Skip to content

Commit

Permalink
improving test code to get stability improved - still fails with stress
Browse files Browse the repository at this point in the history
  • Loading branch information
cre4ture committed Aug 19, 2024
1 parent 12a0dd8 commit b1ea9f5
Show file tree
Hide file tree
Showing 2 changed files with 118 additions and 35 deletions.
98 changes: 76 additions & 22 deletions port_forwarder/port_forwarder_tcp_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package port_forwarder

import (
"fmt"
"net"
"testing"
"time"
Expand All @@ -9,19 +10,53 @@ import (
"github.com/stretchr/testify/assert"
)

func startReadToChannel(receiverConn net.Conn) <-chan []byte {
rcv_chan := make(chan []byte, 10)
r := make(chan bool, 1)
go func() {
defer close(rcv_chan)
r <- true
for {
buf := make([]byte, 100)
n, err := receiverConn.Read(buf)
if err != nil {
break
}
rcv_chan <- buf[0:n]
}
}()
<-r
time.Sleep(50 * time.Millisecond)
return rcv_chan
}

func doTestTcpCommunication(
t *testing.T,
msg string,
senderConn net.Conn,
receiverConn net.Conn,
receiverConn <-chan []byte,
) {
var n int = 0
var err error = nil
data_sent := []byte(msg)
n, err := senderConn.Write(data_sent)
assert.Nil(t, err)
assert.Equal(t, n, len(data_sent))

buf := make([]byte, 100)
n, err = receiverConn.Read(buf)
var buf []byte = nil
for {
fmt.Println("sending ...")
t.Log("sending ...")
n, err = senderConn.Write(data_sent)
assert.Nil(t, err)
assert.Equal(t, n, len(data_sent))

fmt.Println("receiving ...")
t.Log("receiving ...")
var ok bool = false
buf, ok = <-receiverConn
if ok {
break
}
}
fmt.Println("DONE")
t.Log("DONE")
assert.Nil(t, err)
assert.Equal(t, n, len(data_sent))
assert.Equal(t, data_sent, buf[:n])
Expand All @@ -48,14 +83,20 @@ func doTestTcpCommunicationFail(

func tcpListenerNAccept(t *testing.T, listener *net.TCPListener, n int) <-chan net.Conn {
c := make(chan net.Conn, 1)
r := make(chan bool, 1)
go func() {
defer close(c)
r <- true
for range n {
conn, err := listener.Accept()
assert.Nil(t, err)
c <- conn
}
}()

<-r
time.Sleep(50 * time.Millisecond)

return c
}

Expand Down Expand Up @@ -95,27 +136,30 @@ port_forwarding:

client1_conn, err := net.DialTCP("tcp", nil, client_conn_addr)
assert.Nil(t, err)
client1_rcv_chan := startReadToChannel(client1_conn)
client1_server_side_conn := <-server_listen_conn_accepts
client1_server_side_rcv_chan := startReadToChannel(client1_server_side_conn)

client2_conn, err := net.DialTCP("tcp", nil, client_conn_addr)
assert.Nil(t, err)
client2_rcv_chan := startReadToChannel(client2_conn)
client2_server_side_conn := <-server_listen_conn_accepts
assert.Nil(t, err)
client2_server_side_rcv_chan := startReadToChannel(client2_server_side_conn)

doTestTcpCommunication(t, "Hello from client 1 side!",
client1_conn, client1_server_side_conn)
client1_conn, client1_server_side_rcv_chan)
doTestTcpCommunication(t, "Hello from client two side!",
client2_conn, client2_server_side_conn)
client2_conn, client2_server_side_rcv_chan)

doTestTcpCommunication(t, "Hello from server first side!",
client1_server_side_conn, client1_conn)
client1_server_side_conn, client1_rcv_chan)
doTestTcpCommunication(t, "Hello from server second side!",
client2_server_side_conn, client2_conn)
client2_server_side_conn, client2_rcv_chan)
doTestTcpCommunication(t, "Hello from server third side!",
client1_server_side_conn, client1_conn)
client1_server_side_conn, client1_rcv_chan)

doTestTcpCommunication(t, "Hello from client two side AGAIN!",
client2_conn, client2_server_side_conn)
client2_conn, client2_server_side_rcv_chan)

}

Expand Down Expand Up @@ -155,26 +199,31 @@ port_forwarding:

server_listen_conn, err := net.ListenTCP("tcp", server_conn_addr)
assert.Nil(t, err)
defer server_listen_conn.Close()

server_listen_conn_accepts := tcpListenerNAccept(t, server_listen_conn, 1)

time.Sleep(100 * time.Millisecond)

client1_conn, err := net.DialTCP("tcp", nil, client_conn_addr)
assert.Nil(t, err)
defer client1_conn.Close()
client1_rcv_chan := startReadToChannel(client1_conn)

client1_server_side_conn := <-server_listen_conn_accepts
defer client1_server_side_conn.Close()
client1_server_side_rcv_chan := startReadToChannel(client1_server_side_conn)

doTestTcpCommunication(t, "Hello from client 1 side!",
client1_conn, client1_server_side_conn)
client1_conn, client1_server_side_rcv_chan)

doTestTcpCommunication(t, "Hello from server first side!",
client1_server_side_conn, client1_conn)
client1_server_side_conn, client1_rcv_chan)
doTestTcpCommunication(t, "Hello from server third side!",
client1_server_side_conn, client1_conn)
client1_server_side_conn, client1_rcv_chan)

