// Copyright 2018 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/base/common.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/attach.dart'; import 'package:flutter_tools/src/device.dart'; import 'package:mockito/mockito.dart'; import 'package:test/test.dart'; import '../src/common.dart'; import '../src/context.dart'; import '../src/mocks.dart'; void main() { group('attach', () { setUpAll(() { Cache.disableLocking(); }); testUsingContext('finds observatory port and forwards', () async { const int devicePort = 499; const int hostPort = 42; final MockDeviceLogReader mockLogReader = new MockDeviceLogReader(); final MockPortForwarder portForwarder = new MockPortForwarder(); final MockAndroidDevice device = new MockAndroidDevice(); when(device.getLogReader()).thenAnswer((_) { // Now that the reader is used, start writing messages to it. Timer.run(() { mockLogReader.addLine('Foo'); mockLogReader.addLine('Observatory listening on http://127.0.0.1:$devicePort'); }); return mockLogReader; }); when(device.portForwarder).thenReturn(portForwarder); when(portForwarder.forward(devicePort, hostPort: anyNamed('hostPort'))).thenAnswer((_) async => hostPort); when(portForwarder.forwardedPorts).thenReturn([new ForwardedPort(hostPort, devicePort)]); when(portForwarder.unforward(any)).thenAnswer((_) async => null); testDeviceManager.addDevice(device); final AttachCommand command = new AttachCommand(); await createTestCommandRunner(command).run(['attach']); verify(portForwarder.forward(devicePort, hostPort: anyNamed('hostPort'))).called(1); mockLogReader.dispose(); }); testUsingContext('forwards to given port', () async { const int devicePort = 499; const int hostPort = 42; final MockPortForwarder portForwarder = new MockPortForwarder(); final MockAndroidDevice device = new MockAndroidDevice(); when(device.portForwarder).thenReturn(portForwarder); when(portForwarder.forward(devicePort)).thenAnswer((_) async => hostPort); when(portForwarder.forwardedPorts).thenReturn([new ForwardedPort(hostPort, devicePort)]); when(portForwarder.unforward(any)).thenAnswer((_) async => null); testDeviceManager.addDevice(device); final AttachCommand command = new AttachCommand(); await createTestCommandRunner(command).run(['attach', '--debug-port', '$devicePort']); verify(portForwarder.forward(devicePort)).called(1); }); testUsingContext('exits when no device connected', () async { final AttachCommand command = new AttachCommand(); await expectLater( createTestCommandRunner(command).run(['attach']), throwsA(const isInstanceOf()), ); expect(testLogger.statusText, contains('No connected devices')); }); testUsingContext('exits when multiple devices connected', () async { Device aDeviceWithId(String id) { final MockAndroidDevice device = new MockAndroidDevice(); when(device.name).thenReturn('d$id'); when(device.id).thenReturn(id); when(device.isLocalEmulator).thenAnswer((_) async => false); when(device.sdkNameAndVersion).thenAnswer((_) async => 'Android 46'); return device; } final AttachCommand command = new AttachCommand(); testDeviceManager.addDevice(aDeviceWithId('xx1')); testDeviceManager.addDevice(aDeviceWithId('yy2')); await expectLater( createTestCommandRunner(command).run(['attach']), throwsA(const isInstanceOf()), ); expect(testLogger.statusText, contains('More than one device')); expect(testLogger.statusText, contains('xx1')); expect(testLogger.statusText, contains('yy2')); }); }); } class MockPortForwarder extends Mock implements DevicePortForwarder {}