-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathproxy_test.go
More file actions
120 lines (104 loc) · 2.2 KB
/
proxy_test.go
File metadata and controls
120 lines (104 loc) · 2.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package pgmux
import (
"context"
"fmt"
"net"
"testing"
"time"
)
// mockRouter implements Router for testing
type mockRouter struct {
routes map[string]*BackendConfig
}
func (m *mockRouter) Route(ctx context.Context, username string) (*BackendConfig, error) {
if config, ok := m.routes[username]; ok {
return config, nil
}
return nil, ErrUserNotFound
}
func TestProxyServerStart(t *testing.T) {
router := &mockRouter{
routes: map[string]*BackendConfig{
"test_user": {
Host: "localhost",
Port: 5432,
User: "postgres",
},
},
}
proxy := NewProxyServer("127.0.0.1:0", router) // Use port 0 for random port
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// Start proxy in background
errChan := make(chan error, 1)
go func() {
errChan <- proxy.Start(ctx)
}()
// Give proxy time to start
time.Sleep(100 * time.Millisecond)
// Try to connect
conn, err := net.Dial("tcp", proxy.listenAddr)
if err == nil {
conn.Close()
t.Error("Expected connection to fail without proper PostgreSQL handshake")
}
// Shutdown
cancel()
select {
case err := <-errChan:
if err != nil {
t.Errorf("Start() returned error: %v", err)
}
case <-time.After(1 * time.Second):
t.Error("Proxy didn't shut down in time")
}
}
func TestProxyServerInvalidPort(t *testing.T) {
router := &mockRouter{}
proxy := NewProxyServer("invalid:port", router)
ctx := context.Background()
err := proxy.Start(ctx)
if err == nil {
t.Error("Expected error for invalid listen address")
}
}
func TestIsConnectionClosed(t *testing.T) {
tests := []struct {
name string
err error
expected bool
}{
{
name: "nil error",
err: nil,
expected: false,
},
{
name: "regular error",
err: fmt.Errorf("some error"),
expected: false,
},
{
name: "read op error",
err: &net.OpError{
Op: "read",
},
expected: true,
},
{
name: "write op error",
err: &net.OpError{
Op: "write",
},
expected: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := isConnectionClosed(tt.err)
if result != tt.expected {
t.Errorf("expected %v, got %v", tt.expected, result)
}
})
}
}