//go:build linux package hostbox import ( "context" "os" "path/filepath" "testing" ) // Step 8 readiness: leo never ran the legacy claim writer, so it has no // legacy journal directory at all. The import is empty and completes, // exactly as for an empty directory, and a rerun is a no-op. A directory // that appears after the marker is still checked against it. func TestMigrateLegacyWithNoLegacyDirectory(t *testing.T) { service, _, _ := journalFixture(t) legacy := filepath.Join(t.TempDir(), ".hostclaims") called := 0 recover := func(context.Context) error { called++; return nil } if err := service.MigrateLegacy(t.Context(), legacy, "box", "enrollment", nil, nil, recover); err != nil { t.Fatalf("absent legacy directory: %v", err) } source, files, _, marked, err := service.journalMigrationMarker(t.Context()) if err != nil || !marked || source != legacy || files != "absent" { t.Fatalf("marker = %q %q %v %v", source, files, marked, err) } if err := service.MigrateLegacy(t.Context(), legacy, "box", "enrollment", nil, nil, recover); err != nil || called != 2 { t.Fatalf("rerun: %v (recoveries %d)", err, called) } // Legacy journals that appear after the marker are not imported silently. if err := os.Mkdir(legacy, 0o700); err != nil { t.Fatal(err) } for _, name := range []string{"launches.db", "inventory.db"} { if err := os.WriteFile(filepath.Join(legacy, name), []byte("late legacy journal"), 0o600); err != nil { t.Fatal(err) } } if err := service.MigrateLegacy(t.Context(), legacy, "box", "enrollment", nil, nil); err == nil { t.Fatal("legacy journals that appeared after the marker were accepted") } }