diff --git a/Classes/BITStoreUpdateManager.m b/Classes/BITStoreUpdateManager.m index 276a354194..0ba5a26ae0 100644 --- a/Classes/BITStoreUpdateManager.m +++ b/Classes/BITStoreUpdateManager.m @@ -199,7 +199,7 @@ #pragma mark - Time -- (BOOL)shouldCheckForUpdates { +- (BOOL)shouldAutoCheckForUpdates { BOOL checkForUpdate = NO; switch (self.updateSetting) { @@ -275,7 +275,7 @@ self.checkInProgress = YES; // do we need to update? - if (!manual && ![self shouldCheckForUpdates]) { + if (!manual && ![self shouldAutoCheckForUpdates]) { BITHockeyLog(@"INFO: Update check not needed right now"); self.checkInProgress = NO; return; @@ -342,7 +342,7 @@ self.lastCheck = [NSDate distantPast]; } - if ([self isCheckingForUpdateOnLaunch] && [self shouldCheckForUpdates]) { + if ([self isCheckingForUpdateOnLaunch] && [self shouldAutoCheckForUpdates]) { [self performSelector:@selector(checkForUpdateDelayed) withObject:nil afterDelay:1.0f]; } diff --git a/Classes/BITStoreUpdateManagerPrivate.h b/Classes/BITStoreUpdateManagerPrivate.h index 4924597430..ce2e622edb 100644 --- a/Classes/BITStoreUpdateManagerPrivate.h +++ b/Classes/BITStoreUpdateManagerPrivate.h @@ -52,6 +52,7 @@ @property (nonatomic, assign) NSLocale *currentLocale; @property (nonatomic, assign) NSUserDefaults *userDefaults; +- (BOOL)shouldAutoCheckForUpdates; - (BOOL)hasNewVersion:(NSDictionary *)dictionary; - (BOOL)processStoreResponseWithString:(NSString *)responseString; - (void)checkForUpdateDelayed; diff --git a/Support/HockeySDKTests/BITStoreUpdateManagerTests.m b/Support/HockeySDKTests/BITStoreUpdateManagerTests.m index 4769011bb0..8deeb413f7 100644 --- a/Support/HockeySDKTests/BITStoreUpdateManagerTests.m +++ b/Support/HockeySDKTests/BITStoreUpdateManagerTests.m @@ -69,6 +69,104 @@ #pragma mark - Time +- (void)testUpdateCheckDailyFirstTimeEver { + NSUserDefaults *mockUserDefaults = mock([NSUserDefaults class]); + _storeUpdateManager.userDefaults = mockUserDefaults; + + [self startManager]; + + BOOL result = [_storeUpdateManager shouldAutoCheckForUpdates]; + + STAssertTrue(result, @"Checking daily first time ever"); +} + +- (void)testUpdateCheckDailyFirstTimeTodayLastCheckPreviousDay { + NSUserDefaults *mockUserDefaults = mock([NSUserDefaults class]); + _storeUpdateManager.userDefaults = mockUserDefaults; + _storeUpdateManager.lastCheck = [NSDate dateWithTimeIntervalSinceNow:-(60*60*24)]; + + [self startManager]; + + BOOL result = [_storeUpdateManager shouldAutoCheckForUpdates]; + + STAssertTrue(result, @"Checking daily first time today with last check done previous day"); +} + +- (void)testUpdateCheckDailySecondTimeOfTheDay { + NSUserDefaults *mockUserDefaults = mock([NSUserDefaults class]); + _storeUpdateManager.userDefaults = mockUserDefaults; + _storeUpdateManager.lastCheck = [NSDate date]; + + [self startManager]; + + BOOL result = [_storeUpdateManager shouldAutoCheckForUpdates]; + + STAssertFalse(result, @"Checking daily second time of the day"); +} + +- (void)testUpdateCheckWeeklyFirstTimeEver { + NSUserDefaults *mockUserDefaults = mock([NSUserDefaults class]); + _storeUpdateManager.userDefaults = mockUserDefaults; + _storeUpdateManager.updateSetting = BITStoreUpdateCheckWeekly; + + [self startManager]; + + BOOL result = [_storeUpdateManager shouldAutoCheckForUpdates]; + + STAssertTrue(result, @"Checking weekly first time ever"); +} + +- (void)testUpdateCheckWeeklyFirstTimeTodayLastCheckPreviousWeek { + NSUserDefaults *mockUserDefaults = mock([NSUserDefaults class]); + _storeUpdateManager.userDefaults = mockUserDefaults; + _storeUpdateManager.updateSetting = BITStoreUpdateCheckWeekly; + _storeUpdateManager.lastCheck = [NSDate dateWithTimeIntervalSinceNow:-(60*60*24*7)]; + + [self startManager]; + + BOOL result = [_storeUpdateManager shouldAutoCheckForUpdates]; + + STAssertTrue(result, @"Checking weekly first time after one week"); +} + +- (void)testUpdateCheckWeeklyFirstTimeFiveDaysAfterPreviousCheck { + NSUserDefaults *mockUserDefaults = mock([NSUserDefaults class]); + _storeUpdateManager.userDefaults = mockUserDefaults; + _storeUpdateManager.updateSetting = BITStoreUpdateCheckWeekly; + _storeUpdateManager.lastCheck = [NSDate dateWithTimeIntervalSinceNow:-(60*60*24*5)]; + + [self startManager]; + + BOOL result = [_storeUpdateManager shouldAutoCheckForUpdates]; + + STAssertFalse(result, @"Checking weekly first time five days after previous check"); +} + +- (void)testUpdateCheckManuallyFirstTimeEver { + NSUserDefaults *mockUserDefaults = mock([NSUserDefaults class]); + _storeUpdateManager.userDefaults = mockUserDefaults; + _storeUpdateManager.updateSetting = BITStoreUpdateCheckManually; + + [self startManager]; + + BOOL result = [_storeUpdateManager shouldAutoCheckForUpdates]; + + STAssertFalse(result, @"Checking manually first time ever"); +} + +- (void)testUpdateCheckManuallyFirstTimeTodayLastCheckDonePreviousDay { + NSUserDefaults *mockUserDefaults = mock([NSUserDefaults class]); + _storeUpdateManager.userDefaults = mockUserDefaults; + _storeUpdateManager.updateSetting = BITStoreUpdateCheckManually; + _storeUpdateManager.lastCheck = [NSDate dateWithTimeIntervalSinceNow:-(60*60*24)]; + + [self startManager]; + + BOOL result = [_storeUpdateManager shouldAutoCheckForUpdates]; + + STAssertFalse(result, @"Checking manually first time ever"); +} + #pragma mark - JSON Response Processing @@ -179,4 +277,36 @@ STAssertFalse(result, @"There is no udpate available"); } +- (void)testReportedVersionIsBeingIgnored { + NSUserDefaults *mockUserDefaults = mock([NSUserDefaults class]); + [given([mockUserDefaults objectForKey:@"BITStoreUpdateLastStoreVersion"]) willReturn:@"4.1.1"]; + [given([mockUserDefaults objectForKey:@"BITStoreUpdateLastUUID"]) willReturn:@""]; + [given([mockUserDefaults objectForKey:@"BITStoreUpdateIgnoredVersion"]) willReturn:@"4.1.2"]; + _storeUpdateManager.userDefaults = mockUserDefaults; + + [self startManager]; + + NSDictionary *json = [self jsonFromFixture:@"StoreBundleIdentifierKnown"]; + + BOOL result = [_storeUpdateManager hasNewVersion:json]; + + STAssertFalse(result, @"The newer version is being ignored"); +} + +- (void)testReportedVersionIsNewerThanTHeIgnoredVersion { + NSUserDefaults *mockUserDefaults = mock([NSUserDefaults class]); + [given([mockUserDefaults objectForKey:@"BITStoreUpdateLastStoreVersion"]) willReturn:@"4.1.1"]; + [given([mockUserDefaults objectForKey:@"BITStoreUpdateLastUUID"]) willReturn:@""]; + [given([mockUserDefaults objectForKey:@"BITStoreUpdateIgnoredVersion"]) willReturn:@"4.1.1"]; + _storeUpdateManager.userDefaults = mockUserDefaults; + + [self startManager]; + + NSDictionary *json = [self jsonFromFixture:@"StoreBundleIdentifierKnown"]; + + BOOL result = [_storeUpdateManager hasNewVersion:json]; + + STAssertTrue(result, @"The newer version is not ignored"); +} + @end