Improving Testing Documentation & Coverage Starting With Inbound Version Negotiation

This commit is contained in:
Sarah Jamie Lewis 2018-01-01 10:55:59 -08:00
parent f537fb4f76
commit 6d449e230f
2 changed files with 147 additions and 0 deletions

View File

@ -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)
}
}

35
testing.md Normal file
View File

@ -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