Skip to content

Commit 0238303

Browse files
committed
updated tests
1 parent 1e8fad1 commit 0238303

2 files changed

Lines changed: 178 additions & 0 deletions

File tree

cmd/hauler/cli/store/add_test.go

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,108 @@ func TestRewriteReference(t *testing.T) {
368368
// condition fires → registry reverts to host, no library/ to strip
369369
assertAnnotationsInStore(t, s, "newrepo/img:v2", host+"/newrepo/img:v2")
370370
})
371+
372+
// The library/-detection must look at rawRewrite's path (not the
373+
// go-containerregistry-normalized newRepo, which always carries "library/" for
374+
// single-segment repos), so that a rewrite which explicitly asks for
375+
// "library/..." is honored instead of being unconditionally stripped.
376+
377+
t.Run("path-only rewrite with explicit library/ prefix is preserved", func(t *testing.T) {
378+
s := newTestStore(t)
379+
seedStoreDescriptor(t, s, map[string]string{
380+
ocispec.AnnotationRefName: "library/nginx:latest",
381+
consts.ContainerdImageNameKey: "index.docker.io/library/nginx:latest",
382+
})
383+
384+
oldRef, _ := name.NewTag("nginx:latest")
385+
newRef, _ := name.NewTag("library/nginx:v2")
386+
rawRewrite := "library/nginx:v2"
387+
388+
if err := rewriteReference(ctx, s, oldRef, newRef, rawRewrite); err != nil {
389+
t.Fatalf("rewriteReference: %v", err)
390+
}
391+
// rewriteRepo (derived from rawRewrite) starts with "library/" → must be kept
392+
assertAnnotationsInStore(t, s, "library/nginx:v2", "index.docker.io/library/nginx:v2")
393+
})
394+
395+
t.Run("leading slash rewrite with explicit library/ prefix is preserved", func(t *testing.T) {
396+
s := newTestStore(t)
397+
seedStoreDescriptor(t, s, map[string]string{
398+
ocispec.AnnotationRefName: "library/nginx:latest",
399+
consts.ContainerdImageNameKey: "index.docker.io/library/nginx:latest",
400+
})
401+
402+
oldRef, _ := name.NewTag("nginx:latest")
403+
newRef, _ := name.NewTag("library/nginx:v2")
404+
// AddImageCmd passes the pre-trim rewrite string through as rawRewrite, so a
405+
// leading "/" must still be handled correctly here.
406+
rawRewrite := "/library/nginx:v2"
407+
408+
if err := rewriteReference(ctx, s, oldRef, newRef, rawRewrite); err != nil {
409+
t.Fatalf("rewriteReference: %v", err)
410+
}
411+
assertAnnotationsInStore(t, s, "library/nginx:v2", "index.docker.io/library/nginx:v2")
412+
})
413+
}
414+
415+
func TestRewriteChartReference(t *testing.T) {
416+
ctx := newTestContext(t)
417+
418+
// A chart rewritten to a bare single-segment name must not keep an erroneous
419+
// "library/" prefix picked up from go-containerregistry's docker hub
420+
// normalization, unless the rewrite explicitly asked for one.
421+
422+
t.Run("path-only rewrite strips library/ prefix from docker hub normalization", func(t *testing.T) {
423+
s := newTestStore(t)
424+
seedStoreDescriptor(t, s, map[string]string{
425+
ocispec.AnnotationRefName: "library/mychart:1.0.0",
426+
})
427+
428+
ref, _ := name.NewTag("mychart:1.0.0")
429+
if err := rewriteChartReference(ctx, s, ref, "mychart:2.0.0"); err != nil {
430+
t.Fatalf("rewriteChartReference: %v", err)
431+
}
432+
assertArtifactInStore(t, s, "mychart:2.0.0")
433+
})
434+
435+
t.Run("explicit library/ prefix in rewrite is preserved", func(t *testing.T) {
436+
s := newTestStore(t)
437+
seedStoreDescriptor(t, s, map[string]string{
438+
ocispec.AnnotationRefName: "library/mychart:1.0.0",
439+
})
440+
441+
ref, _ := name.NewTag("mychart:1.0.0")
442+
if err := rewriteChartReference(ctx, s, ref, "library/mychart:2.0.0"); err != nil {
443+
t.Fatalf("rewriteChartReference: %v", err)
444+
}
445+
assertArtifactInStore(t, s, "library/mychart:2.0.0")
446+
})
447+
448+
t.Run("leading slash rewrite with explicit library/ prefix is preserved", func(t *testing.T) {
449+
s := newTestStore(t)
450+
seedStoreDescriptor(t, s, map[string]string{
451+
ocispec.AnnotationRefName: "library/mychart:1.0.0",
452+
})
453+
454+
ref, _ := name.NewTag("mychart:1.0.0")
455+
if err := rewriteChartReference(ctx, s, ref, "/library/mychart:2.0.0"); err != nil {
456+
t.Fatalf("rewriteChartReference: %v", err)
457+
}
458+
assertArtifactInStore(t, s, "library/mychart:2.0.0")
459+
})
460+
461+
t.Run("rewrite omitting tag inherits the source tag", func(t *testing.T) {
462+
s := newTestStore(t)
463+
seedStoreDescriptor(t, s, map[string]string{
464+
ocispec.AnnotationRefName: "library/mychart:1.0.0",
465+
})
466+
467+
ref, _ := name.NewTag("mychart:1.0.0")
468+
if err := rewriteChartReference(ctx, s, ref, "myneworg/mychart"); err != nil {
469+
t.Fatalf("rewriteChartReference: %v", err)
470+
}
471+
assertArtifactInStore(t, s, "myneworg/mychart:1.0.0")
472+
})
371473
}
372474

