| 17 | type GetAddr = func(t testing.TB, endpoint string) (host string, port string, fullAddr string) |
| 18 | |
| 19 | func UseDynamicPorts(ctx context.Context, t testing.TB, r Registry) GetAddr { |
| 20 | t.Helper() |
| 21 | |
| 22 | listenDir := t.TempDir() |
| 23 | readListenFile := fmt.Sprintf("%s/read.addr", listenDir) |
| 24 | writeListenFile := fmt.Sprintf("%s/write.addr", listenDir) |
| 25 | metricsListenFile := fmt.Sprintf("%s/metrics.addr", listenDir) |
| 26 | oplListenFile := fmt.Sprintf("%s/opl.addr", listenDir) |
| 27 | |
| 28 | require.NoError(t, r.Config(ctx).Set(config.KeyReadAPIPort, 0)) |
| 29 | require.NoError(t, r.Config(ctx).Set(config.KeyReadAPIListenFile, "file://"+readListenFile)) |
| 30 | require.NoError(t, r.Config(ctx).Set(config.KeyWriteAPIPort, 0)) |
| 31 | require.NoError(t, r.Config(ctx).Set(config.KeyWriteAPIListenFile, "file://"+writeListenFile)) |
| 32 | require.NoError(t, r.Config(ctx).Set(config.KeyMetricsPort, 0)) |
| 33 | require.NoError(t, r.Config(ctx).Set(config.KeyMetricsListenFile, "file://"+metricsListenFile)) |
| 34 | require.NoError(t, r.Config(ctx).Set(config.KeyOPLSyntaxAPIPort, 0)) |
| 35 | require.NoError(t, r.Config(ctx).Set(config.KeyOPLSyntaxListenFile, "file://"+oplListenFile)) |
| 36 | |
| 37 | return func(t testing.TB, endpoint string) (string, string, string) { |
| 38 | fp := "" |
| 39 | switch endpoint { |
| 40 | case "read": |
| 41 | fp = readListenFile |
| 42 | case "write": |
| 43 | fp = writeListenFile |
| 44 | case "metrics": |
| 45 | fp = metricsListenFile |
| 46 | case "opl": |
| 47 | fp = oplListenFile |
| 48 | default: |
| 49 | t.Fatalf("unknown endpoint: %q", endpoint) |
| 50 | } |
| 51 | |
| 52 | var addr []byte |
| 53 | var host, port string |
| 54 | |
| 55 | require.EventuallyWithT(t, func(t *assert.CollectT) { |
| 56 | var err error |
| 57 | addr, err = os.ReadFile(fp) |
| 58 | require.NotEmpty(t, addr) |
| 59 | require.NoError(t, err) |
| 60 | host, port, err = net.SplitHostPort(string(addr)) |
| 61 | require.NoError(t, err) |
| 62 | require.NotEmpty(t, host) |
| 63 | require.NotEmpty(t, port) |
| 64 | }, 2*time.Second, 10*time.Millisecond) |
| 65 | |
| 66 | return host, port, string(addr) |
| 67 | } |
| 68 | } |