github.com/bazelbuild/remote-apis-sdks@v0.0.0-20240425170053-8a36686a6350/go/pkg/filemetadata/cache_test.go (about)

     1  package filemetadata
     2  
     3  import (
     4  	"os"
     5  	"testing"
     6  
     7  	"github.com/bazelbuild/remote-apis-sdks/go/pkg/digest"
     8  	"github.com/bazelbuild/remote-apis-sdks/go/pkg/testutil"
     9  	"github.com/google/go-cmp/cmp"
    10  )
    11  
    12  var (
    13  	contents = []byte("example")
    14  	wantDg   = digest.NewFromBlob(contents)
    15  )
    16  
    17  func TestSimpleCacheLoad(t *testing.T) {
    18  	c := NewSingleFlightCache()
    19  	filename, err := testutil.CreateFile(t, false, "")
    20  	if err != nil {
    21  		t.Fatalf("Failed to create tmp file for testing digests: %v", err)
    22  	}
    23  	if err = os.WriteFile(filename, contents, os.ModeTemporary); err != nil {
    24  		t.Fatalf("Failed to write to tmp file for testing digests: %v", err)
    25  	}
    26  	got := c.Get(filename)
    27  	if got.Err != nil {
    28  		t.Errorf("Get(%v) failed. Got error: %v", filename, got.Err)
    29  	}
    30  	want := &Metadata{
    31  		Digest:       wantDg,
    32  		IsExecutable: false,
    33  	}
    34  	if diff := cmp.Diff(want, got, ignoreMtime); diff != "" {
    35  		t.Errorf("Get(%v) returned diff. (-want +got)\n%s", filename, diff)
    36  	}
    37  	if c.GetCacheHits() != 0 {
    38  		t.Errorf("Cache has wrong num of CacheHits, want 0, got %v", c.GetCacheHits())
    39  	}
    40  
    41  	if c.GetCacheMisses() != 1 {
    42  		t.Errorf("Cache has wrong num of CacheMisses, want 1, got %v", c.GetCacheMisses())
    43  	}
    44  }
    45  
    46  func TestCacheOnceLoadMultiple(t *testing.T) {
    47  	c := NewSingleFlightCache()
    48  	filename, err := testutil.CreateFile(t, false, "")
    49  	if err != nil {
    50  		t.Fatalf("Failed to create tmp file for testing digests: %v", err)
    51  	}
    52  	if err = os.WriteFile(filename, contents, os.ModeTemporary); err != nil {
    53  		t.Fatalf("Failed to write to tmp file for testing digests: %v", err)
    54  	}
    55  	want := &Metadata{
    56  		Digest:       wantDg,
    57  		IsExecutable: false,
    58  	}
    59  	for i := 0; i < 2; i++ {
    60  		got := c.Get(filename)
    61  		if got.Err != nil {
    62  			t.Errorf("Get(%v) failed. Got error: %v", filename, got.Err)
    63  		}
    64  		if diff := cmp.Diff(want, got, ignoreMtime); diff != "" {
    65  			t.Errorf("Get(%v) returned diff. (-want +got)\n%s", filename, diff)
    66  		}
    67  	}
    68  	if c.GetCacheHits() != 1 {
    69  		t.Errorf("Cache has wrong num of CacheHits, want 1, got %v", c.GetCacheHits())
    70  	}
    71  	if c.GetCacheMisses() != 1 {
    72  		t.Errorf("Cache has wrong num of CacheMisses, want 1, got %v", c.GetCacheMisses())
    73  	}
    74  }
    75  
    76  func TestLoadAfterChangeWithoutValidation(t *testing.T) {
    77  	c := NewSingleFlightCache()
    78  	filename, err := testutil.CreateFile(t, false, "")
    79  	if err != nil {
    80  		t.Fatalf("Failed to create tmp file for testing digests: %v", err)
    81  	}
    82  	if err = os.WriteFile(filename, contents, os.ModeTemporary); err != nil {
    83  		t.Fatalf("Failed to write to tmp file for testing digests: %v", err)
    84  	}
    85  	got := c.Get(filename)
    86  	if got.Err != nil {
    87  		t.Fatalf("Get(%v) failed. Got error: %v", filename, got.Err)
    88  	}
    89  	want := &Metadata{
    90  		Digest:       wantDg,
    91  		IsExecutable: false,
    92  	}
    93  	if diff := cmp.Diff(want, got, ignoreMtime); diff != "" {
    94  		t.Fatalf("Get(%v) returned diff. (-want +got)\n%s", filename, diff)
    95  	}
    96  
    97  	change := []byte("change")
    98  	if err = os.WriteFile(filename, change, os.ModeTemporary); err != nil {
    99  		t.Fatalf("Failed to write to tmp file for testing digests: %v", err)
   100  	}
   101  	got = c.Get(filename)
   102  	if got.Err != nil {
   103  		t.Errorf("Get(%v) failed. Got error: %v", filename, got.Err)
   104  	}
   105  	if diff := cmp.Diff(want, got, ignoreMtime); diff != "" {
   106  		t.Errorf("Get(%v) returned diff. (-want +got)\n%s", filename, diff)
   107  	}
   108  	if c.GetCacheHits() != 1 {
   109  		t.Errorf("Cache has wrong num of CacheHits, want 1, got %v", c.GetCacheHits())
   110  	}
   111  	if c.GetCacheMisses() != 1 {
   112  		t.Errorf("Cache has wrong num of CacheMisses, want 1, got %v", c.GetCacheMisses())
   113  	}
   114  }