OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 |
| 5 import 'dart:async'; |
| 6 |
| 7 import 'package:fixnum/fixnum.dart'; |
| 8 import 'package:unittest/unittest.dart'; |
| 9 |
| 10 import 'package:appengine/api/errors.dart'; |
| 11 import 'package:appengine/src/appengine_context.dart'; |
| 12 import 'package:appengine/src/api_impl/raw_datastore_v3_impl.dart'; |
| 13 import 'package:appengine/src/protobuf_api/rpc/rpc_service.dart'; |
| 14 import 'package:appengine/src/protobuf_api/internal/datastore_v3.pb.dart'; |
| 15 import 'package:gcloud/datastore.dart' as raw; |
| 16 |
| 17 import 'utils/mock_rpc.dart'; |
| 18 import 'utils/error_matchers.dart'; |
| 19 import 'utils/raw_datastore_test_utils.dart'; |
| 20 |
| 21 void runTests() { |
| 22 const INVALID_PROTOBUF = const [1, 2, 3, 4, 5]; |
| 23 |
| 24 group('raw_datastore_v3_error_handling', () { |
| 25 var unnamedKeys5 = buildKeys(1, 6); |
| 26 var context = new AppengineContext( |
| 27 'dev', 'application', 'version', null, null, null); |
| 28 |
| 29 var transactionAbortedError = new RpcApplicationError( |
| 30 Error_ErrorCode.CONCURRENT_TRANSACTION.value, 'foobar'); |
| 31 var needIndexError = new RpcApplicationError( |
| 32 Error_ErrorCode.NEED_INDEX.value, 'foobar'); |
| 33 var timeoutError = new RpcApplicationError( |
| 34 Error_ErrorCode.TIMEOUT.value, 'foobar'); |
| 35 |
| 36 buildMock(methodName, requestType, callback) { |
| 37 var mock = new MockRPCService('datastore_v3'); |
| 38 mock.register(methodName, requestType, callback); |
| 39 return mock; |
| 40 } |
| 41 |
| 42 buildDatastore(mock) { |
| 43 return new DatastoreV3RpcImpl(mock, context, 'invalid-ticket'); |
| 44 } |
| 45 |
| 46 group('allocateIds', () { |
| 47 test('network_error', () { |
| 48 var mock = buildMock('AllocateIds', AllocateIdsRequest, |
| 49 (request) => new Future.error(new NetworkError(""))); |
| 50 var datastore = buildDatastore(mock); |
| 51 expect(datastore.allocateIds(unnamedKeys5), throwsA(isNetworkError)); |
| 52 }); |
| 53 |
| 54 test('protocol_error', () { |
| 55 var mock = buildMock('AllocateIds', AllocateIdsRequest, |
| 56 (request) => new Future.value(INVALID_PROTOBUF)); |
| 57 var datastore = buildDatastore(mock); |
| 58 expect(datastore.allocateIds(unnamedKeys5), throwsA(isProtocolError)); |
| 59 }); |
| 60 }); |
| 61 |
| 62 group('beginTransaction', () { |
| 63 test('network_error', () { |
| 64 var mock = buildMock('BeginTransaction', BeginTransactionRequest, |
| 65 (request) => new Future.error(new NetworkError(""))); |
| 66 var datastore = buildDatastore(mock); |
| 67 expect(datastore.beginTransaction(), throwsA(isNetworkError)); |
| 68 }); |
| 69 |
| 70 test('protocol_error', () { |
| 71 var mock = buildMock('BeginTransaction', BeginTransactionRequest, |
| 72 (request) => new Future.value(INVALID_PROTOBUF)); |
| 73 var datastore = buildDatastore(mock); |
| 74 expect(datastore.beginTransaction(), throwsA(isProtocolError)); |
| 75 }); |
| 76 }); |
| 77 |
| 78 group('commit', () { |
| 79 var e = new raw.Entity(buildKey(1, idFunction: (i) => "$i"), {}); |
| 80 |
| 81 test('network_error', () { |
| 82 var mock = buildMock('Put', PutRequest, |
| 83 (request) => new Future.error(new NetworkError(""))); |
| 84 var datastore = buildDatastore(mock); |
| 85 expect(datastore.commit(inserts: [e]), throwsA(isNetworkError)); |
| 86 }); |
| 87 |
| 88 test('protocol_error', () { |
| 89 var mock = buildMock('Put', PutRequest, |
| 90 (request) => new Future.value(INVALID_PROTOBUF)); |
| 91 var datastore = buildDatastore(mock); |
| 92 expect(datastore.commit(inserts: [e]), throwsA(isProtocolError)); |
| 93 }); |
| 94 |
| 95 test('transaction_aborted', () { |
| 96 var mock = buildMock('Put', PutRequest, |
| 97 (request) => new Future.error(transactionAbortedError)); |
| 98 var datastore = buildDatastore(mock); |
| 99 expect(datastore.commit(inserts: [e]), |
| 100 throwsA(isTransactionAbortedError)); |
| 101 }); |
| 102 }); |
| 103 |
| 104 group('rollback', () { |
| 105 var rpcTransaction = new Transaction(); |
| 106 rpcTransaction.handle = new Int64(10); |
| 107 var transaction = new TransactionImpl(rpcTransaction); |
| 108 |
| 109 test('network_error', () { |
| 110 var mock = buildMock('Rollback', Transaction, |
| 111 (request) => new Future.error(new NetworkError(""))); |
| 112 var datastore = buildDatastore(mock); |
| 113 expect(datastore.rollback(transaction), throwsA(isNetworkError)); |
| 114 }); |
| 115 |
| 116 test('protocol_error', () { |
| 117 var mock = buildMock('Rollback', Transaction, |
| 118 (request) => new Future.value(INVALID_PROTOBUF)); |
| 119 var datastore = buildDatastore(mock); |
| 120 expect(datastore.rollback(transaction), throwsA(isProtocolError)); |
| 121 }); |
| 122 }); |
| 123 |
| 124 group('lookup', () { |
| 125 var key = buildKey(1, idFunction: (i) => "$i"); |
| 126 |
| 127 test('network_error', () { |
| 128 var mock = buildMock('Get', GetRequest, |
| 129 (request) => new Future.error(new NetworkError(""))); |
| 130 var datastore = buildDatastore(mock); |
| 131 expect(datastore.lookup([key]), throwsA(isNetworkError)); |
| 132 }); |
| 133 |
| 134 test('protocol_error', () { |
| 135 var mock = buildMock('Get', GetRequest, |
| 136 (request) => new Future.value(INVALID_PROTOBUF)); |
| 137 var datastore = buildDatastore(mock); |
| 138 expect(datastore.lookup([key]), throwsA(isProtocolError)); |
| 139 }); |
| 140 |
| 141 test('timeout_error', () { |
| 142 var mock = buildMock('Get', GetRequest, |
| 143 (request) => new Future.error(timeoutError)); |
| 144 var datastore = buildDatastore(mock); |
| 145 expect(datastore.lookup([key]), throwsA(isTimeoutError)); |
| 146 }); |
| 147 }); |
| 148 |
| 149 group('query', () { |
| 150 var query = new raw.Query(kind: 'TestKind'); |
| 151 |
| 152 test('network_error', () { |
| 153 var mock = buildMock('RunQuery', Query, |
| 154 (request) => new Future.error(new NetworkError(""))); |
| 155 var datastore = buildDatastore(mock); |
| 156 expect(datastore.query(query), throwsA(isNetworkError)); |
| 157 }); |
| 158 |
| 159 test('protocol_error', () { |
| 160 var mock = buildMock('RunQuery', Query, |
| 161 (request) => new Future.value(INVALID_PROTOBUF)); |
| 162 var datastore = buildDatastore(mock); |
| 163 expect(datastore.query(query), throwsA(isProtocolError)); |
| 164 }); |
| 165 |
| 166 test('need_index_error', () { |
| 167 var mock = buildMock('RunQuery', Query, |
| 168 (request) => new Future.error(needIndexError)); |
| 169 var datastore = buildDatastore(mock); |
| 170 expect(datastore.query(query), throwsA(isNeedIndexError)); |
| 171 }); |
| 172 }); |
| 173 }); |
| 174 } |
| 175 |
| 176 main() { |
| 177 runTests(); |
| 178 } |
OLD | NEW |