summaryrefslogtreecommitdiff
path: root/lib/kotlin/cross-test-client/src/main/kotlin/org/apache/thrift/test/TestClient.kt
diff options
context:
space:
mode:
Diffstat (limited to 'lib/kotlin/cross-test-client/src/main/kotlin/org/apache/thrift/test/TestClient.kt')
-rw-r--r--lib/kotlin/cross-test-client/src/main/kotlin/org/apache/thrift/test/TestClient.kt1596
1 files changed, 656 insertions, 940 deletions
diff --git a/lib/kotlin/cross-test-client/src/main/kotlin/org/apache/thrift/test/TestClient.kt b/lib/kotlin/cross-test-client/src/main/kotlin/org/apache/thrift/test/TestClient.kt
index 7597f2f8b..28f9ffd5e 100644
--- a/lib/kotlin/cross-test-client/src/main/kotlin/org/apache/thrift/test/TestClient.kt
+++ b/lib/kotlin/cross-test-client/src/main/kotlin/org/apache/thrift/test/TestClient.kt
@@ -18,10 +18,16 @@
*/
package org.apache.thrift.test
+import com.github.ajalt.clikt.core.CliktCommand
+import com.github.ajalt.clikt.parameters.options.default
+import com.github.ajalt.clikt.parameters.options.flag
+import com.github.ajalt.clikt.parameters.options.option
+import com.github.ajalt.clikt.parameters.types.enum
+import com.github.ajalt.clikt.parameters.types.int
import java.nio.ByteBuffer
import kotlin.math.abs
import kotlin.system.exitProcess
-import org.apache.http.impl.client.HttpClients
+import kotlinx.coroutines.runBlocking
import org.apache.thrift.TApplicationException
import org.apache.thrift.TException
import org.apache.thrift.TSerializer
@@ -29,18 +35,14 @@ import org.apache.thrift.async.TAsyncClientManager
import org.apache.thrift.protocol.TBinaryProtocol
import org.apache.thrift.protocol.TCompactProtocol
import org.apache.thrift.protocol.TJSONProtocol
-import org.apache.thrift.protocol.TMultiplexedProtocol
import org.apache.thrift.protocol.TProtocol
import org.apache.thrift.protocol.TSimpleJSONProtocol
-import org.apache.thrift.transport.THttpClient
import org.apache.thrift.transport.TNonblockingSocket
-import org.apache.thrift.transport.TSSLTransportFactory
+import org.apache.thrift.transport.TNonblockingTransport
import org.apache.thrift.transport.TTransport
-import org.apache.thrift.transport.TZlibTransport
-import org.apache.thrift.transport.layered.TFastFramedTransport
-import org.apache.thrift.transport.layered.TFramedTransport
import thrift.test.Insanity
import thrift.test.Numberz
+import thrift.test.SecondServiceClient
import thrift.test.ThriftTestClient
import thrift.test.Xception
import thrift.test.Xception2
@@ -58,990 +60,704 @@ const val ERR_EXCEPTIONS = 8
const val ERR_PROTOCOLS = 16
const val ERR_UNKNOWN = 64
-suspend fun main(args: Array<String>) {
- var host = "localhost"
- var port = 9090
- var numTests = 1
- var protocolType = "binary"
- var transportType = "buffered"
- var ssl = false
- var zlib = false
- var httpClient = false
- var socketTimeout = 1000
- try {
- for (i in args.indices) {
- if (args[i].startsWith("--host")) {
- host = args[i].split("=").toTypedArray()[1]
- host.trim { it <= ' ' }
- } else if (args[i].startsWith("--port")) {
- port = Integer.valueOf(args[i].split("=").toTypedArray()[1])
- } else if (args[i].startsWith("--n") || args[i].startsWith("--testloops")) {
- numTests = Integer.valueOf(args[i].split("=").toTypedArray()[1])
- } else if (args[i] == "--timeout") {
- socketTimeout = Integer.valueOf(args[i].split("=").toTypedArray()[1])
- } else if (args[i].startsWith("--protocol")) {
- protocolType = args[i].split("=").toTypedArray()[1]
- protocolType.trim { it <= ' ' }
- } else if (args[i].startsWith("--transport")) {
- transportType = args[i].split("=").toTypedArray()[1]
- transportType.trim { it <= ' ' }
- } else if (args[i] == "--ssl") {
- ssl = true
- } else if (args[i] == "--zlib") {
- zlib = true
- } else if (args[i] == "--client") {
- httpClient = true
- } else if (args[i] == "--help") {
- println("Allowed options:")
- println(" --help\t\t\tProduce help message")
- println(" --host=arg (=$host)\tHost to connect")
- println(" --port=arg (=$port)\tPort number to connect")
- println(
- " --transport=arg (=$transportType)\n\t\t\t\tTransport: buffered, framed, fastframed, http, zlib"
- )
- println(
- " --protocol=arg (=$protocolType)\tProtocol: binary, compact, json, multi, multic, multij"
- )
- println(" --ssl\t\t\tEncrypted Transport using SSL")
- println(" --zlib\t\t\tCompressed Transport using Zlib")
- println(" --testloops[--n]=arg (=$numTests)\tNumber of Tests")
- exitProcess(0)
- }
+enum class ProtocolType(val key: String) {
+ Binary("binary"),
+ Multi("multi"),
+ Json("json"),
+ MultiJson("multij"),
+ Compact("compact"),
+ MultiCompact("multic")
+}
+
+enum class TransportType(val key: String) {
+ Buffered("buffered"),
+ Framed("framed"),
+ FastFramed("fastframed"),
+ Http("http")
+}
+
+class TestClient : CliktCommand() {
+ private val host: String by option(help = "The cross test host to connect to")
+ .default("localhost")
+ private val port: Int by option(help = "The cross test port to connect to").int().default(9090)
+ private val numTests: Int by option("--testloops", "--n", help = "Number of runs in this test")
+ .int()
+ .default(1)
+ private val protocolType: ProtocolType by option("--protocol", help = "Protocol type")
+ .enum<ProtocolType> { it.key }
+ .default(ProtocolType.Binary)
+ private val transportType: TransportType by option("--transport", help = "Transport type")
+ .enum<TransportType> { it.key }
+ .default(TransportType.Buffered)
+ private val useHttpClient: Boolean by option("--client", help = "Use http client")
+ .flag(default = false)
+ private val useSSL: Boolean by option("--ssl", help = "Use SSL for encrypted transport")
+ .flag(default = false)
+ private val useZlib: Boolean by option(
+ "--zlib",
+ help = "Use zlib wrapper for compressed transport"
+ )
+ .flag(default = false)
+ private val socketTimeout: Int by option("--timeout", help = "Socket timeout")
+ .int()
+ .default(1000)
+
+ private fun createProtocol(transport: TTransport): TProtocol =
+ when (protocolType) {
+ ProtocolType.Binary, ProtocolType.Multi -> TBinaryProtocol(transport)
+ ProtocolType.Compact, ProtocolType.MultiCompact -> TCompactProtocol(transport)
+ ProtocolType.Json, ProtocolType.MultiJson -> TJSONProtocol(transport)
}
- } catch (x: Exception) {
- System.err.println("Can not parse arguments! See --help")
- exitProcess(ERR_UNKNOWN)
- }
- try {
- checkProtocolType(protocolType)
- checkTransportType(transportType)
- if (transportType == "http" && ssl) {
- throw Exception("SSL is not supported over http.")
+
+ private fun createTransport(): TNonblockingTransport =
+ when (transportType) {
+ TransportType.Framed -> TNonblockingSocket(host, port, socketTimeout)
+ else ->
+ throw UnsupportedOperationException(
+ "only frame transport type is supported for now, got $transportType"
+ )
}
- } catch (e: Exception) {
- System.err.println("Error: " + e.message)
- exitProcess(ERR_UNKNOWN)
- }
- val transport: TTransport
- try {
- transport = getTTransport(transportType, host, port, httpClient, ssl, socketTimeout, zlib)
- } catch (x: Exception) {
- x.printStackTrace()
- exitProcess(ERR_UNKNOWN)
- }
- var tProtocol = getTProtocol(protocolType, transport)
- var tProtocol2: TProtocol? = null
- if (protocolType.startsWith("multi")) {
- tProtocol2 = TMultiplexedProtocol(tProtocol, "SecondService")
- tProtocol = TMultiplexedProtocol(tProtocol, "ThriftTest")
- }
- println("$tProtocol, $transport")
- val clientFactory = {
- ThriftTestClient(
- { TBinaryProtocol(it) },
- TAsyncClientManager(),
- TNonblockingSocket(host, port, socketTimeout)
- )
- }
+ private val clientManager = TAsyncClientManager()
- var testClient = clientFactory()
- val insane = Insanity()
- var timeMin: Long = 0
- var timeMax: Long = 0
- var timeTot: Long = 0
- var returnCode = 0
- for (test in 0 until numTests) {
- // transport.startConnect()
- try {
- /** CONNECT TEST */
- println("Test #${test + 1}, connect $host:$port")
- // if (!transport.isOpen) {
- // try {
- // transport.open()
- // } catch (ttx: TTransportException) {
- // ttx.printStackTrace()
- // println("Connect failed: " + ttx.message)
- // exitProcess(ERR_UNKNOWN)
- // }
- // }
- val start = System.nanoTime()
- /** VOID TEST */
- try {
- print("testVoid()")
- testClient.testVoid()
- print(" = void\n")
- } catch (tax: TApplicationException) {
- tax.printStackTrace()
- returnCode = returnCode or ERR_BASETYPES
- }
- /** STRING TEST */
- print("testString(\"Test\")")
- val s: String = testClient.testString("Test")
- print(" = \"$s\"\n")
- if (s != "Test") {
- returnCode = returnCode or ERR_BASETYPES
- println("*** FAILURE ***\n")
- }
- /** Multiplexed test */
- if (protocolType.startsWith("multi")) {
- throw UnsupportedOperationException("multi protocol is not yet supported")
- // val secondClient: SecondServiceClient =
- // SecondServiceClient(tProtocol2)
- // print("secondtestString(\"Test2\")")
- // s = secondClient.secondtestString("Test2")
- // print(" = \"$s\"\n")
- // if (s != "testString(\"Test2\")") {
- // returnCode = returnCode or ERR_PROTOCOLS
- // println("*** FAILURE ***\n")
- // }
- }
- /** BYTE TEST */
- print("testByte(1)")
- val i8: Byte = testClient.testByte(1.toByte())
- print(" = $i8\n")
- if (i8.toInt() != 1) {
- returnCode = returnCode or ERR_BASETYPES
- println("*** FAILURE ***\n")
- }
- /** I32 TEST */
- print("testI32(-1)")
- val i32: Int = testClient.testI32(-1)
- print(" = $i32\n")
- if (i32 != -1) {
- returnCode = returnCode or ERR_BASETYPES
- println("*** FAILURE ***\n")
- }
- /** I64 TEST */
- print("testI64(-34359738368)")
- val i64: Long = testClient.testI64(-34359738368L)
- print(" = $i64\n")
- if (i64 != -34359738368L) {
- returnCode = returnCode or ERR_BASETYPES
- println("*** FAILURE ***\n")
- }
- /** DOUBLE TEST */
- print("testDouble(-5.325098235)")
- val dub: Double = testClient.testDouble(-5.325098235)
- print(" = $dub\n")
- if (abs(dub - -5.325098235) > 0.001) {
- returnCode = returnCode or ERR_BASETYPES
- println("*** FAILURE ***\n")
- }
- /** BINARY TEST */
+ private fun createClient(): ThriftTestClient =
+ ThriftTestClient({ createProtocol(it) }, clientManager, createTransport())
+
+ private fun createSecondServiceClient(): SecondServiceClient =
+ SecondServiceClient({ createProtocol(it) }, clientManager, createTransport())
+
+ override fun run() = runBlocking {
+ var testClient = createClient()
+ val insane = Insanity()
+ var timeMin: Long = 0
+ var timeMax: Long = 0
+ var timeTot: Long = 0
+ var returnCode = 0
+ for (test in 0 until numTests) {
try {
- print("testBinary(-128...127) = ")
- val data =
- byteArrayOf(
- -128,
- -127,
- -126,
- -125,
- -124,
- -123,
- -122,
- -121,
- -120,
- -119,
- -118,
- -117,
- -116,
- -115,
- -114,
- -113,
- -112,
- -111,
- -110,
- -109,
- -108,
- -107,
- -106,
- -105,
- -104,
- -103,
- -102,
- -101,
- -100,
- -99,
- -98,
- -97,
- -96,
- -95,
- -94,
- -93,
- -92,
- -91,
- -90,
- -89,
- -88,
- -87,
- -86,
- -85,
- -84,
- -83,
- -82,
- -81,
- -80,
- -79,
- -78,
- -77,
- -76,
- -75,
- -74,
- -73,
- -72,
- -71,
- -70,
- -69,
- -68,
- -67,
- -66,
- -65,
- -64,
- -63,
- -62,
- -61,
- -60,
- -59,
- -58,
- -57,
- -56,
- -55,
- -54,
- -53,
- -52,
- -51,
- -50,
- -49,
- -48,
- -47,
- -46,
- -45,
- -44,
- -43,
- -42,
- -41,
- -40,
- -39,
- -38,
- -37,
- -36,
- -35,
- -34,
- -33,
- -32,
- -31,
- -30,
- -29,
- -28,
- -27,
- -26,
- -25,
- -24,
- -23,
- -22,
- -21,
- -20,
- -19,
- -18,
- -17,
- -16,
- -15,
- -14,
- -13,
- -12,
- -11,
- -10,
- -9,
- -8,
- -7,
- -6,
- -5,
- -4,
- -3,
- -2,
- -1,
- 0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 10,
- 11,
- 12,
- 13,
- 14,
- 15,
- 16,
- 17,
- 18,
- 19,
- 20,
- 21,
- 22,
- 23,
- 24,
- 25,
- 26,
- 27,
- 28,
- 29,
- 30,
- 31,
- 32,
- 33,
- 34,
- 35,
- 36,
- 37,
- 38,
- 39,
- 40,
- 41,
- 42,
- 43,
- 44,
- 45,
- 46,
- 47,
- 48,
- 49,
- 50,
- 51,
- 52,
- 53,
- 54,
- 55,
- 56,
- 57,
- 58,
- 59,
- 60,
- 61,
- 62,
- 63,
- 64,
- 65,
- 66,
- 67,
- 68,
- 69,
- 70,
- 71,
- 72,
- 73,
- 74,
- 75,
- 76,
- 77,
- 78,
- 79,
- 80,
- 81,
- 82,
- 83,
- 84,
- 85,
- 86,
- 87,
- 88,
- 89,
- 90,
- 91,
- 92,
- 93,
- 94,
- 95,
- 96,
- 97,
- 98,
- 99,
- 100,
- 101,
- 102,
- 103,
- 104,
- 105,
- 106,
- 107,
- 108,
- 109,
- 110,
- 111,
- 112,
- 113,
- 114,
- 115,
- 116,
- 117,
- 118,
- 119,
- 120,
- 121,
- 122,
- 123,
- 124,
- 125,
- 126,
- 127
- )
- val bin: ByteBuffer = ByteBuffer.wrap(testClient.testBinary(data))
- bin.mark()
- val bytes = ByteArray(bin.limit() - bin.position())
- bin[bytes]
- bin.reset()
- print("{")
- var first = true
- for (i in bytes.indices) {
- if (first) first = false else print(", ")
- print(bytes[i])
- }
- println("}")
- if (ByteBuffer.wrap(data) != bin) {
- returnCode = returnCode or ERR_BASETYPES
+ /** CONNECT TEST */
+ /** CONNECT TEST */
+ // if (!transport.isOpen) {
+ // try {
+ // transport.open()
+ // } catch (ttx: TTransportException) {
+ // ttx.printStackTrace()
+ // println("Connect failed: " + ttx.message)
+ // exitProcess(ERR_UNKNOWN)
+ // }
+ // }
+ println("Test #${test + 1}, connect $host:$port")
+
+ val start = System.nanoTime()
+ /** VOID TEST */
+ /** VOID TEST */
+ returnCode = testClient.voidTest(returnCode)
+ /** STRING TEST */
+ /** STRING TEST */
+ returnCode = testClient.stringTest(returnCode)
+ /** Multiplexed test */
+ /** Multiplexed test */
+ returnCode = multiplexTest(returnCode)
+ /** BYTE TEST */
+ /** BYTE TEST */
+ returnCode = testClient.byteTest(returnCode)
+ /** I32 TEST */
+ /** I32 TEST */
+ returnCode = testClient.i32Test(returnCode)
+ /** I64 TEST */
+ /** I64 TEST */
+ returnCode = testClient.i64Test(returnCode)
+ /** DOUBLE TEST */
+ /** DOUBLE TEST */
+ returnCode = testClient.doubleTest(returnCode)
+ /** BINARY TEST */
+ /** BINARY TEST */
+ returnCode = testClient.binaryTest(returnCode)
+ /** STRUCT TEST */
+ /** STRUCT TEST */
+ val pair = testClient.structTest(returnCode)
+ val out = pair.first
+ returnCode = pair.second
+ /** NESTED STRUCT TEST */
+ /** NESTED STRUCT TEST */
+ returnCode = testClient.nestedStructTest(out, returnCode)
+ /** MAP TEST */
+ /** MAP TEST */
+ val testMapParam = (0..4).associateBy { 10 - it }
+ printMap(testMapParam)
+ val testMapResult: Map<Int, Int> = testClient.testMap(testMapParam)
+ printMap(testMapResult)
+ if (testMapParam != testMapResult) {
+ returnCode = returnCode or ERR_CONTAINERS
println("*** FAILURE ***\n")
}
- } catch (ex: Exception) {
- returnCode = returnCode or ERR_BASETYPES
- println("\n*** FAILURE ***\n")
- ex.printStackTrace(System.out)
- }
- /** STRUCT TEST */
- print("testStruct({\"Zero\", 1, -3, -5})")
- val out = Xtruct()
- out.string_thing = "Zero"
- out.byte_thing = 1.toByte()
- out.i32_thing = -3
- out.i64_thing = -5
- var `in`: Xtruct = testClient.testStruct(out)
- print(
- """ = {"${`in`.string_thing}",${`in`.byte_thing}, ${`in`.i32_thing}, ${`in`.i64_thing}}
-"""
- )
- if (`in` != out) {
- returnCode = returnCode or ERR_STRUCTS
- println("*** FAILURE ***\n")
- }
- /** NESTED STRUCT TEST */
- print("testNest({1, {\"Zero\", 1, -3, -5}), 5}")
- val out2 = Xtruct2()
- out2.byte_thing = 1.toShort().toByte()
- out2.struct_thing = out
- out2.i32_thing = 5
- val in2: Xtruct2 = testClient.testNest(out2)
- `in` = in2.struct_thing!!
- print(
- """ = {${in2.byte_thing}, {"${`in`.string_thing}", ${`in`.byte_thing}, ${`in`.i32_thing}, ${`in`.i64_thing}}, ${in2.i32_thing}}
-"""
- )
- if (in2 != out2) {
- returnCode = returnCode or ERR_STRUCTS
- println("*** FAILURE ***\n")
- }
- /** MAP TEST */
- val mapout: MutableMap<Int, Int> = HashMap()
- for (i in 0..4) {
- mapout[i] = i - 10
- }
- print("testMap({")
- var first = true
- for (key in mapout.keys) {
- if (first) {
- first = false
- } else {
- print(", ")
- }
- print(key.toString() + " => " + mapout[key])
- }
- print("})")
- val mapin: Map<Int, Int> = testClient.testMap(mapout)
- print(" = {")
- first = true
- for (key in mapin.keys) {
- if (first) {
- first = false
- } else {
- print(", ")
- }
- print(key.toString() + " => " + mapout[key])
- }
- print("}\n")
- if (mapout != mapin) {
- returnCode = returnCode or ERR_CONTAINERS
- println("*** FAILURE ***\n")
- }
- /** STRING MAP TEST */
- try {
- val smapout: MutableMap<String, String> = HashMap()
- smapout["a"] = "2"
- smapout["b"] = "blah"
- smapout["some"] = "thing"
- for (key in smapout.keys) {
- if (first) {
- first = false
- } else {
- print(", ")
- }
- print(key + " => " + smapout[key])
- }
- print("})")
- val smapin: Map<String, String> = testClient.testStringMap(smapout)
- print(" = {")
- first = true
- for (key in smapin.keys) {
- if (first) {
- first = false
- } else {
- print(", ")
- }
- print(key + " => " + smapout[key])
+ /** STRING MAP TEST */
+ /** STRING MAP TEST */
+ returnCode = testClient.stringMapTest(returnCode)
+ /** SET TEST */
+ /** SET TEST */
+ val setout: MutableSet<Int> = HashSet()
+ for (i in -2..2) {
+ setout.add(i)
}
- print("}\n")
- if (smapout != smapin) {
+ val setin: Set<Int> = testClient.testSet(setout)
+ if (setout != setin) {
returnCode = returnCode or ERR_CONTAINERS
println("*** FAILURE ***\n")
}
- } catch (ex: Exception) {
- returnCode = returnCode or ERR_CONTAINERS
- println("*** FAILURE ***\n")
- ex.printStackTrace(System.out)
- }
- /** SET TEST */
- val setout: MutableSet<Int> = HashSet()
- for (i in -2..2) {
- setout.add(i)
- }
- print("testSet({")
- first = true
- for (elem in setout) {
- if (first) {
- first = false
- } else {
- print(", ")
- }
- print(elem)
- }
- print("})")
- val setin: Set<Int> = testClient.testSet(setout)
- print(" = {")
- first = true
- for (elem in setin) {
- if (first) {
- first = false
- } else {
- print(", ")
- }
- print(elem)
- }
- print("}\n")
- if (setout != setin) {
- returnCode = returnCode or ERR_CONTAINERS
- println("*** FAILURE ***\n")
- }
- /** LIST TEST */
- val listout: MutableList<Int> = ArrayList()
- for (i in -2..2) {
- listout.add(i)
- }
- print("testList({")
- first = true
- for (elem in listout) {
- if (first) {
- first = false
- } else {
- print(", ")
- }
- print(elem)
- }
- print("})")
- val listin: List<Int> = testClient.testList(listout)
- print(" = {")
- first = true
- for (elem in listin) {
- if (first) {
- first = false
- } else {
- print(", ")
+ /** LIST TEST */
+ /** LIST TEST */
+ val listout: MutableList<Int> = ArrayList()
+ for (i in -2..2) {
+ listout.add(i)
}
- print(elem)
- }
- print("}\n")
- if (listout != listin) {
- returnCode = returnCode or ERR_CONTAINERS
- println("*** FAILURE ***\n")
- }
- /** ENUM TEST */
- print("testEnum(ONE)")
- var ret: Numberz = testClient.testEnum(Numberz.ONE)
- print(" = $ret\n")
- if (ret !== Numberz.ONE) {
- returnCode = returnCode or ERR_STRUCTS
- println("*** FAILURE ***\n")
- }
- print("testEnum(TWO)")
- ret = testClient.testEnum(Numberz.TWO)
- print(" = $ret\n")
- if (ret !== Numberz.TWO) {
- returnCode = returnCode or ERR_STRUCTS
- println("*** FAILURE ***\n")
- }
- print("testEnum(THREE)")
- ret = testClient.testEnum(Numberz.THREE)
- print(" = $ret\n")
- if (ret !== Numberz.THREE) {
- returnCode = returnCode or ERR_STRUCTS
- println("*** FAILURE ***\n")
- }
- print("testEnum(FIVE)")
- ret = testClient.testEnum(Numberz.FIVE)
- print(" = $ret\n")
- if (ret !== Numberz.FIVE) {
- returnCode = returnCode or ERR_STRUCTS
- println("*** FAILURE ***\n")
- }
- print("testEnum(EIGHT)")
- ret = testClient.testEnum(Numberz.EIGHT)
- print(" = $ret\n")
- if (ret !== Numberz.EIGHT) {
- returnCode = returnCode or ERR_STRUCTS
- println("*** FAILURE ***\n")
- }
- /** TYPEDEF TEST */
- print("testTypedef(309858235082523)")
- val uid: Long = testClient.testTypedef(309858235082523L)
- print(" = $uid\n")
- if (uid != 309858235082523L) {
- returnCode = returnCode or ERR_BASETYPES
- println("*** FAILURE ***\n")
- }
- /** NESTED MAP TEST */
- print("testMapMap(1)")
- val mm: Map<Int, Map<Int, Int>> = testClient.testMapMap(1)
- print(" = {")
- for (key in mm.keys) {
- print("$key => {")
- val m2 = mm[key]!!
- for (k2 in m2.keys) {
- print(k2.toString() + " => " + m2[k2] + ", ")
- }
- print("}, ")
- }
- print("}\n")
- if (mm.size != 2 || !mm.containsKey(4) || !mm.containsKey(-4)) {
- returnCode = returnCode or ERR_CONTAINERS
- println("*** FAILURE ***\n")
- } else {
- val m1 = mm[4]!!
- val m2 = mm[-4]!!
- if (m1[1] != 1 ||
- m1[2] != 2 ||
- m1[3] != 3 ||
- m1[4] != 4 ||
- m2[-1] != -1 ||
- m2[-2] != -2 ||
- m2[-3] != -3 ||
- m2[-4] != -4
- ) {
+ val listin: List<Int> = testClient.testList(listout)
+ if (listout != listin) {
returnCode = returnCode or ERR_CONTAINERS
println("*** FAILURE ***\n")
}
- }
- /** INSANITY TEST */
- var insanityFailed = true
- try {
- val hello = Xtruct()
- hello.string_thing = "Hello2"
- hello.byte_thing = 2
- hello.i32_thing = 2
- hello.i64_thing = 2
- val goodbye = Xtruct()
- goodbye.string_thing = "Goodbye4"
- goodbye.byte_thing = 4.toByte()
- goodbye.i32_thing = 4
- goodbye.i64_thing = 4L
- insane.userMap =
- HashMap<Numberz, Long>().apply {
- put(Numberz.EIGHT, 8L)
- put(Numberz.FIVE, 5L)
- }
+ /** ENUM TEST */
+ /** ENUM TEST */
+ returnCode = testClient.enumTest(returnCode)
+ /** TYPEDEF TEST */
+ /** TYPEDEF TEST */
+ returnCode = testClient.typedefTest(returnCode)
+ /** NESTED MAP TEST */
+ /** NESTED MAP TEST */
+ returnCode = testClient.nestedMapTest(returnCode)
+ /** INSANITY TEST */
+ /** INSANITY TEST */
+ var insanityFailed = true
+ try {
+ val hello = Xtruct()
+ hello.string_thing = "Hello2"
+ hello.byte_thing = 2
+ hello.i32_thing = 2
+ hello.i64_thing = 2
+ val goodbye = Xtruct()
+ goodbye.string_thing = "Goodbye4"
+ goodbye.byte_thing = 4.toByte()
+ goodbye.i32_thing = 4
+ goodbye.i64_thing = 4L
+ insane.userMap =
+ HashMap<Numberz, Long>().apply {
+ put(Numberz.EIGHT, 8L)
+ put(Numberz.FIVE, 5L)
+ }
- insane.xtructs =
- ArrayList<Xtruct>().apply {
- add(goodbye)
- add(hello)
- }
+ insane.xtructs =
+ ArrayList<Xtruct>().apply {
+ add(goodbye)
+ add(hello)
+ }
- print("testInsanity()")
- val whoa: Map<Long, Map<Numberz, Insanity>> = testClient.testInsanity(insane)
- print(" = {")
- for (key in whoa.keys) {
- val `val` = whoa[key]!!
- print("$key => {")
- for (k2 in `val`.keys) {
- val v2 = `val`[k2]
- print("$k2 => {")
- val userMap = v2!!.userMap
- print("{")
- if (userMap != null) {
- for (k3 in userMap.keys) {
- print(k3.toString() + " => " + userMap[k3] + ", ")
+ print("testInsanity()")
+ val whoa: Map<Long, Map<Numberz, Insanity>> = testClient.testInsanity(insane)
+ print(" = {")
+ for (key in whoa.keys) {
+ val `val` = whoa[key]!!
+ print("$key => {")
+ for (k2 in `val`.keys) {
+ val v2 = `val`[k2]
+ print("$k2 => {")
+ val userMap = v2!!.userMap
+ print("{")
+ if (userMap != null) {
+ for (k3 in userMap.keys) {
+ print(k3.toString() + " => " + userMap[k3] + ", ")
+ }
}
- }
- print("}, ")
- val xtructs = v2.xtructs
- print("{")
- if (xtructs != null) {
- for ((string_thing, byte_thing, i32_thing, i64_thing) in xtructs) {
- print("{\"$string_thing\", $byte_thing, $i32_thing, $i64_thing}, ")
+ print("}, ")
+ val xtructs = v2.xtructs
+ print("{")
+ if (xtructs != null) {
+ for ((string_thing, byte_thing, i32_thing, i64_thing) in xtructs) {
+ print(
+ "{\"$string_thing\", $byte_thing, $i32_thing, $i64_thing}, "
+ )
+ }
}
+ print("}")
+ print("}, ")
}
- print("}")
print("}, ")
}
- print("}, ")
- }
- print("}\n")
- if (whoa.size == 2 && whoa.containsKey(1L) && whoa.containsKey(2L)) {
- val first_map = whoa[1L]!!
- val second_map = whoa[2L]!!
- if (first_map.size == 2 &&
- first_map.containsKey(Numberz.TWO) &&
- first_map.containsKey(Numberz.THREE) &&
- second_map.size == 1 &&
- second_map.containsKey(Numberz.SIX) &&
- insane == first_map[Numberz.TWO] &&
- insane == first_map[Numberz.THREE]
- ) {
- val six = second_map[Numberz.SIX]!!
- // Cannot use "new Insanity().equals(six)" because as of now,
- // struct/container
- // fields with default requiredness have isset=false for local instances and
- // yet
- // received empty values from other languages like C++ have isset=true .
- if ((six.userMap?.size ?: 0) == 0 && (six.xtructs?.size ?: 0) == 0) {
- // OK
- insanityFailed = false
+ print("}\n")
+ if (whoa.size == 2 && whoa.containsKey(1L) && whoa.containsKey(2L)) {
+ val firstMap = whoa[1L]!!
+ val secondMap = whoa[2L]!!
+ if (firstMap.size == 2 &&
+ firstMap.containsKey(Numberz.TWO) &&
+ firstMap.containsKey(Numberz.THREE) &&
+ secondMap.size == 1 &&
+ secondMap.containsKey(Numberz.SIX) &&
+ insane == firstMap[Numberz.TWO] &&
+ insane == firstMap[Numberz.THREE]
+ ) {
+ val six = secondMap[Numberz.SIX]!!
+ // Cannot use "new Insanity().equals(six)" because as of now,
+ // struct/container
+ // fields with default requiredness have isset=false for local instances
+ // and
+ // yet
+ // received empty values from other languages like C++ have isset=true .
+ if ((six.userMap?.size ?: 0) == 0 && (six.xtructs?.size ?: 0) == 0) {
+ // OK
+ insanityFailed = false
+ }
}
}
+ } catch (ex: Exception) {
+ returnCode = returnCode or ERR_STRUCTS
+ println("*** FAILURE ***\n")
+ ex.printStackTrace(System.out)
+ insanityFailed = false
}
- } catch (ex: Exception) {
- returnCode = returnCode or ERR_STRUCTS
- println("*** FAILURE ***\n")
- ex.printStackTrace(System.out)
- insanityFailed = false
+ if (insanityFailed) {
+ returnCode = returnCode or ERR_STRUCTS
+ println("*** FAILURE ***\n")
+ }
+ /** EXECPTION TEST */
+ /** EXECPTION TEST */
+ val pair2 = exceptionTest(testClient, returnCode)
+ returnCode = pair2.first
+ testClient = pair2.second
+ /** MULTI EXCEPTION TEST */
+ /** MULTI EXCEPTION TEST */
+ val pair3 = multiExceptionTest(testClient, returnCode)
+ returnCode = pair3.first
+ testClient = pair3.second
+ /** ONEWAY TEST */
+ /** ONEWAY TEST */
+ returnCode = testClient.onewayTest(returnCode)
+ val stop = System.nanoTime()
+ val tot = stop - start
+ println("Total time: " + tot / 1000 + "us")
+ if (timeMin == 0L || tot < timeMin) {
+ timeMin = tot
+ }
+ if (tot > timeMax) {
+ timeMax = tot
+ }
+ timeTot += tot
+ // transport.close()
+ } catch (x: Exception) {
+ System.out.printf("*** FAILURE ***\n")
+ x.printStackTrace()
+ returnCode = returnCode or ERR_UNKNOWN
}
- if (insanityFailed) {
- returnCode = returnCode or ERR_STRUCTS
+ }
+ val timeAvg = timeTot / numTests
+ println("Min time: " + timeMin / 1000 + "us")
+ println("Max time: " + timeMax / 1000 + "us")
+ println("Avg time: " + timeAvg / 1000 + "us")
+ try {
+ val json = TSerializer(TSimpleJSONProtocol.Factory()).toString(insane)
+ println("\nSample TSimpleJSONProtocol output:\n$json")
+ } catch (x: TException) {
+ println("*** FAILURE ***")
+ x.printStackTrace()
+ returnCode = returnCode or ERR_BASETYPES
+ }
+ exitProcess(returnCode)
+ }
+
+ private suspend fun multiplexTest(returnCode: Int): Int {
+ var code = returnCode
+ if (protocolType == ProtocolType.Multi ||
+ protocolType == ProtocolType.MultiJson ||
+ protocolType == ProtocolType.MultiCompact
+ ) {
+ val secondClient: SecondServiceClient = createSecondServiceClient()
+ print("secondtestString(\"Test2\")")
+ val s = secondClient.secondtestString("Test2")
+ print(" = \"$s\"\n")
+ if (s != "testString(\"Test2\")") {
+ code = code or ERR_PROTOCOLS
println("*** FAILURE ***\n")
}
- /** EXECPTION TEST */
- try {
- print("testClient.testException(\"Xception\") =>")
- testClient.testException("Xception")
- print(" void\n*** FAILURE ***\n")
- returnCode = returnCode or ERR_EXCEPTIONS
- } catch (e: Xception) {
- System.out.printf(" {%d, \"%s\"}\n", e.errorCode, e.message)
- testClient = clientFactory()
- }
- try {
- print("testClient.testException(\"TException\") =>")
- testClient.testException("TException")
- print(" void\n*** FAILURE ***\n")
- returnCode = returnCode or ERR_EXCEPTIONS
- } catch (e: TException) {
- System.out.printf(" {\"%s\"}\n", e.message)
- testClient = clientFactory()
- }
- try {
- print("testClient.testException(\"success\") =>")
- testClient.testException("success")
- print(" void\n")
- } catch (e: Exception) {
- System.out.printf(" exception\n*** FAILURE ***\n")
- returnCode = returnCode or ERR_EXCEPTIONS
- }
- /** MULTI EXCEPTION TEST */
- try {
- System.out.printf("testClient.testMultiException(\"Xception\", \"test 1\") =>")
- testClient.testMultiException("Xception", "test 1")
- print(" result\n*** FAILURE ***\n")
- returnCode = returnCode or ERR_EXCEPTIONS
- } catch (e: Xception) {
- System.out.printf(" {%d, \"%s\"}\n", e.errorCode, e.message)
- testClient = clientFactory()
- }
- try {
- System.out.printf("testClient.testMultiException(\"Xception2\", \"test 2\") =>")
- testClient.testMultiException("Xception2", "test 2")
- print(" result\n*** FAILURE ***\n")
- returnCode = returnCode or ERR_EXCEPTIONS
- } catch (e: Xception2) {
- System.out.printf(" {%d, {\"%s\"}}\n", e.errorCode, e.struct_thing!!.string_thing)
- testClient = clientFactory()
- }
- try {
- print("testClient.testMultiException(\"success\", \"test 3\") =>")
- val result: Xtruct = testClient.testMultiException("success", "test 3")
- System.out.printf(" {{\"%s\"}}\n", result.string_thing)
- } catch (e: Exception) {
- System.out.printf(" exception\n*** FAILURE ***\n")
- returnCode = returnCode or ERR_EXCEPTIONS
- }
- /** ONEWAY TEST */
- print("testOneway(3)...")
- val startOneway = System.nanoTime()
- testClient.testOneway(3)
- val onewayElapsedMillis = (System.nanoTime() - startOneway) / 1000000
- if (onewayElapsedMillis > 200) {
- println(
- "Oneway test took too long to execute failed: took " +
- onewayElapsedMillis +
- "ms"
- )
- println(
- "oneway calls are 'fire and forget' and therefore should not cause blocking."
- )
- println(
- "Some transports (HTTP) have a required response, and typically this failure"
- )
- println("means the transport response was delayed until after the execution")
- println(
- "of the RPC. The server should post the transport response immediately and"
- )
- println("before executing the RPC.")
- println("*** FAILURE ***")
- returnCode = returnCode or ERR_BASETYPES
+ }
+ return code
+ }
+
+ private suspend fun ThriftTestClient.enumTest(returnCode: Int): Int {
+ var returnCode1 = returnCode
+ print("testEnum(ONE)")
+ var ret: Numberz = testEnum(Numberz.ONE)
+ print(" = $ret\n")
+ if (ret !== Numberz.ONE) {
+ returnCode1 = returnCode1 or ERR_STRUCTS
+ println("*** FAILURE ***\n")
+ }
+ print("testEnum(TWO)")
+ ret = testEnum(Numberz.TWO)
+ print(" = $ret\n")
+ if (ret !== Numberz.TWO) {
+ returnCode1 = returnCode1 or ERR_STRUCTS
+ println("*** FAILURE ***\n")
+ }
+ print("testEnum(THREE)")
+ ret = testEnum(Numberz.THREE)
+ print(" = $ret\n")
+ if (ret !== Numberz.THREE) {
+ returnCode1 = returnCode1 or ERR_STRUCTS
+ println("*** FAILURE ***\n")
+ }
+ print("testEnum(FIVE)")
+ ret = testEnum(Numberz.FIVE)
+ print(" = $ret\n")
+ if (ret !== Numberz.FIVE) {
+ returnCode1 = returnCode1 or ERR_STRUCTS
+ println("*** FAILURE ***\n")
+ }
+ print("testEnum(EIGHT)")
+ ret = testEnum(Numberz.EIGHT)
+ print(" = $ret\n")
+ if (ret !== Numberz.EIGHT) {
+ returnCode1 = returnCode1 or ERR_STRUCTS
+ println("*** FAILURE ***\n")
+ }
+ return returnCode1
+ }
+
+ private fun printMap(testMapParam: Map<Int, Int>) {
+ print("testMap({")
+ var first = true
+ for (key in testMapParam.keys) {
+ if (first) {
+ first = false
} else {
- println("Success - fire and forget only took " + onewayElapsedMillis + "ms")
- }
- val stop = System.nanoTime()
- val tot = stop - start
- println("Total time: " + tot / 1000 + "us")
- if (timeMin == 0L || tot < timeMin) {
- timeMin = tot
- }
- if (tot > timeMax) {
- timeMax = tot
+ print(", ")
}
- timeTot += tot
- // transport.close()
- } catch (x: Exception) {
- System.out.printf("*** FAILURE ***\n")
- x.printStackTrace()
- returnCode = returnCode or ERR_UNKNOWN
+ print(key.toString() + " => " + testMapParam[key])
}
+ print("})")
}
- val timeAvg = timeTot / numTests
- println("Min time: " + timeMin / 1000 + "us")
- println("Max time: " + timeMax / 1000 + "us")
- println("Avg time: " + timeAvg / 1000 + "us")
- try {
- val json = TSerializer(TSimpleJSONProtocol.Factory()).toString(insane)
- println("\nSample TSimpleJSONProtocol output:\n$json")
- } catch (x: TException) {
- println("*** FAILURE ***")
- x.printStackTrace()
- returnCode = returnCode or ERR_BASETYPES
- }
- exitProcess(returnCode)
-}
-private fun getTProtocol(protocol_type: String, transport: TTransport) =
- when (protocol_type) {
- "json", "multij" -> {
- TJSONProtocol(transport)
+ private suspend fun exceptionTest(
+ testClient: ThriftTestClient,
+ returnCode: Int
+ ): Pair<Int, ThriftTestClient> {
+ var client = testClient
+ var code = returnCode
+ try {
+ print("testClient.testException(\"Xception\") =>")
+ client.testException("Xception")
+ print(" void\n*** FAILURE ***\n")
+ code = code or ERR_EXCEPTIONS
+ } catch (e: Xception) {
+ System.out.printf(" {%d, \"%s\"}\n", e.errorCode, e.message)
+ client = createClient()
}
- "compact", "multic" -> {
- TCompactProtocol(transport)
+ try {
+ print("testClient.testException(\"TException\") =>")
+ client.testException("TException")
+ print(" void\n*** FAILURE ***\n")
+ code = code or ERR_EXCEPTIONS
+ } catch (e: TException) {
+ System.out.printf(" {\"%s\"}\n", e.message)
+ client = createClient()
}
- else -> {
- TBinaryProtocol(transport)
+ try {
+ print("testClient.testException(\"success\") =>")
+ client.testException("success")
+ print(" void\n")
+ } catch (e: Exception) {
+ System.out.printf(" exception\n*** FAILURE ***\n")
+ code = code or ERR_EXCEPTIONS
}
+ return code to client
}
-private fun checkTransportType(transport_type: String) {
- when (transport_type) {
- "buffered" -> {}
- "framed" -> {}
- "fastframed" -> {}
- "http" -> {}
- "zlib" -> {}
- else -> {
- throw Exception("Unknown transport type! $transport_type")
+ private suspend fun multiExceptionTest(
+ testClient: ThriftTestClient,
+ returnCode: Int
+ ): Pair<Int, ThriftTestClient> {
+ var client = testClient
+ var code = returnCode
+ try {
+ System.out.printf("testClient.testMultiException(\"Xception\", \"test 1\") =>")
+ client.testMultiException("Xception", "test 1")
+ print(" result\n*** FAILURE ***\n")
+ code = code or ERR_EXCEPTIONS
+ } catch (e: Xception) {
+ System.out.printf(" {%d, \"%s\"}\n", e.errorCode, e.message)
+ client = createClient()
}
+ try {
+ System.out.printf("testClient.testMultiException(\"Xception2\", \"test 2\") =>")
+ client.testMultiException("Xception2", "test 2")
+ print(" result\n*** FAILURE ***\n")
+ code = code or ERR_EXCEPTIONS
+ } catch (e: Xception2) {
+ System.out.printf(" {%d, {\"%s\"}}\n", e.errorCode, e.struct_thing!!.string_thing)
+ client = createClient()
+ }
+ try {
+ print("testClient.testMultiException(\"success\", \"test 3\") =>")
+ val result: Xtruct = client.testMultiException("success", "test 3")
+ System.out.printf(" {{\"%s\"}}\n", result.string_thing)
+ } catch (e: Exception) {
+ System.out.printf(" exception\n*** FAILURE ***\n")
+ code = code or ERR_EXCEPTIONS
+ }
+ return code to client
}
}
-private fun checkProtocolType(protocol_type: String) {
- when (protocol_type) {
- "binary" -> {}
- "compact" -> {}
- "json" -> {}
- "multi" -> {}
- "multic" -> {}
- "multij" -> {}
- else -> {
- throw Exception("Unknown protocol type! $protocol_type")
+private suspend fun ThriftTestClient.typedefTest(returnCode: Int): Int {
+ var returnCode1 = returnCode
+ print("testTypedef(309858235082523)")
+ val uid: Long = testTypedef(309858235082523L)
+ print(" = $uid\n")
+ if (uid != 309858235082523L) {
+ returnCode1 = returnCode1 or ERR_BASETYPES
+ println("*** FAILURE ***\n")
+ }
+ return returnCode1
+}
+
+private suspend fun ThriftTestClient.structTest(returnCode: Int): Pair<Xtruct, Int> {
+ var code = returnCode
+ print("testStruct({\"Zero\", 1, -3, -5})")
+ val out = Xtruct()
+ out.string_thing = "Zero"
+ out.byte_thing = 1.toByte()
+ out.i32_thing = -3
+ out.i64_thing = -5
+ val input: Xtruct = testStruct(out)
+ print(
+ """ = {"${input.string_thing}",${input.byte_thing}, ${input.i32_thing}, ${input.i64_thing}}"""
+ )
+ if (input != out) {
+ code = code or ERR_STRUCTS
+ println("*** FAILURE ***\n")
+ }
+ return out to code
+}
+
+private suspend fun ThriftTestClient.onewayTest(returnCode: Int): Int {
+ var returnCode1 = returnCode
+ print("testOneway(3)...")
+ val startOneway = System.nanoTime()
+ testOneway(3)
+ val onewayElapsedMillis = (System.nanoTime() - startOneway) / 1000000
+ if (onewayElapsedMillis > 200) {
+ println("Oneway test took too long to execute failed: took " + onewayElapsedMillis + "ms")
+ println("oneway calls are 'fire and forget' and therefore should not cause blocking.")
+ println("Some transports (HTTP) have a required response, and typically this failure")
+ println("means the transport response was delayed until after the execution")
+ println("of the RPC. The server should post the transport response immediately and")
+ println("before executing the RPC.")
+ println("*** FAILURE ***")
+ returnCode1 = returnCode1 or ERR_BASETYPES
+ } else {
+ println("Success - fire and forget only took " + onewayElapsedMillis + "ms")
+ }
+ return returnCode1
+}
+
+private suspend fun ThriftTestClient.nestedMapTest(returnCode: Int): Int {
+ var returnCode1 = returnCode
+ print("testMapMap(1)")
+ val mm: Map<Int, Map<Int, Int>> = testMapMap(1)
+ print(" = {")
+ for (key in mm.keys) {
+ print("$key => {")
+ val m2 = mm[key]!!
+ for (k2 in m2.keys) {
+ print(k2.toString() + " => " + m2[k2] + ", ")
+ }
+ print("}, ")
+ }
+ print("}\n")
+ if (mm.size != 2 || !mm.containsKey(4) || !mm.containsKey(-4)) {
+ returnCode1 = returnCode1 or ERR_CONTAINERS
+ println("*** FAILURE ***\n")
+ } else {
+ val m1 = mm[4]!!
+ val m2 = mm[-4]!!
+ if (m1[1] != 1 ||
+ m1[2] != 2 ||
+ m1[3] != 3 ||
+ m1[4] != 4 ||
+ m2[-1] != -1 ||
+ m2[-2] != -2 ||
+ m2[-3] != -3 ||
+ m2[-4] != -4
+ ) {
+ returnCode1 = returnCode1 or ERR_CONTAINERS
+ println("*** FAILURE ***\n")
}
}
+ return returnCode1
}
-private fun getTTransport(
- transport_type: String,
- host: String,
- port: Int,
- http_client: Boolean,
- ssl: Boolean,
- socketTimeout: Int,
- zlib: Boolean
-): TTransport {
- when (transport_type) {
- "http" -> {
- val url = "http://$host:$port/test/service"
- return if (http_client) {
- THttpClient(url, HttpClients.createDefault())
+private suspend fun ThriftTestClient.stringMapTest(returnCode: Int): Int {
+ var returnCode1 = returnCode
+ try {
+ val smapout: MutableMap<String, String> = HashMap()
+ smapout["a"] = "2"
+ smapout["b"] = "blah"
+ smapout["some"] = "thing"
+ var first = true
+ for (key in smapout.keys) {
+ if (first) {
+ first = false
} else {
- THttpClient(url)
+ print(", ")
}
+ print(key + " => " + smapout[key])
}
- else -> {
- val socket =
- if (ssl) {
- TSSLTransportFactory.getClientSocket(host, port, socketTimeout)
- } else {
- println("using non-blocking socket $host:$port")
- TNonblockingSocket(host, port, socketTimeout)
- }
- if (transport_type == "zlib") {
- return TZlibTransport(socket)
+ print("})")
+ val smapin: Map<String, String> = testStringMap(smapout)
+ print(" = {")
+ first = true
+ for (key in smapin.keys) {
+ if (first) {
+ first = false
} else {
- val wrapped =
- when (transport_type) {
- "buffered" -> {
- socket
- }
- "framed" -> {
- TFramedTransport(socket)
- }
- "fastframed" -> {
- TFastFramedTransport(socket)
- }
- else -> {
- socket
- }
- }
- return if (zlib) {
- TZlibTransport(wrapped)
- } else {
- wrapped
- }
+ print(", ")
}
+ print(key + " => " + smapout[key])
+ }
+ print("}\n")
+ if (smapout != smapin) {
+ returnCode1 = returnCode1 or ERR_CONTAINERS
+ println("*** FAILURE ***\n")
+ }
+ } catch (ex: Exception) {
+ returnCode1 = returnCode1 or ERR_CONTAINERS
+ println("*** FAILURE ***\n")
+ ex.printStackTrace(System.out)
+ }
+ return returnCode1
+}
+
+private suspend fun ThriftTestClient.nestedStructTest(out: Xtruct, returnCode: Int): Int {
+ var code = returnCode
+ print("testNest({1, {\"Zero\", 1, -3, -5}), 5}")
+ val out2 = Xtruct2()
+ out2.byte_thing = 1.toShort().toByte()
+ out2.struct_thing = out
+ out2.i32_thing = 5
+ val xstruct2: Xtruct2 = testNest(out2)
+ val input = xstruct2.struct_thing!!
+ print(
+ """ = {${xstruct2.byte_thing}, {"${input.string_thing}", ${input.byte_thing}, ${input.i32_thing}, ${input.i64_thing}}, ${xstruct2.i32_thing}}
+ """
+ )
+ if (xstruct2 != out2) {
+ code = code or ERR_STRUCTS
+ println("*** FAILURE ***\n")
+ }
+ return code
+}
+
+private suspend fun ThriftTestClient.binaryTest(returnCode: Int): Int {
+ var returnCode1 = returnCode
+ try {
+ print("testBinary(-128...127) = ")
+ val data = testByteArray
+ val bin: ByteBuffer = ByteBuffer.wrap(testBinary(data))
+ bin.mark()
+ val bytes = ByteArray(bin.limit() - bin.position())
+ bin[bytes]
+ bin.reset()
+ print("{")
+ var first = true
+ for (i in bytes.indices) {
+ if (first) first = false else print(", ")
+ print(bytes[i])
}
+ println("}")
+ if (ByteBuffer.wrap(data) != bin) {
+ returnCode1 = returnCode1 or ERR_BASETYPES
+ println("*** FAILURE ***\n")
+ }
+ } catch (ex: Exception) {
+ returnCode1 = returnCode1 or ERR_BASETYPES
+ println("\n*** FAILURE ***\n")
+ ex.printStackTrace(System.out)
}
+ return returnCode1
}
+
+private suspend fun ThriftTestClient.doubleTest(returnCode: Int): Int {
+ var returnCode1 = returnCode
+ print("testDouble(-5.325098235)")
+ val dub: Double = testDouble(-5.325098235)
+ print(" = $dub\n")
+ if (abs(dub - -5.325098235) > 0.001) {
+ returnCode1 = returnCode1 or ERR_BASETYPES
+ println("*** FAILURE ***\n")
+ }
+ return returnCode1
+}
+
+private suspend fun ThriftTestClient.i64Test(returnCode: Int): Int {
+ var returnCode1 = returnCode
+ print("testI64(-34359738368)")
+ val i64: Long = testI64(-34359738368L)
+ print(" = $i64\n")
+ if (i64 != -34359738368L) {
+ returnCode1 = returnCode1 or ERR_BASETYPES
+ println("*** FAILURE ***\n")
+ }
+ return returnCode1
+}
+
+private suspend fun ThriftTestClient.i32Test(returnCode: Int): Int {
+ var returnCode1 = returnCode
+ print("testI32(-1)")
+ val i32: Int = testI32(-1)
+ print(" = $i32\n")
+ if (i32 != -1) {
+ returnCode1 = returnCode1 or ERR_BASETYPES
+ println("*** FAILURE ***\n")
+ }
+ return returnCode1
+}
+
+private suspend fun ThriftTestClient.byteTest(returnCode: Int): Int {
+ var returnCode1 = returnCode
+ print("testByte(1)")
+ val i8: Byte = testByte(1.toByte())
+ print(" = $i8\n")
+ if (i8.toInt() != 1) {
+ returnCode1 = returnCode1 or ERR_BASETYPES
+ println("*** FAILURE ***\n")
+ }
+ return returnCode1
+}
+
+private suspend fun ThriftTestClient.stringTest(returnCode: Int): Int {
+ var returnCode1 = returnCode
+ print("testString(\"Test\")")
+ val s: String = testString("Test")
+ print(" = \"$s\"\n")
+ if (s != "Test") {
+ returnCode1 = returnCode1 or ERR_BASETYPES
+ println("*** FAILURE ***\n")
+ }
+ return returnCode1
+}
+
+private suspend fun ThriftTestClient.voidTest(returnCode: Int): Int {
+ var returnCode1 = returnCode
+ try {
+ print("testVoid()")
+ testVoid()
+ print(" = void\n")
+ } catch (tax: TApplicationException) {
+ tax.printStackTrace()
+ returnCode1 = returnCode1 or ERR_BASETYPES
+ }
+ return returnCode1
+}
+
+fun main(args: Array<String>) {
+ TestClient().main(args)
+}
+
+private val testByteArray = (-128..127).map { it.toByte() }.toByteArray()