feat: sync langpack and auth updates
Sync telesrv commits 49f9bab and 04d9563 into the public mirror. Exclude private docs and runtime key material per sync rules.
This commit is contained in:
parent
6af61f26ba
commit
1292540350
244 changed files with 1552172 additions and 27668 deletions
|
|
@ -4,6 +4,7 @@ import (
|
|||
"context"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"telesrv/internal/store/memory"
|
||||
|
|
@ -59,6 +60,23 @@ func TestParseClientLangPackFile(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestParseClientLangPackFileWithUnderscorePackName(t *testing.T) {
|
||||
packDir := filepath.Join(t.TempDir(), "android_x")
|
||||
if err := os.MkdirAll(packDir, 0o700); err != nil {
|
||||
t.Fatalf("mkdir fixture: %v", err)
|
||||
}
|
||||
path := filepath.Join(packDir, "android_x_en_v42.strings")
|
||||
writeLangPackFixture(t, path, `"TranslationMoreText" = "Translation Platform";`)
|
||||
|
||||
pack, err := ParseTDesktopFile(path)
|
||||
if err != nil {
|
||||
t.Fatalf("parse: %v", err)
|
||||
}
|
||||
if pack.LangPack != "android_x" || pack.LangCode != "en" || pack.Version != 42 {
|
||||
t.Fatalf("pack meta = %+v", pack)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSeedDirectoryWalksClientSubdirs(t *testing.T) {
|
||||
root := t.TempDir()
|
||||
for _, item := range []struct {
|
||||
|
|
@ -98,13 +116,21 @@ func TestSeedDirectoryWalksClientSubdirs(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestBundledAndroidPersianLangPackParses(t *testing.T) {
|
||||
path := filepath.Join("..", "..", "..", "data", "langpack", "android", "android_fa_v59634849.strings")
|
||||
pack, err := ParseTDesktopFile(path)
|
||||
root := filepath.Join("..", "..", "..", "data", "langpack", "android")
|
||||
candidates, _, err := scanSeedCandidates(root)
|
||||
if err != nil {
|
||||
t.Fatalf("scan bundled android packs: %v", err)
|
||||
}
|
||||
candidate, ok := candidates["android\x00fa"]
|
||||
if !ok {
|
||||
t.Fatal("bundled android fa pack not found")
|
||||
}
|
||||
pack, err := ParseTDesktopFile(candidate.path)
|
||||
if err != nil {
|
||||
t.Fatalf("parse bundled android fa pack: %v", err)
|
||||
}
|
||||
if pack.LangPack != "android" || pack.LangCode != "fa" || pack.Version != 59634849 {
|
||||
t.Fatalf("pack meta = %+v, want android/fa v59634849", pack)
|
||||
if pack.LangPack != "android" || pack.LangCode != "fa" || pack.Version <= 0 {
|
||||
t.Fatalf("pack meta = %+v, want versioned android/fa", pack)
|
||||
}
|
||||
if len(pack.Strings) < 10000 {
|
||||
t.Fatalf("strings count = %d, want full android fa pack", len(pack.Strings))
|
||||
|
|
@ -120,3 +146,120 @@ func TestBundledAndroidPersianLangPackParses(t *testing.T) {
|
|||
}
|
||||
t.Fatalf("TranslateLanguageFA not found in bundled android fa pack")
|
||||
}
|
||||
|
||||
func TestSeedDirectoryReconcilesManifest(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
root := t.TempDir()
|
||||
packDir := filepath.Join(root, "tdesktop")
|
||||
if err := os.MkdirAll(packDir, 0o700); err != nil {
|
||||
t.Fatalf("mkdir pack dir: %v", err)
|
||||
}
|
||||
v1 := filepath.Join(packDir, "tdesktop_pt-BR_v1.strings")
|
||||
writeLangPackFixture(t, v1, `
|
||||
"lng_language_name" = "Português (Brasil)";
|
||||
"lng_old" = "old";
|
||||
`)
|
||||
|
||||
store := memory.NewLangPackStore()
|
||||
service := NewService(store)
|
||||
seeded, err := service.SeedDirectory(ctx, root)
|
||||
if err != nil || seeded != 2 {
|
||||
t.Fatalf("seed v1 = %d, %v", seeded, err)
|
||||
}
|
||||
pack, err := service.GetLangPack(ctx, "TDESKTOP", "pt_BR")
|
||||
if err != nil || pack.LangCode != "pt-br" || pack.Version != 1 || len(pack.Strings) != 2 {
|
||||
t.Fatalf("normalized pack = %+v, err %v", pack, err)
|
||||
}
|
||||
languages, err := service.ListLanguages(ctx, "tdesktop")
|
||||
if err != nil || findLanguage(languages, "pt-br") == nil {
|
||||
t.Fatalf("languages = %+v, err %v", languages, err)
|
||||
}
|
||||
if seeded, err := service.SeedDirectory(ctx, root); err != nil || seeded != 0 {
|
||||
t.Fatalf("unchanged seed = %d, %v", seeded, err)
|
||||
}
|
||||
|
||||
v2 := filepath.Join(packDir, "tdesktop_pt-br_v2.strings")
|
||||
writeLangPackFixture(t, v2, `
|
||||
"lng_language_name" = "Português do Brasil";
|
||||
"lng_new" = "new";
|
||||
`)
|
||||
seeded, err = service.SeedDirectory(ctx, root)
|
||||
if err != nil || seeded != 2 {
|
||||
t.Fatalf("seed v2 = %d, %v", seeded, err)
|
||||
}
|
||||
pack, err = service.GetLangPack(ctx, "tdesktop", "pt-br")
|
||||
if err != nil || pack.Version != 2 || len(pack.Strings) != 2 || stringValue(pack.Strings, "lng_old") != "" || stringValue(pack.Strings, "lng_new") != "new" {
|
||||
t.Fatalf("replaced pack = %+v, err %v", pack, err)
|
||||
}
|
||||
|
||||
if err := os.Remove(v1); err != nil {
|
||||
t.Fatalf("remove v1: %v", err)
|
||||
}
|
||||
if err := os.Remove(v2); err != nil {
|
||||
t.Fatalf("remove v2: %v", err)
|
||||
}
|
||||
if err := os.Remove(packDir); err != nil {
|
||||
t.Fatalf("remove pack dir: %v", err)
|
||||
}
|
||||
if seeded, err := service.SeedDirectory(ctx, root); err != nil || seeded != 0 {
|
||||
t.Fatalf("reconcile removed file = %d, %v", seeded, err)
|
||||
}
|
||||
languages, err = service.ListLanguages(ctx, "tdesktop")
|
||||
if err != nil || len(languages) != 0 {
|
||||
t.Fatalf("languages after removal = %+v, err %v", languages, err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSeedDirectoryRejectsVersionInvariantViolations(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
root := t.TempDir()
|
||||
packDir := filepath.Join(root, "tdesktop")
|
||||
if err := os.MkdirAll(packDir, 0o700); err != nil {
|
||||
t.Fatalf("mkdir pack dir: %v", err)
|
||||
}
|
||||
v2 := filepath.Join(packDir, "tdesktop_fr_v2.strings")
|
||||
writeLangPackFixture(t, v2, `"lng_language_name" = "Français";`)
|
||||
service := NewService(memory.NewLangPackStore())
|
||||
if _, err := service.SeedDirectory(ctx, root); err != nil {
|
||||
t.Fatalf("seed v2: %v", err)
|
||||
}
|
||||
|
||||
writeLangPackFixture(t, v2, `"lng_language_name" = "Français modifié";`)
|
||||
if _, err := service.SeedDirectory(ctx, root); err == nil || !strings.Contains(err.Error(), "without version bump") {
|
||||
t.Fatalf("same-version mutation error = %v", err)
|
||||
}
|
||||
pack, err := service.GetLangPack(ctx, "tdesktop", "fr")
|
||||
if err != nil || stringValue(pack.Strings, "lng_language_name") != "Français" {
|
||||
t.Fatalf("pack changed after rejected mutation = %+v, err %v", pack, err)
|
||||
}
|
||||
|
||||
if err := os.Remove(v2); err != nil {
|
||||
t.Fatalf("remove v2: %v", err)
|
||||
}
|
||||
writeLangPackFixture(t, filepath.Join(packDir, "tdesktop_fr_v1.strings"), `"lng_language_name" = "Français";`)
|
||||
if _, err := service.SeedDirectory(ctx, root); err == nil || !strings.Contains(err.Error(), "version rollback") {
|
||||
t.Fatalf("version rollback error = %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBundledLangPackDirectoryReconciles(t *testing.T) {
|
||||
root := filepath.Join("..", "..", "..", "data", "langpack")
|
||||
service := NewService(memory.NewLangPackStore())
|
||||
seeded, err := service.SeedDirectory(context.Background(), root)
|
||||
if err != nil {
|
||||
t.Fatalf("seed bundled langpacks: %v", err)
|
||||
}
|
||||
if seeded < 50000 {
|
||||
t.Fatalf("seeded bundled strings = %d, want full catalog", seeded)
|
||||
}
|
||||
if seeded, err := service.SeedDirectory(context.Background(), root); err != nil || seeded != 0 {
|
||||
t.Fatalf("reconcile unchanged bundled langpacks = %d, %v", seeded, err)
|
||||
}
|
||||
}
|
||||
|
||||
func writeLangPackFixture(t *testing.T, path, content string) {
|
||||
t.Helper()
|
||||
if err := os.WriteFile(path, []byte(content), 0o600); err != nil {
|
||||
t.Fatalf("write langpack fixture %q: %v", path, err)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue