Generate equipment loot atomically, grant random boxes and prevent repeat claims. Read gacha pools, pity, products, tickets, missions, presets, chapter rewards and inventory costs from GameData; extend both collaboration UR ticket pools. Sync owned recipes, configure startup state and calendars in versioned seeds, and validate unlock tickets and revival talents.
95 lines
2.2 KiB
Go
95 lines
2.2 KiB
Go
package gamedata
|
|
|
|
import (
|
|
"archive/zip"
|
|
"bytes"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"bd2server/internal/server/dbcrypt"
|
|
)
|
|
|
|
// These tests cover the production archive/decryption contract. Interactive
|
|
// queries against the installed 178 MB GameData belong in tools/gamedata_db.py
|
|
// so ordinary Go tests never double as an ad-hoc database console.
|
|
func TestReadDatabase(t *testing.T) {
|
|
root := t.TempDir()
|
|
release := filepath.Join(root, "123", "release")
|
|
if err := os.MkdirAll(release, 0o755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
plain := make([]byte, dbcrypt.PageSize)
|
|
copy(plain, dbcrypt.Header)
|
|
copy(plain[100:], []byte("CREATE TABLE QuestTable21"))
|
|
encrypted, err := dbcrypt.EncryptPages(plain)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
name, err := DatabaseName("pack21")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
writeDatabaseTestArchive(t, filepath.Join(release, ArchiveName), name, encrypted)
|
|
got, err := ReadDatabase(root, "123", "pack21")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !bytes.Equal(got, plain) {
|
|
t.Fatal("decrypted database mismatch")
|
|
}
|
|
}
|
|
|
|
func TestReadQuestDatabase(t *testing.T) {
|
|
root := t.TempDir()
|
|
release := filepath.Join(root, "123", "release")
|
|
if err := os.MkdirAll(release, 0o755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
plain := make([]byte, dbcrypt.PageSize)
|
|
copy(plain, dbcrypt.Header)
|
|
copy(plain[100:], []byte("CREATE TABLE QuestTable21"))
|
|
encrypted, err := dbcrypt.EncryptPages(plain)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
member, err := DatabaseName("common")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
writeDatabaseTestArchive(t, filepath.Join(release, ArchiveName), member, encrypted)
|
|
got, err := ReadQuestDatabase(root, "123")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !bytes.Equal(got, plain) {
|
|
t.Fatal("decrypted quest database mismatch")
|
|
}
|
|
}
|
|
|
|
func writeDatabaseTestArchive(t *testing.T, path, member string, content []byte) {
|
|
t.Helper()
|
|
file, err := os.Create(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
archive := zip.NewWriter(file)
|
|
entry, err := archive.Create(member)
|
|
if err != nil {
|
|
file.Close()
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := entry.Write(content); err != nil {
|
|
archive.Close()
|
|
file.Close()
|
|
t.Fatal(err)
|
|
}
|
|
if err := archive.Close(); err != nil {
|
|
file.Close()
|
|
t.Fatal(err)
|
|
}
|
|
if err := file.Close(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|