forked from mdlayher/vsock
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconn_linux_test.go
More file actions
114 lines (94 loc) · 2.33 KB
/
conn_linux_test.go
File metadata and controls
114 lines (94 loc) · 2.33 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
//+build linux
package vsock
import (
"errors"
"os"
"reflect"
"testing"
"golang.org/x/sys/unix"
)
func Test_dialStreamLinuxHandleError(t *testing.T) {
var closed bool
lfd := &testFD{
// Track when fd.Close is called.
close: func() error {
closed = true
return nil
},
// Always return an error on connect.
connect: func(sa unix.Sockaddr) error {
return errors.New("error during connect")
},
}
if _, err := dialStreamLinuxHandleError(lfd, 0, 0); err == nil {
t.Fatal("expected an error, but none occurred")
}
if want, got := true, closed; want != got {
t.Fatalf("unexpected socket close value:\n- want: %v\n- got: %v",
want, got)
}
}
func Test_dialStreamLinuxFull(t *testing.T) {
const (
localFD uintptr = 10
localCID uint32 = 3
localPort uint32 = 1024
remoteCID uint32 = ContextIDHost
remotePort uint32 = 2048
)
lsa := &unix.SockaddrVM{
CID: localCID,
Port: localPort,
}
rsa := &unix.SockaddrVM{
CID: remoteCID,
Port: remotePort,
}
lfd := &testFD{
connect: func(sa unix.Sockaddr) error {
if want, got := rsa, sa; !reflect.DeepEqual(want, got) {
t.Fatalf("unexpected connect sockaddr:\n- want: %#v\n- got: %#v",
want, got)
}
return nil
},
getsockname: func() (unix.Sockaddr, error) {
return lsa, nil
},
newFile: func(name string) *os.File {
return os.NewFile(localFD, name)
},
setNonblock: func(nonblocking bool) error {
if want, got := true, nonblocking; !reflect.DeepEqual(want, got) {
t.Fatalf("unexpected set nonblocking value:\n- want: %#v\n- got: %#v",
want, got)
}
return nil
},
}
nc, err := dialStreamLinux(lfd, remoteCID, remotePort)
if err != nil {
t.Fatalf("failed to dial: %v", err)
}
c := nc.(*conn)
localAddr := &Addr{
ContextID: localCID,
Port: localPort,
}
if want, got := localAddr, c.LocalAddr(); !reflect.DeepEqual(want, got) {
t.Fatalf("unexpected conn local address:\n- want: %#v\n- got: %#v",
want, got)
}
remoteAddr := &Addr{
ContextID: remoteCID,
Port: remotePort,
}
if want, got := remoteAddr, c.RemoteAddr(); !reflect.DeepEqual(want, got) {
t.Fatalf("unexpected conn remote address:\n- want: %#v\n- got: %#v",
want, got)
}
if want, got := localFD, c.file.Fd(); want != got {
t.Fatalf("unexpected conn file descriptor:\n- want: %d\n- got: %d",
want, got)
}
}