forked from microsoft/go-mssqldb
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnet_test.go
More file actions
129 lines (109 loc) · 3.2 KB
/
net_test.go
File metadata and controls
129 lines (109 loc) · 3.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
121
122
123
124
125
126
127
128
129
package mssql
import (
"bytes"
"errors"
"net"
"testing"
"time"
)
// mockConn implements a basic net.Conn for testing
type mockConn struct {
*bytes.Buffer
closed bool
}
func (m *mockConn) Close() error {
m.closed = true
return nil
}
func (m *mockConn) LocalAddr() net.Addr { return nil }
func (m *mockConn) RemoteAddr() net.Addr { return nil }
func (m *mockConn) SetDeadline(t time.Time) error { return nil }
func (m *mockConn) SetReadDeadline(t time.Time) error { return nil }
func (m *mockConn) SetWriteDeadline(t time.Time) error { return nil }
// errorConn is a mock that always returns errors
type errorConn struct {
mockConn
}
func (e *errorConn) Write(b []byte) (int, error) {
return 0, errors.New("mock write error")
}
func TestTlsHandshakeConn_FinishPacket(t *testing.T) {
tests := []struct {
name string
packetPending bool
wantFinished bool
wantData []byte // Expected data written to buffer
}{
{
name: "no pending packet",
packetPending: false,
wantFinished: false,
wantData: nil,
},
{
name: "pending packet success",
packetPending: true,
wantFinished: true,
wantData: []byte{byte(packPrelogin), 1, 0, 8, 0, 0, 1, 0}, // Header for empty packet
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// Create a mock connection with a buffer
mockConn := &mockConn{Buffer: &bytes.Buffer{}}
buf := newTdsBuffer(defaultPacketSize, mockConn)
conn := &tlsHandshakeConn{
buf: buf,
packetPending: tt.packetPending,
}
// If we expect a pending packet, begin one
if tt.packetPending {
buf.BeginPacket(packPrelogin, false)
}
finished, err := conn.FinishPacket()
if err != nil {
t.Errorf("FinishPacket() unexpected error = %v", err)
}
if finished != tt.wantFinished {
t.Errorf("FinishPacket() finished = %v, want %v", finished, tt.wantFinished)
}
// Verify packetPending is cleared after successful finish
if tt.packetPending && conn.packetPending {
t.Error("FinishPacket() did not clear packetPending flag")
}
// Check if correct data was written
if tt.wantData != nil {
written := mockConn.Bytes()
if !bytes.Equal(written, tt.wantData) {
t.Errorf("FinishPacket() wrote %v, want %v", written, tt.wantData)
}
}
})
}
}
func TestTlsHandshakeConn_FinishPacket_Error(t *testing.T) {
// Test error handling when buf.FinishPacket() fails
errorConn := &errorConn{mockConn{Buffer: &bytes.Buffer{}}}
buf := newTdsBuffer(defaultPacketSize, errorConn)
conn := &tlsHandshakeConn{
buf: buf,
packetPending: true,
}
// Begin a packet
buf.BeginPacket(packPrelogin, false)
finished, err := conn.FinishPacket()
if err == nil {
t.Error("FinishPacket() expected error but got nil")
}
if finished {
t.Error("FinishPacket() should return false on error")
}
// Verify packetPending is NOT cleared on error
if !conn.packetPending {
t.Error("FinishPacket() should NOT clear packetPending on error")
}
// Verify error wrapping
if err != nil && err.Error() != "cannot send handshake packet: mock write error" {
t.Errorf("FinishPacket() error = %v, want proper error wrapping", err)
}
}