373475
// --------------------------------------------------------------------------

cmd/hauler/cli/store/info_test.go

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,82 @@ func TestNewItem(t *testing.T) {
215215
}
216216
}
217217

218+
func TestResolveDisplayReference(t *testing.T) {
219+
// ContainerdImageNameKey already holds the fully-qualified reference exactly as
220+
// computed by rewriteReference (see add.go), so it must be returned verbatim.
221+
// Re-parsing it through the reference package would re-trigger
222+
// go-containerregistry's docker hub "library/" normalization for a
223+
// single-segment repo, undoing a rewrite like "hello-world-custom" back to
224+
// "library/hello-world-custom".
225+
t.Run("ContainerdImageNameKey is used verbatim, without re-injecting library/", func(t *testing.T) {
226+
desc := ocispec.Descriptor{
227+
Annotations: map[string]string{
228+
consts.ContainerdImageNameKey: "index.docker.io/hello-world-custom:v2",
229+
ocispec.AnnotationRefName: "hello-world-custom:v2",
230+
},
231+
}
232+
got, err := resolveDisplayReference(desc)
233+
if err != nil {
234+
t.Fatalf("resolveDisplayReference: %v", err)
235+
}
236+
if want := "index.docker.io/hello-world-custom:v2"; got != want {
237+
t.Errorf("got %q, want %q", got, want)
238+
}
239+
})
240+
241+
t.Run("falls back to AnnotationRefName parsed when ContainerdImageNameKey absent", func(t *testing.T) {
242+
desc := ocispec.Descriptor{
243+
Annotations: map[string]string{
244+
ocispec.AnnotationRefName: "hello-world-custom:v2",
245+
},
246+
}
247+
got, err := resolveDisplayReference(desc)
248+
if err != nil {
249+
t.Fatalf("resolveDisplayReference: %v", err)
250+
}
251+
if want := "hauler/hello-world-custom:v2"; got != want {
252+
t.Errorf("got %q, want %q", got, want)
253+
}
254+
})
255+
256+
t.Run("returns error when fallback ref cannot be parsed", func(t *testing.T) {
257+
desc := ocispec.Descriptor{Annotations: map[string]string{}}
258+
if _, err := resolveDisplayReference(desc); err == nil {
259+
t.Fatal("expected error, got nil")
260+
}
261+
})
262+
}
263+
264+
func TestNewItem_ReferenceUsesContainerdImageNameVerbatim(t *testing.T) {
265+
desc := ocispec.Descriptor{
266+
Annotations: map[string]string{
267+
consts.ContainerdImageNameKey: "index.docker.io/hello-world-custom:v2",
268+
ocispec.AnnotationRefName: "hello-world-custom:v2",
269+
},
270+
}
271+
m := ocispec.Manifest{Config: ocispec.Descriptor{MediaType: consts.DockerConfigJSON}}
272+
o := &flags.InfoOpts{TypeFilter: "all"}
273+
274+
got := newItem(nil, desc, m, "linux/amd64", o)
275+
if want := "index.docker.io/hello-world-custom:v2"; got.Reference != want {
276+
t.Errorf("got Reference %q, want %q", got.Reference, want)
277+
}
278+
}
279+
280+
func TestFallbackItem_ReferenceUsesContainerdImageNameVerbatim(t *testing.T) {
281+
desc := ocispec.Descriptor{
282+
Annotations: map[string]string{
283+
consts.ContainerdImageNameKey: "index.docker.io/hello-world-custom:v2",
284+
ocispec.AnnotationRefName: "hello-world-custom:v2",
285+
},
286+
}
287+
288+
got := fallbackItem(desc, "linux/amd64", store.BlobResult{})
289+
if want := "index.docker.io/hello-world-custom:v2"; got.Reference != want {
290+
t.Errorf("got Reference %q, want %q", got.Reference, want)
291+
}
292+
}
293+
218294
func TestInfoCmd(t *testing.T) {
219295
ctx := newTestContext(t)
220296
s := newTestStore(t)

0 commit comments

Comments
 (0)