diff --git a/testing/internal/e2e/boundary/connect.go b/testing/internal/e2e/boundary/connect.go index ce96f45a54..ba2a24d1dd 100644 --- a/testing/internal/e2e/boundary/connect.go +++ b/testing/internal/e2e/boundary/connect.go @@ -43,3 +43,46 @@ func ConnectCli(t testing.TB, ctx context.Context, targetId string) ConnectCliOu return connectCliOutput } + +// ConnectCliStdoutPipe uses the boundary CLI to establish connection to the target. +// It captures stdout via a pipe, parses proxy details from the command output, and returns them. +// The connection must be closed separately via the `boundary sessions cancel` command +// This implementation works on cross platforms (Windows, Unix, Linux, macOS) - unlike the pty-based version above (Unix, Linux, macOS). +// StdoutPipe only captures stdout, as opposed to pty which is an interactive pseudo-terminal +func ConnectCliStdoutPipe(t testing.TB, ctx context.Context, targetId string) ConnectCliOutput { + cmd := exec.CommandContext(ctx, + "boundary", "connect", + "-target-id", targetId, + "-format", "json", + ) + + // Capture stdout + stdoutPipe, err := cmd.StdoutPipe() + require.NoError(t, err) + + // Start the command + err = cmd.Start() + require.NoError(t, err) + + // Register cleanup to kill the process + t.Cleanup(func() { + if cmd.Process != nil { + _ = cmd.Process.Kill() + } + }) + + // Read the first line of output (JSON with connection info) + scanner := bufio.NewScanner(stdoutPipe) + var outputLine string + if scanner.Scan() { + outputLine = scanner.Text() + } + require.NoError(t, scanner.Err()) + + // Parse the JSON output + var connectOutput ConnectCliOutput + err = json.Unmarshal([]byte(outputLine), &connectOutput) + require.NoError(t, err) + + return connectOutput +}