diff options
author | Mark Erickson <mark.erickson@workiva.com> | 2015-08-29 10:46:51 -0500 |
---|---|---|
committer | Jens Geyer <jensg@apache.org> | 2015-10-03 01:43:59 +0200 |
commit | 932c4700c6e3aee20b74d5e2f562326029e6b9c8 (patch) | |
tree | 9e701dff2cf2726c2ab2af75c72dce4e8fc9ea89 /test/dart | |
parent | 123258ba60facd8581d868c71a543487b2acff3c (diff) | |
download | thrift-932c4700c6e3aee20b74d5e2f562326029e6b9c8.tar.gz |
THRIFT-3299 Create an Apache Thrift language binding for Dart (dartlang.org).
Client: Dart
Patch: Mark Erickson <mark.erickson@workiva.com>
This closes #608
Diffstat (limited to 'test/dart')
-rw-r--r-- | test/dart/Makefile.am | 41 | ||||
-rw-r--r-- | test/dart/test_client/bin/main.dart | 288 | ||||
-rw-r--r-- | test/dart/test_client/pubspec.yaml | 32 |
3 files changed, 361 insertions, 0 deletions
diff --git a/test/dart/Makefile.am b/test/dart/Makefile.am new file mode 100644 index 000000000..59b3b7d72 --- /dev/null +++ b/test/dart/Makefile.am @@ -0,0 +1,41 @@ +# +# 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. +# + +THRIFT = $(top_builddir)/compiler/cpp/thrift + +gen-dart/thrift_test/lib/thrift_test.dart: ../ThriftTest.thrift + $(THRIFT) --gen dart ../ThriftTest.thrift + +pub-get-gen: gen-dart/thrift_test/lib/thrift_test.dart + cd gen-dart/thrift_test; ${DARTPUB} get + +pub-get: pub-get-gen + cd test_client; ${DARTPUB} get + +stubs: gen-dart/thrift_test/lib/thrift_test.dart pub-get + +precross: stubs + +check: stubs + +clean-local: + $(RM) -r gen-dart test_client/.pub + +client: stubs + ${DART} test_client/bin/main.dart diff --git a/test/dart/test_client/bin/main.dart b/test/dart/test_client/bin/main.dart new file mode 100644 index 000000000..3733a085f --- /dev/null +++ b/test/dart/test_client/bin/main.dart @@ -0,0 +1,288 @@ +/// 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. + +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; + +import 'package:args/args.dart'; +import 'package:collection/equality.dart'; +import 'package:thrift/thrift.dart'; +import 'package:thrift/thrift_console.dart'; +import 'package:thrift_test/thrift_test.dart'; + +ThriftTestClient client; +bool verbose; + +/// Adapted from TestClient.php +main(List<String> args) async { + var parser = new ArgParser(); + parser.addOption('host', defaultsTo: 'localhost', help: 'The server host'); + parser.addOption('port', defaultsTo: '9090', help: 'The port to connect to'); + parser.addOption('transport', + defaultsTo: 'buffered', + allowed: ['buffered', 'framed'], + help: 'The transport name', + allowedHelp: { + 'buffered': 'TBufferedTransport', + 'framed': 'TFramedTransport' + }); + parser.addOption('protocol', + defaultsTo: 'binary', + allowed: ['binary', 'json'], + help: 'The protocol name', + allowedHelp: {'binary': 'TBinaryProtocol', 'json': 'TJsonProtocol'}); + parser.addFlag('verbose', defaultsTo: false); + + ArgResults results; + try { + results = parser.parse(args); + } catch (e) { + stdout.writeln('$e\n'); + results = null; + } + + if (results == null) { + print(parser.usage); + exit(0); + } + + verbose = results['verbose'] == true; + + await init( + host: results['host'], + port: int.parse(results['port']), + transportType: results['transport'], + protocolType: results['protocol']).then((_) { + exit(0); + }).catchError((e) { + stdout.writeln('Error:'); + stdout.writeln('$e'); + if (e is Error) { + stdout.writeln('${e.stackTrace}'); + } + exit(1); + }); + exit(0); +} + +TProtocolFactory getProtocolFactory(String protocolType) { + if (protocolType == 'binary') { + return new TBinaryProtocolFactory(); + } else if (protocolType == 'json') { + return new TJsonProtocolFactory(); + } + + throw new ArgumentError.value(protocolType); +} + +Future init( + {String host, int port, String transportType, String protocolType}) async { + TTransport transport; + var protocolFactory = getProtocolFactory(protocolType); + + if (transportType == 'http') { + var httpClient = new HttpClient(); + var config = new THttpConfig(Uri.parse('http://localhost'), {}); + transport = new THttpClientTransport(httpClient, config); + } else { + var socket = await Socket.connect(host, port); + transport = new TClientSocketTransport(new TTcpSocket(socket)); + if (transportType == 'framed') { + transport = new TFramedTransport(transport); + } + } + + var protocol = protocolFactory.getProtocol(transport); + client = new ThriftTestClient(protocol); + + await transport.open(); + + await runTests(); +} + +Future _test(String name, Function testFunc) async { + if (verbose) stdout.write('$name... '); + await testFunc(); + if (verbose) stdout.writeln('success!'); +} + +Future runTests() async { + var xtruct = new Xtruct() + ..string_thing = 'Zero' + ..byte_thing = 1 + ..i32_thing = -3 + ..i64_thing = -5; + + await _test('testVoid', () async { + await client.testVoid(); + }); + + await _test('testString', () async { + var input = 'Test'; + var result = await client.testString(input); + if (result != input) throw new StateError('$result != $input'); + }); + + await _test('testBool', () async { + var input = true; + var result = await client.testBool(input); + if (result != input) throw new StateError('$result != $input'); + }); + + await _test('testByte', () async { + var input = 64; + var result = await client.testByte(input); + if (result != input) throw new StateError('$result != $input'); + }); + + await _test('testI32', () async { + var input = 2147483647; + var result = await client.testI32(input); + if (result != input) throw new StateError('$result != $input'); + }); + + await _test('testI64', () async { + var input = 9223372036854775807; + var result = await client.testI64(input); + if (result != input) throw new StateError('$result != $input'); + }); + + await _test('testDouble', () async { + var input = 3.1415926; + var result = await client.testDouble(input); + if (result != input) throw new StateError('$result != $input'); + }); + + await _test('testBinary', () async { + var utf8Codec = const Utf8Codec(); + var input = utf8Codec.encode('foo'); + var result = await client.testBinary(input); + var equality = const ListEquality(); + if (!equality.equals( + result, input)) throw new StateError('$result != $input'); + }); + + await _test('testStruct', () async { + var result = await client.testStruct(xtruct); + if ('$result' != '$xtruct') throw new StateError('$result != $xtruct'); + }); + + await _test('testNest', () async { + var input = new Xtruct2() + ..byte_thing = 1 + ..struct_thing = xtruct + ..i32_thing = -3; + + var result = await client.testNest(input); + if ('$result' != '$input') throw new StateError('$result != $input'); + }); + + await _test('testMap', () async { + Map<int, int> input = {1: -10, 2: -9, 3: -8, 4: -7, 5: -6}; + + var result = await client.testMap(input); + var equality = const MapEquality(); + if (!equality.equals( + result, input)) throw new StateError('$result != $input'); + }); + + await _test('testSet', () async { + var input = new Set.from([-2, -1, 0, 1, 2]); + var result = await client.testSet(input); + var equality = const SetEquality(); + if (!equality.equals( + result, input)) throw new StateError('$result != $input'); + }); + + await _test('testList', () async { + var input = [-2, -1, 0, 1, 2]; + var result = await client.testList(input); + var equality = const ListEquality(); + if (!equality.equals( + result, input)) throw new StateError('$result != $input'); + }); + + await _test('testEnum', () async { + await _testEnum(Numberz.ONE); + await _testEnum(Numberz.TWO); + await _testEnum(Numberz.THREE); + await _testEnum(Numberz.FIVE); + await _testEnum(Numberz.EIGHT); + }); + + await _test('testTypedef', () async { + var input = 309858235082523; + var result = await client.testTypedef(input); + if (result != input) throw new StateError('$result != $input'); + }); + + await _test('testMapMap', () async { + Map<int, Map<int, int>> result = await client.testMapMap(1); + if (result.isEmpty || + result[result.keys.first].isEmpty) throw new StateError( + 'expected Map<int, Map<int, int>> got $result'); + }); + + await _test('testInsanity', () async { + var input = new Insanity(); + input.userMap = {Numberz.FIVE: 5000}; + input.xtructs = [xtruct]; + + Map<int, Map<int, Insanity>> result = await client.testInsanity(input); + if (result.isEmpty || + result[result.keys.first].isEmpty) throw new StateError( + 'expected Map<int, Map<int, Insanity>> got $result'); + }); + + await _test('testMulti', () async { + var input = new Xtruct() + ..string_thing = 'Hello2' + ..byte_thing = 123 + ..i32_thing = 456 + ..i64_thing = 789; + + var result = await client.testMulti(input.byte_thing, input.i32_thing, + input.i64_thing, {1: 'one'}, Numberz.EIGHT, 5678); + if ('$result' != '$input') throw new StateError('$result != $input'); + }); + + await _test('testException', () async { + try { + await client.testException('Xception'); + } on Xception catch (x) { + return; + } + + throw new StateError('expected an Xception'); + }); + + await _test('testMultiException', () async { + try { + await client.testMultiException('Xception2', 'foo'); + } on Xception2 catch (x) { + return; + } + + throw new StateError('expected an Xception2'); + }); +} + +Future _testEnum(int input) async { + var result = await client.testEnum(input); + if (result != input) throw new StateError('$result != $input'); +} diff --git a/test/dart/test_client/pubspec.yaml b/test/dart/test_client/pubspec.yaml new file mode 100644 index 000000000..54d8b0fcc --- /dev/null +++ b/test/dart/test_client/pubspec.yaml @@ -0,0 +1,32 @@ +# 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. + +name: thrift_test_client +version: 1.0.0-dev +description: A client integration test for the Dart Thrift library +author: Mark Erickson <mark.erickson@workiva.com> +homepage: https://github.com/apache/thrift +environment: + sdk: ^1.12.0 +dependencies: + args: ^0.13.0 + thrift: + path: ../../../lib/dart + thrift_test: + path: ../gen-dart/thrift_test +dev_dependencies: + test: "^0.12.0" |