Clean up test infrastructure (#41880)
This commit is contained in:
parent
863fb2f2cc
commit
1781d5c9bb
1137
.cirrus.yml
1137
.cirrus.yml
File diff suppressed because it is too large
Load Diff
@ -2,3 +2,6 @@ This directory contains tools and resources that the Flutter team uses
|
|||||||
during development of the framework. The tools in this directory
|
during development of the framework. The tools in this directory
|
||||||
should not be necessary for developing Flutter applications, though of
|
should not be necessary for developing Flutter applications, though of
|
||||||
course they may be interesting if you are curious.
|
course they may be interesting if you are curious.
|
||||||
|
|
||||||
|
The tests in this directory are run in the `framework_tests_misc-*`
|
||||||
|
shards.
|
||||||
|
@ -1,31 +1,19 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
|
# This script is only meant to be run by the Cirrus CI system, not locally.
|
||||||
|
# It must be run from the root of the Flutter repo.
|
||||||
|
|
||||||
function error() {
|
function error() {
|
||||||
echo "$@" 1>&2
|
echo "$@" 1>&2
|
||||||
}
|
}
|
||||||
|
|
||||||
# This script is only meant to be run by the Cirrus CI system, not locally.
|
|
||||||
# It must be run from the root of the Flutter repo.
|
|
||||||
|
|
||||||
function accept_android_licenses() {
|
function accept_android_licenses() {
|
||||||
yes "y" | flutter doctor --android-licenses > /dev/null 2>&1
|
yes "y" | flutter doctor --android-licenses > /dev/null 2>&1
|
||||||
}
|
}
|
||||||
|
|
||||||
echo "Flutter SDK directory is: $PWD"
|
echo "Flutter SDK directory is: $PWD"
|
||||||
|
|
||||||
# Run flutter to download dependencies and precompile things, and to disable
|
|
||||||
# analytics on the bots.
|
|
||||||
echo "Downloading build dependencies and pre-compiling Flutter snapshot"
|
|
||||||
./bin/flutter config --no-analytics
|
|
||||||
|
|
||||||
# Run doctor, to print it to the log for debugging purposes.
|
|
||||||
./bin/flutter doctor -v
|
|
||||||
|
|
||||||
# Accept licenses.
|
# Accept licenses.
|
||||||
echo "Accepting Android licenses."
|
echo "Accepting Android licenses."
|
||||||
accept_android_licenses || (error "Accepting Android licenses failed." && false)
|
accept_android_licenses || (error "Accepting Android licenses failed." && false)
|
||||||
|
|
||||||
# Run pub get in all the repo packages.
|
|
||||||
echo "Updating packages for Flutter."
|
|
||||||
./bin/flutter update-packages
|
|
@ -24,11 +24,9 @@ set -x
|
|||||||
|
|
||||||
cd "$FLUTTER_ROOT"
|
cd "$FLUTTER_ROOT"
|
||||||
|
|
||||||
if [[ "$SHARD" = "deploy_gallery" ]]; then
|
|
||||||
version="$(<version)"
|
version="$(<version)"
|
||||||
if [[ "$OS" == "linux" ]]; then
|
if [[ "$OS" == "linux" ]]; then
|
||||||
echo "Building Flutter Gallery $version for Android..."
|
echo "Building Flutter Gallery $version for Android..."
|
||||||
|
|
||||||
# ANDROID_SDK_ROOT must be set in the env.
|
# ANDROID_SDK_ROOT must be set in the env.
|
||||||
(
|
(
|
||||||
cd examples/flutter_gallery
|
cd examples/flutter_gallery
|
||||||
@ -47,7 +45,7 @@ if [[ "$SHARD" = "deploy_gallery" ]]; then
|
|||||||
fastlane deploy_play_store
|
fastlane deploy_play_store
|
||||||
)
|
)
|
||||||
else
|
else
|
||||||
echo "Not deployed: Flutter Gallery is only deployed to the Play Store on merged and tagged dev branch commits"
|
echo "(Not deploying; Flutter Gallery is only deployed to Play store for tagged dev branch commits.)"
|
||||||
fi
|
fi
|
||||||
elif [[ "$OS" == "darwin" ]]; then
|
elif [[ "$OS" == "darwin" ]]; then
|
||||||
echo "Building Flutter Gallery $version for iOS..."
|
echo "Building Flutter Gallery $version for iOS..."
|
||||||
@ -95,17 +93,21 @@ if [[ "$SHARD" = "deploy_gallery" ]]; then
|
|||||||
fastlane build_and_deploy_testflight upload:true
|
fastlane build_and_deploy_testflight upload:true
|
||||||
)
|
)
|
||||||
else
|
else
|
||||||
echo "Archiving with distribution profile..."
|
# On iOS the signing can break as well, so we verify this regularly (not just
|
||||||
|
# on tagged dev branch commits). We can only do this post-merge, though, because
|
||||||
|
# the secrets aren't available on PRs.
|
||||||
|
echo "Testing archiving with distribution profile..."
|
||||||
(
|
(
|
||||||
cd examples/flutter_gallery/ios
|
cd examples/flutter_gallery/ios
|
||||||
fastlane build_and_deploy_testflight
|
fastlane build_and_deploy_testflight
|
||||||
)
|
)
|
||||||
echo "Archive is only deployed to TestFlight on tagged dev branch commits"
|
echo "(Not deploying; Flutter Gallery is only deployed to TestFlight for tagged dev branch commits.)"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
echo "Not deployed: Flutter Gallery is only deployed to TestFlight on merged and tagged dev branch commits"
|
echo "(Not archiving or deploying; Flutter Gallery archiving is only tested post-commit.)"
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
echo "Doing nothing: not on the 'deploy_gallery' SHARD."
|
echo "Unknown OS: $OS"
|
||||||
|
echo "Aborted."
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
@ -95,7 +95,6 @@ Future<void> runCommand(String executable, List<String> arguments, {
|
|||||||
OutputMode outputMode = OutputMode.print,
|
OutputMode outputMode = OutputMode.print,
|
||||||
CapturedOutput output,
|
CapturedOutput output,
|
||||||
bool skip = false,
|
bool skip = false,
|
||||||
bool expectFlaky = false,
|
|
||||||
bool Function(String) removeLine,
|
bool Function(String) removeLine,
|
||||||
}) async {
|
}) async {
|
||||||
assert((outputMode == OutputMode.capture) == (output != null),
|
assert((outputMode == OutputMode.capture) == (output != null),
|
||||||
@ -145,10 +144,6 @@ Future<void> runCommand(String executable, List<String> arguments, {
|
|||||||
output.stderr = _flattenToString(await savedStderr);
|
output.stderr = _flattenToString(await savedStderr);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the test is flaky we don't care about the actual exit.
|
|
||||||
if (expectFlaky)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if ((exitCode == 0) == expectNonZeroExit || (expectedExitCode != null && exitCode != expectedExitCode)) {
|
if ((exitCode == 0) == expectNonZeroExit || (expectedExitCode != null && exitCode != expectedExitCode)) {
|
||||||
if (failureMessage != null) {
|
if (failureMessage != null) {
|
||||||
print(failureMessage);
|
print(failureMessage);
|
||||||
|
1093
dev/bots/test.dart
1093
dev/bots/test.dart
File diff suppressed because it is too large
Load Diff
13
dev/bots/test/bot_test.dart
Normal file
13
dev/bots/test/bot_test.dart
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// Copyright 2017 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:io';
|
||||||
|
|
||||||
|
import 'common.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
test('BOT variable is set on bots', () {
|
||||||
|
expect(Platform.environment['BOT'], 'true');
|
||||||
|
});
|
||||||
|
}
|
21
dev/bots/test/sdk_directory_has_space_test.dart
Normal file
21
dev/bots/test/sdk_directory_has_space_test.dart
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
// Copyright 2017 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:io';
|
||||||
|
|
||||||
|
import 'package:path/path.dart' as path;
|
||||||
|
|
||||||
|
import 'common.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
test('We are in a directory with a space in it', () async {
|
||||||
|
// The Flutter SDK should be in a directory with a space in it, to make sure
|
||||||
|
// our tools support that.
|
||||||
|
final String expectedName = Platform.environment['FLUTTER_SDK_PATH_WITH_SPACE'];
|
||||||
|
expect(expectedName, 'flutter sdk');
|
||||||
|
expect(expectedName, contains(' '));
|
||||||
|
final List<String> parts = path.split(Directory.current.absolute.path);
|
||||||
|
expect(parts.reversed.take(3), <String>['bots', 'dev', expectedName]);
|
||||||
|
});
|
||||||
|
}
|
@ -29,7 +29,11 @@ void main() {
|
|||||||
];
|
];
|
||||||
for (String version in valid_versions) {
|
for (String version in valid_versions) {
|
||||||
when(file.readAsString()).thenAnswer((Invocation invocation) => Future<String>.value(version));
|
when(file.readAsString()).thenAnswer((Invocation invocation) => Future<String>.value(version));
|
||||||
expect(await verifyVersion(version, file), isTrue, reason: '$version is invalid');
|
expect(
|
||||||
|
await verifyVersion(file),
|
||||||
|
isNull,
|
||||||
|
reason: '$version is valid but verifyVersionFile said it was bad',
|
||||||
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -41,10 +45,15 @@ void main() {
|
|||||||
'1.2.3-pre',
|
'1.2.3-pre',
|
||||||
'1.2.3-pre.1+hotfix.1',
|
'1.2.3-pre.1+hotfix.1',
|
||||||
' 1.2.3',
|
' 1.2.3',
|
||||||
|
'1.2.3-hotfix.1',
|
||||||
];
|
];
|
||||||
for (String version in invalid_versions) {
|
for (String version in invalid_versions) {
|
||||||
when(file.readAsString()).thenAnswer((Invocation invocation) => Future<String>.value(version));
|
when(file.readAsString()).thenAnswer((Invocation invocation) => Future<String>.value(version));
|
||||||
expect(await verifyVersion(version, file), isFalse);
|
expect(
|
||||||
|
await verifyVersion(file),
|
||||||
|
'The version logic generated an invalid version string: "$version".',
|
||||||
|
reason: '$version is invalid but verifyVersionFile said it was fine',
|
||||||
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
tags:
|
# package:test configuration
|
||||||
"no_coverage":
|
# https://github.com/dart-lang/test/blob/master/pkgs/test/doc/configuration.md
|
||||||
"create":
|
|
||||||
"integration":
|
|
||||||
|
|
||||||
|
# Some of our tests take an absurdly long time to run, and on some
|
||||||
|
# hosts they can take even longer due to the host suddenly being
|
||||||
|
# overloaded. For this reason, we set the test timeout to
|
||||||
|
# significantly more than it would be by default, and we never set the
|
||||||
|
# timeouts in the tests themselves.
|
||||||
|
timeout: 15m
|
||||||
|
@ -135,7 +135,7 @@ void main() {
|
|||||||
return _updateIdeConfig(
|
return _updateIdeConfig(
|
||||||
expectedContents: expectedContents,
|
expectedContents: expectedContents,
|
||||||
);
|
);
|
||||||
}, timeout: const Timeout.factor(2.0));
|
});
|
||||||
|
|
||||||
testUsingContext('creates non-existent files', () async {
|
testUsingContext('creates non-existent files', () async {
|
||||||
final Map<String, String> templateManifest = _getManifest(
|
final Map<String, String> templateManifest = _getManifest(
|
||||||
@ -155,7 +155,7 @@ void main() {
|
|||||||
return _updateIdeConfig(
|
return _updateIdeConfig(
|
||||||
expectedContents: expectedContents,
|
expectedContents: expectedContents,
|
||||||
);
|
);
|
||||||
}, timeout: const Timeout.factor(2.0));
|
});
|
||||||
|
|
||||||
testUsingContext('overwrites existing files with --overwrite', () async {
|
testUsingContext('overwrites existing files with --overwrite', () async {
|
||||||
final Map<String, String> templateManifest = _getManifest(
|
final Map<String, String> templateManifest = _getManifest(
|
||||||
@ -181,7 +181,7 @@ void main() {
|
|||||||
args: <String>['--overwrite'],
|
args: <String>['--overwrite'],
|
||||||
expectedContents: expectedContents,
|
expectedContents: expectedContents,
|
||||||
);
|
);
|
||||||
}, timeout: const Timeout.factor(2.0));
|
});
|
||||||
|
|
||||||
testUsingContext('only adds new templates without --overwrite', () async {
|
testUsingContext('only adds new templates without --overwrite', () async {
|
||||||
final Map<String, String> templateManifest = _getManifest(
|
final Map<String, String> templateManifest = _getManifest(
|
||||||
@ -212,7 +212,7 @@ void main() {
|
|||||||
args: <String>['--update-templates'],
|
args: <String>['--update-templates'],
|
||||||
expectedContents: expectedContents,
|
expectedContents: expectedContents,
|
||||||
);
|
);
|
||||||
}, timeout: const Timeout.factor(2.0));
|
});
|
||||||
|
|
||||||
testUsingContext('update all templates with --overwrite', () async {
|
testUsingContext('update all templates with --overwrite', () async {
|
||||||
final Map<String, String> templateManifest = _getManifest(
|
final Map<String, String> templateManifest = _getManifest(
|
||||||
@ -239,7 +239,7 @@ void main() {
|
|||||||
args: <String>['--update-templates', '--overwrite'],
|
args: <String>['--update-templates', '--overwrite'],
|
||||||
expectedContents: expectedContents,
|
expectedContents: expectedContents,
|
||||||
);
|
);
|
||||||
}, timeout: const Timeout.factor(2.0));
|
});
|
||||||
|
|
||||||
testUsingContext('removes deleted imls with --overwrite', () async {
|
testUsingContext('removes deleted imls with --overwrite', () async {
|
||||||
final Map<String, String> templateManifest = _getManifest(
|
final Map<String, String> templateManifest = _getManifest(
|
||||||
@ -275,7 +275,7 @@ void main() {
|
|||||||
args: <String>['--update-templates', '--overwrite'],
|
args: <String>['--update-templates', '--overwrite'],
|
||||||
expectedContents: expectedContents,
|
expectedContents: expectedContents,
|
||||||
);
|
);
|
||||||
}, timeout: const Timeout.factor(2.0));
|
});
|
||||||
|
|
||||||
testUsingContext('removes deleted imls with --overwrite, including empty parent dirs', () async {
|
testUsingContext('removes deleted imls with --overwrite, including empty parent dirs', () async {
|
||||||
final Map<String, String> templateManifest = _getManifest(
|
final Map<String, String> templateManifest = _getManifest(
|
||||||
@ -316,7 +316,7 @@ void main() {
|
|||||||
args: <String>['--update-templates', '--overwrite'],
|
args: <String>['--update-templates', '--overwrite'],
|
||||||
expectedContents: expectedContents,
|
expectedContents: expectedContents,
|
||||||
);
|
);
|
||||||
}, timeout: const Timeout.factor(2.0));
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -16,9 +16,6 @@ import 'package:flutter_tools/src/runner/flutter_command.dart';
|
|||||||
import '../../src/common.dart';
|
import '../../src/common.dart';
|
||||||
import '../../src/context.dart';
|
import '../../src/context.dart';
|
||||||
|
|
||||||
/// Test case timeout for tests involving project analysis.
|
|
||||||
const Timeout allowForSlowAnalyzeTests = Timeout.factor(5.0);
|
|
||||||
|
|
||||||
final Generator _kNoColorTerminalPlatform = () => FakePlatform.fromPlatform(const LocalPlatform())..stdoutSupportsAnsi = false;
|
final Generator _kNoColorTerminalPlatform = () => FakePlatform.fromPlatform(const LocalPlatform())..stdoutSupportsAnsi = false;
|
||||||
final Map<Type, Generator> noColorTerminalOverride = <Type, Generator>{
|
final Map<Type, Generator> noColorTerminalOverride = <Type, Generator>{
|
||||||
Platform: _kNoColorTerminalPlatform,
|
Platform: _kNoColorTerminalPlatform,
|
||||||
@ -54,7 +51,7 @@ void main() {
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
expect(libMain.existsSync(), isTrue);
|
expect(libMain.existsSync(), isTrue);
|
||||||
}, timeout: allowForRemotePubInvocation, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -65,7 +62,7 @@ void main() {
|
|||||||
arguments: <String>['analyze'],
|
arguments: <String>['analyze'],
|
||||||
statusTextContains: <String>['No issues found!'],
|
statusTextContains: <String>['No issues found!'],
|
||||||
);
|
);
|
||||||
}, timeout: allowForSlowAnalyzeTests, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -80,6 +77,7 @@ void main() {
|
|||||||
}, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
});
|
});
|
||||||
|
|
||||||
// Analyze in the current directory - no arguments
|
// Analyze in the current directory - no arguments
|
||||||
testUsingContext('working directory with errors', () async {
|
testUsingContext('working directory with errors', () async {
|
||||||
// Break the code to produce the "The parameter 'onPressed' is required" hint
|
// Break the code to produce the "The parameter 'onPressed' is required" hint
|
||||||
@ -110,7 +108,7 @@ void main() {
|
|||||||
exitMessageContains: '2 issues found.',
|
exitMessageContains: '2 issues found.',
|
||||||
toolExit: true,
|
toolExit: true,
|
||||||
);
|
);
|
||||||
}, timeout: allowForSlowAnalyzeTests, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
...noColorTerminalOverride,
|
...noColorTerminalOverride,
|
||||||
});
|
});
|
||||||
@ -140,7 +138,7 @@ void main() {
|
|||||||
exitMessageContains: '3 issues found.',
|
exitMessageContains: '3 issues found.',
|
||||||
toolExit: true,
|
toolExit: true,
|
||||||
);
|
);
|
||||||
}, timeout: allowForSlowAnalyzeTests, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
...noColorTerminalOverride
|
...noColorTerminalOverride
|
||||||
});
|
});
|
||||||
|
@ -73,7 +73,7 @@ void main() {
|
|||||||
|
|
||||||
expect(await command.usageValues,
|
expect(await command.usageValues,
|
||||||
containsPair(CustomDimensions.commandBuildBundleIsModule, 'true'));
|
containsPair(CustomDimensions.commandBuildBundleIsModule, 'true'));
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('bundle getUsage indicate that project is not a module', () async {
|
testUsingContext('bundle getUsage indicate that project is not a module', () async {
|
||||||
final String projectPath = await createProject(tempDir,
|
final String projectPath = await createProject(tempDir,
|
||||||
@ -83,7 +83,7 @@ void main() {
|
|||||||
|
|
||||||
expect(await command.usageValues,
|
expect(await command.usageValues,
|
||||||
containsPair(CustomDimensions.commandBuildBundleIsModule, 'false'));
|
containsPair(CustomDimensions.commandBuildBundleIsModule, 'false'));
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('bundle getUsage indicate the target platform', () async {
|
testUsingContext('bundle getUsage indicate the target platform', () async {
|
||||||
final String projectPath = await createProject(tempDir,
|
final String projectPath = await createProject(tempDir,
|
||||||
@ -93,7 +93,7 @@ void main() {
|
|||||||
|
|
||||||
expect(await command.usageValues,
|
expect(await command.usageValues,
|
||||||
containsPair(CustomDimensions.commandBuildBundleTargetPlatform, 'android-arm'));
|
containsPair(CustomDimensions.commandBuildBundleTargetPlatform, 'android-arm'));
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('bundle fails to build for Windows if feature is disabled', () async {
|
testUsingContext('bundle fails to build for Windows if feature is disabled', () async {
|
||||||
fs.file('lib/main.dart').createSync(recursive: true);
|
fs.file('lib/main.dart').createSync(recursive: true);
|
||||||
|
@ -78,7 +78,7 @@ void main() {
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
return _runFlutterTest(projectDir);
|
return _runFlutterTest(projectDir);
|
||||||
}, timeout: allowForRemotePubInvocation, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -96,7 +96,7 @@ void main() {
|
|||||||
'ios/Runner/GeneratedPluginRegistrant.h',
|
'ios/Runner/GeneratedPluginRegistrant.h',
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}, timeout: allowForRemotePubInvocation, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -118,11 +118,9 @@ void main() {
|
|||||||
'ios/',
|
'ios/',
|
||||||
]);
|
]);
|
||||||
return _runFlutterTest(projectDir);
|
return _runFlutterTest(projectDir);
|
||||||
},
|
}, overrides: <Type, Generator>{
|
||||||
timeout: allowForRemotePubInvocation, overrides: <Type, Generator>{
|
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
},
|
});
|
||||||
);
|
|
||||||
|
|
||||||
testUsingContext('cannot create a project if non-empty non-project directory exists with .metadata', () async {
|
testUsingContext('cannot create a project if non-empty non-project directory exists with .metadata', () async {
|
||||||
await projectDir.absolute.childDirectory('blag').create(recursive: true);
|
await projectDir.absolute.childDirectory('blag').create(recursive: true);
|
||||||
@ -138,7 +136,7 @@ void main() {
|
|||||||
'.ios/',
|
'.ios/',
|
||||||
]),
|
]),
|
||||||
throwsToolExit(message: 'Sorry, unable to detect the type of project to recreate'));
|
throwsToolExit(message: 'Sorry, unable to detect the type of project to recreate'));
|
||||||
}, timeout: allowForRemotePubInvocation, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
...noColorTerminalOverride,
|
...noColorTerminalOverride,
|
||||||
});
|
});
|
||||||
@ -164,7 +162,7 @@ void main() {
|
|||||||
'.ios/',
|
'.ios/',
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}, timeout: allowForRemotePubInvocation, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -189,7 +187,7 @@ void main() {
|
|||||||
'.ios/',
|
'.ios/',
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}, timeout: allowForRemotePubInvocation, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -214,7 +212,7 @@ void main() {
|
|||||||
'lib/flutter_project.dart',
|
'lib/flutter_project.dart',
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}, timeout: allowForRemotePubInvocation, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -245,7 +243,7 @@ void main() {
|
|||||||
'test/widget_test.dart',
|
'test/widget_test.dart',
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}, timeout: allowForRemotePubInvocation, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -267,7 +265,7 @@ void main() {
|
|||||||
'ios/Runner/main.m',
|
'ios/Runner/main.m',
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}, timeout: allowForCreateFlutterProject, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -297,7 +295,7 @@ void main() {
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
return _runFlutterTest(projectDir);
|
return _runFlutterTest(projectDir);
|
||||||
}, timeout: allowForRemotePubInvocation, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -319,7 +317,7 @@ void main() {
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
return _runFlutterTest(projectDir.childDirectory('example'));
|
return _runFlutterTest(projectDir.childDirectory('example'));
|
||||||
}, timeout: allowForRemotePubInvocation, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -346,7 +344,7 @@ void main() {
|
|||||||
'example/ios/Runner/main.m',
|
'example/ios/Runner/main.m',
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('plugin project with custom org', () async {
|
testUsingContext('plugin project with custom org', () async {
|
||||||
return _createProject(
|
return _createProject(
|
||||||
@ -366,7 +364,7 @@ void main() {
|
|||||||
'example/android/app/src/main/java/com/example/flutter_project_example/MainActivity.java',
|
'example/android/app/src/main/java/com/example/flutter_project_example/MainActivity.java',
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('plugin project with valid custom project name', () async {
|
testUsingContext('plugin project with valid custom project name', () async {
|
||||||
return _createProject(
|
return _createProject(
|
||||||
@ -386,7 +384,7 @@ void main() {
|
|||||||
'example/android/app/src/main/java/com/example/flutter_project_example/MainActivity.java',
|
'example/android/app/src/main/java/com/example/flutter_project_example/MainActivity.java',
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('plugin project with invalid custom project name', () async {
|
testUsingContext('plugin project with invalid custom project name', () async {
|
||||||
expect(
|
expect(
|
||||||
@ -396,7 +394,7 @@ void main() {
|
|||||||
),
|
),
|
||||||
throwsToolExit(message: '"xyz.xyz" is not a valid Dart package name.'),
|
throwsToolExit(message: '"xyz.xyz" is not a valid Dart package name.'),
|
||||||
);
|
);
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('legacy app project with-driver-test', () async {
|
testUsingContext('legacy app project with-driver-test', () async {
|
||||||
return _createAndAnalyzeProject(
|
return _createAndAnalyzeProject(
|
||||||
@ -404,7 +402,7 @@ void main() {
|
|||||||
<String>['--with-driver-test', '--template=app'],
|
<String>['--with-driver-test', '--template=app'],
|
||||||
<String>['lib/main.dart'],
|
<String>['lib/main.dart'],
|
||||||
);
|
);
|
||||||
}, timeout: allowForRemotePubInvocation, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -439,7 +437,7 @@ void main() {
|
|||||||
'android/',
|
'android/',
|
||||||
'ios/',
|
'ios/',
|
||||||
]);
|
]);
|
||||||
}, timeout: allowForRemotePubInvocation, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -463,7 +461,7 @@ void main() {
|
|||||||
final String actualContents = await fs.file(projectDir.path + '/android/gradle.properties').readAsString();
|
final String actualContents = await fs.file(projectDir.path + '/android/gradle.properties').readAsString();
|
||||||
|
|
||||||
expect(actualContents.contains('useAndroidX'), true);
|
expect(actualContents.contains('useAndroidX'), true);
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('non androidx app project', () async {
|
testUsingContext('non androidx app project', () async {
|
||||||
Cache.flutterRoot = '../..';
|
Cache.flutterRoot = '../..';
|
||||||
@ -484,7 +482,7 @@ void main() {
|
|||||||
final String actualContents = await fs.file(projectDir.path + '/android/gradle.properties').readAsString();
|
final String actualContents = await fs.file(projectDir.path + '/android/gradle.properties').readAsString();
|
||||||
|
|
||||||
expect(actualContents.contains('useAndroidX'), false);
|
expect(actualContents.contains('useAndroidX'), false);
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('androidx is used by default in a module project', () async {
|
testUsingContext('androidx is used by default in a module project', () async {
|
||||||
Cache.flutterRoot = '../..';
|
Cache.flutterRoot = '../..';
|
||||||
@ -501,7 +499,7 @@ void main() {
|
|||||||
project.usesAndroidX,
|
project.usesAndroidX,
|
||||||
true,
|
true,
|
||||||
);
|
);
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('non androidx module', () async {
|
testUsingContext('non androidx module', () async {
|
||||||
Cache.flutterRoot = '../..';
|
Cache.flutterRoot = '../..';
|
||||||
@ -518,7 +516,7 @@ void main() {
|
|||||||
project.usesAndroidX,
|
project.usesAndroidX,
|
||||||
false,
|
false,
|
||||||
);
|
);
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('androidx is used by default in a plugin project', () async {
|
testUsingContext('androidx is used by default in a plugin project', () async {
|
||||||
Cache.flutterRoot = '../..';
|
Cache.flutterRoot = '../..';
|
||||||
@ -539,7 +537,7 @@ void main() {
|
|||||||
final String actualContents = await fs.file(projectDir.path + '/android/gradle.properties').readAsString();
|
final String actualContents = await fs.file(projectDir.path + '/android/gradle.properties').readAsString();
|
||||||
|
|
||||||
expect(actualContents.contains('useAndroidX'), true);
|
expect(actualContents.contains('useAndroidX'), true);
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('non androidx plugin project', () async {
|
testUsingContext('non androidx plugin project', () async {
|
||||||
Cache.flutterRoot = '../..';
|
Cache.flutterRoot = '../..';
|
||||||
@ -560,7 +558,7 @@ void main() {
|
|||||||
final String actualContents = await fs.file(projectDir.path + '/android/gradle.properties').readAsString();
|
final String actualContents = await fs.file(projectDir.path + '/android/gradle.properties').readAsString();
|
||||||
|
|
||||||
expect(actualContents.contains('useAndroidX'), false);
|
expect(actualContents.contains('useAndroidX'), false);
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('app supports macOS if requested', () async {
|
testUsingContext('app supports macOS if requested', () async {
|
||||||
Cache.flutterRoot = '../..';
|
Cache.flutterRoot = '../..';
|
||||||
@ -573,7 +571,7 @@ void main() {
|
|||||||
await runner.run(<String>['create', '--no-pub', '--macos', projectDir.path]);
|
await runner.run(<String>['create', '--no-pub', '--macos', projectDir.path]);
|
||||||
|
|
||||||
expect(projectDir.childDirectory('macos').childDirectory('Runner.xcworkspace').existsSync(), true);
|
expect(projectDir.childDirectory('macos').childDirectory('Runner.xcworkspace').existsSync(), true);
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('app does not include macOS by default', () async {
|
testUsingContext('app does not include macOS by default', () async {
|
||||||
Cache.flutterRoot = '../..';
|
Cache.flutterRoot = '../..';
|
||||||
@ -586,7 +584,7 @@ void main() {
|
|||||||
await runner.run(<String>['create', '--no-pub', projectDir.path]);
|
await runner.run(<String>['create', '--no-pub', projectDir.path]);
|
||||||
|
|
||||||
expect(projectDir.childDirectory('macos').childDirectory('Runner.xcworkspace').existsSync(), false);
|
expect(projectDir.childDirectory('macos').childDirectory('Runner.xcworkspace').existsSync(), false);
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('plugin supports macOS if requested', () async {
|
testUsingContext('plugin supports macOS if requested', () async {
|
||||||
Cache.flutterRoot = '../..';
|
Cache.flutterRoot = '../..';
|
||||||
@ -599,7 +597,7 @@ void main() {
|
|||||||
await runner.run(<String>['create', '--no-pub', '--template=plugin', '--macos', projectDir.path]);
|
await runner.run(<String>['create', '--no-pub', '--template=plugin', '--macos', projectDir.path]);
|
||||||
|
|
||||||
expect(projectDir.childDirectory('macos').childFile('flutter_project.podspec').existsSync(), true);
|
expect(projectDir.childDirectory('macos').childFile('flutter_project.podspec').existsSync(), true);
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('plugin does not include macOS by default', () async {
|
testUsingContext('plugin does not include macOS by default', () async {
|
||||||
Cache.flutterRoot = '../..';
|
Cache.flutterRoot = '../..';
|
||||||
@ -612,7 +610,7 @@ void main() {
|
|||||||
await runner.run(<String>['create', '--no-pub', '--template=plugin', projectDir.path]);
|
await runner.run(<String>['create', '--no-pub', '--template=plugin', projectDir.path]);
|
||||||
|
|
||||||
expect(projectDir.childDirectory('macos').childFile('flutter_project.podspec').existsSync(), false);
|
expect(projectDir.childDirectory('macos').childFile('flutter_project.podspec').existsSync(), false);
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('has correct content and formatting with module template', () async {
|
testUsingContext('has correct content and formatting with module template', () async {
|
||||||
Cache.flutterRoot = '../..';
|
Cache.flutterRoot = '../..';
|
||||||
@ -708,7 +706,7 @@ void main() {
|
|||||||
}, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
FlutterVersion: () => mockFlutterVersion,
|
FlutterVersion: () => mockFlutterVersion,
|
||||||
Platform: _kNoColorTerminalPlatform,
|
Platform: _kNoColorTerminalPlatform,
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('has correct content and formatting with app template', () async {
|
testUsingContext('has correct content and formatting with app template', () async {
|
||||||
Cache.flutterRoot = '../..';
|
Cache.flutterRoot = '../..';
|
||||||
@ -779,7 +777,7 @@ void main() {
|
|||||||
}, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
FlutterVersion: () => mockFlutterVersion,
|
FlutterVersion: () => mockFlutterVersion,
|
||||||
Platform: _kNoColorTerminalPlatform,
|
Platform: _kNoColorTerminalPlatform,
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('has correct application id for android and bundle id for ios', () async {
|
testUsingContext('has correct application id for android and bundle id for ios', () async {
|
||||||
Cache.flutterRoot = '../..';
|
Cache.flutterRoot = '../..';
|
||||||
@ -827,7 +825,7 @@ void main() {
|
|||||||
}, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
FlutterVersion: () => mockFlutterVersion,
|
FlutterVersion: () => mockFlutterVersion,
|
||||||
Platform: _kNoColorTerminalPlatform,
|
Platform: _kNoColorTerminalPlatform,
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('can re-gen default template over existing project', () async {
|
testUsingContext('can re-gen default template over existing project', () async {
|
||||||
Cache.flutterRoot = '../..';
|
Cache.flutterRoot = '../..';
|
||||||
@ -841,7 +839,7 @@ void main() {
|
|||||||
|
|
||||||
final String metadata = fs.file(fs.path.join(projectDir.path, '.metadata')).readAsStringSync();
|
final String metadata = fs.file(fs.path.join(projectDir.path, '.metadata')).readAsStringSync();
|
||||||
expect(metadata, contains('project_type: app\n'));
|
expect(metadata, contains('project_type: app\n'));
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('can re-gen default template over existing app project with no metadta and detect the type', () async {
|
testUsingContext('can re-gen default template over existing app project with no metadta and detect the type', () async {
|
||||||
Cache.flutterRoot = '../..';
|
Cache.flutterRoot = '../..';
|
||||||
@ -858,7 +856,7 @@ void main() {
|
|||||||
|
|
||||||
final String metadata = fs.file(fs.path.join(projectDir.path, '.metadata')).readAsStringSync();
|
final String metadata = fs.file(fs.path.join(projectDir.path, '.metadata')).readAsStringSync();
|
||||||
expect(metadata, contains('project_type: app\n'));
|
expect(metadata, contains('project_type: app\n'));
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('can re-gen app template over existing app project and detect the type', () async {
|
testUsingContext('can re-gen app template over existing app project and detect the type', () async {
|
||||||
Cache.flutterRoot = '../..';
|
Cache.flutterRoot = '../..';
|
||||||
@ -872,7 +870,7 @@ void main() {
|
|||||||
|
|
||||||
final String metadata = fs.file(fs.path.join(projectDir.path, '.metadata')).readAsStringSync();
|
final String metadata = fs.file(fs.path.join(projectDir.path, '.metadata')).readAsStringSync();
|
||||||
expect(metadata, contains('project_type: app\n'));
|
expect(metadata, contains('project_type: app\n'));
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('can re-gen template over existing module project and detect the type', () async {
|
testUsingContext('can re-gen template over existing module project and detect the type', () async {
|
||||||
Cache.flutterRoot = '../..';
|
Cache.flutterRoot = '../..';
|
||||||
@ -886,7 +884,7 @@ void main() {
|
|||||||
|
|
||||||
final String metadata = fs.file(fs.path.join(projectDir.path, '.metadata')).readAsStringSync();
|
final String metadata = fs.file(fs.path.join(projectDir.path, '.metadata')).readAsStringSync();
|
||||||
expect(metadata, contains('project_type: module\n'));
|
expect(metadata, contains('project_type: module\n'));
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('can re-gen default template over existing plugin project and detect the type', () async {
|
testUsingContext('can re-gen default template over existing plugin project and detect the type', () async {
|
||||||
Cache.flutterRoot = '../..';
|
Cache.flutterRoot = '../..';
|
||||||
@ -900,7 +898,7 @@ void main() {
|
|||||||
|
|
||||||
final String metadata = fs.file(fs.path.join(projectDir.path, '.metadata')).readAsStringSync();
|
final String metadata = fs.file(fs.path.join(projectDir.path, '.metadata')).readAsStringSync();
|
||||||
expect(metadata, contains('project_type: plugin'));
|
expect(metadata, contains('project_type: plugin'));
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('can re-gen default template over existing package project and detect the type', () async {
|
testUsingContext('can re-gen default template over existing package project and detect the type', () async {
|
||||||
Cache.flutterRoot = '../..';
|
Cache.flutterRoot = '../..';
|
||||||
@ -914,7 +912,7 @@ void main() {
|
|||||||
|
|
||||||
final String metadata = fs.file(fs.path.join(projectDir.path, '.metadata')).readAsStringSync();
|
final String metadata = fs.file(fs.path.join(projectDir.path, '.metadata')).readAsStringSync();
|
||||||
expect(metadata, contains('project_type: package'));
|
expect(metadata, contains('project_type: package'));
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('can re-gen module .android/ folder, reusing custom org', () async {
|
testUsingContext('can re-gen module .android/ folder, reusing custom org', () async {
|
||||||
await _createProject(
|
await _createProject(
|
||||||
@ -930,7 +928,7 @@ void main() {
|
|||||||
'.android/app/src/main/java/com/bar/foo/flutter_project/host/MainActivity.java',
|
'.android/app/src/main/java/com/bar/foo/flutter_project/host/MainActivity.java',
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}, timeout: allowForRemotePubInvocation, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -947,7 +945,7 @@ void main() {
|
|||||||
await project.ios.productBundleIdentifier,
|
await project.ios.productBundleIdentifier,
|
||||||
'com.bar.foo.flutterProject',
|
'com.bar.foo.flutterProject',
|
||||||
);
|
);
|
||||||
}, timeout: allowForRemotePubInvocation, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -974,7 +972,7 @@ void main() {
|
|||||||
'android/app/src/main/java/com/example/flutter_project/MainActivity.java',
|
'android/app/src/main/java/com/example/flutter_project/MainActivity.java',
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('can re-gen app ios/ folder, reusing custom org', () async {
|
testUsingContext('can re-gen app ios/ folder, reusing custom org', () async {
|
||||||
await _createProject(
|
await _createProject(
|
||||||
@ -989,7 +987,7 @@ void main() {
|
|||||||
await project.ios.productBundleIdentifier,
|
await project.ios.productBundleIdentifier,
|
||||||
'com.bar.foo.flutterProject',
|
'com.bar.foo.flutterProject',
|
||||||
);
|
);
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('can re-gen plugin ios/ and example/ folders, reusing custom org', () async {
|
testUsingContext('can re-gen plugin ios/ and example/ folders, reusing custom org', () async {
|
||||||
await _createProject(
|
await _createProject(
|
||||||
@ -1022,7 +1020,7 @@ void main() {
|
|||||||
await project.example.ios.productBundleIdentifier,
|
await project.example.ios.productBundleIdentifier,
|
||||||
'com.bar.foo.flutterProjectExample',
|
'com.bar.foo.flutterProjectExample',
|
||||||
);
|
);
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('fails to re-gen without specified org when org is ambiguous', () async {
|
testUsingContext('fails to re-gen without specified org when org is ambiguous', () async {
|
||||||
await _createProject(
|
await _createProject(
|
||||||
@ -1040,7 +1038,7 @@ void main() {
|
|||||||
() => _createProject(projectDir, <String>[], <String>[]),
|
() => _createProject(projectDir, <String>[], <String>[]),
|
||||||
throwsToolExit(message: 'Ambiguous organization'),
|
throwsToolExit(message: 'Ambiguous organization'),
|
||||||
);
|
);
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
// Verify that we help the user correct an option ordering issue
|
// Verify that we help the user correct an option ordering issue
|
||||||
testUsingContext('produces sensible error message', () async {
|
testUsingContext('produces sensible error message', () async {
|
||||||
@ -1102,7 +1100,7 @@ void main() {
|
|||||||
'ios/Runner/GeneratedPluginRegistrant.h',
|
'ios/Runner/GeneratedPluginRegistrant.h',
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}, timeout: allowForRemotePubInvocation, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -1128,7 +1126,6 @@ void main() {
|
|||||||
expect(loggingProcessManager.commands.first, contains(matches(r'dart-sdk[\\/]bin[\\/]pub')));
|
expect(loggingProcessManager.commands.first, contains(matches(r'dart-sdk[\\/]bin[\\/]pub')));
|
||||||
expect(loggingProcessManager.commands.first, contains('--offline'));
|
expect(loggingProcessManager.commands.first, contains('--offline'));
|
||||||
},
|
},
|
||||||
timeout: allowForCreateFlutterProject,
|
|
||||||
overrides: <Type, Generator>{
|
overrides: <Type, Generator>{
|
||||||
ProcessManager: () => loggingProcessManager,
|
ProcessManager: () => loggingProcessManager,
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
@ -1147,7 +1144,6 @@ void main() {
|
|||||||
expect(loggingProcessManager.commands.first, contains(matches(r'dart-sdk[\\/]bin[\\/]pub')));
|
expect(loggingProcessManager.commands.first, contains(matches(r'dart-sdk[\\/]bin[\\/]pub')));
|
||||||
expect(loggingProcessManager.commands.first, isNot(contains('--offline')));
|
expect(loggingProcessManager.commands.first, isNot(contains('--offline')));
|
||||||
},
|
},
|
||||||
timeout: allowForCreateFlutterProject,
|
|
||||||
overrides: <Type, Generator>{
|
overrides: <Type, Generator>{
|
||||||
ProcessManager: () => loggingProcessManager,
|
ProcessManager: () => loggingProcessManager,
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
@ -1168,7 +1164,7 @@ void main() {
|
|||||||
);
|
);
|
||||||
expect(projectDir.childDirectory('lib').childFile('main.dart').readAsStringSync(),
|
expect(projectDir.childDirectory('lib').childFile('main.dart').readAsStringSync(),
|
||||||
contains('void main() {}'));
|
contains('void main() {}'));
|
||||||
}, timeout: allowForRemotePubInvocation, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
HttpClientFactory: () => () => MockHttpClient(200, result: 'void main() {}'),
|
HttpClientFactory: () => () => MockHttpClient(200, result: 'void main() {}'),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -207,7 +207,7 @@ void main() {
|
|||||||
|
|
||||||
expectDependenciesResolved(projectPath);
|
expectDependenciesResolved(projectPath);
|
||||||
expectZeroPluginsInjected(projectPath);
|
expectZeroPluginsInjected(projectPath);
|
||||||
}, timeout: allowForRemotePubInvocation, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -220,7 +220,7 @@ void main() {
|
|||||||
|
|
||||||
expectDependenciesResolved(projectPath);
|
expectDependenciesResolved(projectPath);
|
||||||
expectZeroPluginsInjected(projectPath);
|
expectZeroPluginsInjected(projectPath);
|
||||||
}, timeout: allowForCreateFlutterProject, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -234,7 +234,7 @@ void main() {
|
|||||||
|
|
||||||
expect(await getCommand.usageValues,
|
expect(await getCommand.usageValues,
|
||||||
containsPair(CustomDimensions.commandPackagesNumberPlugins, '0'));
|
containsPair(CustomDimensions.commandPackagesNumberPlugins, '0'));
|
||||||
}, timeout: allowForCreateFlutterProject, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -248,7 +248,7 @@ void main() {
|
|||||||
|
|
||||||
expect(await getCommand.usageValues,
|
expect(await getCommand.usageValues,
|
||||||
containsPair(CustomDimensions.commandPackagesProjectModule, 'false'));
|
containsPair(CustomDimensions.commandPackagesProjectModule, 'false'));
|
||||||
}, timeout: allowForCreateFlutterProject, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -262,7 +262,7 @@ void main() {
|
|||||||
|
|
||||||
expect(await getCommand.usageValues,
|
expect(await getCommand.usageValues,
|
||||||
containsPair(CustomDimensions.commandPackagesProjectModule, 'true'));
|
containsPair(CustomDimensions.commandPackagesProjectModule, 'true'));
|
||||||
}, timeout: allowForCreateFlutterProject, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -275,7 +275,7 @@ void main() {
|
|||||||
|
|
||||||
expectDependenciesResolved(projectPath);
|
expectDependenciesResolved(projectPath);
|
||||||
expectZeroPluginsInjected(projectPath);
|
expectZeroPluginsInjected(projectPath);
|
||||||
}, timeout: allowForRemotePubInvocation, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -288,7 +288,7 @@ void main() {
|
|||||||
|
|
||||||
expectDependenciesResolved(projectPath);
|
expectDependenciesResolved(projectPath);
|
||||||
expectModulePluginInjected(projectPath);
|
expectModulePluginInjected(projectPath);
|
||||||
}, timeout: allowForRemotePubInvocation, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -309,7 +309,7 @@ void main() {
|
|||||||
|
|
||||||
expectDependenciesResolved(exampleProjectPath);
|
expectDependenciesResolved(exampleProjectPath);
|
||||||
expectPluginInjected(exampleProjectPath);
|
expectPluginInjected(exampleProjectPath);
|
||||||
}, timeout: allowForRemotePubInvocation, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Pub: () => const Pub(),
|
Pub: () => const Pub(),
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -57,7 +57,7 @@ void main() {
|
|||||||
|
|
||||||
}, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
AndroidBuilder: () => FakeAndroidBuilder(),
|
AndroidBuilder: () => FakeAndroidBuilder(),
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('indicate that project is a plugin', () async {
|
testUsingContext('indicate that project is a plugin', () async {
|
||||||
final String projectPath = await createProject(tempDir,
|
final String projectPath = await createProject(tempDir,
|
||||||
@ -69,7 +69,7 @@ void main() {
|
|||||||
|
|
||||||
}, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
AndroidBuilder: () => FakeAndroidBuilder(),
|
AndroidBuilder: () => FakeAndroidBuilder(),
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('indicate the target platform', () async {
|
testUsingContext('indicate the target platform', () async {
|
||||||
final String projectPath = await createProject(tempDir,
|
final String projectPath = await createProject(tempDir,
|
||||||
@ -82,7 +82,7 @@ void main() {
|
|||||||
|
|
||||||
}, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
AndroidBuilder: () => FakeAndroidBuilder(),
|
AndroidBuilder: () => FakeAndroidBuilder(),
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
group('Gradle', () {
|
group('Gradle', () {
|
||||||
|
@ -48,7 +48,7 @@ void main() {
|
|||||||
|
|
||||||
}, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
AndroidBuilder: () => FakeAndroidBuilder(),
|
AndroidBuilder: () => FakeAndroidBuilder(),
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('split per abi', () async {
|
testUsingContext('split per abi', () async {
|
||||||
final String projectPath = await createProject(tempDir,
|
final String projectPath = await createProject(tempDir,
|
||||||
@ -65,7 +65,7 @@ void main() {
|
|||||||
|
|
||||||
}, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
AndroidBuilder: () => FakeAndroidBuilder(),
|
AndroidBuilder: () => FakeAndroidBuilder(),
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('build type', () async {
|
testUsingContext('build type', () async {
|
||||||
final String projectPath = await createProject(tempDir,
|
final String projectPath = await createProject(tempDir,
|
||||||
@ -92,7 +92,7 @@ void main() {
|
|||||||
|
|
||||||
}, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
AndroidBuilder: () => FakeAndroidBuilder(),
|
AndroidBuilder: () => FakeAndroidBuilder(),
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
group('Gradle', () {
|
group('Gradle', () {
|
||||||
@ -223,8 +223,7 @@ flutter:
|
|||||||
FlutterProjectFactory: () => FakeFlutterProjectFactory(tempDir),
|
FlutterProjectFactory: () => FakeFlutterProjectFactory(tempDir),
|
||||||
GradleUtils: () => GradleUtils(),
|
GradleUtils: () => GradleUtils(),
|
||||||
ProcessManager: () => mockProcessManager,
|
ProcessManager: () => mockProcessManager,
|
||||||
},
|
});
|
||||||
timeout: allowForCreateFlutterProject);
|
|
||||||
|
|
||||||
testUsingContext('shrinking is disabled when --no-shrink is passed', () async {
|
testUsingContext('shrinking is disabled when --no-shrink is passed', () async {
|
||||||
final String projectPath = await createProject(tempDir,
|
final String projectPath = await createProject(tempDir,
|
||||||
@ -255,8 +254,7 @@ flutter:
|
|||||||
FlutterProjectFactory: () => FakeFlutterProjectFactory(tempDir),
|
FlutterProjectFactory: () => FakeFlutterProjectFactory(tempDir),
|
||||||
GradleUtils: () => GradleUtils(),
|
GradleUtils: () => GradleUtils(),
|
||||||
ProcessManager: () => mockProcessManager,
|
ProcessManager: () => mockProcessManager,
|
||||||
},
|
});
|
||||||
timeout: allowForCreateFlutterProject);
|
|
||||||
|
|
||||||
testUsingContext('guides the user when the shrinker fails', () async {
|
testUsingContext('guides the user when the shrinker fails', () async {
|
||||||
final String projectPath = await createProject(tempDir,
|
final String projectPath = await createProject(tempDir,
|
||||||
@ -312,8 +310,7 @@ flutter:
|
|||||||
FlutterProjectFactory: () => FakeFlutterProjectFactory(tempDir),
|
FlutterProjectFactory: () => FakeFlutterProjectFactory(tempDir),
|
||||||
ProcessManager: () => mockProcessManager,
|
ProcessManager: () => mockProcessManager,
|
||||||
Usage: () => mockUsage,
|
Usage: () => mockUsage,
|
||||||
},
|
});
|
||||||
timeout: allowForCreateFlutterProject);
|
|
||||||
|
|
||||||
testUsingContext('reports when the app isn\'t using AndroidX', () async {
|
testUsingContext('reports when the app isn\'t using AndroidX', () async {
|
||||||
final String projectPath = await createProject(tempDir,
|
final String projectPath = await createProject(tempDir,
|
||||||
@ -366,8 +363,7 @@ flutter:
|
|||||||
FlutterProjectFactory: () => FakeFlutterProjectFactory(tempDir),
|
FlutterProjectFactory: () => FakeFlutterProjectFactory(tempDir),
|
||||||
ProcessManager: () => mockProcessManager,
|
ProcessManager: () => mockProcessManager,
|
||||||
Usage: () => mockUsage,
|
Usage: () => mockUsage,
|
||||||
},
|
});
|
||||||
timeout: allowForCreateFlutterProject);
|
|
||||||
|
|
||||||
testUsingContext('reports when the app is using AndroidX', () async {
|
testUsingContext('reports when the app is using AndroidX', () async {
|
||||||
final String projectPath = await createProject(tempDir,
|
final String projectPath = await createProject(tempDir,
|
||||||
@ -422,8 +418,7 @@ flutter:
|
|||||||
FlutterProjectFactory: () => FakeFlutterProjectFactory(tempDir),
|
FlutterProjectFactory: () => FakeFlutterProjectFactory(tempDir),
|
||||||
ProcessManager: () => mockProcessManager,
|
ProcessManager: () => mockProcessManager,
|
||||||
Usage: () => mockUsage,
|
Usage: () => mockUsage,
|
||||||
},
|
});
|
||||||
timeout: allowForCreateFlutterProject);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@ void main() {
|
|||||||
|
|
||||||
}, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
AndroidBuilder: () => FakeAndroidBuilder(),
|
AndroidBuilder: () => FakeAndroidBuilder(),
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
|
|
||||||
testUsingContext('build type', () async {
|
testUsingContext('build type', () async {
|
||||||
final String projectPath = await createProject(tempDir,
|
final String projectPath = await createProject(tempDir,
|
||||||
@ -75,7 +75,7 @@ void main() {
|
|||||||
|
|
||||||
}, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
AndroidBuilder: () => FakeAndroidBuilder(),
|
AndroidBuilder: () => FakeAndroidBuilder(),
|
||||||
}, timeout: allowForCreateFlutterProject);
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
group('Gradle', () {
|
group('Gradle', () {
|
||||||
@ -212,8 +212,7 @@ flutter:
|
|||||||
FlutterProjectFactory: () => FakeFlutterProjectFactory(tempDir),
|
FlutterProjectFactory: () => FakeFlutterProjectFactory(tempDir),
|
||||||
GradleUtils: () => GradleUtils(),
|
GradleUtils: () => GradleUtils(),
|
||||||
ProcessManager: () => mockProcessManager,
|
ProcessManager: () => mockProcessManager,
|
||||||
},
|
});
|
||||||
timeout: allowForCreateFlutterProject);
|
|
||||||
|
|
||||||
testUsingContext('shrinking is disabled when --no-shrink is passed', () async {
|
testUsingContext('shrinking is disabled when --no-shrink is passed', () async {
|
||||||
final String projectPath = await createProject(
|
final String projectPath = await createProject(
|
||||||
@ -246,8 +245,7 @@ flutter:
|
|||||||
FlutterProjectFactory: () => FakeFlutterProjectFactory(tempDir),
|
FlutterProjectFactory: () => FakeFlutterProjectFactory(tempDir),
|
||||||
GradleUtils: () => GradleUtils(),
|
GradleUtils: () => GradleUtils(),
|
||||||
ProcessManager: () => mockProcessManager,
|
ProcessManager: () => mockProcessManager,
|
||||||
},
|
});
|
||||||
timeout: allowForCreateFlutterProject);
|
|
||||||
|
|
||||||
testUsingContext('guides the user when the shrinker fails', () async {
|
testUsingContext('guides the user when the shrinker fails', () async {
|
||||||
final String projectPath = await createProject(tempDir,
|
final String projectPath = await createProject(tempDir,
|
||||||
@ -303,8 +301,7 @@ flutter:
|
|||||||
FlutterProjectFactory: () => FakeFlutterProjectFactory(tempDir),
|
FlutterProjectFactory: () => FakeFlutterProjectFactory(tempDir),
|
||||||
ProcessManager: () => mockProcessManager,
|
ProcessManager: () => mockProcessManager,
|
||||||
Usage: () => mockUsage,
|
Usage: () => mockUsage,
|
||||||
},
|
});
|
||||||
timeout: allowForCreateFlutterProject);
|
|
||||||
|
|
||||||
testUsingContext('reports when the app isn\'t using AndroidX', () async {
|
testUsingContext('reports when the app isn\'t using AndroidX', () async {
|
||||||
final String projectPath = await createProject(tempDir,
|
final String projectPath = await createProject(tempDir,
|
||||||
@ -357,8 +354,7 @@ flutter:
|
|||||||
FlutterProjectFactory: () => FakeFlutterProjectFactory(tempDir),
|
FlutterProjectFactory: () => FakeFlutterProjectFactory(tempDir),
|
||||||
ProcessManager: () => mockProcessManager,
|
ProcessManager: () => mockProcessManager,
|
||||||
Usage: () => mockUsage,
|
Usage: () => mockUsage,
|
||||||
},
|
});
|
||||||
timeout: allowForCreateFlutterProject);
|
|
||||||
|
|
||||||
testUsingContext('reports when the app is using AndroidX', () async {
|
testUsingContext('reports when the app is using AndroidX', () async {
|
||||||
final String projectPath = await createProject(tempDir,
|
final String projectPath = await createProject(tempDir,
|
||||||
@ -413,8 +409,7 @@ flutter:
|
|||||||
FlutterProjectFactory: () => FakeFlutterProjectFactory(tempDir),
|
FlutterProjectFactory: () => FakeFlutterProjectFactory(tempDir),
|
||||||
ProcessManager: () => mockProcessManager,
|
ProcessManager: () => mockProcessManager,
|
||||||
Usage: () => mockUsage,
|
Usage: () => mockUsage,
|
||||||
},
|
});
|
||||||
timeout: allowForCreateFlutterProject);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,13 +2,9 @@
|
|||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// Integration tests which invoke flutter instead of unit testing the code
|
|
||||||
// will not produce meaningful coverage information - we can measure coverage
|
|
||||||
// from the isolate running the test, but not from the isolate started via
|
|
||||||
// the command line process.
|
|
||||||
@Tags(<String>['no_coverage'])
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:file/file.dart';
|
import 'package:file/file.dart';
|
||||||
import 'package:flutter_tools/src/base/file_system.dart';
|
import 'package:flutter_tools/src/base/file_system.dart';
|
||||||
@ -21,49 +17,26 @@ import 'test_driver.dart';
|
|||||||
import 'test_utils.dart';
|
import 'test_utils.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
group('daemon_mode', () {
|
|
||||||
Directory tempDir;
|
|
||||||
final BasicProject _project = BasicProject();
|
|
||||||
Process process;
|
|
||||||
|
|
||||||
setUp(() async {
|
|
||||||
tempDir = createResolvedTempDirectorySync('daemon_mode_test.');
|
|
||||||
await _project.setUpIn(tempDir);
|
|
||||||
});
|
|
||||||
|
|
||||||
tearDown(() async {
|
|
||||||
tryToDelete(tempDir);
|
|
||||||
process?.kill();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('device.getDevices', () async {
|
test('device.getDevices', () async {
|
||||||
final String flutterBin =
|
final Directory tempDir = createResolvedTempDirectorySync('daemon_mode_test.');
|
||||||
fs.path.join(getFlutterRoot(), 'bin', 'flutter');
|
|
||||||
|
final BasicProject _project = BasicProject();
|
||||||
|
await _project.setUpIn(tempDir);
|
||||||
|
|
||||||
|
final String flutterBin = fs.path.join(getFlutterRoot(), 'bin', 'flutter');
|
||||||
|
|
||||||
const ProcessManager processManager = LocalProcessManager();
|
const ProcessManager processManager = LocalProcessManager();
|
||||||
process = await processManager.start(
|
final Process process = await processManager.start(
|
||||||
<String>[flutterBin, '--show-test-device', 'daemon'],
|
<String>[flutterBin, '--show-test-device', 'daemon'],
|
||||||
workingDirectory: tempDir.path);
|
workingDirectory: tempDir.path,
|
||||||
|
);
|
||||||
|
|
||||||
final StreamController<String> stdout =
|
final StreamController<String> stdout = StreamController<String>.broadcast();
|
||||||
StreamController<String>.broadcast();
|
transformToLines(process.stdout).listen((String line) => stdout.add(line));
|
||||||
|
final Stream<Map<String, dynamic>> stream = stdout
|
||||||
transformToLines(process.stdout)
|
.stream
|
||||||
.listen((String line) => stdout.add(line));
|
.map<Map<String, dynamic>>(parseFlutterResponse)
|
||||||
|
.where((Map<String, dynamic> value) => value != null);
|
||||||
final Stream<Map<String, dynamic>> stream =
|
|
||||||
stdout.stream.where((String line) {
|
|
||||||
final Map<String, dynamic> response = parseFlutterResponse(line);
|
|
||||||
// ignore 'Starting device daemon...'
|
|
||||||
if (response == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// TODO(devoncarew): Remove this after #25440 lands.
|
|
||||||
if (response['event'] == 'daemon.showMessage') {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}).map(parseFlutterResponse);
|
|
||||||
|
|
||||||
Map<String, dynamic> response = await stream.first;
|
Map<String, dynamic> response = await stream.first;
|
||||||
expect(response['event'], 'daemon.connected');
|
expect(response['event'], 'daemon.connected');
|
||||||
@ -94,6 +67,8 @@ void main() {
|
|||||||
final dynamic result = response['result'];
|
final dynamic result = response['result'];
|
||||||
expect(result, isList);
|
expect(result, isList);
|
||||||
expect(result, isNotEmpty);
|
expect(result, isNotEmpty);
|
||||||
|
|
||||||
|
tryToDelete(tempDir);
|
||||||
|
process.kill();
|
||||||
});
|
});
|
||||||
}, timeout: const Timeout.factor(10), tags: <String>['integration']); // This test uses the `flutter` tool, which could be blocked behind the startup lock for a long time.
|
|
||||||
}
|
}
|
||||||
|
@ -2,11 +2,8 @@
|
|||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// Integration tests which invoke flutter instead of unit testing the code
|
import 'dart:io';
|
||||||
// will not produce meaningful coverage information - we can measure coverage
|
|
||||||
// from the isolate running the test, but not from the isolate started via
|
|
||||||
// the command line process.
|
|
||||||
@Tags(<String>['no_coverage'])
|
|
||||||
import 'package:file/file.dart';
|
import 'package:file/file.dart';
|
||||||
import 'package:flutter_tools/src/base/file_system.dart';
|
import 'package:flutter_tools/src/base/file_system.dart';
|
||||||
|
|
||||||
@ -16,23 +13,14 @@ import 'test_driver.dart';
|
|||||||
import 'test_utils.dart';
|
import 'test_utils.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
group('debugger', () {
|
|
||||||
Directory tempDir;
|
|
||||||
final SteppingProject _project = SteppingProject();
|
|
||||||
FlutterRunTestDriver _flutter;
|
|
||||||
|
|
||||||
setUp(() async {
|
|
||||||
tempDir = createResolvedTempDirectorySync('debugger_stepping_test.');
|
|
||||||
await _project.setUpIn(tempDir);
|
|
||||||
_flutter = FlutterRunTestDriver(tempDir);
|
|
||||||
});
|
|
||||||
|
|
||||||
tearDown(() async {
|
|
||||||
await _flutter.stop();
|
|
||||||
tryToDelete(tempDir);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('can step over statements', () async {
|
test('can step over statements', () async {
|
||||||
|
final Directory tempDir = createResolvedTempDirectorySync('debugger_stepping_test.');
|
||||||
|
|
||||||
|
final SteppingProject _project = SteppingProject();
|
||||||
|
await _project.setUpIn(tempDir);
|
||||||
|
|
||||||
|
final FlutterRunTestDriver _flutter = FlutterRunTestDriver(tempDir);
|
||||||
|
|
||||||
await _flutter.run(withDebugger: true, startPaused: true);
|
await _flutter.run(withDebugger: true, startPaused: true);
|
||||||
await _flutter.addBreakpoint(_project.breakpointUri, _project.breakpointLine);
|
await _flutter.addBreakpoint(_project.breakpointUri, _project.breakpointLine);
|
||||||
await _flutter.resume();
|
await _flutter.resume();
|
||||||
@ -51,8 +39,11 @@ void main() {
|
|||||||
final int expectedLine = _project.lineForStep(i);
|
final int expectedLine = _project.lineForStep(i);
|
||||||
|
|
||||||
expect(actualLine, equals(expectedLine),
|
expect(actualLine, equals(expectedLine),
|
||||||
reason: 'After $i steps, debugger should stop at $expectedLine but stopped at $actualLine');
|
reason: 'After $i steps, debugger should stop at $expectedLine but stopped at $actualLine'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await _flutter.stop();
|
||||||
|
tryToDelete(tempDir);
|
||||||
});
|
});
|
||||||
}, timeout: const Timeout.factor(10), tags: <String>['integration']); // The DevFS sync takes a really long time, so these tests can be slow.
|
|
||||||
}
|
}
|
||||||
|
@ -2,12 +2,8 @@
|
|||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// Integration tests which invoke flutter instead of unit testing the code
|
|
||||||
// will not produce meaningful coverage information - we can measure coverage
|
|
||||||
// from the isolate running the test, but not from the isolate started via
|
|
||||||
// the command line process.
|
|
||||||
@Tags(<String>['no_coverage'])
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:file/file.dart';
|
import 'package:file/file.dart';
|
||||||
import 'package:flutter_tools/src/base/file_system.dart';
|
import 'package:flutter_tools/src/base/file_system.dart';
|
||||||
@ -20,22 +16,21 @@ import 'test_data/tests_project.dart';
|
|||||||
import 'test_driver.dart';
|
import 'test_driver.dart';
|
||||||
import 'test_utils.dart';
|
import 'test_utils.dart';
|
||||||
|
|
||||||
void main() {
|
void batch1() {
|
||||||
group('flutter run expression evaluation', () {
|
|
||||||
Directory tempDir;
|
|
||||||
final BasicProject _project = BasicProject();
|
final BasicProject _project = BasicProject();
|
||||||
|
Directory tempDir;
|
||||||
FlutterRunTestDriver _flutter;
|
FlutterRunTestDriver _flutter;
|
||||||
|
|
||||||
setUp(() async {
|
Future<void> initProject() async {
|
||||||
tempDir = createResolvedTempDirectorySync('run_expression_eval_test.');
|
tempDir = createResolvedTempDirectorySync('run_expression_eval_test.');
|
||||||
await _project.setUpIn(tempDir);
|
await _project.setUpIn(tempDir);
|
||||||
_flutter = FlutterRunTestDriver(tempDir);
|
_flutter = FlutterRunTestDriver(tempDir);
|
||||||
});
|
}
|
||||||
|
|
||||||
tearDown(() async {
|
Future<void> cleanProject() async {
|
||||||
await _flutter.stop();
|
await _flutter.stop();
|
||||||
tryToDelete(tempDir);
|
tryToDelete(tempDir);
|
||||||
});
|
}
|
||||||
|
|
||||||
Future<void> breakInBuildMethod(FlutterTestDriver flutter) async {
|
Future<void> breakInBuildMethod(FlutterTestDriver flutter) async {
|
||||||
await _flutter.breakAt(
|
await _flutter.breakAt(
|
||||||
@ -51,89 +46,103 @@ void main() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
test('can evaluate trivial expressions in top level function', () async {
|
test('flutter run expression evaluation - can evaluate trivial expressions in top level function', () async {
|
||||||
|
await initProject();
|
||||||
await _flutter.run(withDebugger: true);
|
await _flutter.run(withDebugger: true);
|
||||||
await breakInTopLevelFunction(_flutter);
|
await breakInTopLevelFunction(_flutter);
|
||||||
await evaluateTrivialExpressions(_flutter);
|
await evaluateTrivialExpressions(_flutter);
|
||||||
|
await cleanProject();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('can evaluate trivial expressions in build method', () async {
|
test('flutter run expression evaluation - can evaluate trivial expressions in build method', () async {
|
||||||
|
await initProject();
|
||||||
await _flutter.run(withDebugger: true);
|
await _flutter.run(withDebugger: true);
|
||||||
await breakInBuildMethod(_flutter);
|
await breakInBuildMethod(_flutter);
|
||||||
await evaluateTrivialExpressions(_flutter);
|
await evaluateTrivialExpressions(_flutter);
|
||||||
|
await cleanProject();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('can evaluate complex expressions in top level function', () async {
|
test('flutter run expression evaluation - can evaluate complex expressions in top level function', () async {
|
||||||
|
await initProject();
|
||||||
await _flutter.run(withDebugger: true);
|
await _flutter.run(withDebugger: true);
|
||||||
await breakInTopLevelFunction(_flutter);
|
await breakInTopLevelFunction(_flutter);
|
||||||
await evaluateComplexExpressions(_flutter);
|
await evaluateComplexExpressions(_flutter);
|
||||||
|
await cleanProject();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('can evaluate complex expressions in build method', () async {
|
test('flutter run expression evaluation - can evaluate complex expressions in build method', () async {
|
||||||
|
await initProject();
|
||||||
await _flutter.run(withDebugger: true);
|
await _flutter.run(withDebugger: true);
|
||||||
await breakInBuildMethod(_flutter);
|
await breakInBuildMethod(_flutter);
|
||||||
await evaluateComplexExpressions(_flutter);
|
await evaluateComplexExpressions(_flutter);
|
||||||
|
await cleanProject();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('can evaluate expressions returning complex objects in top level function', () async {
|
test('flutter run expression evaluation - can evaluate expressions returning complex objects in top level function', () async {
|
||||||
|
await initProject();
|
||||||
await _flutter.run(withDebugger: true);
|
await _flutter.run(withDebugger: true);
|
||||||
await breakInTopLevelFunction(_flutter);
|
await breakInTopLevelFunction(_flutter);
|
||||||
await evaluateComplexReturningExpressions(_flutter);
|
await evaluateComplexReturningExpressions(_flutter);
|
||||||
|
await cleanProject();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('can evaluate expressions returning complex objects in build method', () async {
|
test('flutter run expression evaluation - can evaluate expressions returning complex objects in build method', () async {
|
||||||
|
await initProject();
|
||||||
await _flutter.run(withDebugger: true);
|
await _flutter.run(withDebugger: true);
|
||||||
await breakInBuildMethod(_flutter);
|
await breakInBuildMethod(_flutter);
|
||||||
await evaluateComplexReturningExpressions(_flutter);
|
await evaluateComplexReturningExpressions(_flutter);
|
||||||
|
await cleanProject();
|
||||||
});
|
});
|
||||||
}, timeout: const Timeout.factor(10), tags: <String>['integration']); // The DevFS sync takes a really long time, so these tests can be slow.
|
}
|
||||||
|
|
||||||
group('flutter test expression evaluation', () {
|
void batch2() {
|
||||||
Directory tempDir;
|
|
||||||
final TestsProject _project = TestsProject();
|
final TestsProject _project = TestsProject();
|
||||||
|
Directory tempDir;
|
||||||
FlutterTestTestDriver _flutter;
|
FlutterTestTestDriver _flutter;
|
||||||
|
|
||||||
setUp(() async {
|
Future<void> initProject() async {
|
||||||
tempDir = createResolvedTempDirectorySync('test_expression_eval_test.');
|
tempDir = createResolvedTempDirectorySync('test_expression_eval_test.');
|
||||||
await _project.setUpIn(tempDir);
|
await _project.setUpIn(tempDir);
|
||||||
_flutter = FlutterTestTestDriver(tempDir);
|
_flutter = FlutterTestTestDriver(tempDir);
|
||||||
});
|
}
|
||||||
|
|
||||||
tearDown(() async {
|
Future<void> cleanProject() async {
|
||||||
await _flutter.quit();
|
await _flutter?.quit();
|
||||||
tryToDelete(tempDir);
|
tryToDelete(tempDir);
|
||||||
});
|
}
|
||||||
|
|
||||||
test('can evaluate trivial expressions in a test', () async {
|
test('flutter test expression evaluation - can evaluate trivial expressions in a test', () async {
|
||||||
|
await initProject();
|
||||||
await _flutter.test(
|
await _flutter.test(
|
||||||
withDebugger: true,
|
withDebugger: true,
|
||||||
beforeStart: () => _flutter.addBreakpoint(_project.breakpointUri, _project.breakpointLine),
|
beforeStart: () => _flutter.addBreakpoint(_project.breakpointUri, _project.breakpointLine),
|
||||||
);
|
);
|
||||||
await _flutter.waitForPause();
|
await _flutter.waitForPause();
|
||||||
await evaluateTrivialExpressions(_flutter);
|
await evaluateTrivialExpressions(_flutter);
|
||||||
await _flutter.resume();
|
await cleanProject();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('can evaluate complex expressions in a test', () async {
|
test('flutter test expression evaluation - can evaluate complex expressions in a test', () async {
|
||||||
|
await initProject();
|
||||||
await _flutter.test(
|
await _flutter.test(
|
||||||
withDebugger: true,
|
withDebugger: true,
|
||||||
beforeStart: () => _flutter.addBreakpoint(_project.breakpointUri, _project.breakpointLine),
|
beforeStart: () => _flutter.addBreakpoint(_project.breakpointUri, _project.breakpointLine),
|
||||||
);
|
);
|
||||||
await _flutter.waitForPause();
|
await _flutter.waitForPause();
|
||||||
await evaluateComplexExpressions(_flutter);
|
await evaluateComplexExpressions(_flutter);
|
||||||
await _flutter.resume();
|
await cleanProject();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('can evaluate expressions returning complex objects in a test', () async {
|
test('flutter test expression evaluation - can evaluate expressions returning complex objects in a test', () async {
|
||||||
|
await initProject();
|
||||||
await _flutter.test(
|
await _flutter.test(
|
||||||
withDebugger: true,
|
withDebugger: true,
|
||||||
beforeStart: () => _flutter.addBreakpoint(_project.breakpointUri, _project.breakpointLine),
|
beforeStart: () => _flutter.addBreakpoint(_project.breakpointUri, _project.breakpointLine),
|
||||||
);
|
);
|
||||||
await _flutter.waitForPause();
|
await _flutter.waitForPause();
|
||||||
await evaluateComplexReturningExpressions(_flutter);
|
await evaluateComplexReturningExpressions(_flutter);
|
||||||
await _flutter.resume();
|
await cleanProject();
|
||||||
});
|
});
|
||||||
}, timeout: const Timeout.factor(10), tags: <String>['integration']); // The DevFS sync takes a really long time, so these tests can be slow.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> evaluateTrivialExpressions(FlutterTestDriver flutter) async {
|
Future<void> evaluateTrivialExpressions(FlutterTestDriver flutter) async {
|
||||||
@ -164,3 +173,8 @@ Future<void> evaluateComplexReturningExpressions(FlutterTestDriver flutter) asyn
|
|||||||
final InstanceRef res = await flutter.evaluate(resp.id, r'"$year-$month-$day"');
|
final InstanceRef res = await flutter.evaluate(resp.id, r'"$year-$month-$day"');
|
||||||
expect(res.valueAsString, equals('${now.year}-${now.month}-${now.day}'));
|
expect(res.valueAsString, equals('${now.year}-${now.month}-${now.day}'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
batch1();
|
||||||
|
batch2();
|
||||||
|
}
|
||||||
|
@ -2,11 +2,8 @@
|
|||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// Integration tests which invoke flutter instead of unit testing the code
|
import 'dart:io';
|
||||||
// will not produce meaningful coverage information - we can measure coverage
|
|
||||||
// from the isolate running the test, but not from the isolate started via
|
|
||||||
// the command line process.
|
|
||||||
@Tags(<String>['no_coverage'])
|
|
||||||
import 'package:file/file.dart';
|
import 'package:file/file.dart';
|
||||||
import 'package:flutter_tools/src/base/file_system.dart';
|
import 'package:flutter_tools/src/base/file_system.dart';
|
||||||
|
|
||||||
@ -33,7 +30,6 @@ void main() {
|
|||||||
tryToDelete(tempDir);
|
tryToDelete(tempDir);
|
||||||
});
|
});
|
||||||
|
|
||||||
group('attached process', () {
|
|
||||||
test('writes pid-file', () async {
|
test('writes pid-file', () async {
|
||||||
final File pidFile = tempDir.childFile('test.pid');
|
final File pidFile = tempDir.childFile('test.pid');
|
||||||
await _flutterRun.run(withDebugger: true);
|
await _flutterRun.run(withDebugger: true);
|
||||||
@ -43,11 +39,13 @@ void main() {
|
|||||||
);
|
);
|
||||||
expect(pidFile.existsSync(), isTrue);
|
expect(pidFile.existsSync(), isTrue);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('can hot reload', () async {
|
test('can hot reload', () async {
|
||||||
await _flutterRun.run(withDebugger: true);
|
await _flutterRun.run(withDebugger: true);
|
||||||
await _flutterAttach.attach(_flutterRun.vmServicePort);
|
await _flutterAttach.attach(_flutterRun.vmServicePort);
|
||||||
await _flutterAttach.hotReload();
|
await _flutterAttach.hotReload();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('can detach, reattach, hot reload', () async {
|
test('can detach, reattach, hot reload', () async {
|
||||||
await _flutterRun.run(withDebugger: true);
|
await _flutterRun.run(withDebugger: true);
|
||||||
await _flutterAttach.attach(_flutterRun.vmServicePort);
|
await _flutterAttach.attach(_flutterRun.vmServicePort);
|
||||||
@ -55,6 +53,7 @@ void main() {
|
|||||||
await _flutterAttach.attach(_flutterRun.vmServicePort);
|
await _flutterAttach.attach(_flutterRun.vmServicePort);
|
||||||
await _flutterAttach.hotReload();
|
await _flutterAttach.hotReload();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('killing process behaves the same as detach ', () async {
|
test('killing process behaves the same as detach ', () async {
|
||||||
await _flutterRun.run(withDebugger: true);
|
await _flutterRun.run(withDebugger: true);
|
||||||
await _flutterAttach.attach(_flutterRun.vmServicePort);
|
await _flutterAttach.attach(_flutterRun.vmServicePort);
|
||||||
@ -63,5 +62,4 @@ void main() {
|
|||||||
await _flutterAttach.attach(_flutterRun.vmServicePort);
|
await _flutterAttach.attach(_flutterRun.vmServicePort);
|
||||||
await _flutterAttach.hotReload();
|
await _flutterAttach.hotReload();
|
||||||
});
|
});
|
||||||
}, timeout: const Timeout.factor(10), tags: <String>['integration']); // The DevFS sync takes a really long time, so these tests can be slow.
|
|
||||||
}
|
}
|
||||||
|
@ -2,11 +2,6 @@
|
|||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// Integration tests which invoke flutter instead of unit testing the code
|
|
||||||
// will not produce meaningful coverage information - we can measure coverage
|
|
||||||
// from the isolate running the test, but not from the isolate started via
|
|
||||||
// the command line process.
|
|
||||||
@Tags(<String>['no_coverage'])
|
|
||||||
import 'package:file/file.dart';
|
import 'package:file/file.dart';
|
||||||
import 'package:flutter_tools/src/base/file_system.dart';
|
import 'package:flutter_tools/src/base/file_system.dart';
|
||||||
import 'package:flutter_tools/src/base/io.dart';
|
import 'package:flutter_tools/src/base/io.dart';
|
||||||
@ -18,7 +13,6 @@ import 'test_driver.dart';
|
|||||||
import 'test_utils.dart';
|
import 'test_utils.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
group('flutter_run', () {
|
|
||||||
Directory tempDir;
|
Directory tempDir;
|
||||||
final BasicProject _project = BasicProject();
|
final BasicProject _project = BasicProject();
|
||||||
FlutterRunTestDriver _flutter;
|
FlutterRunTestDriver _flutter;
|
||||||
@ -34,7 +28,7 @@ void main() {
|
|||||||
tryToDelete(tempDir);
|
tryToDelete(tempDir);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('reports an error if an invalid device is supplied', () async {
|
test('flutter run reports an error if an invalid device is supplied', () async {
|
||||||
// This test forces flutter to check for all possible devices to catch issues
|
// This test forces flutter to check for all possible devices to catch issues
|
||||||
// like https://github.com/flutter/flutter/issues/21418 which were skipped
|
// like https://github.com/flutter/flutter/issues/21418 which were skipped
|
||||||
// over because other integration tests run using flutter-tester which short-cuts
|
// over because other integration tests run using flutter-tester which short-cuts
|
||||||
@ -55,10 +49,9 @@ void main() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
test('writes pid-file', () async {
|
test('flutter run writes pid-file', () async {
|
||||||
final File pidFile = tempDir.childFile('test.pid');
|
final File pidFile = tempDir.childFile('test.pid');
|
||||||
await _flutter.run(pidFile: pidFile);
|
await _flutter.run(pidFile: pidFile);
|
||||||
expect(pidFile.existsSync(), isTrue);
|
expect(pidFile.existsSync(), isTrue);
|
||||||
});
|
});
|
||||||
}, timeout: const Timeout.factor(10), tags: <String>['integration']); // The DevFS sync takes a really long time, so these tests can be slow.
|
|
||||||
}
|
}
|
||||||
|
@ -2,11 +2,6 @@
|
|||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// Integration tests which invoke flutter instead of unit testing the code
|
|
||||||
// will not produce meaningful coverage information - we can measure coverage
|
|
||||||
// from the isolate running the test, but not from the isolate started via
|
|
||||||
// the command line process.
|
|
||||||
@Tags(<String>['no_coverage'])
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:file/file.dart';
|
import 'package:file/file.dart';
|
||||||
@ -20,7 +15,6 @@ import 'test_driver.dart';
|
|||||||
import 'test_utils.dart';
|
import 'test_utils.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
group('hot reload tests', () {
|
|
||||||
Directory tempDir;
|
Directory tempDir;
|
||||||
final HotReloadProject _project = HotReloadProject();
|
final HotReloadProject _project = HotReloadProject();
|
||||||
FlutterRunTestDriver _flutter;
|
FlutterRunTestDriver _flutter;
|
||||||
@ -154,5 +148,4 @@ void main() {
|
|||||||
await _flutter.resume();
|
await _flutter.resume();
|
||||||
await subscription.cancel();
|
await subscription.cancel();
|
||||||
});
|
});
|
||||||
}, timeout: const Timeout.factor(10), tags: <String>['integration']); // The DevFS sync takes a really long time, so these tests can be slow.
|
|
||||||
}
|
}
|
||||||
|
@ -2,11 +2,6 @@
|
|||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// Integration tests which invoke flutter instead of unit testing the code
|
|
||||||
// will not produce meaningful coverage information - we can measure coverage
|
|
||||||
// from the isolate running the test, but not from the isolate started via
|
|
||||||
// the command line process.
|
|
||||||
@Tags(<String>['no_coverage'])
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:file/file.dart';
|
import 'package:file/file.dart';
|
||||||
@ -23,7 +18,6 @@ import 'test_utils.dart';
|
|||||||
const Duration requiredLifespan = Duration(seconds: 5);
|
const Duration requiredLifespan = Duration(seconds: 5);
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
group('flutter run', () {
|
|
||||||
final BasicProject _project = BasicProject();
|
final BasicProject _project = BasicProject();
|
||||||
FlutterRunTestDriver _flutter;
|
FlutterRunTestDriver _flutter;
|
||||||
Directory tempDir;
|
Directory tempDir;
|
||||||
@ -39,16 +33,15 @@ void main() {
|
|||||||
tryToDelete(tempDir);
|
tryToDelete(tempDir);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('does not terminate when a debugger is attached', () async {
|
test('flutter run does not terminate when a debugger is attached', () async {
|
||||||
await _flutter.run(withDebugger: true);
|
await _flutter.run(withDebugger: true);
|
||||||
await Future<void>.delayed(requiredLifespan);
|
await Future<void>.delayed(requiredLifespan);
|
||||||
expect(_flutter.hasExited, equals(false));
|
expect(_flutter.hasExited, equals(false));
|
||||||
});
|
});
|
||||||
|
|
||||||
test('does not terminate when a debugger is attached and pause-on-exceptions', () async {
|
test('fluter run does not terminate when a debugger is attached and pause-on-exceptions', () async {
|
||||||
await _flutter.run(withDebugger: true, pauseOnExceptions: true);
|
await _flutter.run(withDebugger: true, pauseOnExceptions: true);
|
||||||
await Future<void>.delayed(requiredLifespan);
|
await Future<void>.delayed(requiredLifespan);
|
||||||
expect(_flutter.hasExited, equals(false));
|
expect(_flutter.hasExited, equals(false));
|
||||||
});
|
});
|
||||||
}, timeout: const Timeout.factor(10), tags: <String>['integration']); // The DevFS sync takes a really long time, so these tests can be slow.
|
|
||||||
}
|
}
|
||||||
|
@ -127,13 +127,6 @@ Future<String> createProject(Directory temp, { List<String> arguments }) async {
|
|||||||
return projectPath;
|
return projectPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Test case timeout for tests involving remote calls to `pub get` or similar.
|
|
||||||
const Timeout allowForRemotePubInvocation = Timeout.factor(10.0);
|
|
||||||
|
|
||||||
/// Test case timeout for tests involving creating a Flutter project with
|
|
||||||
/// `--no-pub`. Use [allowForRemotePubInvocation] when creation involves `pub`.
|
|
||||||
const Timeout allowForCreateFlutterProject = Timeout.factor(3.0);
|
|
||||||
|
|
||||||
Future<void> expectToolExitLater(Future<dynamic> future, Matcher messageMatcher) async {
|
Future<void> expectToolExitLater(Future<dynamic> future, Matcher messageMatcher) async {
|
||||||
try {
|
try {
|
||||||
await future;
|
await future;
|
||||||
|
@ -48,7 +48,6 @@ typedef ContextInitializer = void Function(AppContext testContext);
|
|||||||
void testUsingContext(
|
void testUsingContext(
|
||||||
String description,
|
String description,
|
||||||
dynamic testMethod(), {
|
dynamic testMethod(), {
|
||||||
Timeout timeout,
|
|
||||||
Map<Type, Generator> overrides = const <Type, Generator>{},
|
Map<Type, Generator> overrides = const <Type, Generator>{},
|
||||||
bool initializeFlutterRoot = true,
|
bool initializeFlutterRoot = true,
|
||||||
String testOn,
|
String testOn,
|
||||||
@ -137,8 +136,7 @@ void testUsingContext(
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}, timeout: timeout ?? const Timeout(Duration(seconds: 60)),
|
}, testOn: testOn, skip: skip);
|
||||||
testOn: testOn, skip: skip);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _printBufferedErrors(AppContext testContext) {
|
void _printBufferedErrors(AppContext testContext) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user