channel_test.dart 2.98 KB
Newer Older
1 2 3 4
// 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.

5 6 7 8
import 'dart:async';
import 'dart:convert';
import 'dart:io';

9
import 'package:args/command_runner.dart';
10
import 'package:flutter_tools/src/cache.dart';
11
import 'package:flutter_tools/src/commands/channel.dart';
12
import 'package:mockito/mockito.dart';
13
import 'package:test/test.dart';
14
import 'package:process/process.dart';
15 16 17 18 19 20

import 'src/common.dart';
import 'src/context.dart';

void main() {
  group('channel', () {
21 22
    final MockProcessManager mockProcessManager = new MockProcessManager();

23 24 25 26
    setUpAll(() {
      Cache.disableLocking();
    });

27
    testUsingContext('list', () async {
28 29
      final ChannelCommand command = new ChannelCommand();
      final CommandRunner<Null> runner = createTestCommandRunner(command);
30 31
      await runner.run(<String>['channel']);
      expect(testLogger.errorText, hasLength(0));
32 33 34
      // 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.
35
      expect(testLogger.statusText, contains('Flutter channels:'));
36
    });
37 38 39 40 41 42 43 44 45 46 47 48

    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();

49 50 51
      when(process.stdout).thenAnswer((_) => stdout);
      when(process.stderr).thenAnswer((_) => const Stream<List<int>>.empty());
      when(process.exitCode).thenAnswer((_) => new Future<int>.value(0));
52 53
      when(mockProcessManager.start(
        <String>['git', 'branch', '-r'],
54 55
        workingDirectory: anyNamed('workingDirectory'),
        environment: anyNamed('environment')))
56
      .thenAnswer((_) => new Future<Process>.value(process));
57 58 59 60 61 62

      final ChannelCommand command = new ChannelCommand();
      final CommandRunner<Null> runner = createTestCommandRunner(command);
      await runner.run(<String>['channel']);

      verify(mockProcessManager.start(<String>['git', 'branch', '-r'],
63 64
          workingDirectory: anyNamed('workingDirectory'),
          environment: anyNamed('environment'))).called(1);
65 66 67 68 69 70 71 72 73 74 75 76 77 78

      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,
    });
79 80
  });
}
81 82 83

class MockProcessManager extends Mock implements ProcessManager {}

84
class MockProcess extends Mock implements Process {}