diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/versionChecker/VersionCheckerUtils.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/versionChecker/VersionCheckerUtils.kt index a7d167d801..c1378451df 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/versionChecker/VersionCheckerUtils.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/versionChecker/VersionCheckerUtils.kt @@ -23,7 +23,7 @@ fun isConnected(): Boolean { // convert inputstream to String @Throws(IOException::class) -fun InputStream.findVersion(): String? { +inline fun InputStream.findVersion(): String? { val regex = "(.*)version(.*)\"(((\\d+)\\.)+(\\d+))\"(.*)".toRegex() return bufferedReader() .readLines() @@ -41,19 +41,31 @@ fun checkVersion() = if (isConnected()) { val request = HttpGet("https://raw.githubusercontent.com/MilosKozak/AndroidAPS/master/app/build.gradle") val response: HttpResponse = DefaultHttpClient().execute(request) val version: String? = response.entity.content?.findVersion() - val comparison = version?.compareTo(BuildConfig.VERSION_NAME.replace("\"", "")) ?: 0 - if (comparison == 0) { - log.debug("Version equal to master of fetch failed") - } else if (comparison > 0) { - log.debug("Version outdated. Found $version") - val notification = Notification(Notification.NEWVERSIONDETECTED, String.format(MainApp.gs(R.string.versionavailable), version.toString()), Notification.LOW) - MainApp.bus().post(EventNewNotification(notification)) - } else { - log.debug("Version newer than master. Are you developer?") - } + compareWithCurrentVersion(version, BuildConfig.VERSION_NAME) } catch (e: IOException) { log.debug("Github master version check error: $e") } }.start() } else - log.debug("Github master version no checked. No connectivity") \ No newline at end of file + log.debug("Github master version no checked. No connectivity") + +fun compareWithCurrentVersion(newVersion: String?, currentVersion: String) { + val comparison = newVersion?.versionStrip()?.compareTo(currentVersion.versionStrip()) ?: 0 + when { + comparison == 0 -> log.debug("Version equal to master of fetch failed") + comparison > 0 -> { + log.debug("Version ${currentVersion} outdated. Found $newVersion") + val notification = Notification(Notification.NEWVERSIONDETECTED, String.format(MainApp.gs(R.string.versionavailable), newVersion.toString()), Notification.LOW) + MainApp.bus().post(EventNewNotification(notification)) + } + else -> log.debug("Version newer than master. Are you developer?") + } +} + + fun String.versionStrip() = this.mapNotNull { + when (it) { + in '0'..'9' -> it + '.' -> it + else -> null + } + }.joinToString (separator = "") \ No newline at end of file diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/general/versionChecker/VersionCheckerUtilsKtTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/general/versionChecker/VersionCheckerUtilsKtTest.kt index d5af3a9409..503c8d46be 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/general/versionChecker/VersionCheckerUtilsKtTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/general/versionChecker/VersionCheckerUtilsKtTest.kt @@ -1,8 +1,18 @@ package info.nightscout.androidaps.plugins.general.versionChecker +import com.squareup.otto.Bus +import info.nightscout.androidaps.MainApp +import info.nightscout.androidaps.logging.L import org.junit.Assert.assertEquals import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers +import org.mockito.Mockito.* +import org.powermock.api.mockito.PowerMockito +import org.powermock.core.classloader.annotations.PrepareForTest +import org.powermock.modules.junit4.PowerMockRunner +@RunWith(PowerMockRunner::class) class VersionCheckerUtilsKtTest { @Test fun findVersionMatchesRegularVersion() { @@ -17,9 +27,10 @@ class VersionCheckerUtilsKtTest { assertEquals("2.2.2", detectedVersion) } - // 04. Break stuff.mp3 like it's 1999. Again. Pizza delivery! For i c wiener ... - //@Test - fun findVersionMatchesCustomVersion() { + + // In case we merge a "x.x.x-dev" into master, don't see it as update. + @Test + fun `should return null on non-digit versions on master`() { val buildGradle = """blabla | android { | aosenuthoae @@ -28,7 +39,7 @@ class VersionCheckerUtilsKtTest { | appName = "Aaoeu" """.trimMargin() val detectedVersion: String? = buildGradle.byteInputStream().findVersion() - assertEquals("2.2.2", detectedVersion) + assertEquals(null, detectedVersion) } @Test @@ -37,4 +48,73 @@ class VersionCheckerUtilsKtTest { val detectedVersion: String? = buildGradle.byteInputStream().findVersion() assertEquals(null, detectedVersion) } + + @Test + fun testVersionStrip() { + assertEquals("2.2.2", "2.2.2".versionStrip()) + assertEquals("2.2.2", "2.2.2-dev".versionStrip()) + assertEquals("2.2.2", "2.2.2dev".versionStrip()) + assertEquals("2.2.2", """"2.2.2"""".versionStrip()) + } + + @Test + @PrepareForTest(MainApp::class, L::class) + fun `should find update1`() { + val bus = prepareCompareTests() + compareWithCurrentVersion(newVersion = "2.2.3", currentVersion = "2.2.1") + verify(bus, times(1)).post(any()) + } + + @Test + @PrepareForTest(MainApp::class, L::class) + fun `should find update2`() { + val bus = prepareCompareTests() + compareWithCurrentVersion(newVersion = "2.2.3", currentVersion = "2.2.1-dev") + verify(bus, times(1)).post(any()) + } + + @Test + @PrepareForTest(MainApp::class, L::class) + fun `should find update3`() { + val bus = prepareCompareTests() + compareWithCurrentVersion(newVersion = "2.2.3", currentVersion = "2.1") + verify(bus, times(1)).post(any()) + } + + @Test + @PrepareForTest(MainApp::class, L::class) + fun `should find update4`() { + val bus = prepareCompareTests() + + compareWithCurrentVersion(newVersion = "2.2", currentVersion = "2.1.1") + + verify(bus, times(1)).post(any()) + } + + @Test + @PrepareForTest(MainApp::class, L::class) + fun `should find update5`() { + val bus = prepareCompareTests() + compareWithCurrentVersion(newVersion = "2.2.1", currentVersion = "2.2-dev") + verify(bus, times(1)).post(any()) + } + + @Test + @PrepareForTest(MainApp::class, L::class) + fun `should find update6`() { + val bus = prepareCompareTests() + compareWithCurrentVersion(newVersion = "2.2.1", currentVersion = "2.2dev") + verify(bus, times(1)).post(any()) + } + + + private fun prepareCompareTests(): Bus { + PowerMockito.mockStatic(MainApp::class.java) + val mainApp = mock(MainApp::class.java) + `when`(MainApp.instance()).thenReturn(mainApp) + val bus = mock(Bus::class.java) + `when`(MainApp.bus()).thenReturn(bus) + `when`(MainApp.gs(ArgumentMatchers.anyInt())).thenReturn("some dummy string") + return bus + } } \ No newline at end of file