mirror of
https://github.com/gortc/stun.git
synced 2025-09-26 20:41:36 +08:00
e2e: add TCP test
This commit is contained in:
91
e2e/main.go
91
e2e/main.go
@@ -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)
|
||||
}
|
||||
}
|
||||
|
@@ -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.
|
||||
|
Reference in New Issue
Block a user