Skip to content

Commit 17e38a6

Browse files
authored
Improve TestBuilderResult. (#4238)
1 parent 62a008a commit 17e38a6

File tree

13 files changed

+191
-44
lines changed

13 files changed

+191
-44
lines changed

build_runner/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 2.9.1-wip
2+
3+
- Internal changes for `build_test`.
4+
15
## 2.9.0
26

37
- Watch mode: handle builder code and config changes without recompiling or

build_runner/lib/src/build/build.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -190,9 +190,11 @@ class Build {
190190
}
191191

192192
_resolvers.reset();
193-
buildLog.finishBuild(
194-
result: result.status == BuildStatus.success,
195-
outputs: result.outputs.length,
193+
result = result.copyWith(
194+
errors: buildLog.finishBuild(
195+
result: result.status == BuildStatus.success,
196+
outputs: result.outputs.length,
197+
),
196198
);
197199
return result;
198200
}

build_runner/lib/src/build/build_result.dart

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ class BuildResult {
1818
/// The type of failure.
1919
final FailureType? failureType;
2020

21+
/// Errors reported.
22+
final BuiltList<String> errors;
23+
2124
/// All outputs created/updated during this build.
2225
final BuiltList<AssetId> outputs;
2326

@@ -30,6 +33,7 @@ class BuildResult {
3033

3134
BuildResult({
3235
required this.status,
36+
BuiltList<String>? errors,
3337
BuiltList<AssetId>? outputs,
3438
required this.buildOutputReader,
3539
this.performance,
@@ -38,16 +42,21 @@ class BuildResult {
3842
failureType == null && status == BuildStatus.failure
3943
? FailureType.general
4044
: failureType,
45+
errors = errors ?? BuiltList(),
4146
outputs = outputs ?? BuiltList();
4247

43-
BuildResult copyWith({BuildStatus? status, FailureType? failureType}) =>
44-
BuildResult(
45-
status: status ?? this.status,
46-
outputs: outputs,
47-
buildOutputReader: buildOutputReader,
48-
performance: performance,
49-
failureType: failureType ?? this.failureType,
50-
);
48+
BuildResult copyWith({
49+
BuildStatus? status,
50+
FailureType? failureType,
51+
BuiltList<String>? errors,
52+
}) => BuildResult(
53+
status: status ?? this.status,
54+
errors: errors ?? this.errors,
55+
outputs: outputs,
56+
buildOutputReader: buildOutputReader,
57+
performance: performance,
58+
failureType: failureType ?? this.failureType,
59+
);
5160

5261
@override
5362
String toString() {

build_runner/lib/src/logging/build_log.dart

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'dart:math';
66

77
import 'package:build/build.dart' show AssetId;
8+
import 'package:built_collection/built_collection.dart';
89

910
import '../bootstrap/build_process_state.dart';
1011
import '../build_plan/phase.dart';
@@ -67,6 +68,9 @@ class BuildLog {
6768
/// The messages logged, bucketed by build phase.
6869
final BuildLogMessages _messages = BuildLogMessages();
6970

71+
/// Errors logged.
72+
final ListBuilder<String> _errors = ListBuilder();
73+
7074
/// Progress by build phase.
7175
final Map<String, _PhaseProgress> _phaseProgress = {};
7276

@@ -167,6 +171,7 @@ class BuildLog {
167171

168172
/// Logs an `build_runner` error.
169173
void error(String message) {
174+
_errors.add(message);
170175
if (_display.displayingBlocks) {
171176
_messages.add(severity: Severity.error, message);
172177
_display.block(render());
@@ -182,6 +187,7 @@ class BuildLog {
182187
String? phaseName,
183188
String? context,
184189
}) {
190+
if (severity == Severity.error) _errors.add(message);
185191
if (_display.displayingBlocks) {
186192
_messages.add(
187193
severity: severity,
@@ -339,7 +345,9 @@ class BuildLog {
339345
}
340346

341347
/// Logs that the build has finished with [result] and the count of [outputs].
342-
void finishBuild({required bool result, required int outputs}) {
348+
///
349+
/// Returns the list of errors logged.
350+
BuiltList<String> finishBuild({required bool result, required int outputs}) {
343351
_tick();
344352
final displayingBlocks = _display.displayingBlocks;
345353
_status = [
@@ -362,6 +370,10 @@ class BuildLog {
362370
AnsiBufferLine(_status).toString(),
363371
);
364372
}
373+
374+
final errors = _errors.build();
375+
_errors.clear();
376+
return errors;
365377
}
366378

367379
/// Renders [message] with optional [error] and [stackTrace].

build_runner/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: build_runner
2-
version: 2.9.0
2+
version: 2.9.1-wip
33
description: A build system for Dart code generation and modular compilation.
44
repository: https://github.com/dart-lang/build/tree/master/build_runner
55
resolution: workspace

build_runner/test/build/build_error_test.dart

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import 'dart:async';
66

77
import 'package:build/build.dart';
8-
import 'package:build_runner/src/build/build_result.dart';
98
import 'package:build_test/build_test.dart';
109
import 'package:logging/logging.dart';
1110
import 'package:test/test.dart';
@@ -14,14 +13,13 @@ import '../common/common.dart';
1413

1514
void main() {
1615
test('should fail if a severe logged', () async {
17-
expect(
18-
(await testBuilders(
19-
[_LoggingBuilder(Level.SEVERE)],
20-
{'a|lib/a.dart': ''},
21-
outputs: {'a|lib/a.dart.empty': ''},
22-
)).buildResult.status,
23-
BuildStatus.failure,
16+
final result = await testBuilders(
17+
[_LoggingBuilder(Level.SEVERE)],
18+
{'a|lib/a.dart': ''},
19+
outputs: {'a|lib/a.dart.empty': ''},
2420
);
21+
expect(result.succeeded, false);
22+
expect(result.errors, ['Log message for a|lib/a.dart.']);
2523
});
2624

2725
test('should fail if a severe was logged on a previous build', () async {
@@ -30,7 +28,8 @@ void main() {
3028
{'a|lib/a.dart': ''},
3129
outputs: {'a|lib/a.dart.empty': ''},
3230
);
33-
expect(result.buildResult.status, BuildStatus.failure);
31+
expect(result.succeeded, false);
32+
expect(result.errors, ['Log message for a|lib/a.dart.']);
3433

3534
final builder = _LoggingBuilder(Level.SEVERE);
3635
result = await testBuilders(
@@ -40,7 +39,8 @@ void main() {
4039
readerWriter: result.readerWriter,
4140
outputs: {'a|lib/a.dart.empty': ''},
4241
);
43-
expect(result.buildResult.status, BuildStatus.failure);
42+
expect(result.succeeded, false);
43+
expect(result.errors, ['Log message for a|lib/a.dart.']);
4444
// Should have failed without actually building again.
4545
expect(builder.built, false);
4646
});
@@ -53,7 +53,8 @@ void main() {
5353
{'a|lib/a.dart': ''},
5454
outputs: {'a|lib/a.dart.empty': ''},
5555
);
56-
expect(result.buildResult.status, BuildStatus.failure);
56+
expect(result.succeeded, false);
57+
expect(result.errors, ['Log message for a|lib/a.dart.']);
5758

5859
result = await testBuilders(
5960
[_LoggingBuilder(Level.WARNING)],
@@ -62,18 +63,18 @@ void main() {
6263
readerWriter: result.readerWriter,
6364
outputs: {'a|lib/a.dart.empty': ''},
6465
);
65-
expect(result.buildResult.status, BuildStatus.success);
66+
expect(result.succeeded, true);
67+
expect(result.errors, isEmpty);
6668
},
6769
);
6870

6971
test('should fail if an exception is thrown', () async {
70-
expect(
71-
(await testBuilders(
72-
[TestBuilder(build: (_, _) => throw Exception('Some build failure'))],
73-
{'a|lib/a.txt': ''},
74-
)).buildResult.status,
75-
BuildStatus.failure,
72+
final result = await testBuilders(
73+
[TestBuilder(build: (_, _) => throw Exception('Some build failure'))],
74+
{'a|lib/a.txt': ''},
7675
);
76+
expect(result.succeeded, false);
77+
expect(result.errors, ['Exception: Some build failure']);
7778
});
7879

7980
test(
@@ -110,7 +111,8 @@ void main() {
110111
],
111112
{'a|lib/a.txt': ''},
112113
);
113-
expect(result.buildResult.status, BuildStatus.failure);
114+
expect(result.succeeded, false);
115+
expect(result.errors, ['Wrote an output then failed']);
114116
},
115117
);
116118
}
@@ -124,7 +126,7 @@ class _LoggingBuilder implements Builder {
124126
@override
125127
Future<void> build(BuildStep buildStep) async {
126128
built = true;
127-
log.log(level, buildStep.inputId.toString());
129+
log.log(level, 'Log message for ${buildStep.inputId}.');
128130
await buildStep.canRead(buildStep.inputId);
129131
await buildStep.writeAsString(buildStep.inputId.addExtension('.empty'), '');
130132
}

build_runner/test/build/build_test.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -889,8 +889,8 @@ targets:
889889
(await testBuilders(
890890
[TestBuilder(build: copyFrom(makeAssetId('a|.dart_tool/any_file')))],
891891
{'a|lib/a.txt': 'a', 'a|.dart_tool/any_file': 'content'},
892-
)).buildResult.status,
893-
BuildStatus.failure,
892+
)).succeeded,
893+
false,
894894
);
895895
});
896896

build_runner/test/build/write_cache_test.dart

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import 'dart:async';
66

77
import 'package:build/build.dart';
8-
import 'package:build_runner/src/build/build_result.dart';
98
import 'package:build_test/build_test.dart';
109
import 'package:test/test.dart';
1110

@@ -25,7 +24,7 @@ void main() {
2524
readerWriter: readerWriter,
2625
enableLowResourceMode: true,
2726
);
28-
expect(result.buildResult.status, BuildStatus.success);
27+
expect(result.succeeded, true);
2928
});
3029

3130
test('with caching writes wait until build completion', () async {
@@ -40,7 +39,7 @@ void main() {
4039
readerWriter: readerWriter,
4140
enableLowResourceMode: false,
4241
);
43-
expect(result.buildResult.status, BuildStatus.success);
42+
expect(result.succeeded, true);
4443
expect(
4544
readerWriter.testing.assets,
4645
containsAll([
@@ -66,7 +65,7 @@ void main() {
6665
readerWriter: readerWriter,
6766
enableLowResourceMode: false,
6867
);
69-
expect(result.buildResult.status, BuildStatus.success);
68+
expect(result.succeeded, true);
7069
});
7170
}
7271

build_runner/test/build_plan/build_triggers_test.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import 'package:analyzer/dart/analysis/utilities.dart';
66
import 'package:analyzer/dart/ast/ast.dart';
77
import 'package:build/build.dart';
88
import 'package:build_config/build_config.dart';
9-
import 'package:build_runner/src/build/build_result.dart';
109
import 'package:build_runner/src/build_plan/build_triggers.dart';
1110
import 'package:build_test/build_test.dart';
1211
import 'package:test/test.dart';
@@ -250,7 +249,7 @@ triggers:
250249
outputs: {},
251250
testingBuilderConfig: false,
252251
);
253-
expect(result.buildResult.status, BuildStatus.success);
252+
expect(result.succeeded, true);
254253
});
255254

256255
test('trigger builder in same file', () async {
@@ -295,7 +294,7 @@ triggers:
295294
outputs: {},
296295
testingBuilderConfig: false,
297296
);
298-
expect(result.buildResult.status, BuildStatus.success);
297+
expect(result.succeeded, true);
299298
});
300299

301300
test('trigger builder in part file', () async {

build_test/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
## 3.5.0-wip
2+
3+
- Improve `TestBuilderResult`: add `succeeded`, `outputs` and `errors`.
4+
Deprecate `buildResult` in favor of these new members.
5+
- Add `verbose` to `testBuilders` and related methods. Like the command line
6+
flag it enables info logging from builders.
7+
18
## 3.4.1
29

310
- Use `build_runner` 2.9.0.

0 commit comments

Comments
 (0)