summaryrefslogtreecommitdiff
path: root/test/dart
diff options
context:
space:
mode:
authorMark Erickson <mark.erickson@workiva.com>2015-08-29 10:46:51 -0500
committerJens Geyer <jensg@apache.org>2015-10-03 01:43:59 +0200
commit932c4700c6e3aee20b74d5e2f562326029e6b9c8 (patch)
tree9e701dff2cf2726c2ab2af75c72dce4e8fc9ea89 /test/dart
parent123258ba60facd8581d868c71a543487b2acff3c (diff)
downloadthrift-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.am41
-rw-r--r--test/dart/test_client/bin/main.dart288
-rw-r--r--test/dart/test_client/pubspec.yaml32
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"