| // Copyright 2015 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 'dart:convert'; |
| import 'dart:io'; |
| |
| import 'package:args/command_runner.dart'; |
| import 'package:flutter_tools/src/cache.dart'; |
| import 'package:flutter_tools/src/commands/channel.dart'; |
| import 'package:mockito/mockito.dart'; |
| import 'package:test/test.dart'; |
| import 'package:process/process.dart'; |
| |
| import 'src/common.dart'; |
| import 'src/context.dart'; |
| |
| void main() { |
| group('channel', () { |
| final MockProcessManager mockProcessManager = new MockProcessManager(); |
| |
| setUpAll(() { |
| Cache.disableLocking(); |
| }); |
| |
| testUsingContext('list', () async { |
| final ChannelCommand command = new ChannelCommand(); |
| final CommandRunner<Null> runner = createTestCommandRunner(command); |
| await runner.run(<String>['channel']); |
| expect(testLogger.errorText, hasLength(0)); |
| // The bots may return an empty list of channels (network hiccup?) |
| // and when run locally the list of branches might be different |
| // so we check for the header text rather than any specific channel name. |
| expect(testLogger.statusText, contains('Flutter channels:')); |
| }); |
| |
| testUsingContext('removes duplicates', () async { |
| final Stream<List<int>> stdout = new Stream<List<int>>.fromIterable(<List<int>>[ |
| utf8.encode( |
| 'origin/dev\n' |
| 'origin/beta\n' |
| 'upstream/dev\n' |
| 'upstream/beta\n' |
| ), |
| ]); |
| final Process process = new MockProcess(); |
| |
| when(process.stdout).thenAnswer((_) => stdout); |
| when(process.stderr).thenAnswer((_) => const Stream<List<int>>.empty()); |
| when(process.exitCode).thenAnswer((_) => new Future<int>.value(0)); |
| when(mockProcessManager.start( |
| <String>['git', 'branch', '-r'], |
| workingDirectory: typed(any, named: 'workingDirectory'), |
| environment: typed(any, named: 'environment'))) |
| .thenAnswer((_) => new Future<Process>.value(process)); |
| |
| final ChannelCommand command = new ChannelCommand(); |
| final CommandRunner<Null> runner = createTestCommandRunner(command); |
| await runner.run(<String>['channel']); |
| |
| verify(mockProcessManager.start(<String>['git', 'branch', '-r'], |
| workingDirectory: typed(any, named: 'workingDirectory'), |
| environment: typed(any, named: 'environment'))).called(1); |
| |
| expect(testLogger.errorText, hasLength(0)); |
| |
| // format the status text for a simpler assertion. |
| final Iterable<String> rows = testLogger.statusText |
| .split('\n') |
| .map((String line) => line.trim()) |
| .where((String line) => line?.isNotEmpty == true) |
| .skip(1); // remove `Flutter channels:` line |
| |
| expect(rows, <String>['dev', 'beta']); |
| }, overrides: <Type, Generator>{ |
| ProcessManager: () => mockProcessManager, |
| }); |
| }); |
| } |
| |
| class MockProcessManager extends Mock implements ProcessManager {} |
| |
| class MockProcess extends Mock implements Process {} |