Skip to content

Commit 9bd9d08

Browse files
committed
Merge branch 'implement-wireguard-over-shadowsocks-droid-1276'
2 parents 196061b + 25857ce commit 9bd9d08

File tree

66 files changed

+1304
-395
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+1304
-395
lines changed

android/CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ Line wrap the file at 100 chars. Th
2424
## [Unreleased]
2525
### Added
2626
- Add support for predictive back.
27+
- Add WireGuard over Shadowsocks.
2728

2829
### Changed
2930
- Update colors in the app to be more in line with material design.

android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/data/DummyRelayItems.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@ private val DUMMY_RELAY_COUNTRY_2 =
6262
)
6363

6464
private val DUMMY_WIREGUARD_PORT_RANGES = ArrayList<PortRange>()
65-
private val DUMMY_WIREGUARD_ENDPOINT_DATA = WireguardEndpointData(DUMMY_WIREGUARD_PORT_RANGES)
65+
private val DUMMY_SHADOWSOCKS_PORT_RANGES = emptyList<PortRange>()
66+
private val DUMMY_WIREGUARD_ENDPOINT_DATA =
67+
WireguardEndpointData(DUMMY_WIREGUARD_PORT_RANGES, DUMMY_SHADOWSOCKS_PORT_RANGES)
6668

6769
val DUMMY_RELAY_COUNTRIES = listOf(DUMMY_RELAY_COUNTRY_1, DUMMY_RELAY_COUNTRY_2)
6870

android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/dialog/CustomPortDialogTest.kt

