version_test.dart 5.4 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
import 'package:flutter_tools/src/base/io.dart';
import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/commands/version.dart';
13
import 'package:flutter_tools/src/version.dart';
14 15 16
import 'package:mockito/mockito.dart';
import 'package:process/process.dart';

17 18 19
import '../../src/common.dart';
import '../../src/context.dart';
import '../../src/mocks.dart' show MockProcess;
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 63

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(),
    });
64

65 66 67 68 69 70 71 72 73 74
    testUsingContext('tool exit on confusing version', () async {
      const String version = 'master';
      final VersionCommand command = VersionCommand();
      final Future<void> runCommand = createTestCommandRunner(command).run(<String>['version', version]);
      expect(() async => await Future.wait<void>(<Future<void>>[runCommand]),
             throwsA(isInstanceOf<ToolExit>()));
    }, overrides: <Type, Generator>{
      ProcessManager: () => MockProcessManager(),
    });

75 76 77 78 79 80 81 82 83 84 85 86
    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),
    });
87 88 89 90
  });
}

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

93 94
  String version = '';

95 96
  bool failGitTag;

97 98 99 100 101 102 103 104 105 106 107
  @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') {
108 109 110
      if (failGitTag) {
        return ProcessResult(0, 1, '', '');
      }
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
      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(' ');
130
    if (commandStr == FlutterVersion.gitLog(<String>['-n', '1', '--pretty=format:%H']).join(' ')) {
131 132 133 134 135 136 137 138 139 140 141 142
      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
143 144 145 146 147 148 149 150
  Future<Process> start(
    List<dynamic> command, {
    String workingDirectory,
    Map<String, String> environment,
    bool includeParentEnvironment = true,
    bool runInShell = false,
    ProcessStartMode mode = ProcessStartMode.normal,
  }) {
151 152 153 154 155
    final Completer<Process> completer = Completer<Process>();
    completer.complete(MockProcess());
    return completer.future;
  }
}