|
| 1 | +package com.maxmind.device.collector |
| 2 | + |
| 3 | +import android.content.Context |
| 4 | +import android.net.ConnectivityManager |
| 5 | +import android.net.Network |
| 6 | +import android.net.NetworkCapabilities |
| 7 | +import android.net.wifi.WifiInfo |
| 8 | +import android.net.wifi.WifiManager |
| 9 | +import io.mockk.every |
| 10 | +import io.mockk.mockk |
| 11 | +import org.junit.jupiter.api.Assertions.assertEquals |
| 12 | +import org.junit.jupiter.api.Assertions.assertNotNull |
| 13 | +import org.junit.jupiter.api.Assertions.assertNull |
| 14 | +import org.junit.jupiter.api.BeforeEach |
| 15 | +import org.junit.jupiter.api.Test |
| 16 | + |
| 17 | +internal class NetworkCollectorTest { |
| 18 | + private lateinit var mockContext: Context |
| 19 | + private lateinit var mockConnectivityManager: ConnectivityManager |
| 20 | + private lateinit var mockWifiManager: WifiManager |
| 21 | + private lateinit var mockNetwork: Network |
| 22 | + private lateinit var mockCapabilities: NetworkCapabilities |
| 23 | + private lateinit var collector: NetworkCollector |
| 24 | + |
| 25 | + @BeforeEach |
| 26 | + internal fun setUp() { |
| 27 | + mockContext = mockk(relaxed = true) |
| 28 | + mockConnectivityManager = mockk(relaxed = true) |
| 29 | + mockWifiManager = mockk(relaxed = true) |
| 30 | + mockNetwork = mockk(relaxed = true) |
| 31 | + mockCapabilities = mockk(relaxed = true) |
| 32 | + |
| 33 | + every { mockContext.getSystemService(Context.CONNECTIVITY_SERVICE) } returns |
| 34 | + mockConnectivityManager |
| 35 | + every { mockContext.applicationContext } returns mockContext |
| 36 | + every { mockContext.getSystemService(Context.WIFI_SERVICE) } returns mockWifiManager |
| 37 | + every { mockConnectivityManager.activeNetwork } returns mockNetwork |
| 38 | + every { mockConnectivityManager.getNetworkCapabilities(mockNetwork) } returns |
| 39 | + mockCapabilities |
| 40 | + |
| 41 | + collector = NetworkCollector(mockContext) |
| 42 | + } |
| 43 | + |
| 44 | + @Test |
| 45 | + internal fun `collect returns wifi connection info`() { |
| 46 | + every { mockCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) } returns true |
| 47 | + every { mockCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) } returns false |
| 48 | + every { |
| 49 | + mockCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED) |
| 50 | + } returns true |
| 51 | + every { mockCapabilities.linkDownstreamBandwidthKbps } returns 100000 |
| 52 | + |
| 53 | + val mockWifiInfo = |
| 54 | + mockk<WifiInfo> { |
| 55 | + every { frequency } returns 5180 |
| 56 | + every { linkSpeed } returns 866 |
| 57 | + every { rssi } returns -50 |
| 58 | + } |
| 59 | + every { mockWifiManager.connectionInfo } returns mockWifiInfo |
| 60 | + |
| 61 | + val result = collector.collect() |
| 62 | + |
| 63 | + assertNotNull(result) |
| 64 | + assertEquals("wifi", result?.connectionType) |
| 65 | + assertEquals(false, result?.isMetered) |
| 66 | + assertEquals(100000, result?.linkDownstreamBandwidthKbps) |
| 67 | + assertEquals(5180, result?.wifiFrequency) |
| 68 | + assertEquals(866, result?.wifiLinkSpeed) |
| 69 | + assertEquals(-50, result?.wifiSignalStrength) |
| 70 | + } |
| 71 | + |
| 72 | + @Test |
| 73 | + internal fun `collect returns cellular connection info`() { |
| 74 | + every { mockCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) } returns false |
| 75 | + every { mockCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) } returns true |
| 76 | + every { |
| 77 | + mockCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED) |
| 78 | + } returns false |
| 79 | + every { mockCapabilities.linkDownstreamBandwidthKbps } returns 50000 |
| 80 | + |
| 81 | + val result = collector.collect() |
| 82 | + |
| 83 | + assertNotNull(result) |
| 84 | + assertEquals("cellular", result?.connectionType) |
| 85 | + assertEquals(true, result?.isMetered) |
| 86 | + assertEquals(50000, result?.linkDownstreamBandwidthKbps) |
| 87 | + assertNull(result?.wifiFrequency) |
| 88 | + assertNull(result?.wifiLinkSpeed) |
| 89 | + assertNull(result?.wifiSignalStrength) |
| 90 | + } |
| 91 | + |
| 92 | + @Test |
| 93 | + internal fun `collect returns null when no active network`() { |
| 94 | + every { mockConnectivityManager.activeNetwork } returns null |
| 95 | + |
| 96 | + val result = collector.collect() |
| 97 | + |
| 98 | + assertNull(result) |
| 99 | + } |
| 100 | + |
| 101 | + @Test |
| 102 | + internal fun `collect returns null when no capabilities`() { |
| 103 | + every { mockConnectivityManager.getNetworkCapabilities(mockNetwork) } returns null |
| 104 | + |
| 105 | + val result = collector.collect() |
| 106 | + |
| 107 | + assertNull(result) |
| 108 | + } |
| 109 | + |
| 110 | + @Test |
| 111 | + internal fun `collect returns null when ConnectivityManager unavailable`() { |
| 112 | + every { mockContext.getSystemService(Context.CONNECTIVITY_SERVICE) } returns null |
| 113 | + val collectorWithNoConnectivity = NetworkCollector(mockContext) |
| 114 | + |
| 115 | + val result = collectorWithNoConnectivity.collect() |
| 116 | + |
| 117 | + assertNull(result) |
| 118 | + } |
| 119 | + |
| 120 | + @Test |
| 121 | + internal fun `collect handles ethernet connection`() { |
| 122 | + every { mockCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) } returns false |
| 123 | + every { mockCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) } returns false |
| 124 | + every { mockCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) } returns true |
| 125 | + every { |
| 126 | + mockCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED) |
| 127 | + } returns true |
| 128 | + every { mockCapabilities.linkDownstreamBandwidthKbps } returns 1000000 |
| 129 | + |
| 130 | + val result = collector.collect() |
| 131 | + |
| 132 | + assertNotNull(result) |
| 133 | + assertEquals("ethernet", result?.connectionType) |
| 134 | + } |
| 135 | + |
| 136 | + @Test |
| 137 | + internal fun `connection type constants have correct values`() { |
| 138 | + assertEquals("wifi", NetworkCollector.CONNECTION_TYPE_WIFI) |
| 139 | + assertEquals("cellular", NetworkCollector.CONNECTION_TYPE_CELLULAR) |
| 140 | + assertEquals("ethernet", NetworkCollector.CONNECTION_TYPE_ETHERNET) |
| 141 | + assertEquals("bluetooth", NetworkCollector.CONNECTION_TYPE_BLUETOOTH) |
| 142 | + assertEquals("vpn", NetworkCollector.CONNECTION_TYPE_VPN) |
| 143 | + assertEquals("other", NetworkCollector.CONNECTION_TYPE_OTHER) |
| 144 | + } |
| 145 | +} |
0 commit comments