// 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({}), false); expect(HotRunner.validateReloadReport({ 'type': 'ReloadReport', 'success': false, 'details': {}, }), false); expect(HotRunner.validateReloadReport({ 'type': 'ReloadReport', 'success': false, 'details': { 'notices': >[ ], }, }), false); expect(HotRunner.validateReloadReport({ 'type': 'ReloadReport', 'success': false, 'details': { 'notices': { 'message': 'error', }, }, }), false); expect(HotRunner.validateReloadReport({ 'type': 'ReloadReport', 'success': false, 'details': { 'notices': >[], }, }), false); expect(HotRunner.validateReloadReport({ 'type': 'ReloadReport', 'success': false, 'details': { 'notices': >[ { 'message': false, } ], }, }), false); expect(HotRunner.validateReloadReport({ 'type': 'ReloadReport', 'success': false, 'details': { 'notices': >[ { 'message': ['error'], }, ], }, }), false); expect(HotRunner.validateReloadReport({ 'type': 'ReloadReport', 'success': false, 'details': { 'notices': >[ { 'message': 'error', }, { 'message': ['error'], }, ], }, }), false); expect(HotRunner.validateReloadReport({ 'type': 'ReloadReport', 'success': false, 'details': { 'notices': >[ { 'message': 'error', }, ], }, }), false); expect(HotRunner.validateReloadReport({ '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 devices = [FlutterDevice(MockDevice(), generator: residentCompiler, trackWidgetCreation: false)]; expect((await HotRunner(devices).restart(fullRestart: true)).isOk, false); }, overrides: { Artifacts: () => mockArtifacts, }); testUsingContext('setup function succeeds', () async { final List devices = [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: { Artifacts: () => mockArtifacts, HotRunnerConfig: () => TestHotRunnerConfig(successfulSetup: true), }); testUsingContext('setup function fails', () async { final List devices = [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: { 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 setupHotRestart() async { return successfulSetup; } }