summaryrefslogtreecommitdiffstats
path: root/src/net/net_fake_test.go
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/net/net_fake_test.go203
1 files changed, 203 insertions, 0 deletions
diff --git a/src/net/net_fake_test.go b/src/net/net_fake_test.go
new file mode 100644
index 0000000..783304d
--- /dev/null
+++ b/src/net/net_fake_test.go
@@ -0,0 +1,203 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//go:build js || wasip1
+
+package net
+
+// GOOS=js and GOOS=wasip1 do not have typical socket networking capabilities
+// found on other platforms. To help run test suites of the stdlib packages,
+// an in-memory "fake network" facility is implemented.
+//
+// The tests in this files are intended to validate the behavior of the fake
+// network stack on these platforms.
+
+import "testing"
+
+func TestFakeConn(t *testing.T) {
+ tests := []struct {
+ name string
+ listen func() (Listener, error)
+ dial func(Addr) (Conn, error)
+ addr func(*testing.T, Addr)
+ }{
+ {
+ name: "Listener:tcp",
+ listen: func() (Listener, error) {
+ return Listen("tcp", ":0")
+ },
+ dial: func(addr Addr) (Conn, error) {
+ return Dial(addr.Network(), addr.String())
+ },
+ addr: testFakeTCPAddr,
+ },
+
+ {
+ name: "ListenTCP:tcp",
+ listen: func() (Listener, error) {
+ // Creating a listening TCP connection with a nil address must
+ // select an IP address on localhost with a random port.
+ // This test verifies that the fake network facility does that.
+ return ListenTCP("tcp", nil)
+ },
+ dial: func(addr Addr) (Conn, error) {
+ // Connecting a listening TCP connection will select a local
+ // address on the local network and connects to the destination
+ // address.
+ return DialTCP("tcp", nil, addr.(*TCPAddr))
+ },
+ addr: testFakeTCPAddr,
+ },
+
+ {
+ name: "ListenUnix:unix",
+ listen: func() (Listener, error) {
+ return ListenUnix("unix", &UnixAddr{Name: "test"})
+ },
+ dial: func(addr Addr) (Conn, error) {
+ return DialUnix("unix", nil, addr.(*UnixAddr))
+ },
+ addr: testFakeUnixAddr("unix", "test"),
+ },
+
+ {
+ name: "ListenUnix:unixpacket",
+ listen: func() (Listener, error) {
+ return ListenUnix("unixpacket", &UnixAddr{Name: "test"})
+ },
+ dial: func(addr Addr) (Conn, error) {
+ return DialUnix("unixpacket", nil, addr.(*UnixAddr))
+ },
+ addr: testFakeUnixAddr("unixpacket", "test"),
+ },
+ }
+
+ for _, test := range tests {
+ t.Run(test.name, func(t *testing.T) {
+ l, err := test.listen()
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer l.Close()
+ test.addr(t, l.Addr())
+
+ c, err := test.dial(l.Addr())
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer c.Close()
+ test.addr(t, c.LocalAddr())
+ test.addr(t, c.RemoteAddr())
+ })
+ }
+}
+
+func TestFakePacketConn(t *testing.T) {
+ tests := []struct {
+ name string
+ listen func() (PacketConn, error)
+ dial func(Addr) (Conn, error)
+ addr func(*testing.T, Addr)
+ }{
+ {
+ name: "ListenPacket:udp",
+ listen: func() (PacketConn, error) {
+ return ListenPacket("udp", ":0")
+ },
+ dial: func(addr Addr) (Conn, error) {
+ return Dial(addr.Network(), addr.String())
+ },
+ addr: testFakeUDPAddr,
+ },
+
+ {
+ name: "ListenUDP:udp",
+ listen: func() (PacketConn, error) {
+ // Creating a listening UDP connection with a nil address must
+ // select an IP address on localhost with a random port.
+ // This test verifies that the fake network facility does that.
+ return ListenUDP("udp", nil)
+ },
+ dial: func(addr Addr) (Conn, error) {
+ // Connecting a listening UDP connection will select a local
+ // address on the local network and connects to the destination
+ // address.
+ return DialUDP("udp", nil, addr.(*UDPAddr))
+ },
+ addr: testFakeUDPAddr,
+ },
+
+ {
+ name: "ListenUnixgram:unixgram",
+ listen: func() (PacketConn, error) {
+ return ListenUnixgram("unixgram", &UnixAddr{Name: "test"})
+ },
+ dial: func(addr Addr) (Conn, error) {
+ return DialUnix("unixgram", nil, addr.(*UnixAddr))
+ },
+ addr: testFakeUnixAddr("unixgram", "test"),
+ },
+ }
+
+ for _, test := range tests {
+ t.Run(test.name, func(t *testing.T) {
+ l, err := test.listen()
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer l.Close()
+ test.addr(t, l.LocalAddr())
+
+ c, err := test.dial(l.LocalAddr())
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer c.Close()
+ test.addr(t, c.LocalAddr())
+ test.addr(t, c.RemoteAddr())
+ })
+ }
+}
+
+func testFakeTCPAddr(t *testing.T, addr Addr) {
+ t.Helper()
+ if a, ok := addr.(*TCPAddr); !ok {
+ t.Errorf("Addr is not *TCPAddr: %T", addr)
+ } else {
+ testFakeNetAddr(t, a.IP, a.Port)
+ }
+}
+
+func testFakeUDPAddr(t *testing.T, addr Addr) {
+ t.Helper()
+ if a, ok := addr.(*UDPAddr); !ok {
+ t.Errorf("Addr is not *UDPAddr: %T", addr)
+ } else {
+ testFakeNetAddr(t, a.IP, a.Port)
+ }
+}
+
+func testFakeNetAddr(t *testing.T, ip IP, port int) {
+ t.Helper()
+ if port == 0 {
+ t.Error("network address is missing port")
+ } else if len(ip) == 0 {
+ t.Error("network address is missing IP")
+ } else if !ip.Equal(IPv4(127, 0, 0, 1)) {
+ t.Errorf("network address has wrong IP: %s", ip)
+ }
+}
+
+func testFakeUnixAddr(net, name string) func(*testing.T, Addr) {
+ return func(t *testing.T, addr Addr) {
+ t.Helper()
+ if a, ok := addr.(*UnixAddr); !ok {
+ t.Errorf("Addr is not *UnixAddr: %T", addr)
+ } else if a.Net != net {
+ t.Errorf("unix address has wrong net: want=%q got=%q", net, a.Net)
+ } else if a.Name != name {
+ t.Errorf("unix address has wrong name: want=%q got=%q", name, a.Name)
+ }
+ }
+}