package cache

import (
	"testing"

	"golang.org/x/net/context"
)

// checkLayerInfoCache takes a cache implementation through a common set of
// operations. If adding new tests, please add them here so new
// implementations get the benefit.
func checkLayerInfoCache(t *testing.T, lic LayerInfoCache) {
	ctx := context.Background()

	exists, err := lic.Contains(ctx, "", "fake:abc")
	if err == nil {
		t.Fatalf("expected error checking for cache item with empty repo")
	}

	exists, err = lic.Contains(ctx, "foo/bar", "")
	if err == nil {
		t.Fatalf("expected error checking for cache item with empty digest")
	}

	exists, err = lic.Contains(ctx, "foo/bar", "fake:abc")
	if err != nil {
		t.Fatalf("unexpected error checking for cache item: %v", err)
	}

	if exists {
		t.Fatalf("item should not exist")
	}

	if err := lic.Add(ctx, "", "fake:abc"); err == nil {
		t.Fatalf("expected error adding cache item with empty name")
	}

	if err := lic.Add(ctx, "foo/bar", ""); err == nil {
		t.Fatalf("expected error adding cache item with empty digest")
	}

	if err := lic.Add(ctx, "foo/bar", "fake:abc"); err != nil {
		t.Fatalf("unexpected error adding item: %v", err)
	}

	exists, err = lic.Contains(ctx, "foo/bar", "fake:abc")
	if err != nil {
		t.Fatalf("unexpected error checking for cache item: %v", err)
	}

	if !exists {
		t.Fatalf("item should exist")
	}

	_, err = lic.Meta(ctx, "")
	if err == nil || err == ErrNotFound {
		t.Fatalf("expected error getting meta for cache item with empty digest")
	}

	_, err = lic.Meta(ctx, "fake:abc")
	if err != ErrNotFound {
		t.Fatalf("expected unknown layer error getting meta for cache item with empty digest")
	}

	if err = lic.SetMeta(ctx, "", LayerMeta{}); err == nil {
		t.Fatalf("expected error setting meta for cache item with empty digest")
	}

	if err = lic.SetMeta(ctx, "foo/bar", LayerMeta{}); err == nil {
		t.Fatalf("expected error setting meta for cache item with empty meta")
	}

	expected := LayerMeta{Path: "/foo/bar", Length: 20}
	if err := lic.SetMeta(ctx, "foo/bar", expected); err != nil {
		t.Fatalf("unexpected error setting meta: %v", err)
	}

	meta, err := lic.Meta(ctx, "foo/bar")
	if err != nil {
		t.Fatalf("unexpected error getting meta: %v", err)
	}

	if meta != expected {
		t.Fatalf("retrieved meta data did not match: %v", err)
	}
}