aboutsummaryrefslogtreecommitdiff
path: root/tests/conformance/conformance_nim.nim
diff options
context:
space:
mode:
Diffstat (limited to 'tests/conformance/conformance_nim.nim')
-rw-r--r--tests/conformance/conformance_nim.nim61
1 files changed, 61 insertions, 0 deletions
diff --git a/tests/conformance/conformance_nim.nim b/tests/conformance/conformance_nim.nim
new file mode 100644
index 0000000..54f58b2
--- /dev/null
+++ b/tests/conformance/conformance_nim.nim
@@ -0,0 +1,61 @@
+import endians
+import streams
+import strformat
+
+import protobuf/stream
+import protobuf/types
+
+import conformance_pb
+import test_messages_proto3_pb
+
+let
+ inputStream = newFileStream(stdin)
+ outputStream = newFileStream(stdout)
+
+proc readInt32Le(s: Stream): int32 =
+ var value = readInt32(s)
+ littleEndian32(addr(result), addr(value))
+
+proc writeInt32Le(s: Stream, value: int32) =
+ var value = value
+ var buf: int32
+ littleEndian32(addr(buf), addr(value))
+ write(s, buf)
+
+proc myReadString(s: Stream, size: int): string =
+ result = newString(size)
+ if readData(s, addr(result[0]), size) != size:
+ raise newException(Exception, "failed to read data")
+
+while true:
+ var requestSize = readInt32Le(inputStream)
+ var requestData = myReadString(inputStream, requestSize)
+
+ let request = newConformance_ConformanceRequest(requestData)
+
+ let response = newConformance_ConformanceResponse()
+
+ if request.messageType == "protobuf_test_messages.proto2.TestAllTypesProto2":
+ response.skipped = "skipping proto2 tests"
+ elif request.requestedOutputFormat == conformance_WireFormat.JSON:
+ response.skipped = "dont know how to output json"
+ elif hasJsonPayload(request):
+ response.skipped = "dont know how to parse json"
+ else:
+ try:
+ let parsed = newprotobuf_test_messages_proto3_TestAllTypesProto3(string(request.protobufPayload))
+ let ser = serialize(parsed)
+ response.protobufPayload = bytes(ser)
+ except IOError as exc:
+ response.parse_error = exc.msg
+ except ParseError as exc:
+ response.parse_error = exc.msg
+ except Exception as exc:
+ response.runtimeError = exc.msg
+
+ let responseData = serialize(response)
+
+ writeInt32Le(outputStream, int32(len(responseData)))
+ write(outputStream, responseData)
+
+ flush(outputStream)