version_test.dart 4.83 KB
Newer Older
1 2 3 4 5 6 7 8
// Copyright 2019 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';

9
import 'package:flutter_tools/src/base/common.dart';
10 11 12 13 14 15
import 'package:flutter_tools/src/base/io.dart';
import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/commands/version.dart';
import 'package:mockito/mockito.dart';
import 'package:process/process.dart';

16 17 18
import '../../src/common.dart';
import '../../src/context.dart';
import '../../src/mocks.dart' show MockProcess;
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62

void main() {
  group('version', () {
    setUpAll(() {
      Cache.disableLocking();
    });

    testUsingContext('version ls', () async {
      final VersionCommand command = VersionCommand();
      await createTestCommandRunner(command).run(<String>['version']);
      expect(testLogger.statusText, equals('v10.0.0\r\nv20.0.0\n' ''));
    }, overrides: <Type, Generator>{
      ProcessManager: () => MockProcessManager(),
    });

    testUsingContext('version switch', () async {
      const String version = '10.0.0';
      final VersionCommand command = VersionCommand();
      final Future<void> runCommand = createTestCommandRunner(command).run(<String>['version', version]);
      await Future.wait<void>(<Future<void>>[runCommand]);
      expect(testLogger.statusText, contains('Switching Flutter to version $version'));
    }, overrides: <Type, Generator>{
      ProcessManager: () => MockProcessManager(),
    });

    testUsingContext('switch to not supported version without force', () async {
      const String version = '1.1.5';
      final VersionCommand command = VersionCommand();
      final Future<void> runCommand = createTestCommandRunner(command).run(<String>['version', version]);
      await Future.wait<void>(<Future<void>>[runCommand]);
      expect(testLogger.errorText, contains('Version command is not supported in'));
    }, overrides: <Type, Generator>{
      ProcessManager: () => MockProcessManager(),
    });

    testUsingContext('switch to not supported version with force', () async {
      const String version = '1.1.5';
      final VersionCommand command = VersionCommand();
      final Future<void> runCommand = createTestCommandRunner(command).run(<String>['version', '--force', version]);
      await Future.wait<void>(<Future<void>>[runCommand]);
      expect(testLogger.statusText, contains('Switching Flutter to version $version with force'));
    }, overrides: <Type, Generator>{
      ProcessManager: () => MockProcessManager(),
    });
63 64 65 66 67 68 69 70 71 72 73 74 75

    testUsingContext('exit tool if can\'t get the tags', () async {
      final VersionCommand command = VersionCommand();

      try {
        await command.getTags();
        fail('ToolExit expected');
      } catch(e) {
        expect(e, isInstanceOf<ToolExit>());
      }
    }, overrides: <Type, Generator>{
      ProcessManager: () => MockProcessManager(failGitTag: true),
    });
76 77 78 79
  });
}

class MockProcessManager extends Mock implements ProcessManager {
80 81
  MockProcessManager({ this.failGitTag = false });

82 83
  String version = '';

84 85
  bool failGitTag;

86 87 88 89 90 91 92 93 94 95 96
  @override
  Future<ProcessResult> run(
    List<dynamic> command, {
    String workingDirectory,
    Map<String, String> environment,
    bool includeParentEnvironment = true,
    bool runInShell = false,
    Encoding stdoutEncoding = systemEncoding,
    Encoding stderrEncoding = systemEncoding,
  }) async {
    if (command[0] == 'git' && command[1] == 'tag') {
97 98 99
      if (failGitTag) {
        return ProcessResult(0, 1, '', '');
      }
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
      return ProcessResult(0, 0, 'v10.0.0\r\nv20.0.0', '');
    }
    if (command[0] == 'git' && command[1] == 'checkout') {
      version = command[2];
    }
    return ProcessResult(0, 0, '', '');
  }

  @override
  ProcessResult runSync(
    List<dynamic> command, {
    String workingDirectory,
    Map<String, String> environment,
    bool includeParentEnvironment = true,
    bool runInShell = false,
    Encoding stdoutEncoding = systemEncoding,
    Encoding stderrEncoding = systemEncoding,
  }) {
    final String commandStr = command.join(' ');
    if (commandStr == 'git log -n 1 --pretty=format:%H') {
      return ProcessResult(0, 0, '000000000000000000000', '');
    }
    if (commandStr ==
        'git describe --match v*.*.* --first-parent --long --tags') {
      if (version.isNotEmpty) {
        return ProcessResult(0, 0, '$version-0-g00000000', '');
      }
    }
    return ProcessResult(0, 0, '', '');
  }

  @override
132 133 134 135 136 137 138 139
  Future<Process> start(
    List<dynamic> command, {
    String workingDirectory,
    Map<String, String> environment,
    bool includeParentEnvironment = true,
    bool runInShell = false,
    ProcessStartMode mode = ProcessStartMode.normal,
  }) {
140 141 142 143 144
    final Completer<Process> completer = Completer<Process>();
    completer.complete(MockProcess());
    return completer.future;
  }
}