@@ -10,11 +10,9 @@ import android.content.Context
1010import android.net.ConnectivityManager
1111import android.net.Network
1212import android.net.NetworkCapabilities
13- import android.net.NetworkInfo
1413import com.nextcloud.client.account.Server
1514import com.nextcloud.client.account.User
1615import com.nextcloud.client.account.UserAccountManager
17- import com.nextcloud.client.logger.Logger
1816import com.nextcloud.common.PlainClient
1917import com.nextcloud.operations.GetMethod
2018import com.owncloud.android.lib.resources.status.NextcloudVersion
@@ -31,7 +29,7 @@ import org.mockito.ArgumentCaptor
3129import org.mockito.Mock
3230import org.mockito.MockitoAnnotations
3331import org.mockito.kotlin.any
34- import org.mockito.kotlin.mock
32+ import org.mockito.kotlin.eq
3533import org.mockito.kotlin.never
3634import org.mockito.kotlin.times
3735import org.mockito.kotlin.verify
@@ -49,24 +47,14 @@ class ConnectivityServiceTest {
4947
5048 internal abstract class Base {
5149 companion object {
52- fun mockNetworkInfo (connected : Boolean , connecting : Boolean , type : Int ): NetworkInfo {
53- val networkInfo = mock<NetworkInfo >()
54- whenever(networkInfo.isConnectedOrConnecting).thenReturn(connected or connecting)
55- whenever(networkInfo.isConnected).thenReturn(connected)
56- whenever(networkInfo.type).thenReturn(type)
57- return networkInfo
58- }
59-
6050 const val SERVER_BASE_URL = " https://test.nextcloud.localhost"
6151 }
6252
63- @Mock lateinit var context: Context
64-
6553 @Mock
66- lateinit var platformConnectivityManager : ConnectivityManager
54+ lateinit var context : Context
6755
6856 @Mock
69- lateinit var networkInfo : NetworkInfo
57+ lateinit var platformConnectivityManager : ConnectivityManager
7058
7159 @Mock
7260 lateinit var accountManager: UserAccountManager
@@ -92,10 +80,7 @@ class ConnectivityServiceTest {
9280 @Mock
9381 lateinit var networkCapabilities: NetworkCapabilities
9482
95- @Mock
96- lateinit var logger: Logger
97-
98- val baseServerUri = URI .create(SERVER_BASE_URL )
83+ val baseServerUri: URI = URI .create(SERVER_BASE_URL )
9984 val newServer = Server (baseServerUri, NextcloudVersion .nextcloud_31)
10085 val legacyServer = Server (baseServerUri, OwnCloudVersion .nextcloud_20)
10186
@@ -112,20 +97,21 @@ class ConnectivityServiceTest {
11297 .thenReturn(platformConnectivityManager)
11398
11499 whenever(platformConnectivityManager.activeNetwork).thenReturn(network)
115- whenever(platformConnectivityManager.getNetworkCapabilities(any() ))
100+ whenever(platformConnectivityManager.getNetworkCapabilities(network ))
116101 .thenReturn(networkCapabilities)
117102
118- whenever(networkCapabilities.hasCapability(NetworkCapabilities .NET_CAPABILITY_INTERNET ))
119- .thenReturn(true )
120103 whenever(networkCapabilities.hasTransport(NetworkCapabilities .TRANSPORT_WIFI ))
121104 .thenReturn(true )
122- whenever(networkCapabilities.hasCapability(NetworkCapabilities .NET_CAPABILITY_NOT_RESTRICTED ))
105+ whenever(
106+ networkCapabilities
107+ .hasCapability(eq(NetworkCapabilities .NET_CAPABILITY_NOT_RESTRICTED ))
108+ )
123109 .thenReturn(true )
124110
125- whenever(accountManager.user).thenReturn(user)
126- whenever(user.server).thenReturn(newServer)
127111 whenever(requestBuilder.invoke(any())).thenReturn(getRequest)
128112 whenever(clientFactory.createPlainClient()).thenReturn(client)
113+ whenever(user.server).thenReturn(newServer)
114+ whenever(accountManager.user).thenReturn(user)
129115 whenever(walledCheckCache.getValue()).thenReturn(null )
130116
131117 connectivityService = ConnectivityServiceImpl (
@@ -140,68 +126,83 @@ class ConnectivityServiceTest {
140126
141127 internal class Disconnected : Base () {
142128 @Test
143- fun `wifi is disconnected` () {
144- whenever(networkCapabilities.hasCapability(NetworkCapabilities .NET_CAPABILITY_INTERNET )).thenReturn(false )
145- whenever(networkCapabilities.hasTransport(NetworkCapabilities .TRANSPORT_WIFI )).thenReturn(false )
146- connectivityService.connectivity.apply {
147- assertFalse(isConnected)
148- assertFalse(isWifi)
149- }
129+ fun `no active network` () {
130+ // GIVEN
131+ whenever(platformConnectivityManager.activeNetwork).thenReturn(null )
132+ // WHEN
133+ connectivityService.updateConnectivity()
134+ // THEN
135+ assertSame(Connectivity .DISCONNECTED , connectivityService.connectivity)
136+ assertFalse(connectivityService.isConnected)
150137 }
151138
152139 @Test
153- fun `no active network` () {
154- whenever(platformConnectivityManager.activeNetwork).thenReturn(null )
155- connectivityService.apply {
156- assertFalse(isConnected)
157- assertSame(Connectivity .DISCONNECTED , connectivity)
158- }
140+ fun `no network capabilities` () {
141+ // GIVEN
142+ whenever(platformConnectivityManager.getNetworkCapabilities(network)).thenReturn(null )
143+ // WHEN
144+ connectivityService.updateConnectivity()
145+ // THEN
146+ assertSame(Connectivity .DISCONNECTED , connectivityService.connectivity)
147+ assertFalse(connectivityService.isConnected)
159148 }
160149 }
161150
162151 internal class IsConnected : Base () {
163152 @Test
164153 fun `connected to wifi` () {
165- whenever(networkCapabilities.hasTransport( NetworkCapabilities . TRANSPORT_WIFI )).thenReturn( true )
166- whenever(networkCapabilities.hasCapability( NetworkCapabilities . NET_CAPABILITY_INTERNET )).thenReturn( true )
167- connectivityService.connectivity. let {
168- assertTrue(it.isConnected)
169- assertTrue(it.isWifi )
170- }
154+ // GIVEN: Default setup is connected Wi-Fi
155+ // WHEN
156+ connectivityService.updateConnectivity()
157+ // THEN
158+ assertTrue(connectivityService.connectivity.isConnected )
159+ assertTrue(connectivityService.connectivity.isWifi)
171160 }
172161
173162 @Test
174163 fun `connected to mobile network` () {
175- whenever(networkCapabilities.hasTransport(NetworkCapabilities .TRANSPORT_CELLULAR )).thenReturn(true )
176- whenever(networkCapabilities.hasTransport(NetworkCapabilities .TRANSPORT_WIFI )).thenReturn(false )
164+ // GIVEN
165+ whenever(networkCapabilities.hasTransport(NetworkCapabilities .TRANSPORT_WIFI ))
166+ .thenReturn(false )
167+ whenever(networkCapabilities.hasTransport(NetworkCapabilities .TRANSPORT_CELLULAR ))
168+ .thenReturn(true )
169+ // WHEN
170+ connectivityService.updateConnectivity()
171+ // THEN
177172 connectivityService.connectivity.let {
178173 assertTrue(it.isConnected)
179174 assertFalse(it.isWifi)
180175 }
181176 }
182177
183178 @Test
184- fun `connected to wifi and vpn` () {
185- whenever(networkCapabilities.hasCapability(NetworkCapabilities .NET_CAPABILITY_INTERNET )).thenReturn(true )
186- whenever(networkCapabilities.hasTransport(NetworkCapabilities .TRANSPORT_WIFI )).thenReturn(true )
187- whenever(networkCapabilities.hasTransport(NetworkCapabilities .TRANSPORT_VPN )).thenReturn(true )
179+ fun `connected to vpn` () {
180+ // GIVEN
181+ whenever(networkCapabilities.hasTransport(NetworkCapabilities .TRANSPORT_WIFI ))
182+ .thenReturn(false )
183+ whenever(networkCapabilities.hasTransport(NetworkCapabilities .TRANSPORT_VPN ))
184+ .thenReturn(true )
185+ // WHEN
186+ connectivityService.updateConnectivity()
187+ // THEN
188188 connectivityService.connectivity.let {
189189 assertTrue(it.isConnected)
190- assertTrue (it.isWifi)
190+ assertFalse (it.isWifi)
191191 }
192192 }
193193 }
194194
195195 internal class WifiConnectionWalledStatusOnLegacyServer : Base () {
196196 @Before
197197 fun setUp () {
198- whenever(networkCapabilities.hasCapability(NetworkCapabilities .NET_CAPABILITY_INTERNET )).thenReturn(true )
199- whenever(networkCapabilities.hasTransport(NetworkCapabilities .TRANSPORT_WIFI )).thenReturn(true )
200198 whenever(user.server).thenReturn(legacyServer)
201- connectivityService.connectivity.let {
202- assertTrue(it.isConnected)
203- assertTrue(it.isWifi)
204- }
199+ connectivityService.updateConnectivity()
200+ assertTrue(
201+ " Precondition failed" ,
202+ connectivityService.connectivity.let {
203+ it.isConnected && it.isWifi
204+ }
205+ )
205206 }
206207
207208 fun mockResponse (maintenance : Boolean = true, httpStatus : Int = HttpStatus .SC_OK ) {
@@ -237,9 +238,7 @@ class ConnectivityServiceTest {
237238 internal class WifiConnectionWalledStatus : Base () {
238239 @Before
239240 fun setUp () {
240- whenever(networkCapabilities.hasCapability(NetworkCapabilities .NET_CAPABILITY_INTERNET )).thenReturn(true )
241- whenever(networkCapabilities.hasTransport(NetworkCapabilities .TRANSPORT_WIFI )).thenReturn(true )
242- whenever(accountManager.getServerVersion(any())).thenReturn(OwnCloudVersion .nextcloud_20)
241+ connectivityService.updateConnectivity()
243242 connectivityService.connectivity.let {
244243 assertTrue(it.isConnected)
245244 assertTrue(it.isWifi)
@@ -251,7 +250,9 @@ class ConnectivityServiceTest {
251250 fun `request not sent when not connected` () {
252251 // GIVEN
253252 // network is not connected
254- whenever(networkCapabilities.hasCapability(NetworkCapabilities .NET_CAPABILITY_INTERNET )).thenReturn(false )
253+ whenever(platformConnectivityManager.activeNetwork).thenReturn(null )
254+ connectivityService.updateConnectivity()
255+ assertFalse(" Precondition failed" , connectivityService.isConnected)
255256
256257 // WHEN
257258 // connectivity is checked
@@ -260,38 +261,44 @@ class ConnectivityServiceTest {
260261 // THEN
261262 // connection is walled
262263 // request is not sent
263- assertTrue(" Server should not be accessible " , result)
264+ assertTrue(" Should be walled if not connected " , result)
264265 verify(requestBuilder, never()).invoke(any())
265266 verify(client, never()).execute(any())
266267 }
267268
268269 @Test
269- fun `request not sent when wifi is metered` () {
270+ fun `request IS sent when wifi is metered` () {
270271 // GIVEN
271- // network is connected to wifi
272- // wifi is metered
273- whenever(networkCapabilities.hasCapability(any())).thenReturn(false ) // this test is mocked for API M
274- whenever(platformConnectivityManager.isActiveNetworkMetered).thenReturn(true )
272+ // network is connected to wifi, but metered
273+ whenever(
274+ networkCapabilities
275+ .hasCapability(NetworkCapabilities .NET_CAPABILITY_NOT_RESTRICTED )
276+ )
277+ .thenReturn(false )
278+ connectivityService.updateConnectivity()
279+
275280 connectivityService.connectivity.let {
276281 assertTrue(" should be connected" , it.isConnected)
277282 assertTrue(" should be connected to wifi" , it.isWifi)
278- assertTrue(" check mocking, this check is complicated and depends on SDK version " , it.isMetered)
283+ assertTrue(" should be metered " , it.isMetered)
279284 }
285+ // Mock a successful 204 response
286+ mockResponse(contentLength = 0 , status = HttpStatus .SC_NO_CONTENT )
280287
281288 // WHEN
282289 // connectivity is checked
283290 val result = connectivityService.isInternetWalled
284291
285292 // THEN
286293 // assume internet is not walled
287- // request is not sent
288- assertFalse(" Server should not be accessible" , result)
289- verify(requestBuilder, never( )).invoke(any())
290- verify(getRequest, never( )).execute(any<PlainClient >())
294+ // request IS sent
295+ assertFalse(" Server should be accessible" , result)
296+ verify(requestBuilder, times( 1 )).invoke(any())
297+ verify(getRequest, times( 1 )).execute(any<PlainClient >())
291298 }
292299
293300 @Test
294- fun `check cache value when server uri is not set` () {
301+ fun `check walled when server uri is not set` () {
295302 // GIVEN
296303 // network connectivity is present
297304 // user has no server URI (empty)
@@ -305,7 +312,7 @@ class ConnectivityServiceTest {
305312 // THEN
306313 // connection is walled
307314 // request is not sent
308- assertFalse( " Cached value not set " , result)
315+ assertTrue( " Should be walled if server URI is empty " , result)
309316 verify(requestBuilder, never()).invoke(any())
310317 verify(getRequest, never()).execute(any<PlainClient >())
311318 }
@@ -344,7 +351,12 @@ class ConnectivityServiceTest {
344351 connectivityService.isInternetWalled
345352 val urlCaptor = ArgumentCaptor .forClass(String ::class .java)
346353 verify(requestBuilder).invoke(urlCaptor.capture())
347- assertTrue(" Invalid URL used to check status" , urlCaptor.value.endsWith(" /index.php/204" ))
354+ assertTrue(
355+ " Invalid URL used to check status" ,
356+ urlCaptor
357+ .value
358+ .endsWith(" /index.php/204" )
359+ )
348360 verify(getRequest, times(1 )).execute(client)
349361 }
350362 }
0 commit comments