Skip to content

Commit 3d10b16

Browse files
authored
Add testing.loadIsolateSources. (#4048)
1 parent 1290279 commit 3d10b16

File tree

5 files changed

+57
-17
lines changed

5 files changed

+57
-17
lines changed

build_test/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
- Add `inputsTrackedFor` and `resolverEntrypointsTrackedFor` to
44
`ReaderWriterTesting`, so tests can determine what each build step
55
read and resolved.
6+
- Add `loadIsolateSources` to `ReaderWriterTesting`. It loads all real
7+
sources visible to the test into memory.
68

79
## 3.0.0
810

build_test/lib/src/in_memory_reader_writer.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import 'package:path/path.dart' as p;
1717
import 'package:watcher/watcher.dart';
1818

1919
import 'fake_watcher.dart';
20+
import 'package_reader.dart';
2021
import 'test_reader_writer.dart';
2122

2223
/// The implementation behind [TestReaderWriter].
@@ -182,6 +183,19 @@ class _ReaderWriterTestingImpl implements ReaderWriterTesting {
182183

183184
_ReaderWriterTestingImpl(this._readerWriter);
184185

186+
@override
187+
Future<void> loadIsolateSources() async {
188+
final reader = await PackageAssetReader.currentIsolate();
189+
for (final package in reader.packageConfig.packages) {
190+
await for (final id in reader.findAssets(
191+
Glob('**'),
192+
package: package.name,
193+
)) {
194+
await _readerWriter.writeAsBytes(id, await reader.readAsBytes(id));
195+
}
196+
}
197+
}
198+
185199
@override
186200
Iterable<AssetId> get assets =>
187201
(_readerWriter.filesystem as InMemoryFilesystem).filePaths.map(

build_test/lib/src/package_reader.dart

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,11 @@ import 'package:stream_transform/stream_transform.dart';
2222
/// ```
2323
///
2424
/// Doesn't implement [AssetReader]: for cases that need an [AssetReader],
25-
/// use this class to read the files then write them into an
26-
/// `InMemoryAssetReaderWriter`.
25+
/// use this class to read the files then write them into a `TestReaderWriter`.
26+
/// To copy all the sources see `TestReaderWriter.testing.loadIsolateSources`.
2727
class PackageAssetReader {
28-
final PackageConfig _packageConfig;
28+
/// The package config.
29+
final PackageConfig packageConfig;
2930

3031
/// What package is the originating build occurring in.
3132
final String? _rootPackage;
@@ -39,7 +40,7 @@ class PackageAssetReader {
3940
/// new PackageAssetReader(
4041
/// await loadPackageConfigUri(await Isolate.packageConfig));
4142
/// ```
42-
PackageAssetReader(this._packageConfig, [this._rootPackage]);
43+
PackageAssetReader(this.packageConfig, [this._rootPackage]);
4344

4445
/// A [PackageAssetReader] with a single [packageRoot] configured.
4546
///
@@ -96,7 +97,7 @@ class PackageAssetReader {
9697
File? _resolve(AssetId id) {
9798
final uri = id.uri;
9899
if (uri.isScheme('package')) {
99-
final uri = _packageConfig.resolve(id.uri);
100+
final uri = packageConfig.resolve(id.uri);
100101
if (uri != null) {
101102
return File.fromUri(uri);
102103
}
@@ -112,7 +113,7 @@ class PackageAssetReader {
112113
final rootPackage = _rootPackage;
113114
final root =
114115
rootPackage != null
115-
? _packageConfig[rootPackage]?.root.toFilePath()
116+
? packageConfig[rootPackage]?.root.toFilePath()
116117
: null;
117118
if (root != null && Directory(p.join(root, 'lib')).existsSync()) {
118119
return root;
@@ -129,26 +130,33 @@ class PackageAssetReader {
129130
'explicit `package`.',
130131
);
131132
}
132-
var packageLibDir = _packageConfig[package]?.packageUriRoot;
133+
var packageLibDir = packageConfig[package]?.packageUriRoot;
133134
if (packageLibDir == null) return const Stream.empty();
134-
135-
var packageFiles = Directory.fromUri(packageLibDir)
136-
.list(recursive: true)
137-
.whereType<File>()
138-
.map(
139-
(f) =>
140-
p.join('lib', p.relative(f.path, from: p.fromUri(packageLibDir))),
141-
);
135+
var result = const Stream<String>.empty();
136+
final directory = Directory.fromUri(packageLibDir);
137+
if (directory.existsSync()) {
138+
result = result.merge(
139+
Directory.fromUri(packageLibDir)
140+
.list(recursive: true)
141+
.whereType<File>()
142+
.map(
143+
(f) => p.join(
144+
'lib',
145+
p.relative(f.path, from: p.fromUri(packageLibDir)),
146+
),
147+
),
148+
);
149+
}
142150
if (package == _rootPackage) {
143-
packageFiles = packageFiles.merge(
151+
result = result.merge(
144152
Directory(_rootPackagePath)
145153
.list(recursive: true)
146154
.whereType<File>()
147155
.map((f) => p.relative(f.path, from: _rootPackagePath))
148156
.where((p) => !(p.startsWith('packages/') || p.startsWith('lib/'))),
149157
);
150158
}
151-
return packageFiles.where(glob.matches).map((p) => AssetId(package!, p));
159+
return result.where(glob.matches).map((p) => AssetId(package!, p));
152160
}
153161

154162
Future<bool> canRead(AssetId id) =>

build_test/lib/src/test_reader_writer.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ abstract interface class TestReaderWriter
2626

2727
/// Access to [TestReaderWriter] state for testing.
2828
abstract interface class ReaderWriterTesting {
29+
/// Loads all `lib` files visible to the current isolate into memory.
30+
Future<void> loadIsolateSources();
31+
2932
/// All the assets that exist on the [TestReaderWriter] in-memory filesystem.
3033
Iterable<AssetId> get assets;
3134

build_test/test/in_memory_reader_test.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,5 +59,18 @@ void main() {
5959
);
6060
},
6161
);
62+
63+
test('load isolate sources', () async {
64+
final readerWriter = InMemoryAssetReaderWriter();
65+
await readerWriter.testing.loadIsolateSources();
66+
expect(
67+
readerWriter.testing.assets,
68+
containsAll([
69+
AssetId('build', 'lib/build.dart'),
70+
AssetId('glob', 'lib/glob.dart'),
71+
AssetId('test', 'lib/test.dart'),
72+
]),
73+
);
74+
});
6275
});
6376
}

0 commit comments

Comments
 (0)