| // Copyright 2019 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'dart:convert'; |
| |
| import 'package:cocoon_service/cocoon_service.dart'; |
| import 'package:cocoon_service/src/model/luci/buildbucket.dart'; |
| import 'package:cocoon_service/src/model/luci/push_message.dart' as push_message; |
| import 'package:cocoon_service/src/request_handling/exceptions.dart'; |
| import 'package:mockito/mockito.dart'; |
| import 'package:retry/retry.dart'; |
| import 'package:test/test.dart'; |
| |
| import '../../src/datastore/fake_config.dart'; |
| import '../../src/request_handling/fake_authentication.dart'; |
| import '../../src/request_handling/fake_http.dart'; |
| import '../../src/request_handling/subscription_tester.dart'; |
| import '../../src/utilities/mocks.dart'; |
| |
| void main() { |
| late SchedulerRequestSubscription handler; |
| late SubscriptionTester tester; |
| |
| late MockBuildBucketClient buildBucketClient; |
| |
| setUp(() async { |
| buildBucketClient = MockBuildBucketClient(); |
| when(buildBucketClient.batch(any)).thenAnswer((_) async => const BatchResponse()); |
| handler = SchedulerRequestSubscription( |
| cache: CacheService(inMemory: true), |
| config: FakeConfig(), |
| authProvider: FakeAuthenticationProvider(), |
| buildBucketClient: buildBucketClient, |
| retryOptions: const RetryOptions( |
| maxAttempts: 3, |
| maxDelay: Duration.zero, |
| ), |
| ); |
| tester = SubscriptionTester( |
| request: FakeHttpRequest(), |
| ); |
| }); |
| |
| test('throws exception when BatchRequest cannot be decoded', () async { |
| tester.message = const push_message.PushMessage(); |
| expect(() => tester.post(handler), throwsA(isA<BadRequestException>())); |
| }); |
| |
| test('schedules request to buildbucket', () async { |
| const BatchRequest request = BatchRequest(); |
| tester.message = push_message.PushMessage(data: base64Encode(utf8.encode(jsonEncode(request)))); |
| final Body body = await tester.post(handler); |
| expect(body, Body.empty); |
| }); |
| |
| test('retries schedule build if no response comes back', () async { |
| int attempt = 0; |
| when(buildBucketClient.batch(any)).thenAnswer((_) async { |
| attempt += 1; |
| if (attempt == 2) { |
| return const BatchResponse( |
| responses: <Response>[ |
| Response( |
| scheduleBuild: Build( |
| id: '12345', |
| builderId: BuilderId(builder: 'Linux A'), |
| ), |
| ), |
| ], |
| ); |
| } |
| |
| return const BatchResponse(); |
| }); |
| const BatchRequest request = BatchRequest( |
| requests: <Request>[ |
| Request( |
| scheduleBuild: ScheduleBuildRequest( |
| builderId: BuilderId( |
| builder: 'Linux A', |
| ), |
| ), |
| ), |
| ], |
| ); |
| tester.message = push_message.PushMessage(data: base64Encode(utf8.encode(jsonEncode(request)))); |
| final Body body = await tester.post(handler); |
| expect(body, Body.empty); |
| expect(verify(buildBucketClient.batch(any)).callCount, 2); |
| }); |
| |
| test('acking message and loging error when no response comes back after retry limit', () async { |
| when(buildBucketClient.batch(any)).thenAnswer((_) async { |
| return const BatchResponse(); |
| }); |
| const BatchRequest request = BatchRequest( |
| requests: <Request>[ |
| Request( |
| scheduleBuild: ScheduleBuildRequest( |
| builderId: BuilderId( |
| builder: 'Linux A', |
| ), |
| ), |
| ), |
| ], |
| ); |
| tester.message = push_message.PushMessage(data: base64Encode(utf8.encode(jsonEncode(request)))); |
| final Body body = await tester.post(handler); |
| expect(body, isNotNull); |
| expect(verify(buildBucketClient.batch(any)).callCount, 3); |
| }); |
| } |