1
0
mirror of https://github.com/golang/go synced 2024-11-18 19:54:44 -07:00
go/internal/imports/mod_cache_test.go
Heschi Kreinick c02c21e5e9 internal/imports: cache GOPATH, exports
We intend to use the GOPATH resolver's results during LSP
autocompletion. That means we have to be able to cache its data, same as
we do for modules. Convert it to use a dirInfoCache.

Cache exports in the dirInfoCache. Along the way, store exports as slices
rather than maps. We don't need the extra structure the vast majority of
the time, and the memory overhead is nontrivial.

Change-Id: If267d6b00da2163a960b93b2cf2088ec2538f73d
Reviewed-on: https://go-review.googlesource.com/c/tools/+/205162
Run-TryBot: Heschi Kreinick <heschi@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
2019-11-04 21:31:17 +00:00

125 lines
2.5 KiB
Go

package imports
import (
"fmt"
"reflect"
"sort"
"testing"
)
func TestDirectoryPackageInfoReachedStatus(t *testing.T) {
tests := []struct {
info directoryPackageInfo
target directoryPackageStatus
wantStatus bool
wantError bool
}{
{
info: directoryPackageInfo{
status: directoryScanned,
err: nil,
},
target: directoryScanned,
wantStatus: true,
},
{
info: directoryPackageInfo{
status: directoryScanned,
err: fmt.Errorf("error getting to directory scanned"),
},
target: directoryScanned,
wantStatus: true,
wantError: true,
},
{
info: directoryPackageInfo{},
target: directoryScanned,
wantStatus: false,
},
}
for _, tt := range tests {
gotStatus, gotErr := tt.info.reachedStatus(tt.target)
if gotErr != nil {
if !tt.wantError {
t.Errorf("unexpected error: %s", gotErr)
}
continue
}
if tt.wantStatus != gotStatus {
t.Errorf("reached status expected: %v, got: %v", tt.wantStatus, gotStatus)
}
}
}
func TestModCacheInfo(t *testing.T) {
m := &dirInfoCache{
dirs: make(map[string]*directoryPackageInfo),
}
dirInfo := []struct {
dir string
info directoryPackageInfo
}{
{
dir: "mypackage",
info: directoryPackageInfo{
status: directoryScanned,
dir: "mypackage",
nonCanonicalImportPath: "example.com/mypackage",
needsReplace: false,
},
},
{
dir: "bad package",
info: directoryPackageInfo{
status: directoryScanned,
err: fmt.Errorf("bad package"),
},
},
{
dir: "mypackage/other",
info: directoryPackageInfo{
dir: "mypackage/other",
nonCanonicalImportPath: "example.com/mypackage/other",
needsReplace: false,
},
},
}
for _, d := range dirInfo {
m.Store(d.dir, d.info)
}
for _, d := range dirInfo {
val, ok := m.Load(d.dir)
if !ok {
t.Errorf("directory not loaded: %s", d.dir)
}
if !reflect.DeepEqual(d.info, val) {
t.Errorf("expected: %v, got: %v", d.info, val)
}
}
var wantKeys []string
for _, d := range dirInfo {
wantKeys = append(wantKeys, d.dir)
}
sort.Strings(wantKeys)
gotKeys := m.Keys()
sort.Strings(gotKeys)
if len(gotKeys) != len(wantKeys) {
t.Errorf("different length of keys. expected: %d, got: %d", len(wantKeys), len(gotKeys))
}
for i, want := range wantKeys {
if want != gotKeys[i] {
t.Errorf("%d: expected %s, got %s", i, want, gotKeys[i])
}
}
}