| // Copyright 2022 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 modindex |
| |
| import ( |
| "encoding/hex" |
| "encoding/json" |
| "go/build" |
| "internal/diff" |
| "path/filepath" |
| "reflect" |
| "runtime" |
| "testing" |
| ) |
| |
| func init() { |
| isTest = true |
| enabled = true // to allow GODEBUG=goindex=0 go test, when things are very broken |
| } |
| |
| func TestIndex(t *testing.T) { |
| src := filepath.Join(runtime.GOROOT(), "src") |
| checkPkg := func(t *testing.T, m *Module, pkg string, data []byte) { |
| p := m.Package(pkg) |
| bp, err := p.Import(build.Default, build.ImportComment) |
| if err != nil { |
| t.Fatal(err) |
| } |
| bp1, err := build.Default.Import(".", filepath.Join(src, pkg), build.ImportComment) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| if !reflect.DeepEqual(bp, bp1) { |
| t.Errorf("mismatch") |
| t.Logf("index:\n%s", hex.Dump(data)) |
| |
| js, err := json.MarshalIndent(bp, "", "\t") |
| if err != nil { |
| t.Fatal(err) |
| } |
| js1, err := json.MarshalIndent(bp1, "", "\t") |
| if err != nil { |
| t.Fatal(err) |
| } |
| t.Logf("diff:\n%s", diff.Diff("index", js, "correct", js1)) |
| t.FailNow() |
| } |
| } |
| |
| // Check packages in increasing complexity, one at a time. |
| pkgs := []string{ |
| "crypto", |
| "encoding", |
| "unsafe", |
| "encoding/json", |
| "runtime", |
| "net", |
| } |
| var raws []*rawPackage |
| for _, pkg := range pkgs { |
| raw := importRaw(src, pkg) |
| raws = append(raws, raw) |
| t.Run(pkg, func(t *testing.T) { |
| data := encodeModuleBytes([]*rawPackage{raw}) |
| m, err := fromBytes(src, data) |
| if err != nil { |
| t.Fatal(err) |
| } |
| checkPkg(t, m, pkg, data) |
| }) |
| } |
| |
| // Check that a multi-package index works too. |
| t.Run("all", func(t *testing.T) { |
| data := encodeModuleBytes(raws) |
| m, err := fromBytes(src, data) |
| if err != nil { |
| t.Fatal(err) |
| } |
| for _, pkg := range pkgs { |
| checkPkg(t, m, pkg, data) |
| } |
| }) |
| } |
| |
| func TestImportRaw_IgnoreNonGo(t *testing.T) { |
| path := filepath.Join("testdata", "ignore_non_source") |
| p := importRaw(path, ".") |
| |
| wantFiles := []string{"a.syso", "b.go", "c.c"} |
| |
| var gotFiles []string |
| for i := range p.sourceFiles { |
| gotFiles = append(gotFiles, p.sourceFiles[i].name) |
| } |
| |
| if !reflect.DeepEqual(gotFiles, wantFiles) { |
| t.Errorf("names of files in importRaw(testdata/ignore_non_source): got %v; want %v", |
| gotFiles, wantFiles) |
| } |
| } |