Skip to content

Commit cb481ce

Browse files
authored
Merge pull request #16 from coder/bcpeinhardt/mockpty-test-setup
mockpty e2e test setup
2 parents cdde70d + cc51a42 commit cb481ce

File tree

3 files changed

+107
-5
lines changed

3 files changed

+107
-5
lines changed

Makefile

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,18 @@ build-all:
3636
@echo "Binaries are in the '$(BUILD_DIR)' directory:"
3737
@ls -la $(BUILD_DIR)/
3838

39-
# Run tests
39+
# Run tests (needs sudo for E2E tests)
4040
.PHONY: test
4141
test:
4242
@echo "Running tests..."
43-
go test -v -race ./...
43+
sudo go test -v -race ./...
4444
@echo "✓ All tests passed!"
4545

46-
# Run tests with coverage
46+
# Run tests with coverage (needs sudo for E2E tests)
4747
.PHONY: test-coverage
4848
test-coverage:
4949
@echo "Running tests with coverage..."
50-
go test -v -race -coverprofile=coverage.out ./...
50+
sudo go test -v -race -coverprofile=coverage.out ./...
5151
go tool cover -html=coverage.out -o coverage.html
5252
@echo "✓ Coverage report generated: coverage.html"
5353

cli/cli_test.go

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package cli
2+
3+
import (
4+
"os"
5+
"strings"
6+
"testing"
7+
8+
"github.com/coder/serpent"
9+
)
10+
11+
func ensureRoot(t *testing.T) {
12+
t.Helper()
13+
if os.Getgid() != 0 {
14+
t.Skip("skipping test because no root privileges")
15+
}
16+
}
17+
18+
// MockPTY provides a simple mock for PTY-like testing
19+
// This is a simplified version inspired by coder/coder's ptytest.
20+
type MockPTY struct {
21+
t *testing.T
22+
stdout strings.Builder
23+
stderr strings.Builder
24+
}
25+
26+
// NewMockPTY creates a new mock PTY for testing
27+
func NewMockPTY(t *testing.T) *MockPTY {
28+
return &MockPTY{t: t}
29+
}
30+
31+
func (m *MockPTY) Attach(inv *serpent.Invocation) {
32+
inv.Stdout = &m.stdout
33+
inv.Stderr = &m.stderr
34+
}
35+
36+
func (m *MockPTY) Stdout() string {
37+
return m.stdout.String()
38+
}
39+
40+
func (m *MockPTY) Stderr() string {
41+
return m.stderr.String()
42+
}
43+
44+
func (m *MockPTY) Clear() {
45+
m.stdout = strings.Builder{}
46+
m.stderr = strings.Builder{}
47+
}
48+
49+
func (m *MockPTY) ExpectMatch(content string) {
50+
if !strings.Contains(m.stdout.String(), content) {
51+
m.t.Fatalf("expected \"%s\", got: %s", content, m.stdout.String())
52+
}
53+
}
54+
55+
func (m *MockPTY) ExpectError(content string) {
56+
if !strings.Contains(m.stderr.String(), content) {
57+
m.t.Fatalf("expected error with \"%s\", got: %s", content, m.stderr.String())
58+
}
59+
}
60+
61+
func (m *MockPTY) RequireError() {
62+
if m.stderr.String() == "" {
63+
m.t.Fatal("expected error")
64+
}
65+
}
66+
67+
func (m *MockPTY) RequireNoError() {
68+
if m.stderr.String() != "" {
69+
m.t.Fatalf("expected nothing in stderr, but got: %s", m.stderr.String())
70+
}
71+
}
72+
73+
func TestPtySetupWorks(t *testing.T) {
74+
cmd := NewCommand()
75+
inv := cmd.Invoke("--help")
76+
77+
pty := NewMockPTY(t)
78+
pty.Attach(inv)
79+
80+
if err := inv.Run(); err != nil {
81+
t.Fatalf("could not run with simple --help arg: %v", err)
82+
}
83+
84+
pty.RequireNoError()
85+
pty.ExpectMatch("Monitor and restrict HTTP/HTTPS requests from processes")
86+
}
87+
88+
func TestCurlGithub(t *testing.T) {
89+
ensureRoot(t)
90+
91+
cmd := NewCommand()
92+
inv := cmd.Invoke("--allow", "\"github.com\"", "--", "curl", "https://github.com")
93+
94+
pty := NewMockPTY(t)
95+
pty.Attach(inv)
96+
97+
if err := inv.Run(); err != nil {
98+
t.Fatalf("error curling github: %v", err)
99+
}
100+
101+
pty.RequireNoError()
102+
}

tls/tls.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ func (cm *CertificateManager) generateCA(keyPath, certPath string) error {
175175
// Create config directory if it doesn't exist
176176
err := os.MkdirAll(cm.configDir, 0700)
177177
if err != nil {
178-
return fmt.Errorf("failed to create config directory: %v", err)
178+
return fmt.Errorf("failed to create config directory at %s: %v", cm.configDir, err)
179179
}
180180

181181
// When running under sudo, ensure the directory is owned by the original user

0 commit comments

Comments
 (0)