1#!/usr/bin/env python
2
3# This will create golden files in a directory passed to it.
4# A Test calls this internally to create the golden files
5# So it can process them (so we don't have to checkin the files).
6
7# Ensure msgpack-python and cbor are installed first, using:
8# sudo apt install python-dev (may not be necessary)
9# sudo apt install python-pip # or python3-pip
10# pip install --user msgpack-python msgpack-rpc-python cbor
11
12# Ensure all "string" keys are utf strings (else encoded as bytes)
13
14from __future__ import print_function
15import cbor, msgpack, msgpackrpc, sys, os, threading
16
17mylocaladdr="127.0.0.1" # localhost.localdomain localhost 127.0.0.1
18
19def get_test_data_list():
20 # get list with all primitive types, and a combo type
21 l0 = [
22 -8,
23 -1616,
24 -32323232,
25 -6464646464646464,
26 192,
27 1616,
28 32323232,
29 6464646464646464,
30 192,
31 -3232.0,
32 -6464646464.0,
33 3232.0,
34 6464.0,
35 6464646464.0,
36 160.0,
37 1616.0,
38 False,
39 True,
40 u"null",
41 None,
42 u"some&day>some<day",
43 1328176922000002000,
44 u"",
45 -2206187877999998000,
46 u"bytestring",
47 270,
48 u"none",
49 -2013855847999995777,
50 #-6795364578871345152,
51 ]
52 l1 = [
53 { "true": True,
54 "false": False },
55 { "true": u"True",
56 "false": False,
57 "uint16(1616)": 1616 },
58 { "list": [1616, 32323232, True, -3232.0, {"TRUE":True, "FALSE":False}, [True, False] ],
59 "int32":32323232, "bool": True,
60 "LONG STRING": u"123456789012345678901234567890123456789012345678901234567890",
61 "SHORT STRING": u"1234567890" },
62 { True: "true", 138: False, "false": 200 }
63 ]
64
65 l = []
66 l.extend(l0)
67 l.append(l0)
68 l.append(1)
69 l.extend(l1)
70 return l
71
72def build_test_data(destdir):
73 l = get_test_data_list()
74 for i in range(len(l)):
75 # packer = msgpack.Packer()
76 serialized = msgpack.dumps(l[i])
77 with open(os.path.join(destdir, str(i) + '.msgpack.golden'), 'wb') as f:
78 f.write(serialized)
79 serialized = cbor.dumps(l[i])
80 with open(os.path.join(destdir, str(i) + '.cbor.golden'), 'wb') as f:
81 f.write(serialized)
82
83def doRpcServer(port, stopTimeSec):
84 class EchoHandler(object):
85 def Echo123(self, msg1, msg2, msg3):
86 return ("1:%s 2:%s 3:%s" % (msg1.decode("utf-8"), msg2.decode("utf-8"), msg3.decode("utf-8")))
87 def EchoStruct(self, msg):
88 return ("%s" % msg)
89
90 addr = msgpackrpc.Address(mylocaladdr, port)
91 server = msgpackrpc.Server(EchoHandler())
92 server.listen(addr)
93 # run thread to stop it after stopTimeSec seconds if > 0
94 if stopTimeSec > 0:
95 def myStopRpcServer():
96 server.stop()
97 t = threading.Timer(stopTimeSec, myStopRpcServer)
98 t.start()
99 server.start()
100
101def doRpcClientToPythonSvc(port):
102 address = msgpackrpc.Address(mylocaladdr, port)
103 client = msgpackrpc.Client(address, unpack_encoding='utf-8')
104 print(client.call("Echo123", "A1", "B2", "C3"))
105 print(client.call("EchoStruct", {"A" :"Aa", "B":"Bb", "C":"Cc"}))
106
107# def doCheckSocket(port):
108# print(">>>> port: ", port, " <<<<<")
109# sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
110# result = sock.connect_ex(('127.0.0.1', port))
111# if result == 0:
112# print("\t>>>> Port is open")
113# else:
114# print("\t>>>> Port is not open")
115# sock.close()
116
117def doRpcClientToGoSvc(port):
118 # doCheckSocket(port)
119 address = msgpackrpc.Address(mylocaladdr, port)
120 client = msgpackrpc.Client(address, unpack_encoding='utf-8')
121 print(client.call("TestRpcInt.Echo123", ["A1", "B2", "C3"]))
122 print(client.call("TestRpcInt.EchoStruct", {"A" :"Aa", "B":"Bb", "C":"Cc"}))
123
124def doMain(args):
125 if len(args) == 2 and args[0] == "testdata":
126 build_test_data(args[1])
127 elif len(args) == 3 and args[0] == "rpc-server":
128 doRpcServer(int(args[1]), int(args[2]))
129 elif len(args) == 2 and args[0] == "rpc-client-python-service":
130 doRpcClientToPythonSvc(int(args[1]))
131 elif len(args) == 2 and args[0] == "rpc-client-go-service":
132 doRpcClientToGoSvc(int(args[1]))
133 else:
134 print("Usage: test.py " +
135 "[testdata|rpc-server|rpc-client-python-service|rpc-client-go-service] ...")
136
137if __name__ == "__main__":
138 doMain(sys.argv[1:])
View as plain text