Merge branch 'master' into 4091-test-infinite-scrolling
[arvados.git] / services / keepproxy / keepproxy_test.go
index 2a74a19fc06ee8ef4687bf2da43748fcc2d602df..f6d163c1f19fe7449adb764f7d98f728438b3fa8 100644 (file)
@@ -1,8 +1,8 @@
 package main
 
 import (
-       keepclient "git.curoverse.com/arvados.git/sdk/go/keepclient"
-       arvadosclient "git.curoverse.com/arvados.git/sdk/go/arvadosclient"
+       "git.curoverse.com/arvados.git/sdk/go/keepclient"
+       "git.curoverse.com/arvados.git/sdk/go/arvadosclient"
        "crypto/md5"
        "crypto/tls"
        "fmt"
@@ -34,20 +34,54 @@ func pythonDir() string {
        return fmt.Sprintf("%s/../../sdk/python/tests", cwd)
 }
 
+// Wait (up to 1 second) for keepproxy to listen on a port. This
+// avoids a race condition where we hit a "connection refused" error
+// because we start testing the proxy too soon.
+func waitForListener() {
+       const (ms = 5)
+       for i := 0; listener == nil && i < 1000; i += ms {
+               time.Sleep(ms * time.Millisecond)
+       }
+       if listener == nil {
+               log.Fatalf("Timed out waiting for listener to start")
+       }
+}
+
+func closeListener() {
+       if listener != nil {
+               listener.Close()
+       }
+}
+
 func (s *ServerRequiredSuite) SetUpSuite(c *C) {
        cwd, _ := os.Getwd()
        defer os.Chdir(cwd)
 
        os.Chdir(pythonDir())
-
-       if err := exec.Command("python", "run_test_server.py", "start").Run(); err != nil {
-               panic("'python run_test_server.py start' returned error")
+       {
+               cmd := exec.Command("python", "run_test_server.py", "start")
+               stderr, err := cmd.StderrPipe()
+               if err != nil {
+                       log.Fatalf("Setting up stderr pipe: %s", err)
+               }
+               go io.Copy(os.Stderr, stderr)
+               if err := cmd.Run(); err != nil {
+                       panic(fmt.Sprintf("'python run_test_server.py start' returned error %s", err))
+               }
        }
-       if err := exec.Command("python", "run_test_server.py", "start_keep").Run(); err != nil {
-               panic("'python run_test_server.py start_keep' returned error")
+       {
+               cmd := exec.Command("python", "run_test_server.py", "start_keep")
+               stderr, err := cmd.StderrPipe()
+               if err != nil {
+                       log.Fatalf("Setting up stderr pipe: %s", err)
+               }
+               go io.Copy(os.Stderr, stderr)
+               if err := cmd.Run(); err != nil {
+                       panic(fmt.Sprintf("'python run_test_server.py start_keep' returned error %s", err))
+               }
        }
 
-       os.Setenv("ARVADOS_API_HOST", "localhost:3001")
+       os.Setenv("ARVADOS_API_HOST", "localhost:3000")
        os.Setenv("ARVADOS_API_TOKEN", "4axaw8zxe0qm22wa6urpp5nskcne8z88cvbupv653y1njyi05h")
        os.Setenv("ARVADOS_API_HOST_INSECURE", "true")
 }
@@ -140,7 +174,8 @@ func (s *ServerRequiredSuite) TestPutAskGet(c *C) {
        os.Setenv("ARVADOS_EXTERNAL_CLIENT", "")
        log.Print("keepclient created")
 
-       defer listener.Close()
+       waitForListener()
+       defer closeListener()
 
        hash := fmt.Sprintf("%x", md5.Sum([]byte("foo")))
        var hash2 string
@@ -184,7 +219,8 @@ func (s *ServerRequiredSuite) TestPutAskGetForbidden(c *C) {
        log.Print("TestPutAndGet start")
 
        kc := runProxy(c, []string{"keepproxy"}, "123abc", 29951)
-       defer listener.Close()
+       waitForListener()
+       defer closeListener()
 
        log.Print("keepclient created")
 
@@ -225,7 +261,8 @@ func (s *ServerRequiredSuite) TestGetDisabled(c *C) {
        log.Print("TestGetDisabled start")
 
        kc := runProxy(c, []string{"keepproxy", "-no-get"}, "4axaw8zxe0qm22wa6urpp5nskcne8z88cvbupv653y1njyi05h", 29952)
-       defer listener.Close()
+       waitForListener()
+       defer closeListener()
 
        hash := fmt.Sprintf("%x", md5.Sum([]byte("baz")))
 
@@ -264,7 +301,8 @@ func (s *ServerRequiredSuite) TestPutDisabled(c *C) {
        log.Print("TestPutDisabled start")
 
        kc := runProxy(c, []string{"keepproxy", "-no-put"}, "4axaw8zxe0qm22wa6urpp5nskcne8z88cvbupv653y1njyi05h", 29953)
-       defer listener.Close()
+       waitForListener()
+       defer closeListener()
 
        {
                hash2, rep, err := kc.PutB([]byte("quux"))