// Copyright 2023 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package main import ( "net/http" "net/http/httptest" "strings" "testing" "time" ) // statusHandler is an http.Handler that writes an empty response using itself // as the response status code. type statusHandler int func (h *statusHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { w.WriteHeader(int(*h)) } func TestIsTagged(t *testing.T) { // Set up a fake "Google Code" web server reporting 404 not found. status := statusHandler(http.StatusNotFound) s := httptest.NewServer(&status) defer s.Close() if isTagged(s.URL) { t.Fatal("isTagged == true, want false") } // Change fake server status to 200 OK and try again. status = http.StatusOK if !isTagged(s.URL) { t.Fatal("isTagged == false, want true") } } func TestIntegration(t *testing.T) { status := statusHandler(http.StatusNotFound) ts := httptest.NewServer(&status) defer ts.Close() // Replace the pollSleep with a closure that we can block and unblock. sleep := make(chan bool) pollSleep = func(time.Duration) { sleep <- true sleep <- true } // Replace pollDone with a closure that will tell us when the poller is // exiting. done := make(chan bool) pollDone = func() { done <- true } // Put things as they were when the test finishes. defer func() { pollSleep = time.Sleep pollDone = func() {} }() s := NewServer("1.x", ts.URL, 1*time.Millisecond) <-sleep // Wait for poll loop to start sleeping. // Make first request to the server. r, _ := http.NewRequest("GET", "/", nil) w := httptest.NewRecorder() s.ServeHTTP(w, r) if b := w.Body.String(); !strings.Contains(b, "No.") { t.Fatalf("body = %s, want no", b) } status = http.StatusOK <-sleep // Permit poll loop to stop sleeping. <-done // Wait for poller to see the "OK" status and exit. // Make second request to the server. w = httptest.NewRecorder() s.ServeHTTP(w, r) if b := w.Body.String(); !strings.Contains(b, "YES!") { t.Fatalf("body = %q, want yes", b) } }