// 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:async'; import 'package:file/file.dart'; import 'package:file/memory.dart'; import 'package:mockito/mockito.dart'; import 'package:test/test.dart'; import 'package:platform/platform.dart'; import 'package:flutter_tools/src/cache.dart'; import 'src/context.dart'; void main() { group('$Cache.checkLockAcquired', () { setUp(() { Cache.enableLocking(); }); tearDown(() { // Restore locking to prevent potential side-effects in // tests outside this group (this option is globally shared). Cache.enableLocking(); }); test('should throw when locking is not acquired', () { expect(() => Cache.checkLockAcquired(), throwsStateError); }); test('should not throw when locking is disabled', () { Cache.disableLocking(); Cache.checkLockAcquired(); }); testUsingContext('should not throw when lock is acquired', () async { await Cache.lock(); Cache.checkLockAcquired(); }, overrides: <Type, Generator>{ FileSystem: () => new MockFileSystem(), }); testUsingContext('should not throw when FLUTTER_ALREADY_LOCKED is set', () async { Cache.checkLockAcquired(); }, overrides: <Type, Generator>{ Platform: () => new FakePlatform()..environment = <String, String>{'FLUTTER_ALREADY_LOCKED': 'true'}, }); }); group('Cache', () { test('should not be up to date, if some cached artifact is not', () { final CachedArtifact artifact1 = new MockCachedArtifact(); final CachedArtifact artifact2 = new MockCachedArtifact(); when(artifact1.isUpToDate()).thenReturn(true); when(artifact2.isUpToDate()).thenReturn(false); final Cache cache = new Cache(artifacts: <CachedArtifact>[artifact1, artifact2]); expect(cache.isUpToDate(), isFalse); }); test('should be up to date, if all cached artifacts are', () { final CachedArtifact artifact1 = new MockCachedArtifact(); final CachedArtifact artifact2 = new MockCachedArtifact(); when(artifact1.isUpToDate()).thenReturn(true); when(artifact2.isUpToDate()).thenReturn(true); final Cache cache = new Cache(artifacts: <CachedArtifact>[artifact1, artifact2]); expect(cache.isUpToDate(), isTrue); }); test('should update cached artifacts which are not up to date', () async { final CachedArtifact artifact1 = new MockCachedArtifact(); final CachedArtifact artifact2 = new MockCachedArtifact(); when(artifact1.isUpToDate()).thenReturn(true); when(artifact2.isUpToDate()).thenReturn(false); final Cache cache = new Cache(artifacts: <CachedArtifact>[artifact1, artifact2]); await cache.updateAll(); verifyNever(artifact1.update()); verify(artifact2.update()); }); }); } class MockFileSystem extends MemoryFileSystem { @override File file(dynamic path) { return new MockFile(); } } class MockFile extends Mock implements File { @override Future<RandomAccessFile> open({FileMode mode: FileMode.READ}) async { return new MockRandomAccessFile(); } } class MockRandomAccessFile extends Mock implements RandomAccessFile {} class MockCachedArtifact extends Mock implements CachedArtifact {}