carlos / platform Public

Clone
git clone https://amadan.net/carlos/platform

Plain git — no account needed to clone.

Download

Download this file

1package edge
2
3import (
4 "bufio"
5 "bytes"
6 "context"
7 "io"
8 "net"
9 "net/http"
10 "os"
11 "os/exec"
12 "path/filepath"
13 "strings"
14 "testing"
15 "time"
16)
17
18func TestStartupGateFailsWhenHandlerSetupFails(t *testing.T) {
19 if os.Getenv("CARLOS_TEST_SETUP_FAILURE") == "1" {
20 RunWithActivatorReady([]string{"-dev", "-registry", filepath.Join(os.Getenv("CARLOS_DATA_DIR"), "registry.db"), "-http", os.Getenv("CARLOS_TEST_HTTP_ADDR")}, nil, nil, nil, func(*Edge) {
21 _, _ = os.Stdout.WriteString("configuring\n")
22 _, _ = io.CopyN(io.Discard, os.Stdin, 1)
23 })
24 os.Exit(0)
25 }
26 listener, err := net.Listen("tcp", "127.0.0.1:0")
27 if err != nil {
28 t.Fatal(err)
29 }
30 addr := listener.Addr().String()
31 listener.Close()
32 exe, err := os.Executable()
33 if err != nil {
34 t.Fatal(err)
35 }
36 ctx, cancel := context.WithTimeout(t.Context(), 10*time.Second)
37 defer cancel()
38 cmd := exec.CommandContext(ctx, exe, "-test.run=^TestStartupGateFailsWhenHandlerSetupFails$")
39 dd := t.TempDir()
40 cmd.Dir = dd
41 cmd.Env = []string{
42 "HOME=" + dd, "TMPDIR=" + os.TempDir(),
43 "CARLOS_DATA_DIR=" + dd, "CARLOS_TEST_SETUP_FAILURE=1", "CARLOS_TEST_HTTP_ADDR=" + addr,
44 "CARLOS_TUNNEL_HOST=tunnel.example.com", "CARLOS_TUNNEL_CLIENTS=invalid",
45 }
46 var stderr bytes.Buffer
47 cmd.Stderr = &stderr
48 stdout, err := cmd.StdoutPipe()
49 if err != nil {
50 t.Fatal(err)
51 }
52 stdin, err := cmd.StdinPipe()
53 if err != nil {
54 t.Fatal(err)
55 }
56 if err := cmd.Start(); err != nil {
57 t.Fatal(err)
58 }
59 defer func() { cancel(); _ = cmd.Wait() }()
60 line, err := bufio.NewReader(stdout).ReadString('\n')
61 if err != nil || line != "configuring\n" {
62 t.Fatalf("setup barrier: %q, %v", line, err)
63 }
64 client := &http.Client{Transport: &http.Transport{Proxy: nil}, Timeout: 100 * time.Millisecond}
65 defer client.CloseIdleConnections()
66 probeMustFail := func() {
67 t.Helper()
68 resp, err := client.Get("http://" + addr + "/")
69 if err == nil {
70 resp.Body.Close()
71 t.Fatalf("update probe succeeded before handler setup: %d", resp.StatusCode)
72 }
73 }
74 probeMustFail()
75 if _, err := stdin.Write([]byte("x")); err != nil {
76 t.Fatal(err)
77 }
78 stdin.Close()
79 if err := cmd.Wait(); err == nil {
80 t.Fatal("invalid tunnel configuration did not fail setup")
81 }
82 if !strings.Contains(stderr.String(), "edge: tunnels:") {
83 t.Fatalf("did not reach handler setup failure: %s", stderr.String())
84 }
85 probeMustFail()
86}
87