Revert "Make the 'time to update' message depend up on the channel. (#24173)" (#24320)
This reverts commit 97e03104a0913886a666a36f5d11ab5763d45e6e.
Landing on red to hopefully make less red on the board.
TBR=@goderbauer
diff --git a/packages/flutter_tools/lib/src/version.dart b/packages/flutter_tools/lib/src/version.dart
index 9e3cb56..5f09e68 100644
--- a/packages/flutter_tools/lib/src/version.dart
+++ b/packages/flutter_tools/lib/src/version.dart
@@ -207,34 +207,20 @@
/// The amount of time we wait before pinging the server to check for the
/// availability of a newer version of Flutter.
@visibleForTesting
- static const Duration checkAgeConsideredUpToDate = Duration(days: 3);
+ static const Duration kCheckAgeConsideredUpToDate = Duration(days: 3);
/// We warn the user if the age of their Flutter installation is greater than
- /// this duration. The durations are slightly longer than the expected release
- /// cadence for each channel, to give the user a grace period before they get
- /// notified.
+ /// this duration.
///
- /// For example, for the beta channel, this is set to five weeks because
- /// beta releases happen approximately every month.
+ /// This is set to 5 weeks because releases are currently around every 4 weeks.
@visibleForTesting
- static Duration versionAgeConsideredUpToDate(String channel) {
- switch (channel) {
- case 'stable':
- return const Duration(days: 365 ~/ 2); // Six months
- case 'beta':
- return const Duration(days: 7 * 8); // Eight weeks
- case 'dev':
- return const Duration(days: 7 * 4); // Four weeks
- default:
- return const Duration(days: 7 * 3); // Three weeks
- }
- }
+ static const Duration kVersionAgeConsideredUpToDate = Duration(days: 35);
/// The amount of time we wait between issuing a warning.
///
/// This is to avoid annoying users who are unable to upgrade right away.
@visibleForTesting
- static const Duration maxTimeSinceLastWarning = Duration(days: 1);
+ static const Duration kMaxTimeSinceLastWarning = Duration(days: 1);
/// The amount of time we pause for to let the user read the message about
/// outdated Flutter installation.
@@ -252,7 +238,7 @@
static Future<void> resetFlutterVersionFreshnessCheck() async {
try {
await Cache.instance.getStampFileFor(
- VersionCheckStamp.flutterVersionCheckStampFile,
+ VersionCheckStamp.kFlutterVersionCheckStampFile,
).delete();
} on FileSystemException {
// Ignore, since we don't mind if the file didn't exist in the first place.
@@ -272,7 +258,7 @@
final DateTime localFrameworkCommitDate = DateTime.parse(frameworkCommitDate);
final Duration frameworkAge = _clock.now().difference(localFrameworkCommitDate);
- final bool installationSeemsOutdated = frameworkAge > versionAgeConsideredUpToDate(channel);
+ final bool installationSeemsOutdated = frameworkAge > kVersionAgeConsideredUpToDate;
// Get whether there's a newer version on the remote. This only goes
// to the server if we haven't checked recently so won't happen on every
@@ -287,8 +273,8 @@
// Do not load the stamp before the above server check as it may modify the stamp file.
final VersionCheckStamp stamp = await VersionCheckStamp.load();
- final DateTime lastTimeWarningWasPrinted = stamp.lastTimeWarningWasPrinted ?? _clock.ago(maxTimeSinceLastWarning * 2);
- final bool beenAWhileSinceWarningWasPrinted = _clock.now().difference(lastTimeWarningWasPrinted) > maxTimeSinceLastWarning;
+ final DateTime lastTimeWarningWasPrinted = stamp.lastTimeWarningWasPrinted ?? _clock.ago(kMaxTimeSinceLastWarning * 2);
+ final bool beenAWhileSinceWarningWasPrinted = _clock.now().difference(lastTimeWarningWasPrinted) > kMaxTimeSinceLastWarning;
// We show a warning if either we know there is a new remote version, or we couldn't tell but the local
// version is outdated.
@@ -341,7 +327,7 @@
/// Gets the release date of the latest available Flutter version.
///
/// This method sends a server request if it's been more than
- /// [checkAgeConsideredUpToDate] since the last version check.
+ /// [kCheckAgeConsideredUpToDate] since the last version check.
///
/// Returns null if the cached version is out-of-date or missing, and we are
/// unable to reach the server to get the latest version.
@@ -353,7 +339,7 @@
final Duration timeSinceLastCheck = _clock.now().difference(versionCheckStamp.lastTimeVersionWasChecked);
// Don't ping the server too often. Return cached value if it's fresh.
- if (timeSinceLastCheck < checkAgeConsideredUpToDate)
+ if (timeSinceLastCheck < kCheckAgeConsideredUpToDate)
return versionCheckStamp.lastKnownRemoteVersion;
}
@@ -395,10 +381,10 @@
/// The prefix of the stamp file where we cache Flutter version check data.
@visibleForTesting
- static const String flutterVersionCheckStampFile = 'flutter_version_check';
+ static const String kFlutterVersionCheckStampFile = 'flutter_version_check';
static Future<VersionCheckStamp> load() async {
- final String versionCheckStamp = Cache.instance.getStampFor(flutterVersionCheckStampFile);
+ final String versionCheckStamp = Cache.instance.getStampFor(kFlutterVersionCheckStampFile);
if (versionCheckStamp != null) {
// Attempt to parse stamp JSON.
@@ -449,8 +435,8 @@
if (newTimeWarningWasPrinted != null)
jsonData['lastTimeWarningWasPrinted'] = '$newTimeWarningWasPrinted';
- const JsonEncoder prettyJsonEncoder = JsonEncoder.withIndent(' ');
- Cache.instance.setStampFor(flutterVersionCheckStampFile, prettyJsonEncoder.convert(jsonData));
+ const JsonEncoder kPrettyJsonEncoder = JsonEncoder.withIndent(' ');
+ Cache.instance.setStampFor(kFlutterVersionCheckStampFile, kPrettyJsonEncoder.convert(jsonData));
}
Map<String, String> toJson({
diff --git a/packages/flutter_tools/test/channel_test.dart b/packages/flutter_tools/test/channel_test.dart
index 1e6ea10..a7bdf64 100644
--- a/packages/flutter_tools/test/channel_test.dart
+++ b/packages/flutter_tools/test/channel_test.dart
@@ -188,7 +188,7 @@
)).thenAnswer((_) => Future<Process>.value(createMockProcess()));
final File versionCheckFile = Cache.instance.getStampFileFor(
- VersionCheckStamp.flutterVersionCheckStampFile,
+ VersionCheckStamp.kFlutterVersionCheckStampFile,
);
/// Create a bogus "leftover" version check file to make sure it gets
diff --git a/packages/flutter_tools/test/version_test.dart b/packages/flutter_tools/test/version_test.dart
index 17963e3..5a1af43 100644
--- a/packages/flutter_tools/test/version_test.dart
+++ b/packages/flutter_tools/test/version_test.dart
@@ -19,8 +19,10 @@
import 'src/context.dart';
final SystemClock _testClock = SystemClock.fixed(DateTime(2015, 1, 1));
-final DateTime _stampUpToDate = _testClock.ago(FlutterVersion.checkAgeConsideredUpToDate ~/ 2);
-final DateTime _stampOutOfDate = _testClock.ago(FlutterVersion.checkAgeConsideredUpToDate * 2);
+final DateTime _upToDateVersion = _testClock.ago(FlutterVersion.kVersionAgeConsideredUpToDate ~/ 2);
+final DateTime _outOfDateVersion = _testClock.ago(FlutterVersion.kVersionAgeConsideredUpToDate * 2);
+final DateTime _stampUpToDate = _testClock.ago(FlutterVersion.kCheckAgeConsideredUpToDate ~/ 2);
+final DateTime _stampOutOfDate = _testClock.ago(FlutterVersion.kCheckAgeConsideredUpToDate * 2);
void main() {
MockProcessManager mockProcessManager;
@@ -31,363 +33,324 @@
mockCache = MockCache();
});
- for (String channel in FlutterVersion.officialChannels) {
- DateTime getChannelUpToDateVersion() {
- return _testClock.ago(FlutterVersion.versionAgeConsideredUpToDate(channel) ~/ 2);
- }
-
- DateTime getChannelOutOfDateVersion() {
- return _testClock.ago(FlutterVersion.versionAgeConsideredUpToDate(channel) * 2);
- }
-
- group('$FlutterVersion for $channel', () {
- setUpAll(() {
- Cache.disableLocking();
- FlutterVersion.timeToPauseToLetUserReadTheMessage = Duration.zero;
- });
-
- testUsingContext('prints nothing when Flutter installation looks fresh', () async {
- fakeData(
- mockProcessManager,
- mockCache,
- localCommitDate: getChannelUpToDateVersion(),
- // Server will be pinged because we haven't pinged within last x days
- expectServerPing: true,
- remoteCommitDate: getChannelOutOfDateVersion(),
- expectSetStamp: true,
- channel: channel,
- );
- await FlutterVersion.instance.checkFlutterVersionFreshness();
- _expectVersionMessage('');
- }, overrides: <Type, Generator>{
- FlutterVersion: () => FlutterVersion(_testClock),
- ProcessManager: () => mockProcessManager,
- Cache: () => mockCache,
- });
-
- testUsingContext('prints nothing when Flutter installation looks out-of-date but is actually up-to-date', () async {
- fakeData(
- mockProcessManager,
- mockCache,
- localCommitDate: getChannelOutOfDateVersion(),
- stamp: VersionCheckStamp(
- lastTimeVersionWasChecked: _stampOutOfDate,
- lastKnownRemoteVersion: getChannelOutOfDateVersion(),
- ),
- remoteCommitDate: getChannelOutOfDateVersion(),
- expectSetStamp: true,
- expectServerPing: true,
- channel: channel,
- );
- final FlutterVersion version = FlutterVersion.instance;
-
- await version.checkFlutterVersionFreshness();
- _expectVersionMessage('');
- }, overrides: <Type, Generator>{
- FlutterVersion: () => FlutterVersion(_testClock),
- ProcessManager: () => mockProcessManager,
- Cache: () => mockCache,
- });
-
- testUsingContext('does not ping server when version stamp is up-to-date', () async {
- fakeData(
- mockProcessManager,
- mockCache,
- localCommitDate: getChannelOutOfDateVersion(),
- stamp: VersionCheckStamp(
- lastTimeVersionWasChecked: _stampUpToDate,
- lastKnownRemoteVersion: getChannelUpToDateVersion(),
- ),
- expectSetStamp: true,
- channel: channel,
- );
-
- final FlutterVersion version = FlutterVersion.instance;
- await version.checkFlutterVersionFreshness();
- _expectVersionMessage(FlutterVersion.newVersionAvailableMessage());
- }, overrides: <Type, Generator>{
- FlutterVersion: () => FlutterVersion(_testClock),
- ProcessManager: () => mockProcessManager,
- Cache: () => mockCache,
- });
-
- testUsingContext('does not print warning if printed recently', () async {
- fakeData(
- mockProcessManager,
- mockCache,
- localCommitDate: getChannelOutOfDateVersion(),
- stamp: VersionCheckStamp(
- lastTimeVersionWasChecked: _stampUpToDate,
- lastKnownRemoteVersion: getChannelUpToDateVersion(),
- ),
- expectSetStamp: true,
- channel: channel,
- );
-
- final FlutterVersion version = FlutterVersion.instance;
- await version.checkFlutterVersionFreshness();
- _expectVersionMessage(FlutterVersion.newVersionAvailableMessage());
- expect((await VersionCheckStamp.load()).lastTimeWarningWasPrinted, _testClock.now());
-
- await version.checkFlutterVersionFreshness();
- _expectVersionMessage('');
- }, overrides: <Type, Generator>{
- FlutterVersion: () => FlutterVersion(_testClock),
- ProcessManager: () => mockProcessManager,
- Cache: () => mockCache,
- });
-
- testUsingContext('pings server when version stamp is missing then does not', () async {
- fakeData(
- mockProcessManager,
- mockCache,
- localCommitDate: getChannelOutOfDateVersion(),
- remoteCommitDate: getChannelUpToDateVersion(),
- expectSetStamp: true,
- expectServerPing: true,
- channel: channel,
- );
- final FlutterVersion version = FlutterVersion.instance;
-
- await version.checkFlutterVersionFreshness();
- _expectVersionMessage(FlutterVersion.newVersionAvailableMessage());
-
- // Immediate subsequent check is not expected to ping the server.
- fakeData(
- mockProcessManager,
- mockCache,
- localCommitDate: getChannelOutOfDateVersion(),
- stamp: await VersionCheckStamp.load(),
- channel: channel,
- );
- await version.checkFlutterVersionFreshness();
- _expectVersionMessage('');
- }, overrides: <Type, Generator>{
- FlutterVersion: () => FlutterVersion(_testClock),
- ProcessManager: () => mockProcessManager,
- Cache: () => mockCache,
- });
-
- testUsingContext('pings server when version stamp is out-of-date', () async {
- fakeData(
- mockProcessManager,
- mockCache,
- localCommitDate: getChannelOutOfDateVersion(),
- stamp: VersionCheckStamp(
- lastTimeVersionWasChecked: _stampOutOfDate,
- lastKnownRemoteVersion: _testClock.ago(const Duration(days: 2)),
- ),
- remoteCommitDate: getChannelUpToDateVersion(),
- expectSetStamp: true,
- expectServerPing: true,
- channel: channel,
- );
- final FlutterVersion version = FlutterVersion.instance;
-
- await version.checkFlutterVersionFreshness();
- _expectVersionMessage(FlutterVersion.newVersionAvailableMessage());
- }, overrides: <Type, Generator>{
- FlutterVersion: () => FlutterVersion(_testClock),
- ProcessManager: () => mockProcessManager,
- Cache: () => mockCache,
- });
-
- testUsingContext('does not print warning when unable to connect to server if not out of date', () async {
- fakeData(
- mockProcessManager,
- mockCache,
- localCommitDate: getChannelUpToDateVersion(),
- errorOnFetch: true,
- expectServerPing: true,
- expectSetStamp: true,
- channel: channel,
- );
- final FlutterVersion version = FlutterVersion.instance;
-
- await version.checkFlutterVersionFreshness();
- _expectVersionMessage('');
- }, overrides: <Type, Generator>{
- FlutterVersion: () => FlutterVersion(_testClock),
- ProcessManager: () => mockProcessManager,
- Cache: () => mockCache,
- });
-
- testUsingContext('prints warning when unable to connect to server if really out of date', () async {
- fakeData(
- mockProcessManager,
- mockCache,
- localCommitDate: getChannelOutOfDateVersion(),
- errorOnFetch: true,
- expectServerPing: true,
- expectSetStamp: true,
- channel: channel,
- );
- final FlutterVersion version = FlutterVersion.instance;
-
- await version.checkFlutterVersionFreshness();
- _expectVersionMessage(FlutterVersion.versionOutOfDateMessage(_testClock.now().difference(getChannelOutOfDateVersion())));
- }, overrides: <Type, Generator>{
- FlutterVersion: () => FlutterVersion(_testClock),
- ProcessManager: () => mockProcessManager,
- Cache: () => mockCache,
- });
-
- testUsingContext('versions comparison', () async {
- fakeData(
- mockProcessManager,
- mockCache,
- localCommitDate: getChannelOutOfDateVersion(),
- errorOnFetch: true,
- expectServerPing: true,
- expectSetStamp: true,
- channel: channel,
- );
- final FlutterVersion version = FlutterVersion.instance;
-
- when(mockProcessManager.runSync(
- <String>['git', 'merge-base', '--is-ancestor', 'abcdef', '123456'],
- workingDirectory: anyNamed('workingDirectory'),
- )).thenReturn(ProcessResult(1, 0, '', ''));
-
- expect(
- version.checkRevisionAncestry(
- tentativeDescendantRevision: '123456',
- tentativeAncestorRevision: 'abcdef',
- ),
- true);
-
- verify(mockProcessManager.runSync(
- <String>['git', 'merge-base', '--is-ancestor', 'abcdef', '123456'],
- workingDirectory: anyNamed('workingDirectory'),
- ));
- }, overrides: <Type, Generator>{
- FlutterVersion: () => FlutterVersion(_testClock),
- ProcessManager: () => mockProcessManager,
- });
+ group('$FlutterVersion', () {
+ setUpAll(() {
+ Cache.disableLocking();
+ FlutterVersion.timeToPauseToLetUserReadTheMessage = Duration.zero;
});
- group('$VersionCheckStamp for $channel', () {
- void _expectDefault(VersionCheckStamp stamp) {
- expect(stamp.lastKnownRemoteVersion, isNull);
- expect(stamp.lastTimeVersionWasChecked, isNull);
- expect(stamp.lastTimeWarningWasPrinted, isNull);
- }
+ testUsingContext('prints nothing when Flutter installation looks fresh', () async {
+ fakeData(
+ mockProcessManager,
+ mockCache,
+ localCommitDate: _upToDateVersion,
+ // Server will be pinged because we haven't pinged within last x days
+ expectServerPing: true,
+ remoteCommitDate: _outOfDateVersion,
+ expectSetStamp: true);
+ await FlutterVersion.instance.checkFlutterVersionFreshness();
+ _expectVersionMessage('');
+ }, overrides: <Type, Generator>{
+ FlutterVersion: () => FlutterVersion(_testClock),
+ ProcessManager: () => mockProcessManager,
+ Cache: () => mockCache,
+ });
- testUsingContext('loads blank when stamp file missing', () async {
- fakeData(mockProcessManager, mockCache, channel: channel);
- _expectDefault(await VersionCheckStamp.load());
- }, overrides: <Type, Generator>{
- FlutterVersion: () => FlutterVersion(_testClock),
- ProcessManager: () => mockProcessManager,
- Cache: () => mockCache,
- });
+ testUsingContext('prints nothing when Flutter installation looks out-of-date by is actually up-to-date', () async {
+ fakeData(
+ mockProcessManager,
+ mockCache,
+ localCommitDate: _outOfDateVersion,
+ stamp: VersionCheckStamp(
+ lastTimeVersionWasChecked: _stampOutOfDate,
+ lastKnownRemoteVersion: _outOfDateVersion,
+ ),
+ remoteCommitDate: _outOfDateVersion,
+ expectSetStamp: true,
+ expectServerPing: true,
+ );
+ final FlutterVersion version = FlutterVersion.instance;
- testUsingContext('loads blank when stamp file is malformed JSON', () async {
- fakeData(mockProcessManager, mockCache, stampJson: '<', channel: channel);
- _expectDefault(await VersionCheckStamp.load());
- }, overrides: <Type, Generator>{
- FlutterVersion: () => FlutterVersion(_testClock),
- ProcessManager: () => mockProcessManager,
- Cache: () => mockCache,
- });
+ await version.checkFlutterVersionFreshness();
+ _expectVersionMessage('');
+ }, overrides: <Type, Generator>{
+ FlutterVersion: () => FlutterVersion(_testClock),
+ ProcessManager: () => mockProcessManager,
+ Cache: () => mockCache,
+ });
- testUsingContext('loads blank when stamp file is well-formed but invalid JSON', () async {
- fakeData(
+ testUsingContext('does not ping server when version stamp is up-to-date', () async {
+ fakeData(
+ mockProcessManager,
+ mockCache,
+ localCommitDate: _outOfDateVersion,
+ stamp: VersionCheckStamp(
+ lastTimeVersionWasChecked: _stampUpToDate,
+ lastKnownRemoteVersion: _upToDateVersion,
+ ),
+ expectSetStamp: true,
+ );
+
+ final FlutterVersion version = FlutterVersion.instance;
+ await version.checkFlutterVersionFreshness();
+ _expectVersionMessage(FlutterVersion.newVersionAvailableMessage());
+ }, overrides: <Type, Generator>{
+ FlutterVersion: () => FlutterVersion(_testClock),
+ ProcessManager: () => mockProcessManager,
+ Cache: () => mockCache,
+ });
+
+ testUsingContext('does not print warning if printed recently', () async {
+ fakeData(
+ mockProcessManager,
+ mockCache,
+ localCommitDate: _outOfDateVersion,
+ stamp: VersionCheckStamp(
+ lastTimeVersionWasChecked: _stampUpToDate,
+ lastKnownRemoteVersion: _upToDateVersion,
+ ),
+ expectSetStamp: true,
+ );
+
+ final FlutterVersion version = FlutterVersion.instance;
+ await version.checkFlutterVersionFreshness();
+ _expectVersionMessage(FlutterVersion.newVersionAvailableMessage());
+ expect((await VersionCheckStamp.load()).lastTimeWarningWasPrinted, _testClock.now());
+
+ await version.checkFlutterVersionFreshness();
+ _expectVersionMessage('');
+ }, overrides: <Type, Generator>{
+ FlutterVersion: () => FlutterVersion(_testClock),
+ ProcessManager: () => mockProcessManager,
+ Cache: () => mockCache,
+ });
+
+ testUsingContext('pings server when version stamp is missing then does not', () async {
+ fakeData(
+ mockProcessManager,
+ mockCache,
+ localCommitDate: _outOfDateVersion,
+ remoteCommitDate: _upToDateVersion,
+ expectSetStamp: true,
+ expectServerPing: true,
+ );
+ final FlutterVersion version = FlutterVersion.instance;
+
+ await version.checkFlutterVersionFreshness();
+ _expectVersionMessage(FlutterVersion.newVersionAvailableMessage());
+
+ // Immediate subsequent check is not expected to ping the server.
+ fakeData(
+ mockProcessManager,
+ mockCache,
+ localCommitDate: _outOfDateVersion,
+ stamp: await VersionCheckStamp.load(),
+ );
+ await version.checkFlutterVersionFreshness();
+ _expectVersionMessage('');
+ }, overrides: <Type, Generator>{
+ FlutterVersion: () => FlutterVersion(_testClock),
+ ProcessManager: () => mockProcessManager,
+ Cache: () => mockCache,
+ });
+
+ testUsingContext('pings server when version stamp is out-of-date', () async {
+ fakeData(
+ mockProcessManager,
+ mockCache,
+ localCommitDate: _outOfDateVersion,
+ stamp: VersionCheckStamp(
+ lastTimeVersionWasChecked: _stampOutOfDate,
+ lastKnownRemoteVersion: _testClock.ago(const Duration(days: 2)),
+ ),
+ remoteCommitDate: _upToDateVersion,
+ expectSetStamp: true,
+ expectServerPing: true,
+ );
+ final FlutterVersion version = FlutterVersion.instance;
+
+ await version.checkFlutterVersionFreshness();
+ _expectVersionMessage(FlutterVersion.newVersionAvailableMessage());
+ }, overrides: <Type, Generator>{
+ FlutterVersion: () => FlutterVersion(_testClock),
+ ProcessManager: () => mockProcessManager,
+ Cache: () => mockCache,
+ });
+
+ testUsingContext('does not print warning when unable to connect to server if not out of date', () async {
+ fakeData(
+ mockProcessManager,
+ mockCache,
+ localCommitDate: _upToDateVersion,
+ errorOnFetch: true,
+ expectServerPing: true,
+ expectSetStamp: true,
+ );
+ final FlutterVersion version = FlutterVersion.instance;
+
+ await version.checkFlutterVersionFreshness();
+ _expectVersionMessage('');
+ }, overrides: <Type, Generator>{
+ FlutterVersion: () => FlutterVersion(_testClock),
+ ProcessManager: () => mockProcessManager,
+ Cache: () => mockCache,
+ });
+
+ testUsingContext('prints warning when unable to connect to server if really out of date', () async {
+ fakeData(
+ mockProcessManager,
+ mockCache,
+ localCommitDate: _outOfDateVersion,
+ errorOnFetch: true,
+ expectServerPing: true,
+ expectSetStamp: true
+ );
+ final FlutterVersion version = FlutterVersion.instance;
+
+ await version.checkFlutterVersionFreshness();
+ _expectVersionMessage(FlutterVersion.versionOutOfDateMessage(_testClock.now().difference(_outOfDateVersion)));
+ }, overrides: <Type, Generator>{
+ FlutterVersion: () => FlutterVersion(_testClock),
+ ProcessManager: () => mockProcessManager,
+ Cache: () => mockCache,
+ });
+
+ testUsingContext('versions comparison', () async {
+ fakeData(
mockProcessManager,
mockCache,
- stampJson: '[]',
- channel: channel,
- );
- _expectDefault(await VersionCheckStamp.load());
- }, overrides: <Type, Generator>{
- FlutterVersion: () => FlutterVersion(_testClock),
- ProcessManager: () => mockProcessManager,
- Cache: () => mockCache,
- });
+ localCommitDate: _outOfDateVersion,
+ errorOnFetch: true,
+ expectServerPing: true,
+ expectSetStamp: true
+ );
+ final FlutterVersion version = FlutterVersion.instance;
- testUsingContext('loads valid JSON', () async {
- fakeData(
- mockProcessManager,
- mockCache,
- stampJson: '''
+ when(mockProcessManager.runSync(
+ <String>['git', 'merge-base', '--is-ancestor', 'abcdef', '123456'],
+ workingDirectory: anyNamed('workingDirectory'),
+ )).thenReturn(ProcessResult(1, 0, '', ''));
+
+ expect(
+ version.checkRevisionAncestry(
+ tentativeDescendantRevision: '123456',
+ tentativeAncestorRevision: 'abcdef',
+ ),
+ true
+ );
+
+ verify(mockProcessManager.runSync(
+ <String>['git', 'merge-base', '--is-ancestor', 'abcdef', '123456'],
+ workingDirectory: anyNamed('workingDirectory'),
+ ));
+ },
+ overrides: <Type, Generator>{
+ FlutterVersion: () => FlutterVersion(_testClock),
+ ProcessManager: () => mockProcessManager,
+ });
+ });
+
+ group('$VersionCheckStamp', () {
+ void _expectDefault(VersionCheckStamp stamp) {
+ expect(stamp.lastKnownRemoteVersion, isNull);
+ expect(stamp.lastTimeVersionWasChecked, isNull);
+ expect(stamp.lastTimeWarningWasPrinted, isNull);
+ }
+
+ testUsingContext('loads blank when stamp file missing', () async {
+ fakeData(mockProcessManager, mockCache);
+ _expectDefault(await VersionCheckStamp.load());
+ }, overrides: <Type, Generator>{
+ FlutterVersion: () => FlutterVersion(_testClock),
+ ProcessManager: () => mockProcessManager,
+ Cache: () => mockCache,
+ });
+
+ testUsingContext('loads blank when stamp file is malformed JSON', () async {
+ fakeData(mockProcessManager, mockCache, stampJson: '<');
+ _expectDefault(await VersionCheckStamp.load());
+ }, overrides: <Type, Generator>{
+ FlutterVersion: () => FlutterVersion(_testClock),
+ ProcessManager: () => mockProcessManager,
+ Cache: () => mockCache,
+ });
+
+ testUsingContext('loads blank when stamp file is well-formed but invalid JSON', () async {
+ fakeData(mockProcessManager, mockCache, stampJson: '[]');
+ _expectDefault(await VersionCheckStamp.load());
+ }, overrides: <Type, Generator>{
+ FlutterVersion: () => FlutterVersion(_testClock),
+ ProcessManager: () => mockProcessManager,
+ Cache: () => mockCache,
+ });
+
+ testUsingContext('loads valid JSON', () async {
+ fakeData(mockProcessManager, mockCache, stampJson: '''
{
"lastKnownRemoteVersion": "${_testClock.ago(const Duration(days: 1))}",
"lastTimeVersionWasChecked": "${_testClock.ago(const Duration(days: 2))}",
"lastTimeWarningWasPrinted": "${_testClock.now()}"
}
- ''',
- channel: channel,
- );
+ ''');
- final VersionCheckStamp stamp = await VersionCheckStamp.load();
- expect(stamp.lastKnownRemoteVersion, _testClock.ago(const Duration(days: 1)));
- expect(stamp.lastTimeVersionWasChecked, _testClock.ago(const Duration(days: 2)));
- expect(stamp.lastTimeWarningWasPrinted, _testClock.now());
- }, overrides: <Type, Generator>{
- FlutterVersion: () => FlutterVersion(_testClock),
- ProcessManager: () => mockProcessManager,
- Cache: () => mockCache,
- });
-
- testUsingContext('stores version stamp', () async {
- fakeData(
- mockProcessManager,
- mockCache,
- expectSetStamp: true,
- channel: channel,
- );
-
- _expectDefault(await VersionCheckStamp.load());
-
- final VersionCheckStamp stamp = VersionCheckStamp(
- lastKnownRemoteVersion: _testClock.ago(const Duration(days: 1)),
- lastTimeVersionWasChecked: _testClock.ago(const Duration(days: 2)),
- lastTimeWarningWasPrinted: _testClock.now(),
- );
- await stamp.store();
-
- final VersionCheckStamp storedStamp = await VersionCheckStamp.load();
- expect(storedStamp.lastKnownRemoteVersion, _testClock.ago(const Duration(days: 1)));
- expect(storedStamp.lastTimeVersionWasChecked, _testClock.ago(const Duration(days: 2)));
- expect(storedStamp.lastTimeWarningWasPrinted, _testClock.now());
- }, overrides: <Type, Generator>{
- FlutterVersion: () => FlutterVersion(_testClock),
- ProcessManager: () => mockProcessManager,
- Cache: () => mockCache,
- });
-
- testUsingContext('overwrites individual fields', () async {
- fakeData(
- mockProcessManager,
- mockCache,
- expectSetStamp: true,
- channel: channel,
- );
-
- _expectDefault(await VersionCheckStamp.load());
-
- final VersionCheckStamp stamp = VersionCheckStamp(
- lastKnownRemoteVersion: _testClock.ago(const Duration(days: 10)),
- lastTimeVersionWasChecked: _testClock.ago(const Duration(days: 9)),
- lastTimeWarningWasPrinted: _testClock.ago(const Duration(days: 8)),
- );
- await stamp.store(
- newKnownRemoteVersion: _testClock.ago(const Duration(days: 1)),
- newTimeVersionWasChecked: _testClock.ago(const Duration(days: 2)),
- newTimeWarningWasPrinted: _testClock.now(),
- );
-
- final VersionCheckStamp storedStamp = await VersionCheckStamp.load();
- expect(storedStamp.lastKnownRemoteVersion, _testClock.ago(const Duration(days: 1)));
- expect(storedStamp.lastTimeVersionWasChecked, _testClock.ago(const Duration(days: 2)));
- expect(storedStamp.lastTimeWarningWasPrinted, _testClock.now());
- }, overrides: <Type, Generator>{
- FlutterVersion: () => FlutterVersion(_testClock),
- ProcessManager: () => mockProcessManager,
- Cache: () => mockCache,
- });
+ final VersionCheckStamp stamp = await VersionCheckStamp.load();
+ expect(stamp.lastKnownRemoteVersion, _testClock.ago(const Duration(days: 1)));
+ expect(stamp.lastTimeVersionWasChecked, _testClock.ago(const Duration(days: 2)));
+ expect(stamp.lastTimeWarningWasPrinted, _testClock.now());
+ }, overrides: <Type, Generator>{
+ FlutterVersion: () => FlutterVersion(_testClock),
+ ProcessManager: () => mockProcessManager,
+ Cache: () => mockCache,
});
- }
+
+ testUsingContext('stores version stamp', () async {
+ fakeData(mockProcessManager, mockCache, expectSetStamp: true);
+
+ _expectDefault(await VersionCheckStamp.load());
+
+ final VersionCheckStamp stamp = VersionCheckStamp(
+ lastKnownRemoteVersion: _testClock.ago(const Duration(days: 1)),
+ lastTimeVersionWasChecked: _testClock.ago(const Duration(days: 2)),
+ lastTimeWarningWasPrinted: _testClock.now(),
+ );
+ await stamp.store();
+
+ final VersionCheckStamp storedStamp = await VersionCheckStamp.load();
+ expect(storedStamp.lastKnownRemoteVersion, _testClock.ago(const Duration(days: 1)));
+ expect(storedStamp.lastTimeVersionWasChecked, _testClock.ago(const Duration(days: 2)));
+ expect(storedStamp.lastTimeWarningWasPrinted, _testClock.now());
+ }, overrides: <Type, Generator>{
+ FlutterVersion: () => FlutterVersion(_testClock),
+ ProcessManager: () => mockProcessManager,
+ Cache: () => mockCache,
+ });
+
+ testUsingContext('overwrites individual fields', () async {
+ fakeData(mockProcessManager, mockCache, expectSetStamp: true);
+
+ _expectDefault(await VersionCheckStamp.load());
+
+ final VersionCheckStamp stamp = VersionCheckStamp(
+ lastKnownRemoteVersion: _testClock.ago(const Duration(days: 10)),
+ lastTimeVersionWasChecked: _testClock.ago(const Duration(days: 9)),
+ lastTimeWarningWasPrinted: _testClock.ago(const Duration(days: 8)),
+ );
+ await stamp.store(
+ newKnownRemoteVersion: _testClock.ago(const Duration(days: 1)),
+ newTimeVersionWasChecked: _testClock.ago(const Duration(days: 2)),
+ newTimeWarningWasPrinted: _testClock.now(),
+ );
+
+ final VersionCheckStamp storedStamp = await VersionCheckStamp.load();
+ expect(storedStamp.lastKnownRemoteVersion, _testClock.ago(const Duration(days: 1)));
+ expect(storedStamp.lastTimeVersionWasChecked, _testClock.ago(const Duration(days: 2)));
+ expect(storedStamp.lastTimeWarningWasPrinted, _testClock.now());
+ }, overrides: <Type, Generator>{
+ FlutterVersion: () => FlutterVersion(_testClock),
+ ProcessManager: () => mockProcessManager,
+ Cache: () => mockCache,
+ });
+ });
}
void _expectVersionMessage(String message) {
@@ -406,7 +369,6 @@
bool errorOnFetch = false,
bool expectSetStamp = false,
bool expectServerPing = false,
- String channel = 'master',
}) {
ProcessResult success(String standardOutput) {
return ProcessResult(1, 0, standardOutput, '');
@@ -417,21 +379,19 @@
}
when(cache.getStampFor(any)).thenAnswer((Invocation invocation) {
- expect(invocation.positionalArguments.single, VersionCheckStamp.flutterVersionCheckStampFile);
+ expect(invocation.positionalArguments.single, VersionCheckStamp.kFlutterVersionCheckStampFile);
- if (stampJson != null) {
+ if (stampJson != null)
return stampJson;
- }
- if (stamp != null) {
+ if (stamp != null)
return json.encode(stamp.toJson());
- }
return null;
});
when(cache.setStampFor(any, any)).thenAnswer((Invocation invocation) {
- expect(invocation.positionalArguments.first, VersionCheckStamp.flutterVersionCheckStampFile);
+ expect(invocation.positionalArguments.first, VersionCheckStamp.kFlutterVersionCheckStampFile);
if (expectSetStamp) {
stamp = VersionCheckStamp.fromJson(json.decode(invocation.positionalArguments[1]));
@@ -445,7 +405,10 @@
bool argsAre(String a1, [String a2, String a3, String a4, String a5, String a6, String a7, String a8]) {
const ListEquality<String> equality = ListEquality<String>();
final List<String> args = invocation.positionalArguments.single;
- final List<String> expectedArgs = <String>[a1, a2, a3, a4, a5, a6, a7, a8].where((String arg) => arg != null).toList();
+ final List<String> expectedArgs =
+ <String>[a1, a2, a3, a4, a5, a6, a7, a8]
+ .where((String arg) => arg != null)
+ .toList();
return equality.equals(args, expectedArgs);
}
@@ -455,12 +418,11 @@
return success('');
} else if (argsAre('git', 'remote', 'add', '__flutter_version_check__', 'https://github.com/flutter/flutter.git')) {
return success('');
- } else if (argsAre('git', 'fetch', '__flutter_version_check__', channel)) {
- if (!expectServerPing) {
+ } else if (argsAre('git', 'fetch', '__flutter_version_check__', 'master')) {
+ if (!expectServerPing)
fail('Did not expect server ping');
- }
return errorOnFetch ? failure(128) : success('');
- } else if (remoteCommitDate != null && argsAre('git', 'log', '__flutter_version_check__/$channel', '-n', '1', '--pretty=format:%ad', '--date=iso')) {
+ } else if (remoteCommitDate != null && argsAre('git', 'log', '__flutter_version_check__/master', '-n', '1', '--pretty=format:%ad', '--date=iso')) {
return success(remoteCommitDate.toString());
}
@@ -476,7 +438,7 @@
<String>['git', 'rev-parse', '--abbrev-ref', '--symbolic', '@{u}'],
workingDirectory: anyNamed('workingDirectory'),
environment: anyNamed('environment'),
- )).thenReturn(ProcessResult(101, 0, channel, ''));
+ )).thenReturn(ProcessResult(101, 0, 'master', ''));
when(pm.runSync(
<String>['git', 'rev-parse', '--abbrev-ref', 'HEAD'],
workingDirectory: anyNamed('workingDirectory'),
@@ -500,5 +462,4 @@
}
class MockProcessManager extends Mock implements ProcessManager {}
-
class MockCache extends Mock implements Cache {}