golang.org/x/tools@v0.21.0/internal/imports/mod_cache_test.go (about) 1 // Copyright 2019 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package imports 6 7 import ( 8 "fmt" 9 "os/exec" 10 "reflect" 11 "sort" 12 "strings" 13 "testing" 14 "time" 15 ) 16 17 func TestDirectoryPackageInfoReachedStatus(t *testing.T) { 18 tests := []struct { 19 info directoryPackageInfo 20 target directoryPackageStatus 21 wantStatus bool 22 wantError bool 23 }{ 24 { 25 info: directoryPackageInfo{ 26 status: directoryScanned, 27 err: nil, 28 }, 29 target: directoryScanned, 30 wantStatus: true, 31 }, 32 { 33 info: directoryPackageInfo{ 34 status: directoryScanned, 35 err: fmt.Errorf("error getting to directory scanned"), 36 }, 37 target: directoryScanned, 38 wantStatus: true, 39 wantError: true, 40 }, 41 { 42 info: directoryPackageInfo{}, 43 target: directoryScanned, 44 wantStatus: false, 45 }, 46 } 47 48 for _, tt := range tests { 49 gotStatus, gotErr := tt.info.reachedStatus(tt.target) 50 if gotErr != nil { 51 if !tt.wantError { 52 t.Errorf("unexpected error: %s", gotErr) 53 } 54 continue 55 } 56 57 if tt.wantStatus != gotStatus { 58 t.Errorf("reached status expected: %v, got: %v", tt.wantStatus, gotStatus) 59 } 60 } 61 } 62 63 func TestModCacheInfo(t *testing.T) { 64 m := NewDirInfoCache() 65 66 dirInfo := []struct { 67 dir string 68 info directoryPackageInfo 69 }{ 70 { 71 dir: "mypackage", 72 info: directoryPackageInfo{ 73 status: directoryScanned, 74 dir: "mypackage", 75 nonCanonicalImportPath: "example.com/mypackage", 76 }, 77 }, 78 { 79 dir: "bad package", 80 info: directoryPackageInfo{ 81 status: directoryScanned, 82 err: fmt.Errorf("bad package"), 83 }, 84 }, 85 { 86 dir: "mypackage/other", 87 info: directoryPackageInfo{ 88 dir: "mypackage/other", 89 nonCanonicalImportPath: "example.com/mypackage/other", 90 }, 91 }, 92 } 93 94 for _, d := range dirInfo { 95 m.Store(d.dir, d.info) 96 } 97 98 for _, d := range dirInfo { 99 val, ok := m.Load(d.dir) 100 if !ok { 101 t.Errorf("directory not loaded: %s", d.dir) 102 } 103 104 if !reflect.DeepEqual(d.info, val) { 105 t.Errorf("expected: %v, got: %v", d.info, val) 106 } 107 } 108 109 var wantKeys []string 110 for _, d := range dirInfo { 111 wantKeys = append(wantKeys, d.dir) 112 } 113 sort.Strings(wantKeys) 114 115 gotKeys := m.Keys() 116 sort.Strings(gotKeys) 117 118 if len(gotKeys) != len(wantKeys) { 119 t.Errorf("different length of keys. expected: %d, got: %d", len(wantKeys), len(gotKeys)) 120 } 121 122 for i, want := range wantKeys { 123 if want != gotKeys[i] { 124 t.Errorf("%d: expected %s, got %s", i, want, gotKeys[i]) 125 } 126 } 127 } 128 129 func BenchmarkScanModuleCache(b *testing.B) { 130 output, err := exec.Command("go", "env", "GOMODCACHE").Output() 131 if err != nil { 132 b.Fatal(err) 133 } 134 gomodcache := strings.TrimSpace(string(output)) 135 cache := NewDirInfoCache() 136 start := time.Now() 137 ScanModuleCache(gomodcache, cache, nil) 138 b.Logf("initial scan took %v", time.Since(start)) 139 b.ResetTimer() 140 141 for i := 0; i < b.N; i++ { 142 ScanModuleCache(gomodcache, cache, nil) 143 } 144 }