From ad693a9e5b1390c329b11c790e505b2e4f374844 Mon Sep 17 00:00:00 2001 From: chris1b <7301christoph@gmx.net> Date: Sat, 27 Apr 2019 13:48:48 +0200 Subject: [PATCH] improve network status check: re-create clean feature branch #934 delete feature/improve_network_status_check and recreate from current upstream/master as feature/improve_network_status_check__recreated --- .../kiwix/kiwixmobile/utils/NetworkUtils.java | 37 +++++--- .../kiwixmobile/utils/NetworkUtilsTest.java | 85 ++++++++++++------- 2 files changed, 78 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/org/kiwix/kiwixmobile/utils/NetworkUtils.java b/app/src/main/java/org/kiwix/kiwixmobile/utils/NetworkUtils.java index 9bb663924..06393d917 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/utils/NetworkUtils.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/utils/NetworkUtils.java @@ -28,18 +28,20 @@ import org.kiwix.kiwixmobile.R; import static org.kiwix.kiwixmobile.utils.Constants.TAG_KIWIX; public class NetworkUtils { - + /** + * check availability of any network + * @return true if a network is ready to be used + */ public static boolean isNetworkAvailable(Context context) { ConnectivityManager connectivity = (ConnectivityManager) context - .getSystemService(Context.CONNECTIVITY_SERVICE); + .getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivity == null) { return false; } else { - NetworkInfo[] info = connectivity.getAllNetworkInfo(); - if (info != null) { - for (NetworkInfo anInfo : info) { - if (anInfo.getState() == NetworkInfo.State.CONNECTED - || anInfo.getState() == NetworkInfo.State.CONNECTING) { + NetworkInfo[] networkInfos = connectivity.getAllNetworkInfo(); + if (networkInfos != null) { + for (NetworkInfo networkInfo : networkInfos) { + if (isNetworkConnectionOK(networkInfo)) { return true; } } @@ -48,22 +50,33 @@ public class NetworkUtils { return false; } + static boolean isNetworkConnectionOK(NetworkInfo networkInfo) { + return networkInfo.getState() == NetworkInfo.State.CONNECTED; + } + + + /** + * check if network of type WIFI is connected + * @param context + * @return true if WIFI is connected + */ + //TODO method isWiFi should be renamed to isWifiConnected to express the state which is checked (postponed to refactoring deprecated android.net.* usage) public static boolean isWiFi(Context context) { ConnectivityManager connectivity = (ConnectivityManager) context - .getSystemService(Context.CONNECTIVITY_SERVICE); + .getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivity == null) { return false; } if (Build.VERSION.SDK_INT >= 23) { - NetworkInfo network = connectivity.getActiveNetworkInfo(); - if (network == null) { + NetworkInfo networkInfo = connectivity.getActiveNetworkInfo(); + if (networkInfo == null) { return false; } - return network.getType() == ConnectivityManager.TYPE_WIFI; + return networkInfo.getType() == ConnectivityManager.TYPE_WIFI && networkInfo.isConnected(); } else { NetworkInfo wifi = connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI); - return wifi.isConnected(); + return wifi != null && wifi.isConnected(); } } diff --git a/app/src/test/java/org/kiwix/kiwixmobile/utils/NetworkUtilsTest.java b/app/src/test/java/org/kiwix/kiwixmobile/utils/NetworkUtilsTest.java index 81d8cb113..d5432566e 100644 --- a/app/src/test/java/org/kiwix/kiwixmobile/utils/NetworkUtilsTest.java +++ b/app/src/test/java/org/kiwix/kiwixmobile/utils/NetworkUtilsTest.java @@ -34,7 +34,10 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -47,36 +50,37 @@ public class NetworkUtilsTest { @Mock private NetworkInfo networkInfo1; @Mock private NetworkInfo networkInfo2; - //Sets the Build SDK version - private static void SetSDKVersion(Field field, Object newValue) throws Exception { - field.setAccessible(true); - Field modifiersField = Field.class.getDeclaredField("modifiers"); - modifiersField.setAccessible(true); - modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); - field.set(null, newValue); - } - + @Test public void testNetworkAvailability() { - NetworkInfo[] info = { networkInfo1, networkInfo2 }; + NetworkInfo[] networkInfos = { networkInfo1, networkInfo2 }; when(context.getSystemService(Context.CONNECTIVITY_SERVICE)).thenReturn(connectivity); - when(connectivity.getAllNetworkInfo()).thenReturn(info); + when(connectivity.getAllNetworkInfo()).thenReturn(networkInfos); //one network is connected when(networkInfo1.getState()).thenReturn(NetworkInfo.State.CONNECTED); when(networkInfo2.getState()).thenReturn(NetworkInfo.State.DISCONNECTING); - assertEquals("", true, NetworkUtils.isNetworkAvailable(context)); + assertEquals(true, NetworkUtils.isNetworkAvailable(context)); - //one network is connecting when(networkInfo1.getState()).thenReturn(NetworkInfo.State.DISCONNECTING); when(networkInfo2.getState()).thenReturn(NetworkInfo.State.CONNECTING); - assertEquals("", true, NetworkUtils.isNetworkAvailable(context)); + assertEquals(false, NetworkUtils.isNetworkAvailable(context)); //no network is available when(networkInfo1.getState()).thenReturn(NetworkInfo.State.DISCONNECTED); when(networkInfo2.getState()).thenReturn(NetworkInfo.State.DISCONNECTED); - assertEquals("", false, NetworkUtils.isNetworkAvailable(context)); + assertEquals(false, NetworkUtils.isNetworkAvailable(context)); } + @Test + public void test_isNetworkConnectionOK() { + when(networkInfo2.getState()).thenReturn(NetworkInfo.State.CONNECTING); + assertFalse(NetworkUtils.isNetworkConnectionOK(networkInfo2)); + + when(networkInfo2.getState()).thenReturn(NetworkInfo.State.CONNECTED); + assertTrue(NetworkUtils.isNetworkConnectionOK(networkInfo2)); + } + + @Test public void testWifiAvailability() { when(context.getSystemService(Context.CONNECTIVITY_SERVICE)).thenReturn(connectivity); when(connectivity.getActiveNetworkInfo()).thenReturn(networkInfo); @@ -91,15 +95,23 @@ public class NetworkUtilsTest { //on Mobile Data when(networkInfo.getType()).thenReturn(ConnectivityManager.TYPE_MOBILE); assertEquals(false, NetworkUtils.isWiFi(context)); - //verify that the correct methods are used according to build SDK version + //verify that the correct methods are used according to the build SDK version verify(connectivity).getActiveNetworkInfo(); verify(networkInfo).getType(); verify(connectivity, never()).getNetworkInfo(ConnectivityManager.TYPE_WIFI); - //on WIFI + //on WIFI connected when(networkInfo.getType()).thenReturn(ConnectivityManager.TYPE_WIFI); + when(networkInfo.isConnected()).thenReturn(Boolean.TRUE); assertEquals(true, NetworkUtils.isWiFi(context)); - verify(connectivity).getActiveNetworkInfo(); + verify(connectivity, times(2)).getActiveNetworkInfo(); + verify(connectivity, never()).getNetworkInfo(ConnectivityManager.TYPE_WIFI); + + //on WIFI disconnected + when(networkInfo.getType()).thenReturn(ConnectivityManager.TYPE_WIFI); + when(networkInfo.isConnected()).thenReturn(Boolean.FALSE); + assertEquals(false, NetworkUtils.isWiFi(context)); + verify(connectivity, times(3)).getActiveNetworkInfo(); verify(connectivity, never()).getNetworkInfo(ConnectivityManager.TYPE_WIFI); //SDK < 23 @@ -113,13 +125,13 @@ public class NetworkUtilsTest { when(connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI)).thenReturn(networkInfo); when(networkInfo.isConnected()).thenReturn(true); assertEquals(true, NetworkUtils.isWiFi(context)); - verify(connectivity).getNetworkInfo(ConnectivityManager.TYPE_WIFI); + verify(connectivity, times(1)).getNetworkInfo(ConnectivityManager.TYPE_WIFI); //WIFI disconnected when(connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI)).thenReturn(networkInfo); when(networkInfo.isConnected()).thenReturn(false); assertEquals(false, NetworkUtils.isWiFi(context)); - verify(connectivity).getNetworkInfo(ConnectivityManager.TYPE_WIFI); + verify(connectivity, times(2)).getNetworkInfo(ConnectivityManager.TYPE_WIFI); } @Test @@ -137,17 +149,17 @@ public class NetworkUtilsTest { // URL contains no '?' character but has '/' characters assertEquals("File Name from URL (no '?' character)", "q=kiwix+android", - NetworkUtils.getFileNameFromUrl("https://github.com/search/q=kiwix+android")); + NetworkUtils.getFileNameFromUrl("https://github.com/search/q=kiwix+android")); // and ends with a '/' character matcher = pattern.matcher( - NetworkUtils.getFileNameFromUrl("https://github.com/search/q=kiwix+android/")); + NetworkUtils.getFileNameFromUrl("https://github.com/search/q=kiwix+android/")); if (!matcher.matches()) { assertEquals("filename doesn't match UUID regex (for no '?' and '/' in end)", 0, 1); } // Empty string between last '?' and preceding '/' matcher = pattern.matcher( - NetworkUtils.getFileNameFromUrl("https://github.com/search/?q=kiwix+android")); + NetworkUtils.getFileNameFromUrl("https://github.com/search/?q=kiwix+android")); if (!matcher.matches()) { assertEquals("filename doesn't match UUID regex (for consecutive '/?')", 0, 1); } @@ -155,12 +167,12 @@ public class NetworkUtilsTest { // Standard case // Here the Method should return the substring between the first '?' character and the nearest '/' character preceeding it assertEquals("File Name from URL standard case", "search", NetworkUtils.getFileNameFromUrl( - "https://www.google.com/search?source=hp&ei=zs4LW6W1E5n6rQH65Z-wDQ&q=kiwix+android&oq=kiwix+android&gs_l=psy-ab.3...2590.6259.0.6504.14.12.0.0.0.0.263.485.2-2.2.0....0...1c.1.64.psy-ab..12.2.485.0..0j35i39k1.0.WSlGY7hWzTo")); + "https://www.google.com/search?source=hp&ei=zs4LW6W1E5n6rQH65Z-wDQ&q=kiwix+android&oq=kiwix+android&gs_l=psy-ab.3...2590.6259.0.6504.14.12.0.0.0.0.263.485.2-2.2.0....0...1c.1.64.psy-ab..12.2.485.0..0j35i39k1.0.WSlGY7hWzTo")); assertEquals("File Name from URL standard case", "Special:Search", - NetworkUtils.getFileNameFromUrl( - "https://en.wikipedia.org/wiki/Special:Search?search=kiwix+android&go=Go&searchToken=3zrcxw8fltdcij99zvoh5c6wy")); + NetworkUtils.getFileNameFromUrl( + "https://en.wikipedia.org/wiki/Special:Search?search=kiwix+android&go=Go&searchToken=3zrcxw8fltdcij99zvoh5c6wy")); assertEquals("File Name from URL standard case", "search", - NetworkUtils.getFileNameFromUrl("https://github.com/search?q=kiwix+android")); + NetworkUtils.getFileNameFromUrl("https://github.com/search?q=kiwix+android")); } @Test @@ -173,14 +185,23 @@ public class NetworkUtilsTest { //Using the standard Kiwix Download URLs assertEquals("URL Parsing", "No Pictures", NetworkUtils.parseURL(context, - "http://ftpmirror.your.org/pub/kiwix/zim/wikipedia/wikipedia_af_all_nopic_2016-05.zim")); + "http://ftpmirror.your.org/pub/kiwix/zim/wikipedia/wikipedia_af_all_nopic_2016-05.zim")); assertEquals("URL Parsing", "No Videos", NetworkUtils.parseURL(context, - "http://www.mirrorservice.org/sites/download.kiwix.org/zim/wikipedia/wikipedia_af_all_novid_2016-05.zim")); + "http://www.mirrorservice.org/sites/download.kiwix.org/zim/wikipedia/wikipedia_af_all_novid_2016-05.zim")); assertEquals("URL Parsing", "Simple", NetworkUtils.parseURL(context, - "http://download.wikimedia.org/kiwix/zim/wikipedia/wikipedia_af_all_simple_2016-05.zim")); + "http://download.wikimedia.org/kiwix/zim/wikipedia/wikipedia_af_all_simple_2016-05.zim")); assertEquals("URL Parsing", "No Pictures", NetworkUtils.parseURL(context, - "http://mirror.netcologne.de/kiwix/zim/wikipedia/wikipedia_af_all_nopic_2016-05.zim")); + "http://mirror.netcologne.de/kiwix/zim/wikipedia/wikipedia_af_all_nopic_2016-05.zim")); assertEquals("URL Parsing", "Simple", NetworkUtils.parseURL(context, - "http://mirror3.kiwix.org/zim/wikipedia/wikipedia_af_all_simple_2016-05.zim")); + "http://mirror3.kiwix.org/zim/wikipedia/wikipedia_af_all_simple_2016-05.zim")); + } + + //Sets the Build SDK version + private static void SetSDKVersion(Field field, Object newValue) throws Exception { + field.setAccessible(true); + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); + field.set(null, newValue); } }