Skip to content

Commit efd9a13

Browse files
authored
Add readAllSourcesFromFilesystem to resolveSources. (#4063)
Tweak `resolveSources` error handling.
1 parent 84020e6 commit efd9a13

File tree

4 files changed

+68
-9
lines changed

4 files changed

+68
-9
lines changed

build_test/CHANGELOG.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1-
## 3.1.2
1+
## 3.2.0
22

33
- Fixes when passing a `readerWriter` to `testBuilders`: don't count initial
44
assets as outputs; do set up packages for initial assets; only apply builders
55
to packages mentioned in `sourceAssets`.
6+
- Add `readAllSourcesFromFilesystem` parameter to `resolveSources`. Set it to
7+
`true` to make the method behave as it did in `build_test` 2.2.0.
8+
- Fix to `resolveSources` error handling.
69

710
## 3.1.1
811

build_test/lib/src/resolve_source.dart

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'dart:isolate';
88
import 'package:build/build.dart';
99
import 'package:build/experiments.dart';
1010
import 'package:build_resolvers/build_resolvers.dart';
11+
import 'package:glob/glob.dart';
1112
import 'package:package_config/package_config.dart';
1213

1314
import 'package_reader.dart';
@@ -28,6 +29,7 @@ Future<T> resolveSource<T>(
2829
AssetId? inputId,
2930
PackageConfig? packageConfig,
3031
Set<AssetId>? nonInputsToReadFromFilesystem,
32+
bool? readAllSourcesFromFilesystem,
3133
Resolvers? resolvers,
3234
}) {
3335
inputId ??= AssetId('_resolve_source', 'lib/_resolve_source.dart');
@@ -37,6 +39,7 @@ Future<T> resolveSource<T>(
3739
action,
3840
packageConfig: packageConfig,
3941
nonInputsToReadFromFilesystem: nonInputsToReadFromFilesystem,
42+
readAllSourcesFromFilesystem: readAllSourcesFromFilesystem,
4043
resolverFor: inputId,
4144
resolvers: resolvers,
4245
);
@@ -83,13 +86,20 @@ Future<T> resolveSource<T>(
8386
/// - by default, [PackageAssetReader.currentIsolate]. A custom [packageConfig]
8487
/// may be provided to map files not visible to the current package's runtime.
8588
///
89+
/// By default, only assets listed in [inputs] with value [useAssetReader] are
90+
/// read from the real filesystem. To read more real files: pass
91+
/// [nonInputsToReadFromFilesystem] for individual files, or
92+
/// [readAllSourcesFromFilesystem] to read all sources available with
93+
/// [packageConfig].
94+
///
8695
/// [assetReaderChecks], if provided, runs after the action completes and can be
8796
/// used to add expectations on the reader state.
8897
Future<T> resolveSources<T>(
8998
Map<String, String> inputs,
9099
FutureOr<T> Function(Resolver resolver) action, {
91100
PackageConfig? packageConfig,
92101
Set<AssetId>? nonInputsToReadFromFilesystem,
102+
bool? readAllSourcesFromFilesystem,
93103
String? resolverFor,
94104
String? rootPackage,
95105
FutureOr<void> Function(TestReaderWriter)? assetReaderChecks,
@@ -105,6 +115,7 @@ Future<T> resolveSources<T>(
105115
action,
106116
packageConfig: packageConfig,
107117
nonInputsToReadFromFilesystem: nonInputsToReadFromFilesystem,
118+
readAllSourcesFromFilesystem: readAllSourcesFromFilesystem,
108119
resolverFor: AssetId.parse(resolverFor ?? inputs.keys.first),
109120
assetReaderChecks: assetReaderChecks,
110121
resolvers: resolvers,
@@ -117,6 +128,7 @@ Future<T> resolveAsset<T>(
117128
FutureOr<T> Function(Resolver resolver) action, {
118129
PackageConfig? packageConfig,
119130
Set<AssetId>? nonInputsToReadFromFilesystem,
131+
bool? readAllSourcesFromFilesystem,
120132
Future<void>? tearDown,
121133
Resolvers? resolvers,
122134
}) {
@@ -126,6 +138,7 @@ Future<T> resolveAsset<T>(
126138
action,
127139
packageConfig: packageConfig,
128140
nonInputsToReadFromFilesystem: nonInputsToReadFromFilesystem,
141+
readAllSourcesFromFilesystem: readAllSourcesFromFilesystem,
129142
resolverFor: inputId,
130143
resolvers: resolvers,
131144
);
@@ -142,6 +155,7 @@ Future<T> _resolveAssets<T>(
142155
FutureOr<T> Function(Resolver resolver) action, {
143156
PackageConfig? packageConfig,
144157
Set<AssetId>? nonInputsToReadFromFilesystem,
158+
bool? readAllSourcesFromFilesystem,
145159
AssetId? resolverFor,
146160
FutureOr<void> Function(TestReaderWriter)? assetReaderChecks,
147161
Resolvers? resolvers,
@@ -161,10 +175,21 @@ Future<T> _resolveAssets<T>(
161175
}
162176
}
163177

178+
final readerWriter = TestReaderWriter(rootPackage: rootPackage);
164179
// Copy any additionally requested files from the filesystem to `inputs`.
165180
if (nonInputsToReadFromFilesystem != null) {
166181
for (final id in nonInputsToReadFromFilesystem) {
167-
inputs[id.toString()] = await assetReader.readAsString(id);
182+
readerWriter.testing.writeBytes(id, await assetReader.readAsBytes(id));
183+
}
184+
}
185+
if (readAllSourcesFromFilesystem == true) {
186+
for (final package in assetReader.packageConfig.packages) {
187+
await for (final id in assetReader.findAssets(
188+
Glob('**'),
189+
package: package.name,
190+
)) {
191+
readerWriter.testing.writeBytes(id, await assetReader.readAsBytes(id));
192+
}
168193
}
169194
}
170195

@@ -175,18 +200,25 @@ Future<T> _resolveAssets<T>(
175200
? AnalyzerResolvers.sharedInstance
176201
: AnalyzerResolvers.custom(packageConfig: resolvedConfig);
177202

178-
final buildResult = await testBuilder(
203+
await testBuilder(
179204
resolveBuilder,
180205
inputs,
206+
readerWriter: readerWriter,
181207
resolvers: resolvers,
182208
packageConfig: packageConfig,
183209
);
184-
final readerWriter = buildResult.readerWriter;
185210
if (assetReaderChecks != null) {
186211
assetReaderChecks(readerWriter);
187212
}
188213

189-
return resolveBuilder.onDone.future;
214+
if (resolveBuilder.error == null) {
215+
return resolveBuilder.result as T;
216+
} else {
217+
Error.throwWithStackTrace(
218+
resolveBuilder.error!,
219+
resolveBuilder.stackTrace!,
220+
);
221+
}
190222
}
191223

192224
/// A [Builder] that is only used to retrieve a [Resolver] instance.
@@ -197,17 +229,20 @@ class _ResolveSourceBuilder<T> implements Builder {
197229
final FutureOr<T> Function(Resolver) _action;
198230
final AssetId? _resolverFor;
199231

200-
final onDone = Completer<T>();
232+
T? result;
233+
Object? error;
234+
StackTrace? stackTrace;
201235

202236
_ResolveSourceBuilder(this._action, this._resolverFor);
203237

204238
@override
205239
Future<void> build(BuildStep buildStep) async {
206240
if (_resolverFor != buildStep.inputId) return;
207241
try {
208-
onDone.complete(await _action(buildStep.resolver));
242+
result = await _action(buildStep.resolver);
209243
} catch (e, s) {
210-
onDone.completeError(e, s);
244+
error = e;
245+
stackTrace = s;
211246
}
212247
}
213248

build_test/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: build_test
22
description: Utilities for writing unit tests of Builders.
3-
version: 3.1.2
3+
version: 3.2.0
44
repository: https://github.com/dart-lang/build/tree/master/build_test
55
resolution: workspace
66

build_test/test/resolve_source_test.dart

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,27 @@ void main() {
141141
),
142142
);
143143
});
144+
145+
test('all sources from real filesystem', () async {
146+
await resolveSource(
147+
r'''
148+
library example;
149+
150+
import 'package:collection/collection.dart';
151+
152+
abstract class Foo implements Equality {}
153+
''',
154+
readAllSourcesFromFilesystem: true,
155+
(resolver) async {
156+
var libExample = await resolver.findLibraryNotNull('example');
157+
var classFoo = libExample.getClass('Foo')!;
158+
expect(
159+
classFoo.allSupertypes.map(_toStringId),
160+
contains(endsWith(':collection#Equality')),
161+
);
162+
},
163+
);
164+
});
144165
});
145166

146167
group('should resolveAsset', () {

0 commit comments

Comments
 (0)