// 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:flutter_tools/src/artifacts.dart'; import 'package:flutter_tools/src/device.dart'; import 'package:flutter_tools/src/resident_runner.dart'; import 'package:flutter_tools/src/run_hot.dart'; import 'package:meta/meta.dart'; import 'package:mockito/mockito.dart'; import 'src/common.dart'; import 'src/context.dart'; import 'src/mocks.dart'; void main() { group('validateReloadReport', () { testUsingContext('invalid', () async { expect(HotRunner.validateReloadReport(<String, dynamic>{}), false); expect(HotRunner.validateReloadReport(<String, dynamic>{ 'type': 'ReloadReport', 'success': false, 'details': <String, dynamic>{}, }), false); expect(HotRunner.validateReloadReport(<String, dynamic>{ 'type': 'ReloadReport', 'success': false, 'details': <String, dynamic>{ 'notices': <Map<String, dynamic>>[ ], }, }), false); expect(HotRunner.validateReloadReport(<String, dynamic>{ 'type': 'ReloadReport', 'success': false, 'details': <String, dynamic>{ 'notices': <String, dynamic>{ 'message': 'error', }, }, }), false); expect(HotRunner.validateReloadReport(<String, dynamic>{ 'type': 'ReloadReport', 'success': false, 'details': <String, dynamic>{ 'notices': <Map<String, dynamic>>[], }, }), false); expect(HotRunner.validateReloadReport(<String, dynamic>{ 'type': 'ReloadReport', 'success': false, 'details': <String, dynamic>{ 'notices': <Map<String, dynamic>>[ <String, dynamic>{ 'message': false, } ], }, }), false); expect(HotRunner.validateReloadReport(<String, dynamic>{ 'type': 'ReloadReport', 'success': false, 'details': <String, dynamic>{ 'notices': <Map<String, dynamic>>[ <String, dynamic>{ 'message': <String>['error'], }, ], }, }), false); expect(HotRunner.validateReloadReport(<String, dynamic>{ 'type': 'ReloadReport', 'success': false, 'details': <String, dynamic>{ 'notices': <Map<String, dynamic>>[ <String, dynamic>{ 'message': 'error', }, <String, dynamic>{ 'message': <String>['error'], }, ], }, }), false); expect(HotRunner.validateReloadReport(<String, dynamic>{ 'type': 'ReloadReport', 'success': false, 'details': <String, dynamic>{ 'notices': <Map<String, dynamic>>[ <String, dynamic>{ 'message': 'error', }, ], }, }), false); expect(HotRunner.validateReloadReport(<String, dynamic>{ 'type': 'ReloadReport', 'success': true, }), true); }); }); group('hotRestart', () { final MockResidentCompiler residentCompiler = MockResidentCompiler(); MockLocalEngineArtifacts mockArtifacts; setUp(() { mockArtifacts = MockLocalEngineArtifacts(); when(mockArtifacts.getArtifactPath(Artifact.flutterPatchedSdkPath)).thenReturn('some/path'); }); testUsingContext('no setup', () async { final List<FlutterDevice> devices = <FlutterDevice>[FlutterDevice(MockDevice(), generator: residentCompiler, trackWidgetCreation: false)]; expect((await HotRunner(devices).restart(fullRestart: true)).isOk, false); }, overrides: <Type, Generator>{ Artifacts: () => mockArtifacts, }); testUsingContext('setup function succeeds', () async { final List<FlutterDevice> devices = <FlutterDevice>[FlutterDevice(MockDevice(), generator: residentCompiler, trackWidgetCreation: false)]; final OperationResult result = await HotRunner(devices).restart(fullRestart: true); expect(result.isOk, false); expect(result.message, isNot('setupHotRestart failed')); }, overrides: <Type, Generator>{ Artifacts: () => mockArtifacts, HotRunnerConfig: () => TestHotRunnerConfig(successfulSetup: true), }); testUsingContext('setup function fails', () async { final List<FlutterDevice> devices = <FlutterDevice>[FlutterDevice(MockDevice(), generator: residentCompiler, trackWidgetCreation: false)]; final OperationResult result = await HotRunner(devices).restart(fullRestart: true); expect(result.isOk, false); expect(result.message, 'setupHotRestart failed'); }, overrides: <Type, Generator>{ Artifacts: () => mockArtifacts, HotRunnerConfig: () => TestHotRunnerConfig(successfulSetup: false), }); }); } class MockLocalEngineArtifacts extends Mock implements LocalEngineArtifacts {} class MockDevice extends Mock implements Device { MockDevice() { when(isSupported()).thenReturn(true); } } class TestHotRunnerConfig extends HotRunnerConfig { TestHotRunnerConfig({@required this.successfulSetup}); bool successfulSetup; @override Future<bool> setupHotRestart() async { return successfulSetup; } }