From 9a3f38629fb929ca916bea102ea32aee9f4899de Mon Sep 17 00:00:00 2001 From: jochen Date: Thu, 22 Oct 2026 18:16:54 +0200 Subject: [PATCH] Prove on a real bus that a merge of mesh-sdk changing only what its lib does not name leaves its tree input and new form unchanged (issue 1758, I9, ADR 0499 check 6 in miniature) --- .../mesh-delivery-indexer/integration_test.go | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/modules/mesh-delivery-indexer/cmd/mesh-delivery-indexer/integration_test.go b/modules/mesh-delivery-indexer/cmd/mesh-delivery-indexer/integration_test.go index e65d5fd..448e24c 100644 --- a/modules/mesh-delivery-indexer/cmd/mesh-delivery-indexer/integration_test.go +++ b/modules/mesh-delivery-indexer/cmd/mesh-delivery-indexer/integration_test.go @@ -9,6 +9,7 @@ import ( "io" "os" "path/filepath" + "strings" "testing" "time" @@ -434,3 +435,46 @@ func TestIndexerGivesACandidateItsFingerprintWhenTheCheckerCreatesThePreviewsBuc t.Errorf("none2 = %q within 5 s of the preview, want %q (computed from the preview)", got, delivery.ToolchainNoReport) } } + +// TestAMergeOfMeshSDKChangingOnlyGoLeavesItsNamedTreeEqual: two merged messages of mesh-sdk (its module.json at 9cb4d59, +// whose lib names its paths) differ in the root tree, as a change to go/ alone makes them, and carry the same objects of the +// named paths; the module's kept tree, and so its fingerprint's tree input, is the same after both, and its new form +// (fingerprint or reason) does not move (issue 1758, I9, ADR 0499 check clause 6 in miniature). +func TestAMergeOfMeshSDKChangingOnlyGoLeavesItsNamedTreeEqual(t *testing.T) { + manifest, err := os.ReadFile("../../internal/index/testdata/sdk-9cb4d59-mesh-sdk.module.json") + if err != nil { + t.Fatal(err) + } + objects := map[string]string{"src": "1111111111111111111111111111111111111111", "test": "2222222222222222222222222222222222222222", + "package.json": "3333333333333333333333333333333333333333", "package-lock.json": "4444444444444444444444444444444444444444", "tsconfig.json": "5555555555555555555555555555555555555555"} + js, ctx, _, modules := startIndexer(t, func(context.Context, jetstream.KeyValue) {}) + merged := func(merge, root string) delivery.Module { + data, err := delivery.EncodeForge(delivery.Forge{Kind: delivery.ForgeMerged, Repository: "novox/mesh-sdk", Branch: "feat/x", Number: 70, + Head: "0123456789abcdef0123456789abcdef01234567", Merge: merge, Root: root, Trees: map[string]string{"": root}, + Manifests: map[string]string{"": string(manifest)}, Paths: map[string]map[string]string{"": objects}}) + if err != nil { + t.Fatal(err) + } + if _, err := js.Publish(ctx, "mesh.stream.mesh-delivery-forge-bridge.event.forge.novox.mesh-sdk.merged", data); err != nil { + t.Fatal(err) + } + var m delivery.Module + for deadline := time.Now().Add(5 * time.Second); time.Now().Before(deadline); time.Sleep(50 * time.Millisecond) { + if e, err := modules.Get(ctx, "mesh-sdk"); err == nil { + if m, err = delivery.DecodeModule(e.Value()); err == nil && m.Commit == merge { + return m + } + } + } + t.Fatalf("modules.mesh-sdk = %+v within 5 s, want the merge %s", m, merge) + return m + } + first := merged("89abcdef0123456789abcdef0123456789abcdef", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") + second := merged("99abcdef0123456789abcdef0123456789abcdef", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb") + if first.Inputs2 == nil || second.Inputs2 == nil || first.Inputs2.Tree != second.Inputs2.Tree || !strings.HasPrefix(first.Inputs2.Tree, delivery.NamedTreePrefix) { + t.Fatalf("kept trees %+v and %+v, want one named tree", first.Inputs2, second.Inputs2) + } + if first.FP2 != second.FP2 || first.None2 != second.None2 { + t.Errorf("the new form moved: %q/%q, then %q/%q", first.FP2, first.None2, second.FP2, second.None2) + } +}