diff --git a/pkg/api/api_test.go b/pkg/api/api_test.go new file mode 100644 index 0000000..23a1e20 --- /dev/null +++ b/pkg/api/api_test.go @@ -0,0 +1,77 @@ +package api + +import ( + "io/ioutil" + "net" + "net/http" + "os" + "os/exec" + "path/filepath" + "testing" +) + +const testGoSource = ` +package main + +import ( + _ "github.com/pkg/errors" + _ "golang.org/x/net/websocket" +) + +func main() {} +` + +func TestBuildWithProxy(t *testing.T) { + if testing.Short() { + t.Skip("testing with external VCS might be slow") + return + } + + // Start a proxy + api := New(Log(t.Log), Memory(t.Log, 128*1024*1024)) + ln, err := net.Listen("tcp", ":0") + if err != nil { + t.Fatal(err) + } + defer ln.Close() + go (&http.Server{Handler: api}).Serve(ln) + + // Create temporary directory for a minimal test Go project + tmpDir, err := ioutil.TempDir(os.TempDir(), "gomodproxy_test") + if err != nil { + t.Fatal(err) + } + defer func() { + // Cleanup requires changing the permissions, because some files generated + // by "go build" are read-only. + filepath.Walk(tmpDir, func(f string, fi os.FileInfo, err error) error { + return os.Chmod(f, 0777) + }) + if err := os.RemoveAll(tmpDir); err != nil { + t.Log("RemoveAll", tmpDir, err) + } + }() + + // Generate test main.go and go.mod + err = ioutil.WriteFile(filepath.Join(tmpDir, "main.go"), []byte(testGoSource), 0644) + if err != nil { + t.Fatal(err) + } + err = ioutil.WriteFile(filepath.Join(tmpDir, "go.mod"), []byte("module gomodproxy_test"), 0644) + if err != nil { + t.Fatal(err) + } + + // Perform Go build + cmd := exec.Command("go", "build") + cmd.Dir = tmpDir + cmd.Env = append(os.Environ(), + "GOPATH="+filepath.Join(tmpDir, "_gopath"), + "GOCACHE="+filepath.Join(tmpDir, "_gocache"), + "GOPROXY=http://"+ln.Addr().String(), + "GO111MODULE=on") + out, err := cmd.CombinedOutput() + if err != nil { + t.Fatal(string(out), err) + } +}