Make two tests independent of host load (closes #256)
check / check (push) Successful in 3m55s
check / check (push) Successful in 3m55s
The home-card refresh test runs keepHomeCardsFresh in a synctest bubble, so its waits are exact on a fake clock instead of 15-second polls. The geo fallback subtest in which geojs never answers used a 50 ms time limit and counted requests at the fake server, which a slow host could miss. It now uses a transport that counts each request as it is sent and holds it until the time limit ends it. Model: opus-5-5
This commit is contained in:
1 parent
760ba4746b
commit
b1bd1d97cf
3 files changed
+72
-43
No files matched your search
@@ -90,14 +90,12 @@ func parseAddresses(t *testing.T, addresses ...string) []netip.Addr {
|
||||
return addrs
|
||||
}
|
||||
|
||||
// fakeGeoJS is a geojs server. It sends body, or status when that is set, or
|
||||
// waits for the request to end when hang is true. It keeps each request's
|
||||
// address list.
|
||||
// fakeGeoJS is a geojs server. It sends body, or status when that is set. It
|
||||
// keeps each request's address list.
|
||||
type fakeGeoJS struct {
|
||||
server *httptest.Server
|
||||
body string
|
||||
status int
|
||||
hang bool
|
||||
|
||||
mu sync.Mutex
|
||||
requests []string
|
||||
@@ -119,12 +117,6 @@ func (f *fakeGeoJS) serve(w http.ResponseWriter, r *http.Request) {
|
||||
f.requests = append(f.requests, r.URL.Query().Get("ip"))
|
||||
f.mu.Unlock()
|
||||
|
||||
if f.hang {
|
||||
<-r.Context().Done()
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if f.status != 0 {
|
||||
w.WriteHeader(f.status)
|
||||
|
||||
@@ -142,6 +134,20 @@ func (f *fakeGeoJS) requestsSeen() []string {
|
||||
return append([]string{}, f.requests...)
|
||||
}
|
||||
|
||||
// hangingTransport never answers: each request waits until its context ends.
|
||||
// It counts the requests as they are sent, so the count does not depend on
|
||||
// whether one reaches a server before its time limit runs out.
|
||||
type hangingTransport struct {
|
||||
requests atomic.Int32
|
||||
}
|
||||
|
||||
func (h *hangingTransport) RoundTrip(r *http.Request) (*http.Response, error) {
|
||||
h.requests.Add(1)
|
||||
<-r.Context().Done()
|
||||
|
||||
return nil, r.Context().Err()
|
||||
}
|
||||
|
||||
// openCacheDB opens a new cache.db in a temporary directory.
|
||||
func openCacheDB(t *testing.T, dir string) *sql.DB {
|
||||
t.Helper()
|
||||
@@ -385,13 +391,15 @@ func TestLookupFallsBackToTheDatabase(t *testing.T) {
|
||||
|
||||
fake := newFakeGeoJS(t, tt.body)
|
||||
fake.status = tt.status
|
||||
fake.hang = tt.hang
|
||||
dir := t.TempDir()
|
||||
locator := newTestLocator(t, fake, openCacheDB(t, dir), dir)
|
||||
locator.timeLimit = shortTimeLimit
|
||||
requestCount := func() int { return len(fake.requestsSeen()) }
|
||||
|
||||
if !tt.hang {
|
||||
locator.timeLimit = testTimeLimit
|
||||
if tt.hang {
|
||||
hanging := &hangingTransport{}
|
||||
locator.client = &http.Client{Transport: hanging}
|
||||
locator.timeLimit = shortTimeLimit
|
||||
requestCount = func() int { return int(hanging.requests.Load()) }
|
||||
}
|
||||
|
||||
giveDatabase(t, locator)
|
||||
@@ -413,8 +421,8 @@ func TestLookupFallsBackToTheDatabase(t *testing.T) {
|
||||
// asks geojs again.
|
||||
lookupOne(t, locator, testAddress)
|
||||
|
||||
if requests := fake.requestsSeen(); len(requests) != 2 {
|
||||
t.Errorf("%d requests, want 2", len(requests))
|
||||
if requests := requestCount(); requests != 2 {
|
||||
t.Errorf("%d requests, want 2", requests)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user