+7-11
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import net.mullvad.mullvadvpn.compose.setContentWithTheme
2121
import net.mullvad.mullvadvpn.compose.test.CUSTOM_PORT_DIALOG_INPUT_TEST_TAG
2222
import net.mullvad.mullvadvpn.lib.model.PortRange
2323
import net.mullvad.mullvadvpn.onNodeWithTagAndText
24-
import net.mullvad.mullvadvpn.viewmodel.WireguardCustomPortDialogUiState
2524
import org.junit.jupiter.api.BeforeEach
2625
import org.junit.jupiter.api.Test
2726
import org.junit.jupiter.api.extension.RegisterExtension
@@ -40,6 +39,7 @@ class CustomPortDialogTest {
4039
@SuppressLint("ComposableNaming")
4140
@Composable
4241
private fun testWireguardCustomPortDialog(
42+
title: String = "",
4343
portInput: String = "",
4444
isValidInput: Boolean = false,
4545
showResetToDefault: Boolean = false,
@@ -49,16 +49,12 @@ class CustomPortDialogTest {
4949
onResetPort: () -> Unit = {},
5050
onDismiss: () -> Unit = {},
5151
) {
52-
val state =
53-
WireguardCustomPortDialogUiState(
54-
portInput = portInput,
55-
isValidInput = isValidInput,
56-
allowedPortRanges = allowedPortRanges,
57-
showResetToDefault = showResetToDefault,
58-
)
59-
60-
WireguardCustomPortDialog(
61-
state,
52+
CustomPortDialog(
53+
title = title,
54+
portInput = portInput,
55+
isValidInput = isValidInput,
56+
showResetToDefault = showResetToDefault,
57+
allowedPortRanges = allowedPortRanges,
6258
onInputChanged = onInputChanged,
6359
onSavePort = onSavePort,
6460
onDismiss = onDismiss,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package net.mullvad.mullvadvpn.compose.screen
2+
3+
import androidx.compose.ui.test.ExperimentalTestApi
4+
import androidx.compose.ui.test.onNodeWithTag
5+
import androidx.compose.ui.test.onNodeWithText
6+
import androidx.compose.ui.test.performClick
7+
import io.mockk.mockk
8+
import io.mockk.verify
9+
import net.mullvad.mullvadvpn.compose.createEdgeToEdgeComposeExtension
10+
import net.mullvad.mullvadvpn.compose.setContentWithTheme
11+
import net.mullvad.mullvadvpn.compose.state.ShadowsocksSettingsState
12+
import net.mullvad.mullvadvpn.compose.test.SHADOWSOCKS_CUSTOM_PORT_TEXT_TEST_TAG
13+
import net.mullvad.mullvadvpn.lib.model.Constraint
14+
import net.mullvad.mullvadvpn.lib.model.Port
15+
import org.junit.jupiter.api.Test
16+
import org.junit.jupiter.api.extension.RegisterExtension
17+
18+
@OptIn(ExperimentalTestApi::class)
19+
class ShadowsocksSettingsScreenTest {
20+
@JvmField @RegisterExtension val composeExtension = createEdgeToEdgeComposeExtension()
21+
22+
@Test
23+
fun testShowShadowsocksCustomPort() =
24+
composeExtension.use {
25+
// Arrange
26+
setContentWithTheme {
27+
ShadowsocksSettingsScreen(state = ShadowsocksSettingsState(customPort = Port(4000)))
28+
}
29+
30+
// Assert
31+
onNodeWithText("4000").assertExists()
32+
}
33+
34+
@Test
35+
fun testSelectShadowsocksCustomPort() =
36+
composeExtension.use {
37+
// Arrange
38+
val onObfuscationPortSelected: (Constraint<Port>) -> Unit = mockk(relaxed = true)
39+
setContentWithTheme {
40+
ShadowsocksSettingsScreen(
41+
state =
42+
ShadowsocksSettingsState(
43+
port = Constraint.Only(Port(4000)),
44+
customPort = Port(4000),
45+
),
46+
onObfuscationPortSelected = onObfuscationPortSelected,
47+
)
48+
}
49+
50+
// Act
51+
onNodeWithTag(testTag = SHADOWSOCKS_CUSTOM_PORT_TEXT_TEST_TAG).performClick()
52+
53+
// Assert
54+
verify { onObfuscationPortSelected.invoke(Constraint.Only(Port(4000))) }
55+
}
56+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package net.mullvad.mullvadvpn.compose.screen
2+
3+
import androidx.compose.ui.test.ExperimentalTestApi
4+
import androidx.compose.ui.test.performClick
5+
import io.mockk.coVerify
6+
import io.mockk.mockk
7+
import net.mullvad.mullvadvpn.compose.createEdgeToEdgeComposeExtension
8+
import net.mullvad.mullvadvpn.compose.setContentWithTheme
9+
import net.mullvad.mullvadvpn.compose.state.Udp2TcpSettingsState
10+
import net.mullvad.mullvadvpn.compose.test.UDP_OVER_TCP_PORT_ITEM_X_TEST_TAG
11+
import net.mullvad.mullvadvpn.lib.model.Constraint
12+
import net.mullvad.mullvadvpn.lib.model.Port
13+
import net.mullvad.mullvadvpn.onNodeWithTagAndText
14+
import org.junit.jupiter.api.Test
15+
import org.junit.jupiter.api.extension.RegisterExtension
16+
17+
@OptIn(ExperimentalTestApi::class)
18+
class Udp2TcpSettingsScreenTest {
19+
@JvmField @RegisterExtension val composeExtension = createEdgeToEdgeComposeExtension()
20+
21+
@Test
22+
fun testSelectTcpOverUdpPortOption() =
23+
composeExtension.use {
24+
// Arrange
25+
val onObfuscationPortSelected: (Constraint<Port>) -> Unit = mockk(relaxed = true)
26+
setContentWithTheme {
27+
Udp2TcpSettingsScreen(
28+
state = Udp2TcpSettingsState(port = Constraint.Any),
29+
onObfuscationPortSelected = onObfuscationPortSelected,
30+
)
31+
}
32+
33+
// Act
34+
onNodeWithTagAndText(
35+
testTag = String.format(UDP_OVER_TCP_PORT_ITEM_X_TEST_TAG, 5001),
36+
text = "5001",
37+
)
38+
.assertExists()
39+
.performClick()
40+
41+
// Assert
42+
coVerify(exactly = 1) { onObfuscationPortSelected.invoke(Constraint.Only(Port(5001))) }
43+
}
44+
}

android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreenTest.kt

+4-79
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import androidx.compose.ui.test.onNodeWithText
88
import androidx.compose.ui.test.performClick
99
import androidx.compose.ui.test.performScrollToNode
1010
import io.mockk.MockKAnnotations
11-
import io.mockk.coVerify
1211
import io.mockk.mockk
1312
import io.mockk.verify
1413
import net.mullvad.mullvadvpn.compose.createEdgeToEdgeComposeExtension
@@ -18,17 +17,15 @@ import net.mullvad.mullvadvpn.compose.test.LAZY_LIST_LAST_ITEM_TEST_TAG
1817
import net.mullvad.mullvadvpn.compose.test.LAZY_LIST_QUANTUM_ITEM_OFF_TEST_TAG
1918
import net.mullvad.mullvadvpn.compose.test.LAZY_LIST_QUANTUM_ITEM_ON_TEST_TAG
2019
import net.mullvad.mullvadvpn.compose.test.LAZY_LIST_TEST_TAG
21-
import net.mullvad.mullvadvpn.compose.test.LAZY_LIST_UDP_OVER_TCP_PORT_ITEM_X_TEST_TAG
22-
import net.mullvad.mullvadvpn.compose.test.LAZY_LIST_UDP_OVER_TCP_PORT_TEST_TAG
2320
import net.mullvad.mullvadvpn.compose.test.LAZY_LIST_WIREGUARD_CUSTOM_PORT_NUMBER_TEST_TAG
2421
import net.mullvad.mullvadvpn.compose.test.LAZY_LIST_WIREGUARD_CUSTOM_PORT_TEXT_TEST_TAG
22+
import net.mullvad.mullvadvpn.compose.test.LAZY_LIST_WIREGUARD_OBFUSCATION_TITLE_TEST_TAG
2523
import net.mullvad.mullvadvpn.compose.test.LAZY_LIST_WIREGUARD_PORT_ITEM_X_TEST_TAG
2624
import net.mullvad.mullvadvpn.lib.model.Constraint
2725
import net.mullvad.mullvadvpn.lib.model.Mtu
2826
import net.mullvad.mullvadvpn.lib.model.Port
2927
import net.mullvad.mullvadvpn.lib.model.PortRange
3028
import net.mullvad.mullvadvpn.lib.model.QuantumResistantState
31-
import net.mullvad.mullvadvpn.lib.model.SelectedObfuscation
3229
import net.mullvad.mullvadvpn.onNodeWithTagAndText
3330
import net.mullvad.mullvadvpn.viewmodel.CustomDnsItem
3431
import org.junit.jupiter.api.BeforeEach
@@ -206,74 +203,6 @@ class VpnSettingsScreenTest {
206203
onNodeWithContentDescription(LOCAL_DNS_SERVER_WARNING).assertExists()
207204
}
208205

209-
@Test
210-
fun testSelectTcpOverUdpPortOption() =
211-
composeExtension.use {
212-
// Arrange
213-
val onObfuscationPortSelected: (Constraint<Port>) -> Unit = mockk(relaxed = true)
214-
setContentWithTheme {
215-
VpnSettingsScreen(
216-
state =
217-
VpnSettingsUiState.createDefault(
218-
selectedObfuscation = SelectedObfuscation.Udp2Tcp,
219-
selectedObfuscationPort = Constraint.Only(Port(5001)),
220-
),
221-
onObfuscationPortSelected = onObfuscationPortSelected,
222-
)
223-
}
224-
225-
// Act
226-
onNodeWithTag(LAZY_LIST_TEST_TAG)
227-
.performScrollToNode(hasTestTag(LAZY_LIST_UDP_OVER_TCP_PORT_TEST_TAG))
228-
onNodeWithText("UDP-over-TCP port").performClick()
229-
onNodeWithTag(LAZY_LIST_TEST_TAG)
230-
.performScrollToNode(
231-
hasTestTag(String.format(LAZY_LIST_UDP_OVER_TCP_PORT_ITEM_X_TEST_TAG, 5001))
232-
)
233-
234-
// Assert
235-
onNodeWithTagAndText(
236-
testTag = String.format(LAZY_LIST_UDP_OVER_TCP_PORT_ITEM_X_TEST_TAG, 5001),
237-
text = "5001",
238-
)
239-
.assertExists()
240-
.performClick()
241-
242-
coVerify(exactly = 1) { onObfuscationPortSelected.invoke(Constraint.Only(Port(5001))) }
243-
}
244-
245-
@Test
246-
fun testAttemptSelectTcpOverUdpPortOption() =
247-
composeExtension.use {
248-
// Arrange
249-
val onObfuscationPortSelected: (Constraint<Port>) -> Unit = mockk(relaxed = true)
250-
setContentWithTheme {
251-
VpnSettingsScreen(
252-
state =
253-
VpnSettingsUiState.createDefault(
254-
selectedObfuscation = SelectedObfuscation.Off
255-
),
256-
onObfuscationPortSelected = onObfuscationPortSelected,
257-
)
258-
}
259-
260-
// Act
261-
onNodeWithTag(LAZY_LIST_TEST_TAG)
262-
.performScrollToNode(hasTestTag(LAZY_LIST_UDP_OVER_TCP_PORT_TEST_TAG))
263-
onNodeWithText("UDP-over-TCP port").performClick()
264-
onNodeWithTag(LAZY_LIST_TEST_TAG)
265-
.performScrollToNode(
266-
hasTestTag(String.format(LAZY_LIST_UDP_OVER_TCP_PORT_ITEM_X_TEST_TAG, 5001))
267-
)
268-
269-
// Assert
270-
onNodeWithTag(String.format(LAZY_LIST_UDP_OVER_TCP_PORT_ITEM_X_TEST_TAG, 5001))
271-
.assertExists()
272-
.performClick()
273-
274-
verify(exactly = 0) { onObfuscationPortSelected.invoke(any()) }
275-
}
276-
277206
@Test
278207
fun testShowSelectedTunnelQuantumOption() =
279208
composeExtension.use {
@@ -386,10 +315,7 @@ class VpnSettingsScreenTest {
386315
// Arrange
387316
setContentWithTheme {
388317
VpnSettingsScreen(
389-
state =
390-
VpnSettingsUiState.createDefault(
391-
customWireguardPort = Constraint.Only(Port(4000))
392-
)
318+
state = VpnSettingsUiState.createDefault(customWireguardPort = Port(4000))
393319
)
394320
}
395321

@@ -411,7 +337,7 @@ class VpnSettingsScreenTest {
411337
state =
412338
VpnSettingsUiState.createDefault(
413339
selectedWireguardPort = Constraint.Only(Port(4000)),
414-
customWireguardPort = Constraint.Only(Port(4000)),
340+
customWireguardPort = Port(4000),
415341
),
416342
onWireguardPortSelected = onWireguardPortSelected,
417343
)
@@ -483,9 +409,8 @@ class VpnSettingsScreenTest {
483409
}
484410

485411
// Act
486-
487412
onNodeWithTag(LAZY_LIST_TEST_TAG)
488-
.performScrollToNode(hasTestTag(LAZY_LIST_UDP_OVER_TCP_PORT_TEST_TAG))
413+
.performScrollToNode(hasTestTag(LAZY_LIST_WIREGUARD_OBFUSCATION_TITLE_TEST_TAG))
489414
onNodeWithText("WireGuard obfuscation").performClick()
490415

491416
// Assert

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/cell/InformationComposeCell.kt

+2
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ fun InformationComposeCell(
4141
background: Color = MaterialTheme.colorScheme.primary,
4242
onCellClicked: () -> Unit = {},
4343
onInfoClicked: (() -> Unit)? = null,
44+
testTag: String = "",
4445
) {
4546
val titleModifier = Modifier.alpha(if (isEnabled) AlphaVisible else AlphaInactive)
4647
val bodyViewModifier = Modifier
@@ -60,6 +61,7 @@ fun InformationComposeCell(
6061
InformationComposeCellBody(modifier = bodyViewModifier, onInfoClicked = onInfoClicked)
6162
},
6263
onCellClicked = onCellClicked,
64+
testTag = testTag,
6365
)
6466
}
6567

0 commit comments

Comments
 (0)