chore: fix test
Kim committed
Mar 19, 2026 at 15:52 UTC
7cf8e395b77dd378a266871e92f978f4b09fbded
3 files changed
+43
-3
portal/server_test.go
+25
@@ -4,6 +4,7 @@ import (
4
"context"
5
"crypto/tls"
6
"encoding/json"
7
+ "net"
8
"net/http"
9
"strings"
10
"testing"
@@ -159,9 +160,12 @@ func TestRegisterLeaseRejectsInvalidName(t *testing.T) {
160
func TestRegisterLeaseBuildsUDPEnabledRuntime(t *testing.T) {
161
t.Parallel()
162
163
+ udpPort := reserveUDPPort(t)
164
server, err := NewServer(ServerConfig{
165
PortalURL: "https://portal.example.com",
166
UDPEnabled: true,
167
+ UDPPortMin: udpPort,
168
+ UDPPortMax: udpPort,
169
})
170
if err != nil {
171
t.Fatalf("NewServer() error = %v", err)
@@ -175,6 +179,11 @@ func TestRegisterLeaseBuildsUDPEnabledRuntime(t *testing.T) {
179
if err != nil {
180
t.Fatalf("registerLease() error = %v", err)
181
}
182
+ t.Cleanup(func() {
183
+ if record, ok := server.registry.Get(resp.LeaseID); ok {
184
+ server.closeLease(record)
185
+ }
186
+ })
187
188
record, ok := server.registry.Get(resp.LeaseID)
189
if !ok {
@@ -193,3 +202,19 @@ func TestRegisterLeaseBuildsUDPEnabledRuntime(t *testing.T) {
202
t.Fatal("RegisterResponse.UDPAddr = empty, want public udp address")
203
}
204
}
205
+
206
+func reserveUDPPort(t *testing.T) int {
207
+ t.Helper()
208
+
209
+ conn, err := net.ListenUDP("udp", &net.UDPAddr{IP: net.ParseIP("127.0.0.1"), Port: 0})
210
+ if err != nil {
211
+ t.Fatalf("ListenUDP() error = %v", err)
212
+ }
213
+ defer conn.Close()
214
+
215
+ addr, ok := conn.LocalAddr().(*net.UDPAddr)
216
+ if !ok || addr.Port == 0 {
217
+ t.Fatalf("LocalAddr() = %v, want UDP port", conn.LocalAddr())
218
+ }
219
+ return addr.Port
220
+}
sdk/api_client.go
+8
@@ -161,9 +161,13 @@ func (a *apiClient) ensureCompatible(ctx context.Context, httpClient *http.Clien
161
if err := a.doJSONWithClient(ctx, httpClient, http.MethodGet, types.PathSDKDomain, nil, &resp); err != nil {
162
err = fmt.Errorf("check relay compatibility: %w", err)
163
var netErr net.Error
164
+ var apiErr *types.APIRequestError
165
if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) || errors.As(err, &netErr) {
166
return err
167
}
168
+ if errors.As(err, &apiErr) && apiErr.StatusCode >= 500 {
169
+ return err
170
+ }
171
return fmt.Errorf("%w: %w", errRelayIncompatible, err)
172
}
173
if strings.TrimSpace(resp.Version) != types.SDKProtocolVersion {
@@ -262,6 +266,10 @@ func (a *apiClient) doJSONWithClient(ctx context.Context, httpClient *http.Clien
266
}
267
defer resp.Body.Close()
268
269
+ if resp.StatusCode < http.StatusOK || resp.StatusCode >= http.StatusMultipleChoices {
270
+ return utils.DecodeAPIRequestError(resp)
271
+ }
272
+
273
envelope, err := utils.DecodeAPIEnvelope[json.RawMessage](resp.Body)
274
if err != nil {
275
return fmt.Errorf("decode response: %w", err)
sdk/sdk_test.go
+10
-3
@@ -3,6 +3,7 @@ package sdk
3
import (
4
"context"
5
"encoding/json"
6
+ "errors"
7
"net/http"
8
"net/http/httptest"
9
"sync/atomic"
@@ -428,7 +429,7 @@ func TestNewListenerUDPEnabledKeepsStreamAndDatagram(t *testing.T) {
429
}
430
}
431
431
-func TestListenerWaitDatagramReadyPublishesRelayAddresses(t *testing.T) {
432
+func TestListenerPublishesUDPAddressAfterRegistration(t *testing.T) {
433
server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
434
switch r.URL.Path {
435
case types.PathSDKDomain:
@@ -470,12 +471,18 @@ func TestListenerWaitDatagramReadyPublishesRelayAddresses(t *testing.T) {
471
}
472
defer listener.Close()
473
473
- if err := listener.WaitDatagramReady(context.Background()); err != nil {
474
- t.Fatalf("WaitDatagramReady() error = %v", err)
474
+ if err := listener.WaitRegistered(context.Background()); err != nil {
475
+ t.Fatalf("WaitRegistered() error = %v", err)
476
}
477
if got := listener.UDPAddr(); got != "demo.example.com:29900" {
478
t.Fatalf("UDPAddr() = %q, want %q", got, "demo.example.com:29900")
479
}
480
+
481
+ ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond)
482
+ defer cancel()
483
+ if err := listener.WaitDatagramReady(ctx); !errors.Is(err, context.DeadlineExceeded) {
484
+ t.Fatalf("WaitDatagramReady() error = %v, want %v", err, context.DeadlineExceeded)
485
+ }
486
}
487
488
func writeSDKTestEnvelope[T any](w http.ResponseWriter, status int, envelope types.APIEnvelope[T]) {