21276: Fix unreliable test. 21276-test-race
authorTom Clegg <tom@curii.com>
Fri, 29 Dec 2023 19:40:35 +0000 (14:40 -0500)
committerTom Clegg <tom@curii.com>
Fri, 29 Dec 2023 19:40:35 +0000 (14:40 -0500)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom@curii.com>

lib/controller/handler_test.go
sdk/go/arvadostest/proxy.go

index 0c50a6c4be59b85fc23140d93c4346e1f8e8a9ae..eef0443b9a931afa1d5a0160a6cce8e67cc9c419 100644 (file)
@@ -99,6 +99,7 @@ func (s *HandlerSuite) TestConfigExport(c *check.C) {
 
 func (s *HandlerSuite) TestDiscoveryDocCache(c *check.C) {
        countRailsReqs := func() int {
+               s.railsSpy.Wait()
                n := 0
                for _, req := range s.railsSpy.RequestDumps {
                        if bytes.Contains(req, []byte("/discovery/v1/apis/arvados/v1/rest")) {
index 9940ddd3d96404552282b5e6b8e887c31b3a1862..85d433089aa8b7ba746660fafb2aa64457b83067 100644 (file)
@@ -11,6 +11,7 @@ import (
        "net/http/httptest"
        "net/http/httputil"
        "net/url"
+       "sync"
        "time"
 
        "git.arvados.org/arvados.git/sdk/go/arvados"
@@ -30,6 +31,8 @@ type Proxy struct {
        // If non-nil, func will be called on each incoming request
        // before proxying it.
        Director func(*http.Request)
+
+       wg sync.WaitGroup
 }
 
 // NewProxy returns a new Proxy that saves a dump of each reqeust
@@ -66,14 +69,25 @@ func NewProxy(c *check.C, svc arvados.Service) *Proxy {
                Server: srv,
                URL:    u,
        }
+       var mtx sync.Mutex
        rp.Director = func(r *http.Request) {
+               proxy.wg.Add(1)
+               defer proxy.wg.Done()
                if proxy.Director != nil {
                        proxy.Director(r)
                }
                dump, _ := httputil.DumpRequest(r, true)
+               mtx.Lock()
                proxy.RequestDumps = append(proxy.RequestDumps, dump)
+               mtx.Unlock()
                r.URL.Scheme = target.Scheme
                r.URL.Host = target.Host
        }
        return proxy
 }
+
+// Wait waits until all of the proxied requests that have been sent to
+// Director() have also been recorded in RequestDumps.
+func (proxy *Proxy) Wait() {
+       proxy.wg.Wait()
+}