Skip to content

Commit

Permalink
Refactor other classes depending onn VPNFeatureRegistry
Browse files Browse the repository at this point in the history
  • Loading branch information
karlenDimla committed Apr 4, 2024
1 parent 6adde21 commit 2d198f4
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 33 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,23 +19,26 @@ package com.duckduckgo.mobile.android.vpn.integration
import com.duckduckgo.anvil.annotations.ContributesPluginPoint
import com.duckduckgo.common.utils.plugins.PluginPoint
import com.duckduckgo.di.scopes.VpnScope
import com.duckduckgo.mobile.android.app.tracking.AppTrackingProtection
import com.duckduckgo.mobile.android.vpn.AppTpVpnFeature
import com.duckduckgo.mobile.android.vpn.VpnFeaturesRegistry
import com.duckduckgo.mobile.android.vpn.network.VpnNetworkStack
import com.squareup.anvil.annotations.ContributesBinding
import javax.inject.Inject

@ContributesBinding(VpnScope::class)
class VpnNetworkStackProviderImpl @Inject constructor(
private val vpnNetworkStacks: PluginPoint<VpnNetworkStack>,
private val vpnFeaturesRegistry: VpnFeaturesRegistry,
private val appTrackingProtection: AppTrackingProtection,
) : VpnNetworkStackProvider {
override suspend fun provideNetworkStack(): VpnNetworkStack {
val features = vpnFeaturesRegistry.getRegisteredFeatures()
val feature = features.firstOrNull { it.featureName == AppTpVpnFeature.APPTP_VPN.featureName }
val networkStack = if (appTrackingProtection.isEnabled()) {
// if we have NetP enabled, return NetP's network stack
vpnNetworkStacks.getPlugins().firstOrNull { it.name == AppTpVpnFeature.APPTP_VPN.featureName }
} else {
null
}

return vpnNetworkStacks.getPlugins().firstOrNull { it.name == feature?.featureName }
?: VpnNetworkStack.EmptyVpnNetworkStack
return networkStack ?: VpnNetworkStack.EmptyVpnNetworkStack
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ import android.content.Context
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import com.duckduckgo.di.scopes.AppScope
import com.duckduckgo.mobile.android.vpn.VpnFeaturesRegistry
import com.duckduckgo.mobile.android.app.tracking.AppTrackingProtection
import com.duckduckgo.networkprotection.api.NetworkProtectionState
import com.squareup.anvil.annotations.ContributesBinding
import dagger.SingleInstanceIn
import javax.inject.Inject
Expand All @@ -29,12 +30,13 @@ import javax.inject.Inject
@ContributesBinding(AppScope::class)
class RealExternalVpnDetector @Inject constructor(
private val context: Context,
private val vpnFeaturesRegistry: VpnFeaturesRegistry,
private val appTrackingProtection: AppTrackingProtection,
private val networkProtectionState: NetworkProtectionState,
) : ExternalVpnDetector {

override suspend fun isExternalVpnDetected(): Boolean {
// if we're the ones using the VPN, no VPN is detected
if (vpnFeaturesRegistry.isAnyFeatureRunning()) return false
if (appTrackingProtection.isRunning() || networkProtectionState.isRunning()) return false

return runCatching {
val connectivityManager = context.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,8 @@
package com.duckduckgo.mobile.android.vpn.integration

import com.duckduckgo.common.utils.plugins.PluginPoint
import com.duckduckgo.mobile.android.app.tracking.AppTrackingProtection
import com.duckduckgo.mobile.android.vpn.AppTpVpnFeature
import com.duckduckgo.mobile.android.vpn.FakeVpnFeaturesRegistry
import com.duckduckgo.mobile.android.vpn.VpnFeature
import com.duckduckgo.mobile.android.vpn.VpnFeaturesRegistry
import com.duckduckgo.mobile.android.vpn.network.FakeVpnNetworkStack
import com.duckduckgo.mobile.android.vpn.network.VpnNetworkStack
import kotlinx.coroutines.test.runTest
Expand All @@ -33,46 +31,36 @@ import org.mockito.kotlin.whenever
class VpnNetworkStackProviderTest {

private val vpnNetworkStacks: PluginPoint<VpnNetworkStack> = mock()
private lateinit var vpnFeaturesRegistry: VpnFeaturesRegistry
private val appTrackingProtection: AppTrackingProtection = mock()

private lateinit var vpnNetworkStackProvider: VpnNetworkStackProvider
private val fakeVpnNetworkStack = FakeVpnNetworkStack(AppTpVpnFeature.APPTP_VPN.featureName)

@Before
fun setup() {
whenever(vpnNetworkStacks.getPlugins()).thenReturn(listOf(fakeVpnNetworkStack))
vpnFeaturesRegistry = FakeVpnFeaturesRegistry()

vpnNetworkStackProvider = VpnNetworkStackProviderImpl(vpnNetworkStacks, vpnFeaturesRegistry)
vpnNetworkStackProvider = VpnNetworkStackProviderImpl(vpnNetworkStacks, appTrackingProtection)
}

@Test
fun whenProvideNetworkStackAndNoFeaturesRegisteredThenThrowsException() = runTest {
whenever(appTrackingProtection.isEnabled()).thenReturn(false)
assertEquals(VpnNetworkStack.EmptyVpnNetworkStack, vpnNetworkStackProvider.provideNetworkStack())
}

@Test
fun whenProviderNetworkStackAndAppTpRegisteredThenReturnNetworkStack() = runTest {
vpnFeaturesRegistry.registerFeature(AppTpVpnFeature.APPTP_VPN)
whenever(appTrackingProtection.isEnabled()).thenReturn(true)
val networkStack = vpnNetworkStackProvider.provideNetworkStack()

assertEquals(fakeVpnNetworkStack, networkStack)
}

@Test
fun whenProviderNetworkStackAndUnknownFeatureRegisteredThenThrowsException() = runTest {
vpnFeaturesRegistry.registerFeature(VpnFeature { "unknown" })
whenever(appTrackingProtection.isEnabled()).thenReturn(false)
vpnNetworkStackProvider.provideNetworkStack()
assertEquals(VpnNetworkStack.EmptyVpnNetworkStack, vpnNetworkStackProvider.provideNetworkStack())
}

@Test
fun whenProviderNetworkStackAndFeaturesContainAppTpThenReturnNetworkStack() = runTest {
vpnFeaturesRegistry.registerFeature(VpnFeature { "unknown" })
vpnFeaturesRegistry.registerFeature(AppTpVpnFeature.APPTP_VPN)

val networkStack = vpnNetworkStackProvider.provideNetworkStack()

assertEquals(fakeVpnNetworkStack, networkStack)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ package com.duckduckgo.networkprotection.impl.integration

import com.duckduckgo.common.utils.plugins.PluginPoint
import com.duckduckgo.di.scopes.VpnScope
import com.duckduckgo.mobile.android.vpn.VpnFeaturesRegistry
import com.duckduckgo.mobile.android.vpn.integration.VpnNetworkStackProvider
import com.duckduckgo.mobile.android.vpn.network.VpnNetworkStack
import com.duckduckgo.networkprotection.api.NetworkProtectionState
import com.duckduckgo.networkprotection.impl.NetPVpnFeature
import com.squareup.anvil.annotations.ContributesBinding
import javax.inject.Inject
Expand All @@ -31,12 +31,10 @@ import javax.inject.Inject
)
class NetpVpnNetworkStackProviderImpl @Inject constructor(
private val vpnNetworkStacks: PluginPoint<VpnNetworkStack>,
private val vpnFeaturesRegistry: VpnFeaturesRegistry,
private val networkProtectionState: NetworkProtectionState,
) : VpnNetworkStackProvider {
override suspend fun provideNetworkStack(): VpnNetworkStack {
val features = vpnFeaturesRegistry.getRegisteredFeatures().map { it.featureName }

val networkStack = if (features.contains(NetPVpnFeature.NETP_VPN.featureName)) {
val networkStack = if (networkProtectionState.isEnabled()) {
// if we have NetP enabled, return NetP's network stack
vpnNetworkStacks.getPlugins().firstOrNull { it.name == NetPVpnFeature.NETP_VPN.featureName }
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,13 @@ class FailureRecoveryHandlerTest {
fun setUp() {
MockitoAnnotations.openMocks(this)

failureRecoveryHandler = FailureRecoveryHandler(networkProtectionState, wgTunnel, wgTunnelConfig, currentTimeProvider, networkProtectionPixels)
failureRecoveryHandler = FailureRecoveryHandler(
networkProtectionState,
wgTunnel,
wgTunnelConfig,
currentTimeProvider,
networkProtectionPixels,
)
}

@Test
Expand Down

0 comments on commit 2d198f4

Please sign in to comment.