in repo_dashboard/lib/services/build_status_service.dart [12:91]
Future<BuildStatus> fetchBuildStatus({http.Client client}) async {
client ??= http.Client();
final Map<String, dynamic> fetchedStatus = await _getStatusBody(client, 'api/public/build-status');
final String anticipatedBuildStatus = fetchedStatus != null ? fetchedStatus['AnticipatedBuildStatus'] : null;
final Map<String, dynamic> fetchBuildStatus = await _getStatusBody(client, 'api/public/get-status');
final List<String> failingAgents = <String>[];
final List<CommitTestResult> commitTestResults = <CommitTestResult>[];
if (fetchBuildStatus != null) {
final List<dynamic> agentStatuses = fetchBuildStatus['AgentStatuses'];
if (agentStatuses != null) {
for (Map<String, dynamic> agentStatus in agentStatuses) {
final String agentID = agentStatus['AgentID'];
if (agentID == null) {
continue;
}
final bool isHealthy = agentStatus['IsHealthy'];
final int healthCheckTimeStamp = agentStatus['HealthCheckTimestamp'];
final int minutesSinceHealthCheck =
DateTime.now().difference(DateTime.fromMillisecondsSinceEpoch(healthCheckTimeStamp)).inMinutes;
if (!isHealthy || minutesSinceHealthCheck > 10) {
failingAgents.add(agentID);
}
}
final List<dynamic> statuses = fetchBuildStatus['Statuses'];
if (statuses != null) {
for (Map<String, dynamic> status in statuses) {
final Map<String, dynamic> checklist = status['Checklist']['Checklist'];
final Map<String, dynamic> commitInfo = checklist['Commit'];
final Map<String, dynamic> authorInfo = commitInfo['Author'];
int inProgressTestCount = 0;
int succeededTestCount = 0;
int failedFlakyTestCount = 0;
int failedTestCount = 0;
final List<String> failingTests = <String>[];
for (Map<String, dynamic> stage in status['Stages']) {
for (Map<String, dynamic> taskInfo in stage['Tasks']) {
final Map<String, dynamic> task = taskInfo['Task'];
final String testResult = task['Status'];
if (testResult == 'Succeeded') {
succeededTestCount++;
} else if (testResult == 'In Progress' || testResult == 'New') {
inProgressTestCount++;
} else if (testResult == 'Failed') {
if (task['Flaky']) {
failedFlakyTestCount++;
} else {
failedTestCount++;
failingTests.add(task['Name']);
}
}
}
}
final DateTime createDateTime = DateTime.fromMillisecondsSinceEpoch(checklist['CreateTimestamp']).toLocal();
commitTestResults.add(CommitTestResult(
sha: commitInfo['Sha'],
authorName: authorInfo['Login'],
avatarImageURL: authorInfo['avatar_url'],
createDateTime: createDateTime,
inProgressTestCount: inProgressTestCount,
succeededTestCount: succeededTestCount,
failedFlakyTestCount: failedFlakyTestCount,
failedTestCount: failedTestCount,
failingTests: failingTests,
));
if (commitTestResults.length >= 6) {
break;
}
}
}
}
}
return BuildStatus(
anticipatedBuildStatus: anticipatedBuildStatus,
failingAgents: failingAgents,
commitTestResults: commitTestResults);
}