v2_metadata_service_test.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package metadata // import "github.com/docker/docker/distribution/metadata"
  2. import (
  3. "encoding/hex"
  4. "math/rand"
  5. "os"
  6. "reflect"
  7. "testing"
  8. "github.com/docker/docker/layer"
  9. "github.com/opencontainers/go-digest"
  10. )
  11. func TestV2MetadataService(t *testing.T) {
  12. tmpDir, err := os.MkdirTemp("", "blobsum-storage-service-test")
  13. if err != nil {
  14. t.Fatalf("could not create temp dir: %v", err)
  15. }
  16. defer os.RemoveAll(tmpDir)
  17. metadataStore, err := NewFSMetadataStore(tmpDir)
  18. if err != nil {
  19. t.Fatalf("could not create metadata store: %v", err)
  20. }
  21. V2MetadataService := NewV2MetadataService(metadataStore)
  22. tooManyBlobSums := make([]V2Metadata, 100)
  23. for i := range tooManyBlobSums {
  24. randDigest := randomDigest()
  25. tooManyBlobSums[i] = V2Metadata{Digest: randDigest}
  26. }
  27. testVectors := []struct {
  28. diffID layer.DiffID
  29. metadata []V2Metadata
  30. }{
  31. {
  32. diffID: layer.DiffID("sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4"),
  33. metadata: []V2Metadata{
  34. {Digest: digest.Digest("sha256:f0cd5ca10b07f35512fc2f1cbf9a6cefbdb5cba70ac6b0c9e5988f4497f71937")},
  35. },
  36. },
  37. {
  38. diffID: layer.DiffID("sha256:86e0e091d0da6bde2456dbb48306f3956bbeb2eae1b5b9a43045843f69fe4aaa"),
  39. metadata: []V2Metadata{
  40. {Digest: digest.Digest("sha256:f0cd5ca10b07f35512fc2f1cbf9a6cefbdb5cba70ac6b0c9e5988f4497f71937")},
  41. {Digest: digest.Digest("sha256:9e3447ca24cb96d86ebd5960cb34d1299b07e0a0e03801d90b9969a2c187dd6e")},
  42. },
  43. },
  44. {
  45. diffID: layer.DiffID("sha256:03f4658f8b782e12230c1783426bd3bacce651ce582a4ffb6fbbfa2079428ecb"),
  46. metadata: tooManyBlobSums,
  47. },
  48. }
  49. // Set some associations
  50. for _, vec := range testVectors {
  51. for _, blobsum := range vec.metadata {
  52. err := V2MetadataService.Add(vec.diffID, blobsum)
  53. if err != nil {
  54. t.Fatalf("error calling Set: %v", err)
  55. }
  56. }
  57. }
  58. // Check the correct values are read back
  59. for _, vec := range testVectors {
  60. metadata, err := V2MetadataService.GetMetadata(vec.diffID)
  61. if err != nil {
  62. t.Fatalf("error calling Get: %v", err)
  63. }
  64. expectedMetadataEntries := len(vec.metadata)
  65. if expectedMetadataEntries > 50 {
  66. expectedMetadataEntries = 50
  67. }
  68. if !reflect.DeepEqual(metadata, vec.metadata[len(vec.metadata)-expectedMetadataEntries:len(vec.metadata)]) {
  69. t.Fatal("Get returned incorrect layer ID")
  70. }
  71. }
  72. // Test GetMetadata on a nonexistent entry
  73. _, err = V2MetadataService.GetMetadata(layer.DiffID("sha256:82379823067823853223359023576437723560923756b03560378f4497753917"))
  74. if err == nil {
  75. t.Fatal("expected error looking up nonexistent entry")
  76. }
  77. // Test GetDiffID on a nonexistent entry
  78. _, err = V2MetadataService.GetDiffID(digest.Digest("sha256:82379823067823853223359023576437723560923756b03560378f4497753917"))
  79. if err == nil {
  80. t.Fatal("expected error looking up nonexistent entry")
  81. }
  82. // Overwrite one of the entries and read it back
  83. err = V2MetadataService.Add(testVectors[1].diffID, testVectors[0].metadata[0])
  84. if err != nil {
  85. t.Fatalf("error calling Add: %v", err)
  86. }
  87. diffID, err := V2MetadataService.GetDiffID(testVectors[0].metadata[0].Digest)
  88. if err != nil {
  89. t.Fatalf("error calling GetDiffID: %v", err)
  90. }
  91. if diffID != testVectors[1].diffID {
  92. t.Fatal("GetDiffID returned incorrect diffID")
  93. }
  94. }
  95. func randomDigest() digest.Digest {
  96. b := [32]byte{}
  97. for i := 0; i < len(b); i++ {
  98. b[i] = byte(rand.Intn(256))
  99. }
  100. d := hex.EncodeToString(b[:])
  101. return digest.Digest("sha256:" + d)
  102. }