...

Text file src/github.com/ugorji/go/codec/test.py

Documentation: github.com/ugorji/go/codec

     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