mirror of https://github.com/waku-org/nwaku.git
104 lines
2.2 KiB
Nim
104 lines
2.2 KiB
Nim
|
|
||
|
{.used.}
|
||
|
|
||
|
import
|
||
|
testutils/unittests
|
||
|
import
|
||
|
../../waku/common/protobuf
|
||
|
|
||
|
|
||
|
## Fixtures
|
||
|
|
||
|
const MaxTestRpcFieldLen = 5
|
||
|
|
||
|
type TestRpc = object
|
||
|
testField*: string
|
||
|
|
||
|
proc init(T: type TestRpc, field: string): T =
|
||
|
T(testField: field)
|
||
|
|
||
|
proc encode(rpc: TestRpc): ProtoBuffer =
|
||
|
var pb = initProtoBuffer()
|
||
|
pb.write3(1, rpc.testField)
|
||
|
pb.finish3()
|
||
|
pb
|
||
|
|
||
|
proc encodeWithBadFieldId(rpc: TestRpc): ProtoBuffer =
|
||
|
var pb = initProtoBuffer()
|
||
|
pb.write3(666, rpc.testField)
|
||
|
pb.finish3()
|
||
|
pb
|
||
|
|
||
|
proc decode(T: type TestRpc, buf: seq[byte]): ProtobufResult[T] =
|
||
|
let pb = initProtoBuffer(buf)
|
||
|
|
||
|
var field: string
|
||
|
if not ?pb.getField(1, field):
|
||
|
return err(ProtobufError.missingRequiredField("test_field"))
|
||
|
if field.len > MaxTestRpcFieldLen:
|
||
|
return err(ProtobufError.invalidLengthField("test_field"))
|
||
|
|
||
|
ok(TestRpc.init(field))
|
||
|
|
||
|
|
||
|
## Tests
|
||
|
|
||
|
suite "Waku Common - libp2p minprotobuf wrapper":
|
||
|
|
||
|
test "serialize and deserialize - valid length field":
|
||
|
## Given
|
||
|
let field = "12345"
|
||
|
|
||
|
let rpc = TestRpc.init(field)
|
||
|
|
||
|
## When
|
||
|
let encodedRpc = rpc.encode()
|
||
|
let decodedRpcRes = TestRpc.decode(encodedRpc.buffer)
|
||
|
|
||
|
## Then
|
||
|
check:
|
||
|
decodedRpcRes.isOk()
|
||
|
|
||
|
let decodedRpc = decodedRpcRes.tryGet()
|
||
|
check:
|
||
|
decodedRpc.testField == field
|
||
|
|
||
|
test "serialize and deserialize - missing required field":
|
||
|
## Given
|
||
|
let field = "12345"
|
||
|
|
||
|
let rpc = TestRpc.init(field)
|
||
|
|
||
|
## When
|
||
|
let encodedRpc = rpc.encodeWithBadFieldId()
|
||
|
let decodedRpcRes = TestRpc.decode(encodedRpc.buffer)
|
||
|
|
||
|
## Then
|
||
|
check:
|
||
|
decodedRpcRes.isErr()
|
||
|
|
||
|
let error = decodedRpcRes.tryError()
|
||
|
check:
|
||
|
error.kind == ProtobufErrorKind.MissingRequiredField
|
||
|
error.field == "test_field"
|
||
|
|
||
|
|
||
|
test "serialize and deserialize - invalid length field":
|
||
|
## Given
|
||
|
let field = "123456" # field.len = MaxTestRpcFieldLen + 1
|
||
|
|
||
|
let rpc = TestRpc.init(field)
|
||
|
|
||
|
## When
|
||
|
let encodedRpc = rpc.encode()
|
||
|
let decodedRpcRes = TestRpc.decode(encodedRpc.buffer)
|
||
|
|
||
|
## Then
|
||
|
check:
|
||
|
decodedRpcRes.isErr()
|
||
|
|
||
|
let error = decodedRpcRes.tryError()
|
||
|
check:
|
||
|
error.kind == ProtobufErrorKind.InvalidLengthField
|
||
|
error.field == "test_field"
|