mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00

...because otherwise, processes that think they're manipulating your filesystem will be doing crazy things the test is ignoring, leading to (at best) failures and (at worst) flakes or disk corruption.
152 lines
5.2 KiB
Dart
152 lines
5.2 KiB
Dart
// Copyright 2016 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
import 'dart:convert';
|
|
|
|
import 'package:file/file.dart';
|
|
import 'package:file/memory.dart';
|
|
|
|
import 'package:flutter_tools/src/asset.dart';
|
|
import 'package:flutter_tools/src/base/file_system.dart';
|
|
import 'package:flutter_tools/src/base/platform.dart';
|
|
import 'package:flutter_tools/src/cache.dart';
|
|
|
|
import '../src/common.dart';
|
|
import '../src/context.dart';
|
|
|
|
void main() {
|
|
setUpAll(() {
|
|
Cache.flutterRoot = getFlutterRoot();
|
|
});
|
|
|
|
group('AssetBundle.build', () {
|
|
FileSystem testFileSystem;
|
|
|
|
setUp(() async {
|
|
testFileSystem = MemoryFileSystem(
|
|
style: platform.isWindows
|
|
? FileSystemStyle.windows
|
|
: FileSystemStyle.posix,
|
|
);
|
|
testFileSystem.currentDirectory = testFileSystem.systemTempDirectory.createTempSync('flutter_asset_bundle_test.');
|
|
});
|
|
|
|
testUsingContext('nonempty', () async {
|
|
final AssetBundle ab = AssetBundleFactory.instance.createBundle();
|
|
expect(await ab.build(), 0);
|
|
expect(ab.entries.length, greaterThan(0));
|
|
}, overrides: <Type, Generator>{
|
|
FileSystem: () => testFileSystem,
|
|
ProcessManager: () => FakeProcessManager(<FakeCommand>[]),
|
|
});
|
|
|
|
testUsingContext('empty pubspec', () async {
|
|
fs.file('pubspec.yaml')
|
|
..createSync()
|
|
..writeAsStringSync('');
|
|
|
|
final AssetBundle bundle = AssetBundleFactory.instance.createBundle();
|
|
await bundle.build(manifestPath: 'pubspec.yaml');
|
|
expect(bundle.entries.length, 1);
|
|
const String expectedAssetManifest = '{}';
|
|
expect(
|
|
utf8.decode(await bundle.entries['AssetManifest.json'].contentsAsBytes()),
|
|
expectedAssetManifest,
|
|
);
|
|
}, overrides: <Type, Generator>{
|
|
FileSystem: () => testFileSystem,
|
|
ProcessManager: () => FakeProcessManager(<FakeCommand>[]),
|
|
});
|
|
|
|
testUsingContext('wildcard directories are updated when filesystem changes', () async {
|
|
fs.file('.packages').createSync();
|
|
fs.file(fs.path.join('assets', 'foo', 'bar.txt')).createSync(recursive: true);
|
|
fs.file('pubspec.yaml')
|
|
..createSync()
|
|
..writeAsStringSync(r'''
|
|
name: example
|
|
flutter:
|
|
assets:
|
|
- assets/foo/
|
|
''');
|
|
final AssetBundle bundle = AssetBundleFactory.instance.createBundle();
|
|
await bundle.build(manifestPath: 'pubspec.yaml');
|
|
// Expected assets:
|
|
// - asset manifest
|
|
// - font manifest
|
|
// - license file
|
|
// - assets/foo/bar.txt
|
|
expect(bundle.entries.length, 4);
|
|
expect(bundle.needsBuild(manifestPath: 'pubspec.yaml'), false);
|
|
|
|
// Adding a file should update the stat of the directory, but instead
|
|
// we need to fully recreate it.
|
|
fs.directory(fs.path.join('assets', 'foo')).deleteSync(recursive: true);
|
|
fs.file(fs.path.join('assets', 'foo', 'fizz.txt')).createSync(recursive: true);
|
|
fs.file(fs.path.join('assets', 'foo', 'bar.txt')).createSync();
|
|
|
|
expect(bundle.needsBuild(manifestPath: 'pubspec.yaml'), true);
|
|
await bundle.build(manifestPath: 'pubspec.yaml');
|
|
// Expected assets:
|
|
// - asset manifest
|
|
// - font manifest
|
|
// - license file
|
|
// - assets/foo/bar.txt
|
|
// - assets/foo/fizz.txt
|
|
expect(bundle.entries.length, 5);
|
|
}, overrides: <Type, Generator>{
|
|
FileSystem: () => testFileSystem,
|
|
ProcessManager: () => FakeProcessManager(<FakeCommand>[]),
|
|
});
|
|
|
|
testUsingContext('handle removal of wildcard directories', () async {
|
|
fs.file(fs.path.join('assets', 'foo', 'bar.txt')).createSync(recursive: true);
|
|
fs.file('pubspec.yaml')
|
|
..createSync()
|
|
..writeAsStringSync(r'''
|
|
name: example
|
|
flutter:
|
|
assets:
|
|
- assets/foo/
|
|
''');
|
|
fs.file('.packages').createSync();
|
|
final AssetBundle bundle = AssetBundleFactory.instance.createBundle();
|
|
await bundle.build(manifestPath: 'pubspec.yaml');
|
|
// Expected assets:
|
|
// - asset manifest
|
|
// - font manifest
|
|
// - license file
|
|
// - assets/foo/bar.txt
|
|
expect(bundle.entries.length, 4);
|
|
expect(bundle.needsBuild(manifestPath: 'pubspec.yaml'), false);
|
|
|
|
// Delete the wildcard directory and update pubspec file.
|
|
fs.directory(fs.path.join('assets', 'foo')).deleteSync(recursive: true);
|
|
fs.file('pubspec.yaml')
|
|
..createSync()
|
|
..writeAsStringSync(r'''
|
|
name: example''');
|
|
|
|
// touch .packages to make sure its change time is after pubspec.yaml's
|
|
fs.file('.packages').createSync();
|
|
|
|
// Even though the previous file was removed, it is left in the
|
|
// asset manifest and not updated. This is due to the devfs not
|
|
// supporting file deletion.
|
|
expect(bundle.needsBuild(manifestPath: 'pubspec.yaml'), true);
|
|
await bundle.build(manifestPath: 'pubspec.yaml');
|
|
// Expected assets:
|
|
// - asset manifest
|
|
// - font manifest
|
|
// - license file
|
|
// - assets/foo/bar.txt
|
|
expect(bundle.entries.length, 4);
|
|
}, overrides: <Type, Generator>{
|
|
FileSystem: () => testFileSystem,
|
|
ProcessManager: () => FakeProcessManager(<FakeCommand>[]),
|
|
});
|
|
});
|
|
|
|
}
|