blob: 05a4ced500afa797872b6b89f863c224f2ba203b [file] [log] [blame]
// Example environment for the test_on_env Bazel rule.
package main
import (
"fmt"
"io/ioutil"
"net"
"net/http"
"os"
"path"
"strconv"
"time"
)
const (
delaySeconds = 3
envPortFileBaseName = "port"
)
func main() {
// Read in build paths to the ready and port files.
envDir := os.Getenv("ENV_DIR")
if envDir == "" {
panic(fmt.Sprintf("required environment variable ENV_DIR is unset"))
}
envReadyFile := os.Getenv("ENV_READY_FILE")
if envReadyFile == "" {
panic(fmt.Sprintf("required environment variable ENV_READY_FILE is unset"))
}
envPortFile := path.Join(envDir, envPortFileBaseName)
// We test the readiness check by simulating a delay.
fmt.Printf("Simulating a %d-second delay before starting the HTTP server...\n", delaySeconds)
time.Sleep(delaySeconds * time.Second)
// Serve a plaintext echo endpoint.
http.HandleFunc("/echo", func(w http.ResponseWriter, r *http.Request) {
msg := r.URL.Query().Get("msg")
if msg == "" {
w.WriteHeader(http.StatusBadRequest)
if _, err := fmt.Fprintln(w, `Error: Query parameter "msg" is empty or missing.`); err != nil {
panic(err)
}
} else {
if _, err := fmt.Fprintln(w, msg); err != nil {
panic(err)
}
}
})
// Listen on an unused port chosen by the OS.
listener, err := net.Listen("tcp", ":0")
if err != nil {
panic(err)
}
port := listener.Addr().(*net.TCPAddr).Port
// Write port file first.
err = ioutil.WriteFile(envPortFile, []byte(strconv.Itoa(port)), 0644)
if err != nil {
panic(err)
}
// Write ready file second. This signals that the environment is ready for the tests to execute.
err = ioutil.WriteFile(envReadyFile, []byte{}, 0644)
if err != nil {
panic(err)
}
fmt.Printf("Listening on port %d.\n", port)
err = http.Serve(listener, nil) // Always returns a non-nil error.
if err.Error() != "" {
panic(err)
}
}