| // Copyright 2023 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package proxy |
| |
| import ( |
| "archive/zip" |
| "fmt" |
| "io" |
| "os" |
| "path/filepath" |
| "strings" |
| "testing" |
| ) |
| |
| func TestWriteModuleVersion(t *testing.T) { |
| tests := []struct { |
| modulePath, version string |
| files map[string][]byte |
| }{ |
| { |
| modulePath: "mod.test/module", |
| version: "v1.2.3", |
| files: map[string][]byte{ |
| "go.mod": []byte("module mod.com\n\ngo 1.12"), |
| "const.go": []byte("package module\n\nconst Answer = 42"), |
| }, |
| }, |
| { |
| modulePath: "mod.test/module", |
| version: "v1.2.4", |
| files: map[string][]byte{ |
| "go.mod": []byte("module mod.com\n\ngo 1.12"), |
| "const.go": []byte("package module\n\nconst Answer = 43"), |
| }, |
| }, |
| { |
| modulePath: "mod.test/nogomod", |
| version: "v0.9.0", |
| files: map[string][]byte{ |
| "const.go": []byte("package module\n\nconst Other = \"Other\""), |
| }, |
| }, |
| } |
| dir := t.TempDir() |
| defer os.RemoveAll(dir) |
| for _, test := range tests { |
| // Since we later assert on the contents of /list, don't use subtests. |
| if err := writeModuleVersion(dir, test.modulePath, test.version, test.files); err != nil { |
| t.Fatal(err) |
| } |
| rootDir := filepath.Join(dir, filepath.FromSlash(test.modulePath), "@v") |
| gomod, err := os.ReadFile(filepath.Join(rootDir, test.version+".mod")) |
| if err != nil { |
| t.Fatal(err) |
| } |
| wantMod, ok := test.files["go.mod"] |
| if !ok { |
| wantMod = []byte("module " + test.modulePath) |
| } |
| if got, want := string(gomod), string(wantMod); got != want { |
| t.Errorf("reading %s/@v/%s.mod: got %q, want %q", test.modulePath, test.version, got, want) |
| } |
| zr, err := zip.OpenReader(filepath.Join(rootDir, test.version+".zip")) |
| if err != nil { |
| t.Fatal(err) |
| } |
| defer zr.Close() |
| |
| for _, zf := range zr.File { |
| r, err := zf.Open() |
| if err != nil { |
| t.Fatal(err) |
| } |
| defer r.Close() |
| content, err := io.ReadAll(r) |
| if err != nil { |
| t.Fatal(err) |
| } |
| name := strings.TrimPrefix(zf.Name, fmt.Sprintf("%s@%s/", test.modulePath, test.version)) |
| if got, want := string(content), string(test.files[name]); got != want { |
| t.Errorf("unzipping %q: got %q, want %q", zf.Name, got, want) |
| } |
| delete(test.files, name) |
| } |
| for name := range test.files { |
| t.Errorf("file %q not present in the module zip", name) |
| } |
| } |
| |
| lists := []struct { |
| modulePath, want string |
| }{ |
| {"mod.test/module", "v1.2.3\nv1.2.4\n"}, |
| {"mod.test/nogomod", "v0.9.0\n"}, |
| } |
| |
| for _, test := range lists { |
| fp := filepath.Join(dir, filepath.FromSlash(test.modulePath), "@v", "list") |
| list, err := os.ReadFile(fp) |
| if err != nil { |
| t.Fatal(err) |
| } |
| if got := string(list); got != test.want { |
| t.Errorf("%q/@v/list: got %q, want %q", test.modulePath, got, test.want) |
| } |
| } |
| } |