|
4 | 4 | "context" |
5 | 5 | "log/slog" |
6 | 6 | "os" |
| 7 | + "strings" |
7 | 8 | "testing" |
8 | 9 | "time" |
9 | 10 |
|
@@ -128,3 +129,94 @@ func Test_ClientEndpoint_Verbose(t *testing.T) { |
128 | 129 | t.Error("expected opts when Verbose=true, got none") |
129 | 130 | } |
130 | 131 | } |
| 132 | + |
| 133 | +func Test_RunServer_AdvertisedURL(t *testing.T) { |
| 134 | + ctx, cancel := context.WithCancel(context.Background()) |
| 135 | + defer cancel() |
| 136 | + |
| 137 | + g := &global{ |
| 138 | + ctx: ctx, |
| 139 | + logger: slog.New(slog.NewTextHandler(os.Stderr, nil)), |
| 140 | + } |
| 141 | + g.HTTP.Addr = ":0" |
| 142 | + g.HTTP.Prefix = "/api" |
| 143 | + |
| 144 | + s := &RunServer{} |
| 145 | + var registerURL string |
| 146 | + s.Register(func(_ *httprouter.Router) error { |
| 147 | + if url := g.URL(); url != nil { |
| 148 | + registerURL = url.String() |
| 149 | + } |
| 150 | + return nil |
| 151 | + }) |
| 152 | + |
| 153 | + done := make(chan error, 1) |
| 154 | + go func() { |
| 155 | + done <- s.Run(g) |
| 156 | + }() |
| 157 | + |
| 158 | + time.Sleep(100 * time.Millisecond) |
| 159 | + if registerURL == "" { |
| 160 | + t.Fatal("expected URL to be available during route registration") |
| 161 | + } |
| 162 | + if !strings.HasPrefix(registerURL, "http://localhost:") { |
| 163 | + t.Fatalf("register URL = %q, want localhost prefix", registerURL) |
| 164 | + } |
| 165 | + if strings.Contains(registerURL, ":0/") { |
| 166 | + t.Fatalf("register URL = %q, want bound port instead of :0", registerURL) |
| 167 | + } |
| 168 | + |
| 169 | + if url := g.URL(); url == nil { |
| 170 | + t.Fatal("expected URL after listen") |
| 171 | + } else if strings.Contains(url.String(), ":0/") { |
| 172 | + t.Fatalf("final URL = %q, want bound port", url.String()) |
| 173 | + } |
| 174 | + |
| 175 | + cancel() |
| 176 | + if err := <-done; err != nil { |
| 177 | + t.Fatal(err) |
| 178 | + } |
| 179 | +} |
| 180 | + |
| 181 | +func Test_RunServer_AdvertisedURL_TLSName(t *testing.T) { |
| 182 | + ctx, cancel := context.WithCancel(context.Background()) |
| 183 | + defer cancel() |
| 184 | + |
| 185 | + g := &global{ |
| 186 | + ctx: ctx, |
| 187 | + logger: slog.New(slog.NewTextHandler(os.Stderr, nil)), |
| 188 | + } |
| 189 | + g.HTTP.Addr = ":0" |
| 190 | + g.HTTP.Prefix = "/api" |
| 191 | + |
| 192 | + s := &RunServer{} |
| 193 | + s.TLS.ServerName = "auth.example.com" |
| 194 | + var registerURL string |
| 195 | + s.Register(func(_ *httprouter.Router) error { |
| 196 | + if url := g.URL(); url != nil { |
| 197 | + registerURL = url.String() |
| 198 | + } |
| 199 | + return nil |
| 200 | + }) |
| 201 | + |
| 202 | + done := make(chan error, 1) |
| 203 | + go func() { |
| 204 | + done <- s.Run(g) |
| 205 | + }() |
| 206 | + |
| 207 | + time.Sleep(100 * time.Millisecond) |
| 208 | + if registerURL != "https://auth.example.com/api" { |
| 209 | + t.Fatalf("register URL = %q, want %q", registerURL, "https://auth.example.com/api") |
| 210 | + } |
| 211 | + |
| 212 | + if url := g.URL(); url == nil { |
| 213 | + t.Fatal("expected URL after listen") |
| 214 | + } else if got := url.String(); got != "https://auth.example.com/api" { |
| 215 | + t.Fatalf("final URL = %q, want %q", got, "https://auth.example.com/api") |
| 216 | + } |
| 217 | + |
| 218 | + cancel() |
| 219 | + if err := <-done; err != nil { |
| 220 | + t.Fatal(err) |
| 221 | + } |
| 222 | +} |
0 commit comments