diff --git a/go/catalogue/catalogue_check_test.go b/go/catalogue/catalogue_check_test.go index a0d13fd..ffc7cf8 100644 --- a/go/catalogue/catalogue_check_test.go +++ b/go/catalogue/catalogue_check_test.go @@ -22,16 +22,12 @@ func catalogueRoot(t *testing.T) string { } func TestEveryCatalogueManifestParses(t *testing.T) { - root := catalogueRoot(t) - found, err := filepath.Glob(filepath.Join(root, "modules", "*", "module.json")) - if err != nil || len(found) == 0 { - t.Fatalf("no manifests under %s: %v", root, err) - } + _, found := catalogueManifests(t) named, routed := 0, 0 - for _, p := range found { - m, err := ReadTreeManifest(root, filepath.Dir(p)) + for _, r := range found { + m, err := r.manifest, r.err if err != nil { - t.Errorf("%s: %v", filepath.Base(filepath.Dir(p)), err) + t.Errorf("%s: %v", filepath.Base(filepath.Dir(r.path)), err) continue } for _, l := range m.Listens { @@ -54,16 +50,12 @@ func TestEveryCatalogueManifestParses(t *testing.T) { // definition names a domain or a public address the mesh acts on, and every value that must for now // carries its reason (novox/hq ADR 0155, issue 134). The list it prints is the one that shrinks. func TestNoCatalogueManifestNamesAnInstallation(t *testing.T) { - root := catalogueRoot(t) - found, err := filepath.Glob(filepath.Join(root, "modules", "*", "module.json")) - if err != nil || len(found) == 0 { - t.Fatalf("no manifests under %s: %v", root, err) - } + _, found := catalogueManifests(t) var named []string - for _, p := range found { - m, err := ReadTreeManifest(root, filepath.Dir(p)) + for _, r := range found { + m, err := r.manifest, r.err if err != nil { - t.Errorf("%s: %v", p, err) + t.Errorf("%s: %v", r.path, err) continue } named = append(named, InstallationProblems(m)...) @@ -78,15 +70,11 @@ func TestNoCatalogueManifestNamesAnInstallation(t *testing.T) { // backup line by hand, every directory a container writes is declared, and every irreplaceable item is // backed up — so a store added is a store backed up, without a list of stores to keep in step. func TestEveryCatalogueModuleDeclaresItsData(t *testing.T) { - root := catalogueRoot(t) - found, err := filepath.Glob(filepath.Join(root, "modules", "*", "module.json")) - if err != nil || len(found) == 0 { - t.Fatalf("no manifests under %s: %v", root, err) - } + _, found := catalogueManifests(t) shelf := Shelf{} granting := 0 - for _, p := range found { - m, err := ReadTreeManifest(root, filepath.Dir(p)) + for _, r := range found { + m, err := r.manifest, r.err if err != nil { continue // TestEveryCatalogueManifestParses says why } @@ -108,16 +96,12 @@ func TestEveryCatalogueModuleDeclaresItsData(t *testing.T) { // overflow fails here, in the pull request that introduces it, rather than on the provider's machine // the first time a real machine's name meets the module's (issue 263). func TestEveryCatalogueIdentityFitsWhatItRequires(t *testing.T) { - root := catalogueRoot(t) - found, err := filepath.Glob(filepath.Join(root, "modules", "*", "module.json")) - if err != nil || len(found) == 0 { - t.Fatalf("no manifests under %s: %v", root, err) - } + _, found := catalogueManifests(t) shelf := Shelf{} - for _, p := range found { - m, err := ReadTreeManifest(root, filepath.Dir(p)) + for _, r := range found { + m, err := r.manifest, r.err if err != nil { - t.Fatalf("%s: %v", p, err) + t.Fatalf("%s: %v", r.path, err) } shelf[m.Module] = m } diff --git a/go/catalogue/catalogue_read_test.go b/go/catalogue/catalogue_read_test.go new file mode 100644 index 0000000..50ca38a --- /dev/null +++ b/go/catalogue/catalogue_read_test.go @@ -0,0 +1,44 @@ +package catalogue + +import ( + "path/filepath" + "sync" + "testing" +) + +// readManifest is one manifest of the catalogue as ReadTreeManifest read it. +type readManifest struct { + path string // the module.json + manifest Manifest + err error +} + +var ( + readOnce sync.Once + readAll []readManifest + readRoot string +) + +// catalogueManifests is every manifest of the catalogue (catalogueRoot), read through ReadTreeManifest once +// per test binary and not once per test: the checks over the real catalogue each read and parsed every +// manifest again, and together took 1.5 s of mesh-sdk's unit bound of 2 s (issue 1756). What it returns is +// shared and read-only: a test that changes a manifest copies it first. +func catalogueManifests(t *testing.T) (string, []readManifest) { + t.Helper() + root := catalogueRoot(t) + readOnce.Do(func() { + readRoot = root + found, err := filepath.Glob(filepath.Join(root, "modules", "*", "module.json")) + if err != nil { + return + } + for _, p := range found { + m, err := ReadTreeManifest(root, filepath.Dir(p)) + readAll = append(readAll, readManifest{path: p, manifest: m, err: err}) + } + }) + if len(readAll) == 0 { + t.Fatalf("no manifests under %s", root) + } + return readRoot, readAll +} diff --git a/go/catalogue/mounts_test.go b/go/catalogue/mounts_test.go index d13c6dc..1e0a3df 100644 --- a/go/catalogue/mounts_test.go +++ b/go/catalogue/mounts_test.go @@ -4,8 +4,6 @@ import ( "path/filepath" "strings" "testing" - - "git.novox.be/novox/mesh-sdk/go/internal/beside" ) // A bind mount the module never declared is refused where it is written (novox/hq 04-ISSUES/026, @@ -71,14 +69,10 @@ func TestTheRuntimeSocketIsGrantedByTheCapabilityAndNotOtherwise(t *testing.T) { // **Every manifest in the catalogue (internal/beside) passes**, so the rule is not one the catalogue // is already breaking. func TestEveryCatalogueManifestDeclaresWhatItMounts(t *testing.T) { - files, _ := filepath.Glob(filepath.Join(beside.Catalogue(t), "*", "module.json")) - if len(files) == 0 { - t.Fatal("no manifests in the catalogue, so this proved nothing") - } - root := beside.Dir(t, "mesh-catalog") // once: it copies the captured tree - for _, file := range files { - if _, err := ReadTreeManifest(root, filepath.Dir(file)); err != nil { - t.Errorf("%s: %v", filepath.Base(filepath.Dir(file)), err) + _, files := catalogueManifests(t) + for _, f := range files { + if f.err != nil { + t.Errorf("%s: %v", filepath.Base(filepath.Dir(f.path)), f.err) } } } diff --git a/go/forgekey/runner_test.go b/go/forgekey/runner_test.go index 9c26b65..13f3669 100644 --- a/go/forgekey/runner_test.go +++ b/go/forgekey/runner_test.go @@ -1,3 +1,5 @@ +//go:build integration + package forgekey import (