Skip to content

Commit 60e8b7d

Browse files
committed
fix: connection service tests
Signed-off-by: alperozturk <alper_ozturk@proton.me>
1 parent ae23afa commit 60e8b7d

File tree

2 files changed

+89
-78
lines changed

2 files changed

+89
-78
lines changed

app/src/main/java/com/nextcloud/client/network/ConnectivityServiceImpl.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import android.os.Build;
1616
import android.os.Handler;
1717
import android.os.Looper;
18-
import android.text.TextUtils;
1918

2019
import com.nextcloud.client.account.Server;
2120
import com.nextcloud.client.account.UserAccountManager;
@@ -84,7 +83,7 @@ public ConnectivityServiceImpl(@NonNull Context context,
8483
updateConnectivity();
8584
}
8685

87-
private void updateConnectivity() {
86+
public void updateConnectivity() {
8887
Network activeNetwork = connectivityManager.getActiveNetwork();
8988
if (activeNetwork == null) {
9089
currentConnectivity = Connectivity.DISCONNECTED;
@@ -139,7 +138,7 @@ public boolean isInternetWalled() {
139138
Server server = accountManager.getUser().getServer();
140139
String baseServerAddress = server.getUri().toString();
141140

142-
if (!currentConnectivity.isConnected() || TextUtils.isEmpty(baseServerAddress)) {
141+
if (!currentConnectivity.isConnected() || baseServerAddress.isEmpty()) {
143142
walledCheckCache.setValue(true);
144143
return true;
145144
}

app/src/test/java/com/nextcloud/client/network/ConnectivityServiceTest.kt

Lines changed: 87 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,9 @@ import android.content.Context
1010
import android.net.ConnectivityManager
1111
import android.net.Network
1212
import android.net.NetworkCapabilities
13-
import android.net.NetworkInfo
1413
import com.nextcloud.client.account.Server
1514
import com.nextcloud.client.account.User
1615
import com.nextcloud.client.account.UserAccountManager
17-
import com.nextcloud.client.logger.Logger
1816
import com.nextcloud.common.PlainClient
1917
import com.nextcloud.operations.GetMethod
2018
import com.owncloud.android.lib.resources.status.NextcloudVersion
@@ -31,7 +29,7 @@ import org.mockito.ArgumentCaptor
3129
import org.mockito.Mock
3230
import org.mockito.MockitoAnnotations
3331
import org.mockito.kotlin.any
34-
import org.mockito.kotlin.mock
32+
import org.mockito.kotlin.eq
3533
import org.mockito.kotlin.never
3634
import org.mockito.kotlin.times
3735
import 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

Comments
 (0)