package appbackup import ( "path/filepath" "strings" "testing" ) // slash normalizes OS path separators so the assertions hold on both Linux (production) and Windows // (dev). The double-nest invariant is about path segments, not the separator byte. func slash(p string) string { return filepath.ToSlash(p) } // TestNoDoubleFelhomDataForInGuestDrive asserts that for an enrolled in-guest user-data drive // (Model A, slice 10 — the in-guest mount IS the felhom-data namespace root), none of the backup // path helpers re-inject a felhom-data segment, so the on-host path is single-nested rather than // the .../felhom-data/felhom-data/... double-nest that this fix removes. func TestNoDoubleFelhomDataForInGuestDrive(t *testing.T) { // An enrolled drive's in-guest mount — note the basename is NOT "felhom-data". drive := filepath.FromSlash("/mnt/felhom-usb") ns := NamespaceRoot(drive, true) if ns != drive { t.Fatalf("in-guest namespace root should be the drive mount as-is: got %q want %q", ns, drive) } paths := map[string]string{ "PrimaryBackupPath": PrimaryBackupPath(ns), "AppDBDumpPath": AppDBDumpPath(ns, "nextcloud"), "AppVolumeDumpPath": AppVolumeDumpPath(ns, "nextcloud"), "AppDataDir": AppDataDir(ns, "nextcloud"), } for name, p := range paths { sp := slash(p) if strings.Contains(sp, FelhomDataDir+"/"+FelhomDataDir) { t.Errorf("%s double-nests felhom-data: %q", name, sp) } if n := strings.Count(sp, FelhomDataDir); n > 1 { t.Errorf("%s has %d felhom-data segments (want <=1): %q", name, n, sp) } if !strings.HasPrefix(sp, "/mnt/felhom-usb/") { t.Errorf("%s not rooted at the drive mount: %q", name, sp) } } // Concrete expected single-nested DB-dump path for a drive-resident app. if got, want := slash(AppDBDumpPath(ns, "nextcloud")), "/mnt/felhom-usb/backups/primary/nextcloud/db-dumps"; got != want { t.Errorf("drive-resident DB-dump path: got %q want %q", got, want) } } // TestSystemFallbackNestsOnceUnderFelhomData asserts the SSD-only system-data fallback still nests // under exactly one felhom-data segment (the bare drive root does NOT already contain the namespace). func TestSystemFallbackNestsOnceUnderFelhomData(t *testing.T) { ns := NamespaceRoot(filepath.FromSlash("/mnt/sys_drive"), false) if want := filepath.Join(filepath.FromSlash("/mnt/sys_drive"), FelhomDataDir); ns != want { t.Fatalf("system fallback namespace root: got %q want %q", ns, want) } got := slash(AppDBDumpPath(ns, "nextcloud")) if want := "/mnt/sys_drive/felhom-data/backups/primary/nextcloud/db-dumps"; got != want { t.Errorf("system fallback DB-dump path: got %q want %q", got, want) } if n := strings.Count(got, FelhomDataDir); n != 1 { t.Errorf("system fallback should have exactly one felhom-data segment, got %d: %q", n, got) } }