fixblobs_test.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package server
  2. import (
  3. "io/fs"
  4. "os"
  5. "path/filepath"
  6. "runtime"
  7. "slices"
  8. "strings"
  9. "testing"
  10. )
  11. func TestFixBlobs(t *testing.T) {
  12. cases := []struct {
  13. path []string
  14. want []string
  15. }{
  16. {path: []string{"sha256-1234"}, want: []string{"sha256-1234"}},
  17. {path: []string{"sha256:1234"}, want: []string{"sha256-1234"}},
  18. {path: []string{"sha259:5678"}, want: []string{"sha259:5678"}},
  19. {path: []string{"sha256:abcd"}, want: []string{"sha256-abcd"}},
  20. {path: []string{"x/y/sha256:abcd"}, want: []string{"x/y/sha256-abcd"}},
  21. {path: []string{"x:y/sha256:abcd"}, want: []string{"x:y/sha256-abcd"}},
  22. {path: []string{"x:y/sha256:abcd"}, want: []string{"x:y/sha256-abcd"}},
  23. {path: []string{"x:y/sha256:abcd", "sha256:1234"}, want: []string{"x:y/sha256-abcd", "sha256-1234"}},
  24. {path: []string{"x:y/sha256:abcd", "sha256-1234"}, want: []string{"x:y/sha256-abcd", "sha256-1234"}},
  25. }
  26. for _, tt := range cases {
  27. t.Run(strings.Join(tt.path, "|"), func(t *testing.T) {
  28. hasColon := slices.ContainsFunc(tt.path, func(s string) bool { return strings.Contains(s, ":") })
  29. if hasColon && runtime.GOOS == "windows" {
  30. t.Skip("skipping test on windows")
  31. }
  32. rootDir := t.TempDir()
  33. for _, path := range tt.path {
  34. fullPath := filepath.Join(rootDir, path)
  35. fullDir, _ := filepath.Split(fullPath)
  36. t.Logf("creating dir %s", fullDir)
  37. if err := os.MkdirAll(fullDir, 0o755); err != nil {
  38. t.Fatal(err)
  39. }
  40. t.Logf("writing file %s", fullPath)
  41. if err := os.WriteFile(fullPath, nil, 0o644); err != nil {
  42. t.Fatal(err)
  43. }
  44. }
  45. if err := fixBlobs(rootDir); err != nil {
  46. t.Fatal(err)
  47. }
  48. got := slurpFiles(os.DirFS(rootDir))
  49. slices.Sort(tt.want)
  50. slices.Sort(got)
  51. if !slices.Equal(got, tt.want) {
  52. t.Fatalf("got = %v, want %v", got, tt.want)
  53. }
  54. })
  55. }
  56. }
  57. func TestFixManifests(t *testing.T) {
  58. cases := []struct {
  59. path []string
  60. want []string
  61. }{
  62. {path: []string{}, want: []string{}},
  63. {path: []string{"h/n/m/t"}, want: []string{"h/n/m/t"}},
  64. {path: []string{"h:p/n/m/t"}, want: []string{"h%p/n/m/t"}},
  65. {path: []string{"x:y/h:p/n/m/t"}, want: []string{"x:y/h%p/n/m/t"}},
  66. }
  67. for _, tt := range cases {
  68. t.Run(strings.Join(tt.path, "|"), func(t *testing.T) {
  69. hasColon := slices.ContainsFunc(tt.path, func(s string) bool { return strings.Contains(s, ":") })
  70. if hasColon && runtime.GOOS == "windows" {
  71. t.Skip("skipping test on windows")
  72. }
  73. rootDir := t.TempDir()
  74. for _, path := range tt.path {
  75. fullPath := filepath.Join(rootDir, path)
  76. fullDir, _ := filepath.Split(fullPath)
  77. t.Logf("creating dir %s", fullDir)
  78. if err := os.MkdirAll(fullDir, 0o755); err != nil {
  79. t.Fatal(err)
  80. }
  81. t.Logf("writing file %s", fullPath)
  82. if err := os.WriteFile(fullPath, nil, 0o644); err != nil {
  83. t.Fatal(err)
  84. }
  85. }
  86. if err := fixManifests(rootDir); err != nil {
  87. t.Fatal(err)
  88. }
  89. got := slurpFiles(os.DirFS(rootDir))
  90. slices.Sort(tt.want)
  91. slices.Sort(got)
  92. if !slices.Equal(got, tt.want) {
  93. t.Fatalf("got = %v, want %v", got, tt.want)
  94. }
  95. })
  96. }
  97. }
  98. func slurpFiles(fsys fs.FS) []string {
  99. var sfs []string
  100. fn := func(path string, d fs.DirEntry, err error) error {
  101. if err != nil {
  102. return err
  103. }
  104. if d.IsDir() {
  105. return nil
  106. }
  107. sfs = append(sfs, path)
  108. return nil
  109. }
  110. if err := fs.WalkDir(fsys, ".", fn); err != nil {
  111. panic(err)
  112. }
  113. return sfs
  114. }