blob: 5c03bbfa5b072b8bf21c2f4e3c0cd07df7f65435 [file] [log] [blame]
// 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 'package:gcloud/db.dart';
import 'package:mockito/mockito.dart';
import 'package:test/test.dart';
import 'package:cocoon_service/src/model/appengine/commit.dart';
import 'package:cocoon_service/src/model/appengine/task.dart';
import 'package:cocoon_service/src/request_handlers/refresh_chromebot_status.dart';
import 'package:cocoon_service/src/service/datastore.dart';
import 'package:cocoon_service/src/service/luci.dart';
import '../src/datastore/fake_cocoon_config.dart';
import '../src/request_handling/api_request_handler_tester.dart';
import '../src/request_handling/fake_authentication.dart';
import '../src/request_handling/fake_http.dart';
import '../src/utilities/mocks.dart';
void main() {
group('RefreshChromebotStatus', () {
FakeConfig config;
ApiRequestHandlerTester tester;
MockLuciService mockLuciService;
RefreshChromebotStatus handler;
FakeHttpClient branchHttpClient;
setUp(() {
branchHttpClient = FakeHttpClient();
config = FakeConfig(
luciBuildersValue: const <Map<String, String>>[
<String, String>{
'name': 'Builder1',
'repo': 'flutter',
'taskName': 'foo',
},
],
);
tester = ApiRequestHandlerTester();
mockLuciService = MockLuciService();
handler = RefreshChromebotStatus(
config,
FakeAuthenticationProvider(),
luciServiceProvider: (_) => mockLuciService,
datastoreProvider: (DatastoreDB db) => DatastoreService(config.db, 5),
branchHttpClientProvider: () => branchHttpClient,
gitHubBackoffCalculator: (int attempt) => Duration.zero,
);
});
test('do not update task status when SHA does not match', () async {
final Commit commit =
Commit(key: config.db.emptyKey.append(Commit, id: 'abc'), sha: 'abc');
final Task task =
Task(key: commit.key.append(Task, id: 123), status: Task.statusNew);
config.db.values[commit.key] = commit;
config.db.values[task.key] = task;
final Map<BranchLuciBuilder, Map<String, List<LuciTask>>> luciTasks =
Map<BranchLuciBuilder, Map<String, List<LuciTask>>>.fromIterable(
await LuciBuilder.getBuilders(config),
key: (dynamic builder) => BranchLuciBuilder(
luciBuilder: builder as LuciBuilder, branch: 'master'),
value: (dynamic builder) => <String, List<LuciTask>>{
'def': <LuciTask>[
const LuciTask(
commitSha: 'def',
ref: 'refs/heads/master',
status: Task.statusSucceeded,
buildNumber: 1)
],
});
when(mockLuciService.getBranchRecentTasks(
repo: 'flutter', requireTaskName: true))
.thenAnswer((Invocation invocation) {
return Future<
Map<BranchLuciBuilder, Map<String, List<LuciTask>>>>.value(
luciTasks);
});
expect(task.status, Task.statusNew);
await tester.get(handler);
expect(task.status, Task.statusNew);
});
test('do not update task status when branch does not match', () async {
final Commit commit = Commit(
key: config.db.emptyKey.append(Commit, id: 'abc'),
sha: 'abc',
branch: 'test');
final Task task =
Task(key: commit.key.append(Task, id: 123), status: Task.statusNew);
config.db.values[commit.key] = commit;
config.db.values[task.key] = task;
final Map<BranchLuciBuilder, Map<String, List<LuciTask>>> luciTasks =
Map<BranchLuciBuilder, Map<String, List<LuciTask>>>.fromIterable(
await LuciBuilder.getBuilders(config),
key: (dynamic builder) => BranchLuciBuilder(
luciBuilder: builder as LuciBuilder, branch: 'master'),
value: (dynamic builder) => <String, List<LuciTask>>{
'abc': <LuciTask>[
const LuciTask(
commitSha: 'abc',
ref: 'refs/heads/master',
status: Task.statusSucceeded,
buildNumber: 1)
],
});
when(mockLuciService.getBranchRecentTasks(
repo: 'flutter', requireTaskName: true))
.thenAnswer((Invocation invocation) {
return Future<
Map<BranchLuciBuilder, Map<String, List<LuciTask>>>>.value(
luciTasks);
});
expect(task.status, Task.statusNew);
await tester.get(handler);
expect(task.status, Task.statusNew);
});
test(
'update task status and buildNumber when buildNumberList does not match',
() async {
final Commit commit =
Commit(key: config.db.emptyKey.append(Commit, id: 'abc'), sha: 'abc');
final Task task =
Task(key: commit.key.append(Task, id: 123), status: Task.statusNew);
config.db.values[commit.key] = commit;
config.db.values[task.key] = task;
final Map<BranchLuciBuilder, Map<String, List<LuciTask>>> luciTasks =
Map<BranchLuciBuilder, Map<String, List<LuciTask>>>.fromIterable(
await LuciBuilder.getBuilders(config),
key: (dynamic builder) => BranchLuciBuilder(
luciBuilder: builder as LuciBuilder, branch: 'master'),
value: (dynamic builder) => <String, List<LuciTask>>{
'abc': <LuciTask>[
const LuciTask(
commitSha: 'abc',
ref: 'refs/heads/master',
status: Task.statusSucceeded,
buildNumber: 1)
],
});
when(mockLuciService.getBranchRecentTasks(
repo: 'flutter', requireTaskName: true))
.thenAnswer((Invocation invocation) {
return Future<
Map<BranchLuciBuilder, Map<String, List<LuciTask>>>>.value(
luciTasks);
});
expect(task.status, Task.statusNew);
expect(task.buildNumberList, isNull);
await tester.get(handler);
expect(task.status, Task.statusSucceeded);
expect(task.buildNumberList, '1');
});
test('update task status and buildNumber when status does not match',
() async {
final Commit commit =
Commit(key: config.db.emptyKey.append(Commit, id: 'abc'), sha: 'abc');
final Task task = Task(
key: commit.key.append(Task, id: 123),
status: Task.statusNew,
buildNumberList: '1');
config.db.values[commit.key] = commit;
config.db.values[task.key] = task;
final Map<BranchLuciBuilder, Map<String, List<LuciTask>>> luciTasks =
Map<BranchLuciBuilder, Map<String, List<LuciTask>>>.fromIterable(
await LuciBuilder.getBuilders(config),
key: (dynamic builder) => BranchLuciBuilder(
luciBuilder: builder as LuciBuilder, branch: 'master'),
value: (dynamic builder) => <String, List<LuciTask>>{
'abc': <LuciTask>[
const LuciTask(
commitSha: 'abc',
ref: 'refs/heads/master',
status: Task.statusSucceeded,
buildNumber: 1)
],
});
when(mockLuciService.getBranchRecentTasks(
repo: 'flutter', requireTaskName: true))
.thenAnswer((Invocation invocation) {
return Future<
Map<BranchLuciBuilder, Map<String, List<LuciTask>>>>.value(
luciTasks);
});
expect(task.status, Task.statusNew);
await tester.get(handler);
expect(task.status, Task.statusSucceeded);
});
test('update task status with latest status when multilple reruns exist',
() async {
final Commit commit =
Commit(key: config.db.emptyKey.append(Commit, id: 'abc'), sha: 'abc');
final Task task = Task(
key: commit.key.append(Task, id: 123),
status: Task.statusNew,
buildNumberList: '1');
config.db.values[commit.key] = commit;
config.db.values[task.key] = task;
final Map<BranchLuciBuilder, Map<String, List<LuciTask>>> luciTasks =
Map<BranchLuciBuilder, Map<String, List<LuciTask>>>.fromIterable(
await LuciBuilder.getBuilders(config),
key: (dynamic builder) => BranchLuciBuilder(
luciBuilder: builder as LuciBuilder, branch: 'master'),
value: (dynamic builder) => <String, List<LuciTask>>{
'abc': <LuciTask>[
const LuciTask(
commitSha: 'abc',
ref: 'refs/heads/master',
status: Task.statusSucceeded,
buildNumber: 2),
const LuciTask(
commitSha: 'abc',
ref: 'refs/heads/master',
status: Task.statusFailed,
buildNumber: 1)
],
});
when(mockLuciService.getBranchRecentTasks(
repo: 'flutter', requireTaskName: true))
.thenAnswer((Invocation invocation) {
return Future<
Map<BranchLuciBuilder, Map<String, List<LuciTask>>>>.value(
luciTasks);
});
expect(task.status, Task.statusNew);
await tester.get(handler);
expect(task.status, Task.statusSucceeded);
expect(task.buildNumberList, '1,2');
});
test('update task status for non master branch', () async {
final Commit commit = Commit(
key: config.db.emptyKey.append(Commit, id: 'def'),
sha: 'def',
branch: 'test');
final Task task =
Task(key: commit.key.append(Task, id: 456), status: Task.statusNew);
config.db.values[commit.key] = commit;
config.db.values[task.key] = task;
final Map<BranchLuciBuilder, Map<String, List<LuciTask>>> luciTasks =
Map<BranchLuciBuilder, Map<String, List<LuciTask>>>.fromIterable(
await LuciBuilder.getBuilders(config),
key: (dynamic builder) => BranchLuciBuilder(
luciBuilder: builder as LuciBuilder, branch: 'master'),
value: (dynamic builder) => <String, List<LuciTask>>{
'def': <LuciTask>[
const LuciTask(
commitSha: 'def',
ref: 'refs/heads/master',
status: Task.statusFailed,
buildNumber: 1),
],
});
final Map<BranchLuciBuilder, Map<String, List<LuciTask>>> testLuciTasks =
Map<BranchLuciBuilder, Map<String, List<LuciTask>>>.fromIterable(
await LuciBuilder.getBuilders(config),
key: (dynamic builder) => BranchLuciBuilder(
luciBuilder: builder as LuciBuilder, branch: 'test'),
value: (dynamic builder) => <String, List<LuciTask>>{
'def': <LuciTask>[
const LuciTask(
commitSha: 'def',
ref: 'refs/heads/test',
status: Task.statusSucceeded,
buildNumber: 2)
],
});
luciTasks.addAll(testLuciTasks);
when(mockLuciService.getBranchRecentTasks(
repo: 'flutter', requireTaskName: true))
.thenAnswer((Invocation invocation) {
return Future<
Map<BranchLuciBuilder, Map<String, List<LuciTask>>>>.value(
luciTasks);
});
expect(task.status, Task.statusNew);
await tester.get(handler);
expect(task.status, Task.statusSucceeded);
});
});
}