From 7e9aee07143d1dcdbf16a827b7fac060f4ae74a1 Mon Sep 17 00:00:00 2001 From: Hayden Parker Date: Fri, 12 Feb 2016 00:21:27 -0800 Subject: [PATCH] router address tests --- lib/common/router_address.go | 38 ++++++++------ lib/common/router_address_test.go | 85 +++++++++++++++++++++++++++++++ lib/common/string.go | 2 +- lib/common/string_test.go | 4 +- 4 files changed, 111 insertions(+), 18 deletions(-) diff --git a/lib/common/router_address.go b/lib/common/router_address.go index f77b572..0adee98 100644 --- a/lib/common/router_address.go +++ b/lib/common/router_address.go @@ -11,7 +11,7 @@ type RouterAddress []byte // encountered parsing the RouterAddress. // func (router_address RouterAddress) Cost() (cost int, err error) { - verr, exit := router_address.checkRouterAddressValid() + verr, exit := router_address.checkValid() err = verr if exit { return @@ -25,12 +25,12 @@ func (router_address RouterAddress) Cost() (cost int, err error) { // encountered parsing the RouterAddress. // func (router_address RouterAddress) Expiration() (date Date, err error) { - verr, exit := router_address.checkRouterAddressValid() + verr, exit := router_address.checkValid() err = verr if exit { return } - copy(router_address[1:8], date[:]) + copy(date[:], router_address[1:9]) return } @@ -40,7 +40,7 @@ func (router_address RouterAddress) Expiration() (date Date, err error) { // // func (router_address RouterAddress) TransportStyle() (str String, err error) { - verr, exit := router_address.checkRouterAddressValid() + verr, exit := router_address.checkValid() err = verr if exit { return @@ -54,7 +54,7 @@ func (router_address RouterAddress) TransportStyle() (str String, err error) { // RouterAddress and any parsing errors. // func (router_address RouterAddress) Options() (mapping Mapping, err error) { - verr, exit := router_address.checkRouterAddressValid() + verr, exit := router_address.checkValid() err = verr if exit { return @@ -71,14 +71,13 @@ func (router_address RouterAddress) Options() (mapping Mapping, err error) { // Check if the RouterAddress is empty or if it is too small // to contain valid data // -func (router_address RouterAddress) checkRouterAddressValid() (err error, exit bool) { +func (router_address RouterAddress) checkValid() (err error, exit bool) { addr_len := len(router_address) exit = false - if len(router_address) == 0 { + if addr_len == 0 { err = errors.New("error parsing RouterAddress: no data") exit = true - } - if addr_len < 9 { + } else if addr_len < 9 { err = errors.New("warning parsing RouterAddress: data too small") } return @@ -90,14 +89,23 @@ func (router_address RouterAddress) checkRouterAddressValid() (err error, exit b // func ReadRouterAddress(data []byte) (router_address RouterAddress, remainder []byte, err error) { test_address := RouterAddress(data) - err, _ = test_address.checkRouterAddressValid() + err, _ = test_address.checkValid() if err != nil { return } - ops, rerr := test_address.Options() - err = rerr - ops_len := len(ops) - router_address = RouterAddress(data[:9+ops_len]) - remainder = data[9+ops_len:] + router_address = append(router_address, data[:9]...) + str, remainder, err := ReadString(data[9:]) + if err != nil { + return + } + router_address = append(router_address, str...) + map_size := 0 + mapping := make([]byte, 0) + if len(remainder) >= 2 { + map_size = Integer(remainder[:2]) + mapping = remainder[:map_size+2] + router_address = append(router_address, mapping...) + } + remainder = data[9+len(str)+len(mapping):] return } diff --git a/lib/common/router_address_test.go b/lib/common/router_address_test.go index 805d0c7..3b05e85 100644 --- a/lib/common/router_address_test.go +++ b/lib/common/router_address_test.go @@ -1 +1,86 @@ package common + +import ( + "bytes" + "testing" +) + +func TestCheckValidReportsEmptySlice(t *testing.T) { + router_address := RouterAddress([]byte{}) + err, exit := router_address.checkValid() + if err == nil || err.Error() != "error parsing RouterAddress: no data" { + t.Fatal("incorrect error returned by checkValid:", err) + } + if exit != true { + t.Fatal("checkValid did not indicate to stop parsing on empty slice") + } +} + +func TestCheckRouterAddressValidReportsDataMissing(t *testing.T) { + router_address := RouterAddress([]byte{0x01}) + err, exit := router_address.checkValid() + if err == nil || err.Error() != "warning parsing RouterAddress: data too small" { + t.Fatal("incorrect error returned by checkValid:", err) + } + if exit != false { + t.Fatal("checkValid indicated to stop parsing when some fields may be present") + } +} + +func TestCheckRouterAddressValidNoErrWithValidData(t *testing.T) { + router_address := RouterAddress([]byte{0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00}) + mapping, _ := GoMapToMapping(map[string]string{"host": "127.0.0.1", "port": "4567"}) + router_address = append(router_address, mapping...) + err, exit := router_address.checkValid() + if err != nil { + t.Fatal("checkValid reported error with valid data:", err) + } + if exit != false { + t.Fatal("checkValid indicated to stop parsing valid data") + } +} + +func TestRouterAddressCostReturnsFirstByte(t *testing.T) { + router_address := RouterAddress([]byte{0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00}) + cost, err := router_address.Cost() + if err != nil { + t.Fatal("err when calling Cost on valid data:", err) + } + if cost != 6 { + t.Fatal("Cost returned wrong cost:", cost) + } +} + +func TestRouterAddressExpirationReturnsCorrectData(t *testing.T) { + router_address := RouterAddress([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00}) + expiration, err := router_address.Expiration() + if err != nil { + t.Fatal("err when calling Expiration on valid data:", err) + } + if bytes.Compare(expiration[:], []byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}) != 0 { + t.Fatal("Expiration did not return correct data:", expiration) + } +} + +func TestReadRouterAddressReturnsCorrectRemainderWithoutError(t *testing.T) { + router_address_bytes := []byte{0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} + str, _ := ToI2PString("foo") + mapping, _ := GoMapToMapping(map[string]string{"host": "127.0.0.1", "port": "4567"}) + router_address_bytes = append(router_address_bytes, []byte(str)...) + router_address_bytes = append(router_address_bytes, mapping...) + router_address_bytes = append(router_address_bytes, []byte{0x01, 0x02, 0x03}...) + router_address, remainder, err := ReadRouterAddress(router_address_bytes) + if err != nil { + t.Fatal("ReadRouterAddress reported error with valid data:", err) + } + if bytes.Compare(remainder, []byte{0x01, 0x02, 0x03}) != 0 { + t.Fatal("incorrect remainder returned on ReadRouterAddress:", remainder) + } + err, exit := router_address.checkValid() + if err != nil { + t.Fatal("checkValid on address from ReadRouterAddress reported error with valid data:", err) + } + if exit != false { + t.Fatal("checkValid on address from ReadRouterAddress indicated to stop parsing valid data") + } +} diff --git a/lib/common/string.go b/lib/common/string.go index 7df5a10..66da78d 100644 --- a/lib/common/string.go +++ b/lib/common/string.go @@ -77,7 +77,7 @@ func ReadString(data []byte) (String, []byte, error) { case "string parsing warning: string data is shorter than specified by length": return str, make([]byte, 0), err case "string parsing warning: string contains data beyond length": - return String(str[:length+1]), str[length+1:], err + return String(str[:length+1]), str[length+1:], nil //err } } return str, make([]byte, 0), nil diff --git a/lib/common/string_test.go b/lib/common/string_test.go index 3a77e49..90554f3 100644 --- a/lib/common/string_test.go +++ b/lib/common/string_test.go @@ -105,8 +105,8 @@ func TestToI2PStringReportsOverflows(t *testing.T) { func TestReadStringReadsLength(t *testing.T) { bytes := []byte{0x01, 0x04, 0x06} str, remainder, err := ReadString(bytes) - if err == nil || err.Error() != "string parsing warning: string contains data beyond length" { - t.Fatal("ReadString() returned incorrect error,", err) + if err != nil { + t.Fatal("ReadString() returned error reading string with extra data,", err) } if len(str) != 2 { t.Fatal("ReadString() did not return correct string length:", len(str))