Improving Testing Documentation & Coverage Starting With Inbound Version Negotiation
This commit is contained in:
parent
f537fb4f76
commit
6d449e230f
|
@ -0,0 +1,112 @@
|
|||
package goricochet
|
||||
|
||||
import (
|
||||
"io"
|
||||
"net"
|
||||
"testing"
|
||||
"github.com/s-rah/go-ricochet/utils"
|
||||
)
|
||||
|
||||
func TestBadProtcolLength(t *testing.T) {
|
||||
|
||||
connect := func() {
|
||||
conn, err := net.Dial("tcp", ":4000")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
conn.Write([]byte{0x49, 0x4D})
|
||||
}
|
||||
|
||||
l, err := net.Listen("tcp", ":4000")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer l.Close()
|
||||
go connect()
|
||||
conn, err := l.Accept()
|
||||
_, err = NegotiateVersionInbound(conn)
|
||||
if err != io.ErrUnexpectedEOF {
|
||||
t.Errorf("Invalid Error Received. Expected ErrUnexpectedEOF. Got %v", err)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestNoSupportedVersions(t *testing.T) {
|
||||
|
||||
connect := func() {
|
||||
conn, err := net.Dial("tcp", ":4000")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
conn.Write([]byte{0x49, 0x4D, 0x00, 0xFF})
|
||||
}
|
||||
|
||||
l, err := net.Listen("tcp", ":4000")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer l.Close()
|
||||
go connect()
|
||||
conn, err := l.Accept()
|
||||
_, err = NegotiateVersionInbound(conn)
|
||||
if err != utils.VersionNegotiationError {
|
||||
t.Errorf("Invalid Error Received. Expected VersionNegotiationError. Got %v", err)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestInvalidVersionList(t *testing.T) {
|
||||
|
||||
connect := func() {
|
||||
conn, err := net.Dial("tcp", ":4000")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
conn.Write([]byte{0x49, 0x4D, 0x01})
|
||||
}
|
||||
|
||||
l, err := net.Listen("tcp", ":4000")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer l.Close()
|
||||
go connect()
|
||||
conn, err := l.Accept()
|
||||
_, err = NegotiateVersionInbound(conn)
|
||||
if err != utils.VersionNegotiationError {
|
||||
t.Errorf("Invalid Error Received. Expected VersionNegotiationError. Got %v", err)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestNoCompatibleVersions(t *testing.T) {
|
||||
|
||||
connect := func() {
|
||||
conn, err := net.Dial("tcp", ":4000")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
conn.Write([]byte{0x49, 0x4D, 0x01, 0xFF})
|
||||
}
|
||||
|
||||
l, err := net.Listen("tcp", ":4000")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer l.Close()
|
||||
go connect()
|
||||
conn, err := l.Accept()
|
||||
_, err = NegotiateVersionInbound(conn)
|
||||
if err != utils.VersionNegotiationFailed {
|
||||
t.Errorf("Invalid Error Received. Expected VersionNegotiationFailed. Got %v", err)
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
# Ricochet Testing Specification
|
||||
|
||||
This documents outlines each scenario this library must correctly handle and
|
||||
links it to the automated test that exercises that functionality.
|
||||
|
||||
We separate this document into two sections, one for inbound connections, and the
|
||||
other for outbound connections.
|
||||
|
||||
# Inbound
|
||||
|
||||
## Version Negotiation
|
||||
|
||||
File: [ricochet_test.go](./inbound_version_negotiation_test.go)
|
||||
|
||||
### Invalid Protocol
|
||||
|
||||
If the inbound listener receives:
|
||||
|
||||
* Less than 4 bytes (`TestBadProtcolLength`)
|
||||
* The first 2 bytes are not equal ot 0x49 and 0x4D
|
||||
* A number of supported Versions < 1 (`TestNoSupportedVersions`, `TestInvalidVersionList`)
|
||||
|
||||
Then it must close the connection.
|
||||
|
||||
### No Compatible Version Found
|
||||
|
||||
If the inbound listener does not receive a compatible version in the list of
|
||||
supported versions. Then is must close the connection. `TestNoCompatibleVersions`
|
||||
|
||||
### Successful Version Negotiation
|
||||
|
||||
Assuming the inbound listener receives a valid protocol message, and that message
|
||||
contains a known supported version. Then the connection should remain open.
|
||||
|
||||
# Outbound
|
Reference in New Issue