blob: 758dd4ad9bf088ba9fb5c7b16e9aa4d148a7cde0 [file] [log] [blame]
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_tools/src/android/android_device.dart';
import 'package:flutter_tools/src/base/io.dart';
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/device_port_forwader.dart';
import '../../src/common.dart';
import '../../src/context.dart';
import '../../src/fake_process_manager.dart';
void main() {
testWithoutContext('AndroidDevicePortForwarder returns the generated host '
'port from stdout', () async {
final AndroidDevicePortForwarder forwarder = AndroidDevicePortForwarder(
adbPath: 'adb',
deviceId: '1',
processManager: FakeProcessManager.list(<FakeCommand>[
const FakeCommand(
command: <String>['adb', '-s', '1', 'forward', 'tcp:0', 'tcp:123'],
stdout: '456',
)
]),
logger: BufferLogger.test(),
);
expect(await forwarder.forward(123), 456);
});
testWithoutContext('AndroidDevicePortForwarder returns the supplied host '
'port when stdout is empty', () async {
final AndroidDevicePortForwarder forwarder = AndroidDevicePortForwarder(
adbPath: 'adb',
deviceId: '1',
processManager: FakeProcessManager.list(<FakeCommand>[
const FakeCommand(
command: <String>['adb', '-s', '1', 'forward', 'tcp:456', 'tcp:123'],
stdout: '',
)
]),
logger: BufferLogger.test(),
);
expect(await forwarder.forward(123, hostPort: 456), 456);
});
testWithoutContext('AndroidDevicePortForwarder returns the supplied host port '
'when stdout is the host port', () async {
final AndroidDevicePortForwarder forwarder = AndroidDevicePortForwarder(
adbPath: 'adb',
deviceId: '1',
processManager: FakeProcessManager.list(<FakeCommand>[
const FakeCommand(
command: <String>['adb', '-s', '1', 'forward', 'tcp:456', 'tcp:123'],
stdout: '456',
)
]),
logger: BufferLogger.test(),
);
expect(await forwarder.forward(123, hostPort: 456), 456);
});
testWithoutContext('AndroidDevicePortForwarder throws an exception when stdout '
'is not blank nor the host port', () async {
final AndroidDevicePortForwarder forwarder = AndroidDevicePortForwarder(
adbPath: 'adb',
deviceId: '1',
processManager: FakeProcessManager.list(<FakeCommand>[
const FakeCommand(
command: <String>['adb', '-s', '1', 'forward', 'tcp:456', 'tcp:123'],
stdout: '123456',
)
]),
logger: BufferLogger.test(),
);
expect(forwarder.forward(123, hostPort: 456), throwsA(isA<ProcessException>()));
});
testWithoutContext('AndroidDevicePortForwarder forwardedPorts returns empty '
'list when forward failed', () {
final AndroidDevicePortForwarder forwarder = AndroidDevicePortForwarder(
adbPath: 'adb',
deviceId: '1',
processManager: FakeProcessManager.list(<FakeCommand>[
const FakeCommand(
command: <String>['adb', '-s', '1', 'forward', '--list'],
exitCode: 1,
)
]),
logger: BufferLogger.test(),
);
expect(forwarder.forwardedPorts, isEmpty);
});
testWithoutContext('disposing device disposes the portForwarder', () async {
final FakeProcessManager processManager = FakeProcessManager.list(<FakeCommand>[
const FakeCommand(
command: <String>['adb', '-s', '1', 'forward', 'tcp:0', 'tcp:123'],
stdout: '456',
),
const FakeCommand(
command: <String>['adb', '-s', '1', 'forward', '--list'],
stdout: '1234 tcp:456 tcp:123',
),
const FakeCommand(
command: <String>['adb', '-s', '1', 'forward', '--remove', 'tcp:456'],
)
]);
final AndroidDevicePortForwarder forwarder = AndroidDevicePortForwarder(
adbPath: 'adb',
deviceId: '1',
processManager: processManager,
logger: BufferLogger.test(),
);
expect(await forwarder.forward(123), equals(456));
await forwarder.dispose();
expect(processManager, hasNoRemainingExpectations);
});
testWithoutContext('failures to unforward port do not throw if the forward is missing', () async {
final FakeProcessManager processManager = FakeProcessManager.list(<FakeCommand>[
const FakeCommand(
command: <String>['adb', '-s', '1', 'forward', '--remove', 'tcp:456'],
stderr: "error: listener 'tcp:456' not found",
exitCode: 1,
)
]);
final AndroidDevicePortForwarder forwarder = AndroidDevicePortForwarder(
adbPath: 'adb',
deviceId: '1',
processManager: processManager,
logger: BufferLogger.test(),
);
await forwarder.unforward(ForwardedPort(456, 23));
});
testWithoutContext('failures to unforward port throw exception if stderr is not recognized', () async {
final FakeProcessManager processManager = FakeProcessManager.list(<FakeCommand>[
const FakeCommand(
command: <String>['adb', '-s', '1', 'forward', '--remove', 'tcp:456'],
stderr: 'error: everything is broken!',
exitCode: 1,
)
]);
final AndroidDevicePortForwarder forwarder = AndroidDevicePortForwarder(
adbPath: 'adb',
deviceId: '1',
processManager: processManager,
logger: BufferLogger.test(),
);
expect(() => forwarder.unforward(ForwardedPort(456, 23)), throwsA(isA<ProcessException>()));
});
}