/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package; import haxe.Int32; import haxe.Int64; import haxe.io.Bytes; import haxe.Timer; import haxe.ds.IntMap; import haxe.ds.StringMap; import haxe.ds.ObjectMap; import uuid.Uuid; import org.apache.thrift.*; import org.apache.thrift.helper.*; import org.apache.thrift.protocol.*; import org.apache.thrift.transport.*; import org.apache.thrift.server.*; import org.apache.thrift.meta_data.*; #if cpp import sys.thread.Thread; #else // no thread support (yet) #end import thrift.test.*; // generated code using StringTools; class TestResults { private var successCnt : Int = 0; private var errorCnt : Int = 0; private var failedTests : String = ""; private var print_direct : Bool = false; public static var EXITCODE_SUCCESS = 0x00; // no errors bits set // public static var EXITCODE_FAILBIT_BASETYPES = 0x01; public static var EXITCODE_FAILBIT_STRUCTS = 0x02; public static var EXITCODE_FAILBIT_CONTAINERS = 0x04; public static var EXITCODE_FAILBIT_EXCEPTIONS = 0x08; // public static var EXITCODE_ALL_FAILBITS = 0x0F; // private var testsExecuted : Int = 0; private var testsFailed : Int = 0; private var currentTest : Int = 0; public function new(direct : Bool) { print_direct = direct; } public function StartTestGroup( groupBit : Int) : Void { currentTest = groupBit; testsExecuted |= groupBit; } public function Expect( expr : Bool, msg : String) : Void { if ( expr) { ++successCnt; } else { ++errorCnt; testsFailed |= currentTest; failedTests += "\n " + msg; if( print_direct) { trace('FAIL: $msg'); } } } public function CalculateExitCode() : Int { var notExecuted : Int = EXITCODE_ALL_FAILBITS & (~testsExecuted); return testsFailed | notExecuted; } public function PrintSummary() : Void { var total = successCnt + errorCnt; var sp = Math.round((1000 * successCnt) / total) / 10; var ep = Math.round((1000 * errorCnt) / total) / 10; trace('==========================='); trace('Tests executed $total'); trace('Tests succeeded $successCnt ($sp%)'); trace('Tests failed $errorCnt ($ep%)'); if ( errorCnt > 0) { trace('==========================='); trace('FAILED TESTS: $failedTests'); } trace('==========================='); } } class TestClient { public static function Execute(args : Arguments) : Void { var exitCode = 0xFF; try { var difft = Timer.stamp(); if ( args.numThreads > 1) { #if cpp exitCode = MultiThreadClient(args); #else trace('Threads not supported/implemented for this platform.'); exitCode = SingleThreadClient(args); #end } else { exitCode = SingleThreadClient(args); } difft = Math.round( 1000 * (Timer.stamp() - difft)) / 1000; trace('total test time: $difft seconds'); } catch (e : TException) { trace('TException: $e'); exitCode = 0xFF; } catch (e : Dynamic) { trace('Exception: $e'); exitCode = 0xFF; } #if sys Sys.exit( exitCode); #end } public static function SingleThreadClient(args : Arguments) : Int { var rslt = new TestResults(true); RunClient(args,rslt); rslt.PrintSummary(); return rslt.CalculateExitCode(); } #if cpp public static function MultiThreadClient(args : Arguments) : Int { var threads = new List(); for( test in 0 ... args.numThreads) { threads.add( StartThread( args)); } var exitCode : Int = 0; for( thread in threads) { exitCode |= Thread.readMessage(true); } return exitCode; } #end #if cpp private static function StartThread(args : Arguments) : Thread { var thread = Thread.create( function() : Void { var rslt = new TestResults(false); var main : Thread = Thread.readMessage(true); try { RunClient(args,rslt); } catch (e : TException) { rslt.Expect( false, '$e'); trace('$e'); } catch (e : Dynamic) { rslt.Expect( false, '$e'); trace('$e'); } main.sendMessage( rslt.CalculateExitCode()); }); thread.sendMessage(Thread.current()); return thread; } #end public static function RunClient(args : Arguments, rslt : TestResults) { var transport : TTransport = null; switch (args.transport) { case socket: transport = new TSocket(args.host, args.port); case http: var uri = 'http://${args.host}:${args.port}'; trace('- http client : ${uri}'); transport = new THttpClient(uri); default: throw "Unhandled transport"; } // optional: layered transport if ( args.framed) { trace("- framed transport"); transport = new TFramedTransport(transport); } if ( args.buffered) { trace("- buffered transport"); transport = new TBufferedTransport(transport); } // protocol var protocol : TProtocol = null; switch( args.protocol) { case binary: trace("- binary protocol"); protocol = new TBinaryProtocol(transport); case json: trace("- json protocol"); protocol = new TJSONProtocol(transport); case compact: trace("- compact protocol"); protocol = new TCompactProtocol(transport); } // some quick and basic unit tests HaxeBasicsTest( args, rslt); ModuleUnitTests( args, rslt); // now run the test code trace('- ${args.numIterations} iterations'); for( i in 0 ... args.numIterations) { ClientTest( transport, protocol, args, rslt); } } public static function HaxeBasicsTest( args : Arguments, rslt : TestResults) : Void { // We need to test a few basic things used in the ClientTest // Anything else beyond this scope should go into /lib/haxe/ instead rslt.StartTestGroup( TestResults.EXITCODE_FAILBIT_BASETYPES); var map32 = new IntMap(); var map64 = new Int64Map(); rslt.Expect( map32.keys().hasNext() == map64.keys().hasNext(), "Int64Map Test #1"); rslt.Expect( map32.exists( 4711) == map64.exists( Int64.make(47,11)), "Int64Map Test #2"); rslt.Expect( map32.remove( 4711) == map64.remove( Int64.make(47,11)), "Int64Map Test #3"); rslt.Expect( map32.get( 4711) == map64.get( Int64.make(47,11)), "Int64Map Test #4"); map32.set( 42, 815); map64.set( Int64.make(0,42), 815); map32.set( -517, 23); map64.set( Int64.neg(Int64.make(0,517)), 23); map32.set( 0, -123); map64.set( Int64.make(0,0), -123); //trace('map32 = $map32'); //trace('map64 = $map64'); rslt.Expect( map32.keys().hasNext() == map64.keys().hasNext(), "Int64Map Test #10"); rslt.Expect( map32.exists( 4711) == map64.exists( Int64.make(47,11)), "Int64Map Test #11"); rslt.Expect( map32.exists( -517) == map64.exists( Int64.neg(Int64.make(0,517))), "Int64Map Test #12"); rslt.Expect( map32.exists( 42) == map64.exists( Int64.make(0,42)), "Int64Map Test #13"); rslt.Expect( map32.exists( 0) == map64.exists( Int64.make(0,0)), "Int64Map Test #14"); rslt.Expect( map32.get( 4711) == map64.get( Int64.make(47,11)), "Int64Map Test #15"); rslt.Expect( map32.get( -517) == map64.get( Int64.neg(Int64.make(0,517))), "Int64Map Test #16"); rslt.Expect( map32.get( 42) == map64.get( Int64.make(0,42)), "Int64Map Test #Int64.make(-5,17)"); rslt.Expect( map32.get( 0) == map64.get( Int64.make(0,0)), "Int64Map Test #18"); rslt.Expect( map32.remove( 4711) == map64.remove( Int64.make(47,11)), "Int64Map Test #19"); rslt.Expect( map32.remove( -517) == map64.remove( Int64.neg(Int64.make(0,517))), "Int64Map Test #20"); rslt.Expect( map32.exists( 4711) == map64.exists( Int64.make(47,11)), "Int64Map Test #21"); rslt.Expect( map32.exists( -517) == map64.exists( Int64.neg(Int64.make(0,517))), "Int64Map Test #22"); rslt.Expect( map32.exists( 42) == map64.exists( Int64.make(0,42)), "Int64Map Test #23"); rslt.Expect( map32.exists( 0) == map64.exists( Int64.make(0,0)), "Int64Map Test #24"); rslt.Expect( map32.get( 4711) == map64.get( Int64.make(47,11)), "Int64Map Test #25"); rslt.Expect( map32.get( -517) == map64.get( Int64.neg(Int64.make(0,517))), "Int64Map Test #26"); rslt.Expect( map32.get( 42) == map64.get( Int64.make(0,42)), "Int64Map Test #27"); rslt.Expect( map32.get( 0) == map64.get( Int64.make(0,0)), "Int64Map Test #28"); map32.set( 42, 1); map64.set( Int64.make(0,42), 1); map32.set( -517, -2); map64.set( Int64.neg(Int64.make(0,517)), -2); map32.set( 0, 3); map64.set( Int64.make(0,0), 3); var c32 = 0; var ksum32 = 0; for (key in map32.keys()) { ++c32; ksum32 += key; } var c64 = 0; var ksum64 = Int64.make(0,0); for (key in map64.keys()) { ++c64; ksum64 = Int64.add( ksum64, key); } rslt.Expect( c32 == c64, "Int64Map Test #30"); rslt.Expect( '$ksum64' == '$ksum32', '$ksum64 == $ksum32 Test #31'); //compare without spaces because differ in php and cpp var s32 = map32.toString().replace(' ', ''); var s64 = map64.toString().replace(' ', ''); rslt.Expect( s32 == s64, "Int64Map.toString(): " + ' ("$s32" == "$s64") Test #32'); map32.remove( 42); map64.remove( Int64.make(0,42)); map32.remove( -517); map64.remove( Int64.neg(Int64.make(0,517))); map32.remove( 0); map64.remove( Int64.make(0,0)); rslt.Expect( map32.keys().hasNext() == map64.keys().hasNext(), "Int64Map Test #90"); rslt.Expect( map32.exists( 4711) == map64.exists( Int64.make(47,11)), "Int64Map Test #91"); rslt.Expect( map32.exists( -517) == map64.exists( Int64.neg(Int64.make(0,517))), "Int64Map Test #92"); rslt.Expect( map32.exists( 42) == map64.exists( Int64.make(0,42)), "Int64Map Test #93"); rslt.Expect( map32.exists( 0) == map64.exists( Int64.make(0,0)), "Int64Map Test #94"); rslt.Expect( map32.get( 4711) == map64.get( Int64.make(47,11)), "Int64Map Test #95"); rslt.Expect( map32.get( -517) == map64.get( Int64.make(-5,17)), "Int64Map Test #96"); rslt.Expect( map32.get( 42) == map64.get( Int64.make(0,42)), "Int64Map Test #97"); rslt.Expect( map32.get( 0) == map64.get( Int64.make(0, 0)), "Int64Map Test #98"); } // core module unit tests public static function ModuleUnitTests( args : Arguments, rslt : TestResults) : Void { #if debug try { BitConverter.UnitTest(); rslt.Expect( true, 'BitConverter.UnitTest Test #100'); } catch( e : Dynamic) { rslt.Expect( false, 'BitConverter.UnitTest: $e Test #100'); } try { ZigZag.UnitTest(); rslt.Expect( true, 'ZigZag.UnitTest Test #101'); } catch( e : Dynamic) { rslt.Expect( false, 'ZigZag.UnitTest: $e Test #101'); } try { UuidHelper.UnitTest(); rslt.Expect( true, 'UuidHelper.UnitTest Test #102'); } catch( e : Dynamic) { rslt.Expect( false, 'UuidHelper.UnitTest: $e Test #102'); } #end } public static function BytesToHex(data : Bytes) : String { var hex = ""; for ( i in 0 ... data.length) { hex += StringTools.hex( data.get(i), 2); } return hex; } public static function PrepareTestData(randomDist : Bool) : Bytes { var retval = Bytes.alloc(0x100); var initLen : Int = (retval.length > 0x100 ? 0x100 : retval.length); // linear distribution, unless random is requested if (!randomDist) { for (i in 0 ... initLen) { retval.set(i, i % 0x100); } return retval; } // random distribution for (i in 0 ... initLen) { retval.set(i, 0); } for (i in 1 ... initLen) { while( true) { var nextPos = Std.random(initLen); if (retval.get(nextPos) == 0) { retval.set( nextPos, i % 0x100); break; } } } return retval; } public static function ClientTest( transport : TTransport, protocol : TProtocol, args : Arguments, rslt : TestResults) : Void { var client = new ThriftTestImpl(protocol,protocol); try { if (!transport.isOpen()) { transport.open(); } } catch (e : TException) { rslt.Expect( false, 'unable to open transport: $e'); return; } catch (e : Dynamic) { rslt.Expect( false, 'unable to open transport: $e'); return; } var start = Date.now(); rslt.StartTestGroup( TestResults.EXITCODE_FAILBIT_EXCEPTIONS); // if arg == "Xception" throw Xception with errorCode = 1001 and message = arg trace('testException("Xception")'); try { client.testException("Xception"); rslt.Expect( false, 'testException("Xception") should throw'); } catch (e : Xception) { rslt.Expect( e.message == "Xception", 'testException("Xception") - e.message == "Xception"'); rslt.Expect( e.errorCode == 1001, 'testException("Xception") - e.errorCode == 1001'); } catch (e : TException) { rslt.Expect( false, 'testException("Xception") - ${e} : ${e.errorMsg}'); } catch (e : Dynamic) { rslt.Expect( false, 'testException("Xception") - $e'); } // if arg == "TException" throw TException trace('testException("TException")'); try { client.testException("TException"); rslt.Expect( false, 'testException("TException") should throw'); } catch (e : TException) { rslt.Expect( true, 'testException("TException") - $e : ${e.errorMsg}'); } catch (e : Dynamic) { rslt.Expect( false, 'testException("TException") - $e'); } // reopen the transport, just in case the server closed his end if (transport.isOpen()) transport.close(); transport.open(); // else do not throw anything trace('testException("bla")'); try { client.testException("bla"); rslt.Expect( true, 'testException("bla") should not throw'); } catch (e : TException) { rslt.Expect( false, 'testException("bla") - ${e} : ${e.errorMsg}'); } catch (e : Dynamic) { rslt.Expect( false, 'testException("bla") - $e'); } rslt.StartTestGroup( TestResults.EXITCODE_FAILBIT_BASETYPES); trace('testVoid()'); client.testVoid(); trace(' = void'); rslt.Expect(true,"testVoid()"); // bump counter trace('testBool(${true})'); var b = client.testBool(true); trace(' = $b'); rslt.Expect(b, '$b == "${true}"'); trace('testBool(${false})'); b = client.testBool(false); trace(' = $b'); rslt.Expect( ! b, '$b == "${false}"'); trace('testString("Test")'); var s = client.testString("Test"); trace(' = "$s"'); rslt.Expect(s == "Test", '$s == "Test"'); trace('testByte(1)'); var i8 = client.testByte(1); trace(' = $i8'); rslt.Expect(i8 == 1, '$i8 == 1'); trace('testI32(-1)'); var i32 = client.testI32(-1); trace(' = $i32'); rslt.Expect(i32 == -1, '$i32 == -1'); trace('testI64(-34359738368)'); var i64 = client.testI64( Int64.make( 0xFFFFFFF8, 0x00000000)); // -34359738368 trace(' = $i64'); rslt.Expect( Int64.compare( i64, Int64.make( 0xFFFFFFF8, 0x00000000)) == 0, Int64.toStr(i64) +" == "+Int64.toStr(Int64.make( 0xFFFFFFF8, 0x00000000))); // edge case: the largest negative Int64 has no positive Int64 equivalent trace('testI64(-9223372036854775808)'); i64 = client.testI64( Int64.make( 0x80000000, 0x00000000)); // -9223372036854775808 trace(' = $i64'); rslt.Expect( Int64.compare( i64, Int64.make( 0x80000000, 0x00000000)) == 0, Int64.toStr(i64) +" == "+Int64.toStr(Int64.make( 0x80000000, 0x00000000))); trace('testDouble(5.325098235)'); var dub = client.testDouble(5.325098235); trace(' = $dub'); rslt.Expect(dub == 5.325098235, '$dub == 5.325098235'); var uuidOut : String = UuidHelper.CanonicalUuid("{00112233-4455-6677-8899-AABBCCDDEEFF}"); trace('testUuid(${uuidOut}'); try { var uuidIn = client.testUuid(uuidOut); trace('testUuid() = ${uuidIn}'); rslt.Expect( uuidIn == uuidOut, '${uuidIn} == ${uuidOut}'); } catch (e : TApplicationException) { trace('testUuid(${uuidOut}): '+e.errorMsg); // may not be supported by the server } var binOut = PrepareTestData(true); trace('testBinary('+BytesToHex(binOut)+')'); try { var binIn = client.testBinary(binOut); trace('testBinary() = '+BytesToHex(binIn)); rslt.Expect( binIn.length == binOut.length, '${binIn.length} == ${binOut.length}'); var len = ((binIn.length < binOut.length) ? binIn.length : binOut.length); for (ofs in 0 ... len) { if (binIn.get(ofs) != binOut.get(ofs)) { rslt.Expect( false, 'testBinary('+BytesToHex(binOut)+'): content mismatch at offset $ofs'); } } } catch (e : TApplicationException) { trace('testBinary('+BytesToHex(binOut)+'): '+e.errorMsg); // may not be supported by the server } rslt.StartTestGroup( TestResults.EXITCODE_FAILBIT_STRUCTS); trace('testStruct({"Zero", 1, -3, -5})'); var o = new Xtruct(); o.string_thing = "Zero"; o.byte_thing = 1; o.i32_thing = -3; o.i64_thing = Int64.make(0,-5); var i = client.testStruct(o); trace(' = {"' + i.string_thing + '", ' + i.byte_thing +', ' + i.i32_thing +', '+ Int64.toStr(i.i64_thing) + '}'); rslt.Expect( i.string_thing == o.string_thing, "i.string_thing == o.string_thing"); rslt.Expect( i.byte_thing == o.byte_thing, "i.byte_thing == o.byte_thing"); rslt.Expect( i.i32_thing == o.i32_thing, "i.i64_thing == o.i64_thing"); rslt.Expect( i.i32_thing == o.i32_thing, "i.i64_thing == o.i64_thing"); trace('testNest({1, {\"Zero\", 1, -3, -5}, 5})'); var o2 = new Xtruct2(); o2.byte_thing = 1; o2.struct_thing = o; o2.i32_thing = 5; var i2 = client.testNest(o2); i = i2.struct_thing; trace(" = {" + i2.byte_thing + ", {\"" + i.string_thing + "\", " + i.byte_thing + ", " + i.i32_thing + ", " + Int64.toStr(i.i64_thing) + "}, " + i2.i32_thing + "}"); rslt.Expect( i2.byte_thing == o2.byte_thing, "i2.byte_thing == o2.byte_thing"); rslt.Expect( i2.i32_thing == o2.i32_thing, "i2.i32_thing == o2.i32_thing"); rslt.Expect( i.string_thing == o.string_thing, "i.string_thing == o.string_thing"); rslt.Expect( i.byte_thing == o.byte_thing, "i.byte_thing == o.byte_thing"); rslt.Expect( i.i32_thing == o.i32_thing, "i.i32_thing == o.i32_thing"); rslt.Expect( Int64.compare( i.i64_thing, o.i64_thing) == 0, "i.i64_thing == o.i64_thing"); rslt.StartTestGroup( TestResults.EXITCODE_FAILBIT_CONTAINERS); var mapout = new IntMap< haxe.Int32>(); for ( j in 0 ... 5) { mapout.set(j, j - 10); } trace("testMap({"); var first : Bool = true; for( key in mapout.keys()) { if (first) { first = false; } else { trace(", "); } trace(key + " => " + mapout.get(key)); } trace("})"); var mapin = client.testMap(mapout); trace(" = {"); first = true; for( key in mapin.keys()) { if (first) { first = false; } else { trace(", "); } trace(key + " => " + mapin.get(key)); rslt.Expect( mapin.get(key) == mapout.get(key), ' mapin.get($key) == mapout.get($key)'); } trace("}"); for( key in mapout.keys()) { rslt.Expect(mapin.exists(key), 'mapin.exists($key)'); } var listout = new List(); for (j in -2 ... 3) { listout.add(j); } trace("testList({"); first = true; for( j in listout) { if (first) { first = false; } else { trace(", "); } trace(j); } trace("})"); var listin = client.testList(listout); trace(" = {"); first = true; for( j in listin) { if (first) { first = false; } else { trace(", "); } trace(j); } trace("}"); rslt.Expect(listin.length == listout.length, "listin.length == listout.length"); var literout = listout.iterator(); var literin = listin.iterator(); while( literin.hasNext()) { rslt.Expect(literin.next() == literout.next(), "literin[i] == literout[i]"); } //set var setout = new IntSet(); for (j in -2 ... 3) { setout.add(j); } trace("testSet({"); first = true; for( j in setout) { if (first) { first = false; } else { trace(", "); } trace(j); } trace("})"); var setin = client.testSet(setout); trace(" = {"); first = true; for( j in setin) { if (first) { first = false; } else { trace(", "); } trace(j); rslt.Expect(setout.contains(j), 'setout.contains($j)'); } trace("}"); rslt.Expect(setin.size == setout.size, "setin.length == setout.length"); rslt.StartTestGroup( TestResults.EXITCODE_FAILBIT_BASETYPES); trace("testEnum(ONE)"); var ret = client.testEnum(Numberz.ONE); trace(" = " + ret); rslt.Expect(ret == Numberz.ONE, '$ret == Numberz.ONE'); trace("testEnum(TWO)"); ret = client.testEnum(Numberz.TWO); trace(" = " + ret); rslt.Expect(ret == Numberz.TWO, '$ret == Numberz.TWO'); trace("testEnum(THREE)"); ret = client.testEnum(Numberz.THREE); trace(" = " + ret); rslt.Expect(ret == Numberz.THREE, '$ret == Numberz.THREE'); trace("testEnum(FIVE)"); ret = client.testEnum(Numberz.FIVE); trace(" = " + ret); rslt.Expect(ret == Numberz.FIVE, '$ret == Numberz.FIVE'); trace("testEnum(EIGHT)"); ret = client.testEnum(Numberz.EIGHT); trace(" = " + ret); rslt.Expect(ret == Numberz.EIGHT, '$ret == Numberz.EIGHT'); trace("testTypedef(309858235082523)"); var uid = client.testTypedef( Int64.make( 0x119D0, 0x7E08671B)); // 309858235082523 trace(" = " + uid); rslt.Expect( Int64.compare( uid, Int64.make( 0x119D0, 0x7E08671B)) == 0, Int64.toStr(uid)+" == "+Int64.toStr(Int64.make( 0x119D0, 0x7E08671B))); rslt.StartTestGroup( TestResults.EXITCODE_FAILBIT_CONTAINERS); trace("testMapMap(1)"); var mm = client.testMapMap(1); trace(" = {"); for( key in mm.keys()) { trace(key + " => {"); var m2 = mm.get(key); for( k2 in m2.keys()) { trace(k2 + " => " + m2.get(k2) + ", "); } trace("}, "); } trace("}"); var pos = mm.get(4); var neg = mm.get(-4); rslt.Expect( (pos != null) && (neg != null), "(pos != null) && (neg != null)"); for (i in 1 ... 5) { rslt.Expect( pos.get(i) == i, 'pos.get($i) == $i'); rslt.Expect( neg.get(-i) == -i, 'neg.get(-$i) == -$i'); } rslt.Expect( ! pos.exists(0), '!pos.exists(0)'); rslt.Expect( ! neg.exists(-0), '!neg.exists(-0)'); rslt.Expect( ! pos.exists(42), '!pos.exists(42)'); rslt.Expect( ! neg.exists(-42), '!neg.exists(-42)'); rslt.StartTestGroup( TestResults.EXITCODE_FAILBIT_STRUCTS); var insane = new Insanity(); insane.userMap = new IntMap< Int64>(); insane.userMap.set( Numberz.FIVE, Int64.make(0,5000)); var truck = new Xtruct(); truck.string_thing = "Truck"; truck.byte_thing = 8; truck.i32_thing = 8; truck.i64_thing = Int64.make(0,8); insane.xtructs = new List(); insane.xtructs.add(truck); trace("testInsanity()"); var whoa = client.testInsanity(insane); trace(" = {"); for( key in whoa.keys()) { var val = whoa.get(key); trace(key + " => {"); for( k2 in val.keys()) { var v2 = val.get(k2); trace(k2 + " => {"); var userMap = v2.userMap; trace("{"); if (userMap != null) { for( k3 in userMap.keys()) { trace(k3 + " => " + userMap.get(k3) + ", "); } } else { trace("null"); } trace("}, "); var xtructs = v2.xtructs; trace("{"); if (xtructs != null) { for( x in xtructs) { trace("{\"" + x.string_thing + "\", " + x.byte_thing + ", " + x.i32_thing + ", " + x.i32_thing + "}, "); } } else { trace("null"); } trace("}"); trace("}, "); } trace("}, "); } trace("}"); /** * So you think you've got this all worked, out eh? * * Creates a the returned map with these values and prints it out: * { 1 => { 2 => argument, * 3 => argument, * }, * 2 => { 6 => , }, * } * @return map> - a map with the above values */ var first_map = whoa.get(Int64.make(0,1)); var second_map = whoa.get(Int64.make(0,2)); rslt.Expect( (first_map != null) && (second_map != null), "(first_map != null) && (second_map != null)"); if ((first_map != null) && (second_map != null)) { var crazy2 = first_map.get(Numberz.TWO); var crazy3 = first_map.get(Numberz.THREE); var looney = second_map.get(Numberz.SIX); rslt.Expect( (crazy2 != null) && (crazy3 != null) && (looney != null), "(crazy2 != null) && (crazy3 != null) && (looney != null)"); var crz2iter = crazy2.xtructs.iterator(); var crz3iter = crazy3.xtructs.iterator(); rslt.Expect( crz2iter.hasNext() && crz3iter.hasNext(), "crz2iter.hasNext() && crz3iter.hasNext()"); var goodbye2 = crz2iter.next(); var goodbye3 = crz3iter.next(); rslt.Expect( ! (crz2iter.hasNext() || crz3iter.hasNext()), "! (crz2iter.hasNext() || crz3iter.hasNext())"); rslt.Expect( Int64.compare( crazy2.userMap.get(Numberz.FIVE), insane.userMap.get(Numberz.FIVE)) == 0, "crazy2.userMap[5] == insane.userMap[5]"); rslt.Expect( truck.string_thing == goodbye2.string_thing, "truck.string_thing == goodbye2.string_thing"); rslt.Expect( truck.byte_thing == goodbye2.byte_thing, "truck.byte_thing == goodbye2.byte_thing"); rslt.Expect( truck.i32_thing == goodbye2.i32_thing, "truck.i32_thing == goodbye2.i32_thing"); rslt.Expect( Int64.compare( truck.i64_thing, goodbye2.i64_thing) == 0, "truck.i64_thing == goodbye2.i64_thing"); rslt.Expect( Int64.compare( crazy3.userMap.get(Numberz.FIVE), insane.userMap.get(Numberz.FIVE)) == 0, "crazy3.userMap[5] == insane.userMap[5]"); rslt.Expect( truck.string_thing == goodbye3.string_thing, "truck.string_thing == goodbye3.string_thing"); rslt.Expect( truck.byte_thing == goodbye3.byte_thing, "truck.byte_thing == goodbye3.byte_thing"); rslt.Expect( truck.i32_thing == goodbye3.i32_thing, "truck.i32_thing == goodbye3.i32_thing"); rslt.Expect( Int64.compare( truck.i64_thing, goodbye3.i64_thing) == 0, "truck.i64_thing == goodbye3.i64_thing"); rslt.Expect( ! looney.isSet(1), "! looney.isSet(1)"); rslt.Expect( ! looney.isSet(2), "! looney.isSet(2)"); } var arg0 = 1; var arg1 = 2; var arg2 = Int64.make( 0x7FFFFFFF,0xFFFFFFFF); var multiDict = new IntMap< String>(); multiDict.set(1, "one"); var arg4 = Numberz.FIVE; var arg5 = Int64.make(0,5000000); trace("Test Multi(" + arg0 + "," + arg1 + "," + arg2 + "," + multiDict + "," + arg4 + "," + arg5 + ")"); var multiResponse = client.testMulti(arg0, arg1, arg2, multiDict, arg4, arg5); trace(" = Xtruct(byte_thing:" + multiResponse.byte_thing + ",string_thing:" + multiResponse.string_thing + ",i32_thing:" + multiResponse.i32_thing + ",i64_thing:" + Int64.toStr(multiResponse.i64_thing) + ")"); rslt.Expect( multiResponse.string_thing == "Hello2", 'multiResponse.String_thing == "Hello2"'); rslt.Expect( multiResponse.byte_thing == arg0, 'multiResponse.Byte_thing == arg0'); rslt.Expect( multiResponse.i32_thing == arg1, 'multiResponse.I32_thing == arg1'); rslt.Expect( Int64.compare( multiResponse.i64_thing, arg2) == 0, 'multiResponse.I64_thing == arg2'); rslt.StartTestGroup( 0); trace("Test Oneway(1)"); client.testOneway(1); if( ! args.skipSpeedTest) { trace("Test Calltime()"); var difft = Timer.stamp(); for ( k in 0 ... 1000) { client.testVoid(); } difft = Math.round( 1000 * (Timer.stamp() - difft)) / 1000; trace('$difft ms per testVoid() call'); } } }