Skip to content

Commit 7dbcd85

Browse files
authored
Combine InMemoryAssetReader and InMemoryAssetWriter into InMemoryAssetReaderWriter (#3854)
* Refactor tests: create reader and writer inside `testBuilders`. * Combine `InMemoryAssetReader` and `InMemoryAssetWriter` into `InMemoryAssetReaderWriter`. Update tests so that reader and writer are backed by the same `InMemoryAssetReaderWriter`. * Address review comments.
1 parent dd4ea07 commit 7dbcd85

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+700
-664
lines changed

_test_common/lib/common.dart

+1-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ export 'package:build_test/build_test.dart'
1414
export 'assets.dart';
1515
export 'builders.dart';
1616
export 'descriptors.dart';
17-
export 'in_memory_reader.dart';
18-
export 'in_memory_writer.dart';
17+
export 'in_memory_reader_writer.dart';
1918
export 'matchers.dart';
2019
export 'package_graphs.dart';
2120
export 'sdk.dart';

_test_common/lib/in_memory_reader.dart

-30
This file was deleted.

_test_common/lib/in_memory_writer.dart renamed to _test_common/lib/in_memory_reader_writer.dart

+12-2
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,20 @@ import 'package:build_test/build_test.dart';
1010
import 'package:path/path.dart' as p;
1111
import 'package:watcher/watcher.dart';
1212

13-
class InMemoryRunnerAssetWriter extends InMemoryAssetWriter
14-
implements RunnerAssetWriter {
13+
class InMemoryRunnerAssetReaderWriter extends InMemoryAssetReaderWriter
14+
implements RunnerAssetReader, RunnerAssetWriter {
15+
final _onCanReadController = StreamController<AssetId>.broadcast();
16+
Stream<AssetId> get onCanRead => _onCanReadController.stream;
1517
void Function(AssetId)? onDelete;
1618

19+
InMemoryRunnerAssetReaderWriter({super.sourceAssets, super.rootPackage});
20+
21+
@override
22+
Future<bool> canRead(AssetId id) {
23+
_onCanReadController.add(id);
24+
return super.canRead(id);
25+
}
26+
1727
@override
1828
Future writeAsBytes(AssetId id, List<int> bytes) async {
1929
var type = assets.containsKey(id) ? ChangeType.MODIFY : ChangeType.ADD;

_test_common/lib/test_environment.dart

+9-14
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,26 @@
44

55
import 'dart:async';
66

7-
// ignore: implementation_imports
8-
import 'package:build_runner_core/src/asset/reader.dart';
9-
// ignore: implementation_imports
10-
import 'package:build_runner_core/src/asset/writer.dart';
11-
// ignore: implementation_imports
12-
import 'package:build_runner_core/src/environment/build_environment.dart';
7+
import 'package:build_runner_core/build_runner_core.dart';
138
import 'package:logging/logging.dart';
149

1510
import 'common.dart';
11+
import 'in_memory_reader_writer.dart';
1612

1713
/// A [BuildEnvironment] for testing.
1814
///
19-
/// Defaults to using an [InMemoryRunnerAssetReader] and
20-
/// [InMemoryRunnerAssetWriter].
15+
/// Defaults to an empty [InMemoryRunnerAssetReaderWriter].
2116
///
2217
/// To handle prompts you must first set `nextPromptResponse`. Alternatively
2318
/// you can set `throwOnPrompt` to `true` to emulate a
2419
/// [NonInteractiveBuildException].
2520
class TestBuildEnvironment extends BuildEnvironment {
21+
final InMemoryRunnerAssetReaderWriter _readerWriter;
22+
2623
@override
27-
final RunnerAssetReader reader;
24+
RunnerAssetReader get reader => _readerWriter;
2825
@override
29-
final RunnerAssetWriter writer;
26+
RunnerAssetWriter get writer => _readerWriter;
3027

3128
/// If true, this will throw a [NonInteractiveBuildException] for all calls to
3229
/// [prompt].
@@ -44,11 +41,9 @@ class TestBuildEnvironment extends BuildEnvironment {
4441
int? _nextPromptResponse;
4542

4643
TestBuildEnvironment(
47-
{RunnerAssetReader? reader,
48-
RunnerAssetWriter? writer,
44+
{InMemoryRunnerAssetReaderWriter? readerWriter,
4945
this.throwOnPrompt = false})
50-
: reader = reader ?? InMemoryRunnerAssetReader(),
51-
writer = writer ?? InMemoryRunnerAssetWriter();
46+
: _readerWriter = readerWriter ?? InMemoryRunnerAssetReaderWriter();
5247

5348
@override
5449
void onLog(LogRecord record) => logRecords.add(record);

_test_common/lib/test_phases.dart

+25-18
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ import 'package:build_test/build_test.dart';
1111
import 'package:logging/logging.dart';
1212
import 'package:test/test.dart';
1313

14-
import 'in_memory_reader.dart';
15-
import 'in_memory_writer.dart';
14+
import 'in_memory_reader_writer.dart';
1615
import 'package_graphs.dart';
1716

1817
Future<void> wait(int milliseconds) =>
@@ -41,14 +40,13 @@ void _printOnFailure(LogRecord record) {
4140
/// For example `$$myapp|lib/utils.copy.dart` will check that the generated
4241
/// output was written to the build cache.
4342
///
43+
/// [resumeFrom] reuses the `readerWriter` from a previous [BuildResult].
44+
///
4445
/// [packageGraph] supplies the root package into which the outputs are to be
4546
/// written.
4647
///
4748
/// [status] optionally indicates the desired outcome.
4849
///
49-
/// [writer] can optionally be provided to capture assets written by the
50-
/// builders (e.g. when [outputs] is not sufficient).
51-
///
5250
/// [logLevel] sets the builder log level and [onLog] can optionally capture
5351
/// build log messages.
5452
///
@@ -67,15 +65,14 @@ void _printOnFailure(LogRecord record) {
6765
/// });
6866
/// }
6967
///
70-
Future<BuildResult> testBuilders(
68+
Future<TestBuildersResult> testBuilders(
7169
List<BuilderApplication> builders,
7270
Map<String, /*String|List<int>*/ Object> inputs, {
71+
TestBuildersResult? resumeFrom,
7372
Map<String, /*String|List<int>*/ Object>? outputs,
7473
PackageGraph? packageGraph,
7574
BuildStatus status = BuildStatus.success,
7675
Map<String, BuildConfig>? overrideBuildConfig,
77-
InMemoryRunnerAssetReader? reader,
78-
InMemoryRunnerAssetWriter? writer,
7976
Level? logLevel,
8077
// A better way to "silence" logging than setting logLevel to OFF.
8178
void Function(LogRecord record) onLog = _printOnFailure,
@@ -88,14 +85,16 @@ Future<BuildResult> testBuilders(
8885
Set<BuildFilter> buildFilters = const {},
8986
String? logPerformanceDir,
9087
String expectedGeneratedDir = 'generated',
88+
void Function(AssetId id)? onDelete,
9189
}) async {
9290
packageGraph ??= buildPackageGraph({rootPackage('a'): []});
93-
writer ??= InMemoryRunnerAssetWriter();
94-
reader ??= InMemoryRunnerAssetReader.shareAssetCache(writer.assets,
95-
rootPackage: packageGraph.root.name);
91+
final readerWriter = resumeFrom == null
92+
? InMemoryRunnerAssetReaderWriter(rootPackage: packageGraph.root.name)
93+
: resumeFrom.readerWriter;
94+
readerWriter.onDelete = onDelete;
9695
var pkgConfigId =
9796
AssetId(packageGraph.root.name, '.dart_tool/package_config.json');
98-
if (!await reader.canRead(pkgConfigId)) {
97+
if (!await readerWriter.canRead(pkgConfigId)) {
9998
var packageConfig = {
10099
'configVersion': 2,
101100
'packages': [
@@ -108,21 +107,21 @@ Future<BuildResult> testBuilders(
108107
},
109108
],
110109
};
111-
await writer.writeAsString(pkgConfigId, jsonEncode(packageConfig));
110+
await readerWriter.writeAsString(pkgConfigId, jsonEncode(packageConfig));
112111
}
113112

114113
inputs.forEach((serializedId, contents) {
115114
var id = makeAssetId(serializedId);
116115
if (contents is String) {
117-
reader!.cacheStringAsset(id, contents);
116+
readerWriter.cacheStringAsset(id, contents);
118117
} else if (contents is List<int>) {
119-
reader!.cacheBytesAsset(id, contents);
118+
readerWriter.cacheBytesAsset(id, contents);
120119
}
121120
});
122121

123122
builderConfigOverrides ??= const {};
124123
var environment = OverrideableEnvironment(IOEnvironment(packageGraph),
125-
reader: reader, writer: writer, onLog: onLog);
124+
reader: readerWriter, writer: readerWriter, onLog: onLog);
126125
var logSubscription =
127126
LogSubscription(environment, verbose: verbose, logLevel: logLevel);
128127
var options = await BuildOptions.create(logSubscription,
@@ -149,12 +148,13 @@ Future<BuildResult> testBuilders(
149148
if (checkBuildStatus) {
150149
checkBuild(result,
151150
outputs: outputs,
152-
writer: writer,
151+
writer: readerWriter,
153152
status: status,
154153
rootPackage: packageGraph.root.name,
155154
expectedGeneratedDir: expectedGeneratedDir);
156155
}
157-
return result;
156+
157+
return TestBuildersResult(buildResult: result, readerWriter: readerWriter);
158158
}
159159

160160
/// Translates expected outptus which start with `$$` to the build cache and
@@ -190,3 +190,10 @@ void checkBuild(BuildResult result,
190190
mapAssetIds: (id) => mapHidden(id, expectedGeneratedDir));
191191
}
192192
}
193+
194+
class TestBuildersResult {
195+
final BuildResult buildResult;
196+
final InMemoryRunnerAssetReaderWriter readerWriter;
197+
198+
TestBuildersResult({required this.buildResult, required this.readerWriter});
199+
}

build/CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
- Add `package:build/src/internal.dart` for use by `build_resolvers`,
44
`build_runner_core` and `build_test`.
5+
- Use `build_test` 3.0.0.
56

67
## 2.4.2
78

build/pubspec.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ dependencies:
2020

2121
dev_dependencies:
2222
build_resolvers: ^2.4.0
23-
build_test: ^2.0.0
23+
build_test: ^3.0.0-wip
2424
dart_flutter_team_lints: ^3.1.0
2525
test: ^1.16.0
2626

build/test/builder/build_step_impl_test.dart

+1-2
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,7 @@ void main() {
7878
late InMemoryAssetReader reader;
7979

8080
setUp(() {
81-
writer = InMemoryAssetWriter();
82-
reader = InMemoryAssetReader.shareAssetCache(writer.assets);
81+
writer = reader = InMemoryAssetReaderWriter();
8382
});
8483

8584
test('tracks outputs created by a builder', () async {

build/test/generate/run_builder_test.dart

+1-2
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@ void main() {
2929
});
3030
builder = TestBuilder(
3131
extraWork: (buildStep, __) => buildStep.fetchResource(resource));
32-
writer = InMemoryAssetWriter();
33-
reader = InMemoryAssetReader.shareAssetCache(writer.assets);
32+
writer = reader = InMemoryAssetReaderWriter();
3433
addAssets(inputs, writer);
3534
});
3635

build_modules/CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 5.0.12-wip
2+
3+
- Use `build_test` 3.0.0.
4+
15
## 5.0.11
26

37
- Support 3.8.0 pre-release sdks.

build_modules/pubspec.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: build_modules
2-
version: 5.0.11
2+
version: 5.0.12-wip
33
description: >-
44
Builders to analyze and split Dart code into individually compilable modules
55
based on imports.
@@ -32,7 +32,7 @@ dev_dependencies:
3232
path: test/fixtures/b
3333
# Used inside tests
3434
build_runner: ^2.0.0
35-
build_test: ^2.0.0
35+
build_test: ^3.0.0-wip
3636
json_serializable: ^6.0.0
3737
test: ^1.16.0
3838

build_modules/test/util.dart

+3-5
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,13 @@ Future<void> testBuilderAndCollectAssets(
1717
void Function(LogRecord log)? onLog,
1818
void Function(AssetId, Iterable<AssetId>)?
1919
reportUnusedAssetsForInput}) async {
20-
var writer = InMemoryAssetWriter();
2120
onLog ??= (log) => printOnFailure('${log.level}: ${log.message}');
22-
await testBuilder(builder, assets,
21+
final result = await testBuilder(builder, assets,
2322
generateFor: generateFor,
2423
outputs: outputs,
2524
onLog: onLog,
26-
reportUnusedAssetsForInput: reportUnusedAssetsForInput,
27-
writer: writer);
28-
writer.assets.forEach((id, value) {
25+
reportUnusedAssetsForInput: reportUnusedAssetsForInput);
26+
result.readerWriter.assets.forEach((id, value) {
2927
assets['${id.package}|${id.path}'] = value;
3028
});
3129
}

build_resolvers/CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
- Start using `package:build/src/internal.dart`.
44
- Switch `BuildAssetUriResolver` dependency crawl to an iterative
55
algorithm, preventing stack overflows.
6+
- Use `build_test` 3.0.0.
67

78
## 2.4.4
89

build_resolvers/pubspec.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ dependencies:
2424
yaml: ^3.0.0
2525

2626
dev_dependencies:
27-
build_test: ^2.0.0
27+
build_test: ^3.0.0-wip
2828
dart_flutter_team_lints: ^3.1.0
2929
test: ^1.16.0
3030

0 commit comments

Comments
 (0)