upgrade_test.dart 5.25 KB
Newer Older
1 2 3 4
// Copyright 2016 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
import 'package:flutter_tools/src/base/common.dart';
6
import 'package:flutter_tools/src/base/file_system.dart';
7
import 'package:flutter_tools/src/base/io.dart';
8
import 'package:flutter_tools/src/base/os.dart';
9
import 'package:flutter_tools/src/cache.dart';
10
import 'package:flutter_tools/src/commands/upgrade.dart';
11 12 13 14
import 'package:flutter_tools/src/runner/flutter_command.dart';
import 'package:flutter_tools/src/version.dart';
import 'package:mockito/mockito.dart';
import 'package:process/process.dart';
15

16 17
import '../src/common.dart';
import '../src/context.dart';
18

19
void main() {
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 64 65 66 67 68 69 70 71 72 73 74 75 76
  group('UpgradeCommandRunner', () {
    FakeUpgradeCommandRunner fakeCommandRunner;
    UpgradeCommandRunner realCommandRunner;
    MockProcessManager processManager;
    final MockFlutterVersion flutterVersion = MockFlutterVersion();
    const GitTagVersion gitTagVersion = GitTagVersion(1, 2, 3, 4, 5, 'asd');
    when(flutterVersion.channel).thenReturn('dev');

    setUp(() {
      fakeCommandRunner = FakeUpgradeCommandRunner();
      realCommandRunner = UpgradeCommandRunner();
      processManager = MockProcessManager();
    });

    test('throws on unknown tag, official branch,  noforce', () async {
      final Future<FlutterCommandResult> result = fakeCommandRunner.runCommand(
        false,
        const GitTagVersion.unknown(),
        flutterVersion,
      );
      expect(result, throwsA(isInstanceOf<ToolExit>()));
    });

    test('does not throw on unknown tag, official branch, force', () async {
      final Future<FlutterCommandResult> result = fakeCommandRunner.runCommand(
        true,
        const GitTagVersion.unknown(),
        flutterVersion,
      );
      expect(await result, null);
    });

    test('Doesn\'t throw on known tag, dev branch, no force', () async {
      final Future<FlutterCommandResult> result = fakeCommandRunner.runCommand(
        false,
        gitTagVersion,
        flutterVersion,
      );
      expect(await result, null);
    });

    testUsingContext('verifyUpstreamConfigured', () async {
      when(processManager.run(
        <String>['git', 'rev-parse', '@{u}'],
        environment:anyNamed('environment'),
        workingDirectory: anyNamed('workingDirectory'))
      ).thenAnswer((Invocation invocation) async {
        return FakeProcessResult()
          ..exitCode = 0;
      });
      await realCommandRunner.verifyUpstreamConfigured();
    }, overrides: <Type, Generator>{
      ProcessManager: () => processManager,
    });
  });

  group('matchesGitLine', () {
77 78 79 80
    setUpAll(() {
      Cache.disableLocking();
    });

81
    bool _match(String line) => UpgradeCommandRunner.matchesGitLine(line);
82 83

    test('regex match', () {
84
      expect(_match(' .../flutter_gallery/lib/demo/buttons_demo.dart    | 10 +--'), true);
85 86 87 88
      expect(_match(' dev/benchmarks/complex_layout/lib/main.dart        |  24 +-'), true);

      expect(_match(' rename {packages/flutter/doc => dev/docs}/styles.html (92%)'), true);
      expect(_match(' delete mode 100644 doc/index.html'), true);
89
      expect(_match(' create mode 100644 examples/flutter_gallery/lib/gallery/demo.dart'), true);
90 91 92 93 94 95 96 97

      expect(_match('Fast-forward'), true);
    });

    test('regex doesn\'t match', () {
      expect(_match('Updating 79cfe1e..5046107'), false);
      expect(_match('229 files changed, 6179 insertions(+), 3065 deletions(-)'), false);
    });
98 99

    group('findProjectRoot', () {
100
      Directory tempDir;
101 102

      setUp(() async {
103
        tempDir = fs.systemTempDirectory.createTempSync('flutter_tools_upgrade_test.');
104 105 106
      });

      tearDown(() {
107
        tryToDelete(tempDir);
108 109 110
      });

      testUsingContext('in project', () async {
111
        final String projectPath = await createProject(tempDir);
112 113
        expect(findProjectRoot(projectPath), projectPath);
        expect(findProjectRoot(fs.path.join(projectPath, 'lib')), projectPath);
114

115
        final String hello = fs.path.join(Cache.flutterRoot, 'examples', 'hello_world');
116
        expect(findProjectRoot(hello), hello);
117
        expect(findProjectRoot(fs.path.join(hello, 'lib')), hello);
118 119 120
      });

      testUsingContext('outside project', () async {
121
        final String projectPath = await createProject(tempDir);
122
        expect(findProjectRoot(fs.directory(projectPath).parent.path), null);
123
        expect(findProjectRoot(Cache.flutterRoot), null);
124 125
      });
    });
126 127
  });
}
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166

class FakeUpgradeCommandRunner extends UpgradeCommandRunner {
  @override
  Future<void> verifyUpstreamConfigured() async {}

  @override
  Future<void> resetChanges(GitTagVersion gitTagVersion) async {}

  @override
  Future<void> upgradeChannel(FlutterVersion flutterVersion) async {}

  @override
  Future<void> attemptFastForward() async {}

  @override
  Future<void> precacheArtifacts() async {}

  @override
  Future<void> updatePackages(FlutterVersion flutterVersion) async {}

  @override
  Future<void> runDoctor() async {}
}

class MockFlutterVersion extends Mock implements FlutterVersion {}
class MockProcessManager extends Mock implements ProcessManager {}
class FakeProcessResult implements ProcessResult {
  @override
  int exitCode;

  @override
  int pid = 0;

  @override
  String stderr = '';

  @override
  String stdout = '';
}