blob: d0d98a489fbda4d41ffcc863daa552e1bcaf57a6 [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.
import 'dart:async';
import 'package:flutter_tools/src/base/common.dart';
import 'package:flutter_tools/src/base/io.dart';
import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/commands/logs.dart';
import 'package:flutter_tools/src/device.dart';
import 'package:test/fake.dart';
import '../../src/context.dart';
import '../../src/fake_devices.dart';
import '../../src/test_flutter_command_runner.dart';
void main() {
group('logs', () {
late Platform platform;
late FakeDeviceManager deviceManager;
const deviceId = 'abc123';
setUp(() {
Cache.disableLocking();
deviceManager = FakeDeviceManager();
platform = FakePlatform();
});
tearDown(() {
Cache.enableLocking();
});
testUsingContext('fail with a bad device id', () async {
final command = LogsCommand(sigterm: FakeProcessSignal(), sigint: FakeProcessSignal());
await expectLater(
() => createTestCommandRunner(command).run(<String>['-d', 'abc123', 'logs']),
throwsA(
isA<ToolExit>().having((ToolExit error) => error.exitCode, 'exitCode', anyOf(isNull, 1)),
),
);
});
testUsingContext(
'does not try to complete exitCompleter multiple times',
() async {
final fakeDevice = FakeDevice('phone', deviceId);
deviceManager.attachedDevices.add(fakeDevice);
final termSignal = FakeProcessSignal();
final intSignal = FakeProcessSignal();
final command = LogsCommand(sigterm: termSignal, sigint: intSignal);
final Future<void> commandFuture = createTestCommandRunner(
command,
).run(<String>['-d', deviceId, 'logs']);
intSignal.send(1);
termSignal.send(1);
await pumpEventQueue(times: 5);
await commandFuture;
},
overrides: <Type, Generator>{Platform: () => platform, DeviceManager: () => deviceManager},
);
});
}
class FakeProcessSignal extends Fake implements ProcessSignal {
late final _controller = StreamController<ProcessSignal>();
@override
Stream<ProcessSignal> watch() => _controller.stream;
@override
bool send(int pid) {
_controller.add(this);
return true;
}
}