doTestTcpCommunication(t, "Hello from client one side AGAIN!",
client1_conn, client1_server_side_conn)
client1_conn, client1_server_side_rcv_chan)

new_server_fwd_list, err := loadPortFwdConfigFromString(sl, `
port_forwarding:
Expand Down Expand Up @@ -247,23 +296,28 @@ port_forwarding:

server_listen_conn, err := net.ListenTCP("tcp", server_conn_addr)
assert.Nil(t, err)
defer server_listen_conn.Close()
server_listen_conn_accepts := tcpListenerNAccept(t, server_listen_conn, 1)

client1_conn, err := net.DialTCP("tcp", nil, client_conn_addr)
assert.Nil(t, err)
defer client1_conn.Close()
client1_rcv_chan := startReadToChannel(client1_conn)

client1_server_side_conn := <-server_listen_conn_accepts
defer client1_server_side_conn.Close()
client1_server_side_rcv_chan := startReadToChannel(client1_server_side_conn)

doTestTcpCommunication(t, "Hello from client 1 side!",
client1_conn, client1_server_side_conn)
client1_conn, client1_server_side_rcv_chan)

doTestTcpCommunication(t, "Hello from server first side!",
client1_server_side_conn, client1_conn)
client1_server_side_conn, client1_rcv_chan)
doTestTcpCommunication(t, "Hello from server third side!",
client1_server_side_conn, client1_conn)
client1_server_side_conn, client1_rcv_chan)

doTestTcpCommunication(t, "Hello from client one side AGAIN!",
client1_conn, client1_server_side_conn)
client1_conn, client1_server_side_rcv_chan)

new_server_fwd_list, err := loadPortFwdConfigFromString(sl, `
port_forwarding:
Expand Down
55 changes: 42 additions & 13 deletions port_forwarder/port_forwarder_udp_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@ func doTestUdpCommunication(
msg string,
senderConn *net.UDPConn,
toAddr net.Addr,
receiverConn *net.UDPConn,
) (senderAddr net.Addr) {
receiverConn <-chan Pair[[]byte, net.Addr],
) net.Addr {
data_sent := []byte(msg)
var n int
var err error
Expand All @@ -68,12 +68,33 @@ func doTestUdpCommunication(
assert.Nil(t, err)
assert.Equal(t, n, len(data_sent))

buf := make([]byte, 100)
n, senderAddr, err = receiverConn.ReadFrom(buf)
pair := <-receiverConn
assert.Nil(t, err)
assert.Equal(t, n, len(data_sent))
assert.Equal(t, data_sent, buf[:n])
return
assert.Equal(t, data_sent, pair.a)
return pair.b
}

type Pair[A any, B any] struct {
a A
b B
}

func readUdpConnectionToChannel(conn *net.UDPConn) <-chan Pair[[]byte, net.Addr] {
rcv_chan := make(chan Pair[[]byte, net.Addr])

go func() {
defer close(rcv_chan)
for {
buf := make([]byte, 100)
n, addr, err := conn.ReadFrom(buf)
if err != nil {
return
}
rcv_chan <- Pair[[]byte, net.Addr]{buf[0:n], addr}
}
}()

return rcv_chan
}

func TestUdpInOut2Clients(t *testing.T) {
Expand Down Expand Up @@ -108,26 +129,34 @@ port_forwarding:

server_listen_conn, err := net.ListenUDP("udp", server_conn_addr)
assert.Nil(t, err)
defer server_listen_conn.Close()
server_listen_rcv_chan := readUdpConnectionToChannel(server_listen_conn)

client1_conn, err := net.DialUDP("udp", nil, client_conn_addr)
assert.Nil(t, err)
defer client1_conn.Close()
client1_rcv_chan := readUdpConnectionToChannel(client1_conn)

client2_conn, err := net.DialUDP("udp", nil, client_conn_addr)
assert.Nil(t, err)
defer client2_conn.Close()
client2_rcv_chan := readUdpConnectionToChannel(client2_conn)

client1_addr := doTestUdpCommunication(t, "Hello from client 1 side!",
client1_conn, nil, server_listen_conn)
client1_conn, nil, server_listen_rcv_chan)
assert.NotNil(t, client1_addr)
client2_addr := doTestUdpCommunication(t, "Hello from client two side!",
client2_conn, nil, server_listen_conn)
client2_conn, nil, server_listen_rcv_chan)
assert.NotNil(t, client2_addr)

doTestUdpCommunication(t, "Hello from server first side!",
server_listen_conn, client1_addr, client1_conn)
server_listen_conn, client1_addr, client1_rcv_chan)
doTestUdpCommunication(t, "Hello from server second side!",
server_listen_conn, client2_addr, client2_conn)
server_listen_conn, client2_addr, client2_rcv_chan)
doTestUdpCommunication(t, "Hello from server third side!",
server_listen_conn, client1_addr, client1_conn)
server_listen_conn, client1_addr, client1_rcv_chan)

doTestUdpCommunication(t, "Hello from client two side AGAIN!",
client2_conn, nil, server_listen_conn)
client2_conn, nil, server_listen_rcv_chan)

}

0 comments on commit b1ea9f5

Please sign in to comment.