Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Reland] Add migrator to upgrade gradle version when conflict with Android Studio bundled Java version is detected #125836

Merged
merged 13 commits into from May 3, 2023
Merged
Expand Up @@ -20,7 +20,7 @@ import '../gradle_utils.dart';
@visibleForTesting
final Version androidStudioFlamingo = Version(2022, 2, 0);

const String _gradleVersion7_6_1 = r'7.6.1';
const String gradleVersion7_6_1 = r'7.6.1';
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this should be annotated @VisibleForTesting


// String that can be placed in the gradle-wrapper.properties to opt out of this
// migrator.
Expand Down Expand Up @@ -151,10 +151,10 @@ class AndroidStudioJavaGradleConflictMigration extends ProjectMigrator {
final String existingVersionString = gradleDistributionUrl[1]!;
if (gradleVersionsToUpgradeFrom.contains(existingVersionString)) {
logger.printStatus('Conflict detected between Android Studio Java version and Gradle version, '
'upgrading Gradle version from $existingVersionString to $_gradleVersion7_6_1.');
'upgrading Gradle version from $existingVersionString to $gradleVersion7_6_1.');
final String gradleDistributionUrlString = gradleDistributionUrl.group(0)!;
final String upgradedDistributionUrl =
gradleDistributionUrlString.replaceAll(existingVersionString, _gradleVersion7_6_1);
gradleDistributionUrlString.replaceAll(existingVersionString, gradleVersion7_6_1);
fileContents = fileContents.replaceFirst(gradleOrgVersionMatch, upgradedDistributionUrl);
}
return fileContents;
Expand Down
Expand Up @@ -186,6 +186,24 @@ tasks.register("clean", Delete) {
gradleWrapperToMigrate);
});

testWithoutContext('skipped if error is encountered in migrate()', () {
final AndroidStudioJavaGradleConflictMigration migration = AndroidStudioJavaGradleConflictMigration(
bufferLogger,
project: project,
androidStudio: FakeAndroidStudio(version: androidStudioFlamingo),
fileSystem: FakeFileSystem(),
processUtils: FakeProcessUtils(),
platform: FakePlatform(),
os: FakeOperatingSystemUtils(),
androidSdk: FakeErroringAndroidSdk(javaVersion: '17'),
);
gradleWrapperPropertiesFile.writeAsStringSync(gradleWrapperToMigrate);
migration.migrate();
expect(bufferLogger.traceText, contains(errorWhileMigrating));
expect(gradleWrapperPropertiesFile.readAsStringSync(),
gradleWrapperToMigrate);
});

testWithoutContext('skipped if android studio version is less than flamingo', () {
reidbaker marked this conversation as resolved.
Show resolved Hide resolved
final AndroidStudioJavaGradleConflictMigration migration = AndroidStudioJavaGradleConflictMigration(
bufferLogger,
Expand Down Expand Up @@ -253,8 +271,9 @@ tasks.register("clean", Delete) {
gradleWrapperPropertiesFile.writeAsStringSync(gradleWrapperToMigrate);
migration.migrate();
expect(gradleWrapperPropertiesFile.readAsStringSync(), gradleWrapperToMigrateTo);
expect(bufferLogger.statusText, contains('Conflict detected between Android Studio Java version and Gradle version, '
'upgrading Gradle version from 6.7 to 7.6.1.'));
expect(bufferLogger.statusText, contains('Conflict detected between '
'Android Studio Java version and Gradle version, upgrading Gradle '
'version from 6.7 to $gradleVersion7_6_1.'));
});

testWithoutContext('change is not made when opt out flag is set', () {
Expand Down Expand Up @@ -314,6 +333,25 @@ class FakeAndroidSdk extends Fake implements AndroidSdk {
}
}

class FakeErroringAndroidSdk extends Fake implements AndroidSdk {
FakeErroringAndroidSdk({required String javaVersion}) {
_javaVersion = javaVersion;
}

late String _javaVersion;

@override
String? getJavaVersion({
required AndroidStudio? androidStudio,
required FileSystem fileSystem,
required OperatingSystemUtils operatingSystemUtils,
required Platform platform,
required ProcessUtils processUtils,
}) {
throw const FileSystemException();
}
}

class FakeFileSystem extends Fake implements FileSystem {}
class FakeProcessUtils extends Fake implements ProcessUtils {}
class FakePlatform extends Fake implements Platform {}
Expand Down