e2e: add TCP test

This commit is contained in:
Aleksandr Razumov
2018-08-12 00:30:59 +03:00
parent ba6aa03b7d
commit 75733f5024
2 changed files with 92 additions and 1 deletions

View File

@@ -108,4 +108,95 @@ func main() {
if err := client.Close(); err != nil {
log.Fatalln("failed to close client:", err)
}
// Trying to use TCP.
var (
tcpAddr *net.TCPAddr
)
fmt.Println("TCP START")
for i := 0; i < 10; i++ {
tcpAddr, err = net.ResolveTCPAddr("tcp", fmt.Sprintf("stun-server:%d", stun.DefaultPort))
if err == nil {
break
}
time.Sleep(time.Millisecond * 300 * time.Duration(i))
}
if err != nil {
log.Fatalln("too many attempts to resolve:", err)
}
tcpConn, err := net.DialTCP("tcp", nil, tcpAddr)
if err != nil {
log.Fatalln("failed to dial:", err)
}
tcpLocalAddr := tcpConn.LocalAddr()
fmt.Println("TCP LISTEN ON", tcpConn.LocalAddr(), "TO", tcpConn.RemoteAddr())
client, err = stun.NewClient(stun.ClientOptions{
Connection: tcpConn,
})
if err != nil {
log.Fatalln("failed to create tcp client:", err)
}
// First request should error.
request, err = stun.Build(stun.BindingRequest, stun.TransactionID, stun.Fingerprint)
if err != nil {
log.Fatalln("failed to build:", err)
}
if err = client.Do(request, func(event stun.Event) {
if event.Error != nil {
log.Fatalln("got event with error:", event.Error)
}
response := event.Message
if response.Type != stun.BindingError {
log.Fatalln("bad message", response)
}
var errCode stun.ErrorCodeAttribute
if codeErr := errCode.GetFrom(response); codeErr != nil {
log.Fatalln("failed to get error code:", codeErr)
}
if errCode.Code != stun.CodeUnauthorised {
log.Fatalln("unexpected error code:", errCode)
}
if parseErr := response.Parse(&nonce, &realm); parseErr != nil {
log.Fatalln("failed to parse:", parseErr)
}
fmt.Println("Got nonce", nonce, "and realm", realm)
}); err != nil {
log.Fatalln("failed to Do:", err)
}
// Authenticating and sending second request.
request, err = stun.Build(stun.TransactionID, stun.BindingRequest,
stun.NewUsername(username), nonce, realm,
stun.NewLongTermIntegrity(username, realm.String(), password),
stun.Fingerprint,
)
if err != nil {
log.Fatalln(err)
}
if err = client.Do(request, func(event stun.Event) {
if event.Error != nil {
log.Fatalln("got event with error:", event.Error)
}
response := event.Message
if response.Type != stun.BindingSuccess {
var errCode stun.ErrorCodeAttribute
if codeErr := errCode.GetFrom(response); codeErr != nil {
log.Fatalln("failed to get error code:", codeErr)
}
log.Fatalln("bad message", response, errCode)
}
var xorMapped stun.XORMappedAddress
if err = response.Parse(&xorMapped); err != nil {
log.Fatalln("failed to parse xor mapped address:", err)
}
if tcpLocalAddr.String() != xorMapped.String() {
log.Fatalln(tcpLocalAddr, "!=", xorMapped)
}
fmt.Println("OK", response, "GOT", xorMapped)
}); err != nil {
log.Fatalln("failed to Do:", err)
}
if err := client.Close(); err != nil {
log.Fatalln("failed to close client:", err)
}
}

View File

@@ -55,7 +55,7 @@ realm=realm
# Uncomment if no TCP client listener is desired.
# By default TCP client listener is always started.
#
no-tcp
# no-tcp
# Uncomment if no TLS client listener is desired.
# By default TLS client listener is always started.