// 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:flutter_tools/src/asset.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:test/test.dart'; import 'src/common.dart'; import 'src/context.dart'; void main() { // These tests do not use a memory file system because we want to ensure that // asset bundles work correctly on Windows and Posix systems. Directory tempDir; Directory oldCurrentDir; setUp(() async { tempDir = await fs.systemTempDirectory.createTemp('asset_bundle_tests'); oldCurrentDir = fs.currentDirectory; fs.currentDirectory = tempDir; }); tearDown(() { fs.currentDirectory = oldCurrentDir; try { tempDir?.deleteSync(recursive: true); tempDir = null; } on FileSystemException catch (e) { // Do nothing, windows sometimes has trouble deleting. print('Ignored exception during tearDown: $e'); } }); group('AssetBundle asset variants', () { testUsingContext('main asset and variants', () async { // Setting flutterRoot here so that it picks up the MemoryFileSystem's // path separator. Cache.flutterRoot = getFlutterRoot(); fs.file('pubspec.yaml') ..createSync() ..writeAsStringSync( ''' name: test dependencies: flutter: sdk: flutter flutter: assets: - a/b/c/foo ''' ); fs.file('.packages')..createSync(); final List<String> assets = <String>[ 'a/b/c/foo', 'a/b/c/var1/foo', 'a/b/c/var2/foo', 'a/b/c/var3/foo', ]; for (String asset in assets) { fs.file(asset) ..createSync(recursive: true) ..writeAsStringSync(asset); } AssetBundle bundle = new AssetBundle(); await bundle.build(manifestPath: 'pubspec.yaml'); // The main asset file, /a/b/c/foo, and its variants exist. for (String asset in assets) { expect(bundle.entries.containsKey(asset), true); expect(UTF8.decode(await bundle.entries[asset].contentsAsBytes()), asset); } fs.file('a/b/c/foo').deleteSync(); bundle = new AssetBundle(); await bundle.build(manifestPath: 'pubspec.yaml'); // Now the main asset file, /a/b/c/foo, does not exist. This is OK because // the /a/b/c/*/foo variants do exist. expect(bundle.entries.containsKey('a/b/c/foo'), false); for (String asset in assets.skip(1)) { expect(bundle.entries.containsKey(asset), true); expect(UTF8.decode(await bundle.entries[asset].contentsAsBytes()), asset); } }); }); }