summaryrefslogtreecommitdiff
path: root/app/src/test
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/test')
-rw-r--r--app/src/test/java/de/blinkt/openvpn/VpnProfileTest.java79
-rw-r--r--app/src/test/java/io/swagger/client/JSONTest.java31
-rw-r--r--app/src/test/java/se/leap/bitmaskclient/base/models/GatewayJsonTest.java2
-rw-r--r--app/src/test/java/se/leap/bitmaskclient/base/models/IntroducerTest.java83
-rw-r--r--app/src/test/java/se/leap/bitmaskclient/base/models/ProviderTest.java29
-rw-r--r--app/src/test/java/se/leap/bitmaskclient/base/utils/ConfigHelperTest.java31
-rw-r--r--app/src/test/java/se/leap/bitmaskclient/base/utils/CredentialsParserTest.java57
-rw-r--r--app/src/test/java/se/leap/bitmaskclient/base/utils/PreferenceHelperTest.java17
-rw-r--r--app/src/test/java/se/leap/bitmaskclient/base/utils/PrivateKeyHelperTest.java48
-rw-r--r--app/src/test/java/se/leap/bitmaskclient/eip/GatewayTest.java159
-rw-r--r--app/src/test/java/se/leap/bitmaskclient/eip/GatewaysManagerTest.java163
-rw-r--r--app/src/test/java/se/leap/bitmaskclient/eip/VpnCertificateValidatorTest.java4
-rw-r--r--app/src/test/java/se/leap/bitmaskclient/eip/VpnConfigGeneratorTest.java516
-rw-r--r--app/src/test/java/se/leap/bitmaskclient/pluggableTransports/models/KcpConfigTest.java15
-rw-r--r--app/src/test/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerTest.java276
-rw-r--r--app/src/test/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerV3Test.java (renamed from app/src/test/java/se/leap/bitmaskclient/eip/ProviderApiManagerTest.java)503
-rw-r--r--app/src/test/java/se/leap/bitmaskclient/providersetup/ProviderManagerTest.java19
-rw-r--r--app/src/test/java/se/leap/bitmaskclient/testutils/BackendMockResponses/NoErrorBackendResponseAPIv4.java2
-rw-r--r--app/src/test/java/se/leap/bitmaskclient/testutils/BackendMockResponses/TorFallbackBackendResponse.java2
-rw-r--r--app/src/test/java/se/leap/bitmaskclient/testutils/MockHelper.java45
-rw-r--r--app/src/test/java/se/leap/bitmaskclient/testutils/TestSetupHelper.java80
-rw-r--r--app/src/test/resources/ed25519_credentials.pem31
-rw-r--r--app/src/test/resources/multiple_pts_per_host_eip-service.json145
-rw-r--r--app/src/test/resources/preconfigured/riseup.net.pem40
-rw-r--r--app/src/test/resources/private_PKCS8_encoded_ecdsa_key.pem8
-rw-r--r--app/src/test/resources/private_PKCS8_encoded_ed25519_key.pem3
-rw-r--r--app/src/test/resources/ptdemo.bitmask.eip-service-obfsvpn1.0.0.json64
-rw-r--r--app/src/test/resources/ptdemo_kcp_gateways.json6
-rw-r--r--app/src/test/resources/ptdemo_misconfigured_ipv4ipv6.json3
-rw-r--r--app/src/test/resources/ptdemo_misconfigured_tcp2.json (renamed from app/src/test/resources/ptdemo_misconfigured_udp2.json)2
-rw-r--r--app/src/test/resources/ptdemo_misconfigured_udptcp.json3
-rw-r--r--app/src/test/resources/ptdemo_obfs4hop_tcp_gateways.json3
-rw-r--r--app/src/test/resources/ptdemo_three_mixed_gateways.json4
-rw-r--r--app/src/test/resources/riseup.net.pem40
-rw-r--r--app/src/test/resources/v4/generictest.cert49
-rw-r--r--app/src/test/resources/v4/riseup.net.cert76
-rw-r--r--app/src/test/resources/v4/riseup_eipservice_for_geoip_v4.json15
37 files changed, 1748 insertions, 905 deletions
diff --git a/app/src/test/java/de/blinkt/openvpn/VpnProfileTest.java b/app/src/test/java/de/blinkt/openvpn/VpnProfileTest.java
index ad42ffde..aa098b94 100644
--- a/app/src/test/java/de/blinkt/openvpn/VpnProfileTest.java
+++ b/app/src/test/java/de/blinkt/openvpn/VpnProfileTest.java
@@ -4,6 +4,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.when;
import static de.blinkt.openvpn.core.connection.Connection.TransportType.OBFS4;
@@ -25,22 +26,23 @@ import de.blinkt.openvpn.core.connection.Obfs4Connection;
import de.blinkt.openvpn.core.connection.OpenvpnConnection;
import se.leap.bitmaskclient.base.models.Transport;
import se.leap.bitmaskclient.base.utils.BuildConfigHelper;
-import se.leap.bitmaskclient.pluggableTransports.Obfs4Options;
+import se.leap.bitmaskclient.pluggableTransports.models.Obfs4Options;
@RunWith(PowerMockRunner.class)
@PrepareForTest({UUID.class, BuildConfigHelper.class})
public class VpnProfileTest {
private static final String OPENVPNCONNECTION_PROFILE = "{\"mCipher\":\"\",\"mProfileVersion\":7,\"mLastUsed\":0,\"mCheckRemoteCN\":true,\"mVerb\":\"1\",\"mRemoteRandom\":false,\"mRoutenopull\":false,\"mConnectRetry\":\"2\",\"mAllowedAppsVpn\":[],\"mUserEditable\":true,\"mUseUdp\":true,\"mAllowedAppsVpnAreDisallowed\":true,\"mDNS1\":\"8.8.8.8\",\"mDNS2\":\"8.8.4.4\",\"mUseCustomConfig\":false,\"mUseFloat\":false,\"mUseDefaultRoute\":true,\"mConnectRetryMaxTime\":\"300\",\"mNobind\":true,\"mVersion\":0,\"mConnectRetryMax\":\"-1\",\"mOverrideDNS\":false,\"mAuth\":\"\",\"mTunMtu\":0,\"mPassword\":\"\",\"mTLSAuthDirection\":\"\",\"mKeyPassword\":\"\",\"mCustomConfigOptions\":\"\",\"mName\":\"mockProfile\",\"mExpectTLSCert\":false,\"mUsername\":\"\",\"mAllowLocalLAN\":false,\"mDataCiphers\":\"\",\"mSearchDomain\":\"blinkt.de\",\"mTemporaryProfile\":false,\"mUseTLSAuth\":false,\"mRemoteCN\":\"\",\"mCustomRoutesv6\":\"\",\"mPersistTun\":false,\"mX509AuthType\":3,\"mUuid\":\"9d295ca2-3789-48dd-996e-f731dbf50fdc\",\"mServerName\":\"openvpn.example.com\",\"mMssFix\":0,\"mPushPeerInfo\":false,\"mAuthenticationType\":2,\"mBlockUnusedAddressFamilies\":true,\"mServerPort\":\"1194\",\"mUseDefaultRoutev6\":true,\"mConnections\":[{\"mCustomConfiguration\":\"\",\"mUseUdp\":false,\"mServerName\":\"openvpn.example.com\",\"mProxyType\":\"NONE\",\"mProxyPort\":\"8080\",\"mUseCustomConfig\":false,\"mConnectTimeout\":0,\"mProxyName\":\"proxy.example.com\",\"mUseProxyAuth\":false,\"ConnectionAdapter.META_TYPE\":\"de.blinkt.openvpn.core.connection.OpenvpnConnection\",\"mServerPort\":\"1194\",\"mEnabled\":true}],\"mUseLzo\":false,\"mTransportType\":1,\"mAllowAppVpnBypass\":false,\"mUsePull\":true,\"mUseRandomHostname\":false,\"mAuthRetry\":0}";
- private static final String OBFS4CONNECTION_PROFILE = "{\"mCipher\":\"\",\"mProfileVersion\":7,\"mLastUsed\":0,\"mCheckRemoteCN\":true,\"mVerb\":\"1\",\"mRemoteRandom\":false,\"mRoutenopull\":false,\"mConnectRetry\":\"2\",\"mAllowedAppsVpn\":[],\"mUserEditable\":true,\"mUseUdp\":true,\"mAllowedAppsVpnAreDisallowed\":true,\"mDNS1\":\"8.8.8.8\",\"mDNS2\":\"8.8.4.4\",\"mUseCustomConfig\":false,\"mUseFloat\":false,\"mUseDefaultRoute\":true,\"mConnectRetryMaxTime\":\"300\",\"mNobind\":true,\"mVersion\":0,\"mConnectRetryMax\":\"-1\",\"mOverrideDNS\":false,\"mAuth\":\"\",\"mTunMtu\":0,\"mPassword\":\"\",\"mTLSAuthDirection\":\"\",\"mKeyPassword\":\"\",\"mCustomConfigOptions\":\"\",\"mName\":\"mockProfile\",\"mExpectTLSCert\":false,\"mUsername\":\"\",\"mAllowLocalLAN\":false,\"mDataCiphers\":\"\",\"mSearchDomain\":\"blinkt.de\",\"mTemporaryProfile\":false,\"mUseTLSAuth\":false,\"mRemoteCN\":\"\",\"mCustomRoutesv6\":\"\",\"mPersistTun\":false,\"mX509AuthType\":3,\"mUuid\":\"9d295ca2-3789-48dd-996e-f731dbf50fdc\",\"mServerName\":\"openvpn.example.com\",\"mMssFix\":0,\"mPushPeerInfo\":false,\"mAuthenticationType\":2,\"mBlockUnusedAddressFamilies\":true,\"mServerPort\":\"1194\",\"mUseDefaultRoutev6\":true,\"mConnections\":[{\"mCustomConfiguration\":\"\",\"mServerName\":\"127.0.0.1\",\"mProxyType\":\"NONE\",\"mConnectTimeout\":0,\"mServerPort\":\"4430\",\"mUseUdp\":false,\"mProxyPort\":\"\",\"mUseCustomConfig\":false,\"options\":{\"gatewayIP\":\"192.168.0.1\",\"transport\":{\"options\":{\"portCount\":0,\"iatMode\":\"0\",\"cert\":\"CERT\",\"experimental\":false,\"portSeed\":0},\"type\":\"obfs4\",\"protocols\":[\"tcp\"],\"ports\":[\"1234\"]}},\"mProxyName\":\"\",\"mUseProxyAuth\":false,\"ConnectionAdapter.META_TYPE\":\"de.blinkt.openvpn.core.connection.Obfs4Connection\",\"mEnabled\":true}],\"mUseLzo\":false,\"mTransportType\":2,\"mAllowAppVpnBypass\":false,\"mUsePull\":true,\"mUseRandomHostname\":false,\"mAuthRetry\":0}";
- private static final String OBFS4CONNECTION_PROFILE_OBFSVPN = "{\"mCipher\":\"\",\"mProfileVersion\":7,\"mLastUsed\":0,\"mCheckRemoteCN\":true,\"mVerb\":\"1\",\"mRemoteRandom\":false,\"mRoutenopull\":false,\"mConnectRetry\":\"2\",\"mAllowedAppsVpn\":[],\"mUserEditable\":true,\"mUseUdp\":true,\"mAllowedAppsVpnAreDisallowed\":true,\"mDNS1\":\"8.8.8.8\",\"mDNS2\":\"8.8.4.4\",\"mUseCustomConfig\":false,\"mUseFloat\":false,\"mUseDefaultRoute\":true,\"mConnectRetryMaxTime\":\"300\",\"mNobind\":true,\"mVersion\":0,\"mConnectRetryMax\":\"-1\",\"mOverrideDNS\":false,\"mAuth\":\"\",\"mTunMtu\":0,\"mPassword\":\"\",\"mTLSAuthDirection\":\"\",\"mKeyPassword\":\"\",\"mCustomConfigOptions\":\"\",\"mName\":\"mockProfile\",\"mExpectTLSCert\":false,\"mUsername\":\"\",\"mAllowLocalLAN\":false,\"mDataCiphers\":\"\",\"mSearchDomain\":\"blinkt.de\",\"mTemporaryProfile\":false,\"mUseTLSAuth\":false,\"mRemoteCN\":\"\",\"mCustomRoutesv6\":\"\",\"mPersistTun\":false,\"mX509AuthType\":3,\"mUuid\":\"9d295ca2-3789-48dd-996e-f731dbf50fdc\",\"mServerName\":\"openvpn.example.com\",\"mMssFix\":0,\"mPushPeerInfo\":false,\"mAuthenticationType\":2,\"mBlockUnusedAddressFamilies\":true,\"mServerPort\":\"1194\",\"mUseDefaultRoutev6\":true,\"mConnections\":[{\"mCustomConfiguration\":\"\",\"mServerName\":\"192.168.0.1\",\"mProxyType\":\"SOCKS5\",\"mConnectTimeout\":0,\"mServerPort\":\"1234\",\"mUseUdp\":false,\"mProxyPort\":\"4430\",\"mUseCustomConfig\":false,\"options\":{\"gatewayIP\":\"192.168.0.1\",\"transport\":{\"options\":{\"portCount\":0,\"iatMode\":\"1\",\"cert\":\"CERT\",\"experimental\":false,\"portSeed\":0},\"type\":\"obfs4\",\"protocols\":[\"tcp\"],\"ports\":[\"1234\"]}},\"mProxyName\":\"127.0.0.1\",\"mUseProxyAuth\":false,\"ConnectionAdapter.META_TYPE\":\"de.blinkt.openvpn.core.connection.Obfs4Connection\",\"mEnabled\":true}],\"mUseLzo\":false,\"mTransportType\":2,\"mAllowAppVpnBypass\":false,\"mUsePull\":true,\"mUseRandomHostname\":false,\"mAuthRetry\":0}";
- private static final String OBFS4CONNECTION_PROFILE_OBFSVPN_KCP = "{\"mCipher\":\"\",\"mProfileVersion\":7,\"mLastUsed\":0,\"mCheckRemoteCN\":true,\"mVerb\":\"1\",\"mRemoteRandom\":false,\"mRoutenopull\":false,\"mConnectRetry\":\"2\",\"mAllowedAppsVpn\":[],\"mUserEditable\":true,\"mUseUdp\":true,\"mAllowedAppsVpnAreDisallowed\":true,\"mDNS1\":\"8.8.8.8\",\"mDNS2\":\"8.8.4.4\",\"mUseCustomConfig\":false,\"mUseFloat\":false,\"mUseDefaultRoute\":true,\"mConnectRetryMaxTime\":\"300\",\"mNobind\":true,\"mVersion\":0,\"mConnectRetryMax\":\"-1\",\"mOverrideDNS\":false,\"mAuth\":\"\",\"mTunMtu\":0,\"mPassword\":\"\",\"mTLSAuthDirection\":\"\",\"mKeyPassword\":\"\",\"mCustomConfigOptions\":\"\",\"mName\":\"mockProfile\",\"mExpectTLSCert\":false,\"mUsername\":\"\",\"mAllowLocalLAN\":false,\"mDataCiphers\":\"\",\"mSearchDomain\":\"blinkt.de\",\"mTemporaryProfile\":false,\"mUseTLSAuth\":false,\"mRemoteCN\":\"\",\"mCustomRoutesv6\":\"\",\"mPersistTun\":false,\"mX509AuthType\":3,\"mUuid\":\"9d295ca2-3789-48dd-996e-f731dbf50fdc\",\"mServerName\":\"openvpn.example.com\",\"mMssFix\":0,\"mPushPeerInfo\":false,\"mAuthenticationType\":2,\"mBlockUnusedAddressFamilies\":true,\"mServerPort\":\"1194\",\"mUseDefaultRoutev6\":true,\"mConnections\":[{\"mCustomConfiguration\":\"\",\"mServerName\":\"192.168.0.1\",\"mProxyType\":\"SOCKS5\",\"mConnectTimeout\":0,\"mServerPort\":\"1234\",\"mUseUdp\":false,\"mProxyPort\":\"4430\",\"mUseCustomConfig\":false,\"options\":{\"gatewayIP\":\"192.168.0.1\",\"transport\":{\"options\":{\"portCount\":0,\"iatMode\":\"1\",\"cert\":\"CERT\",\"experimental\":false,\"portSeed\":0},\"type\":\"obfs4\",\"protocols\":[\"kcp\"],\"ports\":[\"1234\"]}},\"mProxyName\":\"127.0.0.1\",\"mUseProxyAuth\":false,\"ConnectionAdapter.META_TYPE\":\"de.blinkt.openvpn.core.connection.Obfs4Connection\",\"mEnabled\":true}],\"mUseLzo\":false,\"mTransportType\":2,\"mAllowAppVpnBypass\":false,\"mUsePull\":true,\"mUseRandomHostname\":false,\"mAuthRetry\":0}\n";
+ private static final String OBFS4CONNECTION_PROFILE = "{\"mCipher\":\"\",\"mProfileVersion\":7,\"mLastUsed\":0,\"mCheckRemoteCN\":true,\"mVerb\":\"1\",\"mRemoteRandom\":false,\"mRoutenopull\":false,\"mConnectRetry\":\"2\",\"mAllowedAppsVpn\":[],\"mUserEditable\":true,\"mUseUdp\":true,\"mAllowedAppsVpnAreDisallowed\":true,\"mDNS1\":\"8.8.8.8\",\"mDNS2\":\"8.8.4.4\",\"mUseCustomConfig\":false,\"mUseFloat\":false,\"mUseDefaultRoute\":true,\"mConnectRetryMaxTime\":\"300\",\"mNobind\":true,\"mVersion\":0,\"mConnectRetryMax\":\"-1\",\"mOverrideDNS\":false,\"mAuth\":\"\",\"mTunMtu\":0,\"mPassword\":\"\",\"mTLSAuthDirection\":\"\",\"mKeyPassword\":\"\",\"mCustomConfigOptions\":\"\",\"mName\":\"mockProfile\",\"mExpectTLSCert\":false,\"mUsername\":\"\",\"mAllowLocalLAN\":false,\"mDataCiphers\":\"\",\"mSearchDomain\":\"blinkt.de\",\"mTemporaryProfile\":false,\"mUseTLSAuth\":false,\"mRemoteCN\":\"\",\"mCustomRoutesv6\":\"\",\"mPersistTun\":false,\"mX509AuthType\":3,\"mUuid\":\"9d295ca2-3789-48dd-996e-f731dbf50fdc\",\"mServerName\":\"openvpn.example.com\",\"mMssFix\":0,\"mPushPeerInfo\":false,\"mAuthenticationType\":2,\"mBlockUnusedAddressFamilies\":true,\"mServerPort\":\"1194\",\"mUseDefaultRoutev6\":true,\"mConnections\":[{\"mCustomConfiguration\":\"\",\"mServerName\":\"127.0.0.1\",\"mProxyType\":\"NONE\",\"mConnectTimeout\":0,\"mServerPort\":\"8080\",\"mUseUdp\":true,\"mProxyPort\":\"\",\"mUseCustomConfig\":false,\"options\":{\"bridgeIP\":\"192.168.0.1\",\"transport\":{\"options\":{\"minHopSeconds\":0,\"portCount\":0,\"iatMode\":\"0\",\"cert\":\"CERT\",\"experimental\":false,\"minHopPort\":0,\"portSeed\":0,\"hopJitter\":0,\"maxHopPort\":0},\"type\":\"obfs4\",\"protocols\":[\"tcp\"],\"ports\":[\"1234\"]}},\"mProxyName\":\"\",\"mUseProxyAuth\":false,\"ConnectionAdapter.META_TYPE\":\"de.blinkt.openvpn.core.connection.Obfs4Connection\",\"mEnabled\":true}],\"mUseLzo\":false,\"mTransportType\":2,\"mAllowAppVpnBypass\":false,\"mUsePull\":true,\"mUseRandomHostname\":false,\"mAuthRetry\":0}";
+ private static final String OBFS4CONNECTION_PROFILE_OBFSVPN = "{\"mCipher\":\"\",\"mProfileVersion\":7,\"mLastUsed\":0,\"mCheckRemoteCN\":true,\"mVerb\":\"1\",\"mRemoteRandom\":false,\"mRoutenopull\":false,\"mConnectRetry\":\"2\",\"mAllowedAppsVpn\":[],\"mUserEditable\":true,\"mUseUdp\":true,\"mAllowedAppsVpnAreDisallowed\":true,\"mDNS1\":\"8.8.8.8\",\"mDNS2\":\"8.8.4.4\",\"mUseCustomConfig\":false,\"mUseFloat\":false,\"mUseDefaultRoute\":true,\"mConnectRetryMaxTime\":\"300\",\"mNobind\":true,\"mVersion\":0,\"mConnectRetryMax\":\"-1\",\"mOverrideDNS\":false,\"mAuth\":\"\",\"mTunMtu\":0,\"mPassword\":\"\",\"mTLSAuthDirection\":\"\",\"mKeyPassword\":\"\",\"mCustomConfigOptions\":\"\",\"mName\":\"mockProfile\",\"mExpectTLSCert\":false,\"mUsername\":\"\",\"mAllowLocalLAN\":false,\"mDataCiphers\":\"\",\"mSearchDomain\":\"blinkt.de\",\"mTemporaryProfile\":false,\"mUseTLSAuth\":false,\"mRemoteCN\":\"\",\"mCustomRoutesv6\":\"\",\"mPersistTun\":false,\"mX509AuthType\":3,\"mUuid\":\"9d295ca2-3789-48dd-996e-f731dbf50fdc\",\"mServerName\":\"openvpn.example.com\",\"mMssFix\":0,\"mPushPeerInfo\":false,\"mAuthenticationType\":2,\"mBlockUnusedAddressFamilies\":true,\"mServerPort\":\"1194\",\"mUseDefaultRoutev6\":true,\"mConnections\":[{\"mCustomConfiguration\":\"\",\"mServerName\":\"127.0.0.1\",\"mProxyType\":\"NONE\",\"mConnectTimeout\":0,\"mServerPort\":\"8080\",\"mUseUdp\":true,\"mProxyPort\":\"\",\"mUseCustomConfig\":false,\"options\":{\"bridgeIP\":\"192.168.0.1\",\"transport\":{\"options\":{\"minHopSeconds\":0,\"portCount\":0,\"iatMode\":\"1\",\"cert\":\"CERT\",\"experimental\":false,\"minHopPort\":0,\"portSeed\":0,\"hopJitter\":0,\"maxHopPort\":0},\"type\":\"obfs4\",\"protocols\":[\"tcp\"],\"ports\":[\"1234\"]}},\"mProxyName\":\"\",\"mUseProxyAuth\":false,\"ConnectionAdapter.META_TYPE\":\"de.blinkt.openvpn.core.connection.Obfs4Connection\",\"mEnabled\":true}],\"mUseLzo\":false,\"mTransportType\":2,\"mAllowAppVpnBypass\":false,\"mUsePull\":true,\"mUseRandomHostname\":false,\"mAuthRetry\":0}";
+ private static final String OBFS4CONNECTION_PROFILE_OBFSVPN_KCP = "{\"mCipher\":\"\",\"mProfileVersion\":7,\"mLastUsed\":0,\"mCheckRemoteCN\":true,\"mVerb\":\"1\",\"mRemoteRandom\":false,\"mRoutenopull\":false,\"mConnectRetry\":\"2\",\"mAllowedAppsVpn\":[],\"mUserEditable\":true,\"mUseUdp\":true,\"mAllowedAppsVpnAreDisallowed\":true,\"mDNS1\":\"8.8.8.8\",\"mDNS2\":\"8.8.4.4\",\"mUseCustomConfig\":false,\"mUseFloat\":false,\"mUseDefaultRoute\":true,\"mConnectRetryMaxTime\":\"300\",\"mNobind\":true,\"mVersion\":0,\"mConnectRetryMax\":\"-1\",\"mOverrideDNS\":false,\"mAuth\":\"\",\"mTunMtu\":0,\"mPassword\":\"\",\"mTLSAuthDirection\":\"\",\"mKeyPassword\":\"\",\"mCustomConfigOptions\":\"\",\"mName\":\"mockProfile\",\"mExpectTLSCert\":false,\"mUsername\":\"\",\"mAllowLocalLAN\":false,\"mDataCiphers\":\"\",\"mSearchDomain\":\"blinkt.de\",\"mTemporaryProfile\":false,\"mUseTLSAuth\":false,\"mRemoteCN\":\"\",\"mCustomRoutesv6\":\"\",\"mPersistTun\":false,\"mX509AuthType\":3,\"mUuid\":\"9d295ca2-3789-48dd-996e-f731dbf50fdc\",\"mServerName\":\"openvpn.example.com\",\"mMssFix\":0,\"mPushPeerInfo\":false,\"mAuthenticationType\":2,\"mBlockUnusedAddressFamilies\":true,\"mServerPort\":\"1194\",\"mUseDefaultRoutev6\":true,\"mConnections\":[{\"mCustomConfiguration\":\"\",\"mServerName\":\"127.0.0.1\",\"mProxyType\":\"NONE\",\"mConnectTimeout\":0,\"mServerPort\":\"8080\",\"mUseUdp\":true,\"mProxyPort\":\"\",\"mUseCustomConfig\":false,\"options\":{\"bridgeIP\":\"192.168.0.1\",\"transport\":{\"options\":{\"minHopSeconds\":0,\"portCount\":0,\"iatMode\":\"1\",\"cert\":\"CERT\",\"experimental\":false,\"minHopPort\":0,\"portSeed\":0,\"hopJitter\":0,\"maxHopPort\":0},\"type\":\"obfs4\",\"protocols\":[\"kcp\"],\"ports\":[\"1234\"]}},\"mProxyName\":\"\",\"mUseProxyAuth\":false,\"ConnectionAdapter.META_TYPE\":\"de.blinkt.openvpn.core.connection.Obfs4Connection\",\"mEnabled\":true}],\"mUseLzo\":false,\"mTransportType\":2,\"mAllowAppVpnBypass\":false,\"mUsePull\":true,\"mUseRandomHostname\":false,\"mAuthRetry\":0}\n";
+ private static final String OBFS4CONNECTION_PROFILE_OBFSVPN_QUIC = "{\"mCipher\":\"\",\"mProfileVersion\":7,\"mLastUsed\":0,\"mCheckRemoteCN\":true,\"mVerb\":\"1\",\"mRemoteRandom\":false,\"mRoutenopull\":false,\"mConnectRetry\":\"2\",\"mAllowedAppsVpn\":[],\"mUserEditable\":true,\"mUseUdp\":true,\"mAllowedAppsVpnAreDisallowed\":true,\"mDNS1\":\"8.8.8.8\",\"mDNS2\":\"8.8.4.4\",\"mUseCustomConfig\":false,\"mUseFloat\":false,\"mUseDefaultRoute\":true,\"mConnectRetryMaxTime\":\"300\",\"mNobind\":true,\"mVersion\":0,\"mConnectRetryMax\":\"-1\",\"mOverrideDNS\":false,\"mAuth\":\"\",\"mTunMtu\":0,\"mPassword\":\"\",\"mTLSAuthDirection\":\"\",\"mKeyPassword\":\"\",\"mCustomConfigOptions\":\"\",\"mName\":\"mockProfile\",\"mExpectTLSCert\":false,\"mUsername\":\"\",\"mAllowLocalLAN\":false,\"mDataCiphers\":\"\",\"mSearchDomain\":\"blinkt.de\",\"mTemporaryProfile\":false,\"mUseTLSAuth\":false,\"mRemoteCN\":\"\",\"mCustomRoutesv6\":\"\",\"mPersistTun\":false,\"mX509AuthType\":3,\"mUuid\":\"9d295ca2-3789-48dd-996e-f731dbf50fdc\",\"mServerName\":\"openvpn.example.com\",\"mMssFix\":0,\"mPushPeerInfo\":false,\"mAuthenticationType\":2,\"mBlockUnusedAddressFamilies\":true,\"mServerPort\":\"1194\",\"mUseDefaultRoutev6\":true,\"mConnections\":[{\"mCustomConfiguration\":\"\",\"mServerName\":\"127.0.0.1\",\"mProxyType\":\"NONE\",\"mConnectTimeout\":0,\"mServerPort\":\"8080\",\"mUseUdp\":true,\"mProxyPort\":\"\",\"mUseCustomConfig\":false,\"options\":{\"bridgeIP\":\"192.168.0.1\",\"transport\":{\"options\":{\"minHopSeconds\":0,\"portCount\":0,\"iatMode\":\"1\",\"cert\":\"CERT\",\"experimental\":false,\"minHopPort\":0,\"portSeed\":0,\"hopJitter\":0,\"maxHopPort\":0},\"type\":\"obfs4\",\"protocols\":[\"quic\"],\"ports\":[\"1234\"]}},\"mProxyName\":\"\",\"mUseProxyAuth\":false,\"ConnectionAdapter.META_TYPE\":\"de.blinkt.openvpn.core.connection.Obfs4Connection\",\"mEnabled\":true}],\"mUseLzo\":false,\"mTransportType\":2,\"mAllowAppVpnBypass\":false,\"mUsePull\":true,\"mUseRandomHostname\":false,\"mAuthRetry\":0}\n";
- private static final String OBFS4CONNECTION_PROFILE_OBFSVPN_HOP = "{\"mCipher\":\"\",\"mProfileVersion\":7,\"mLastUsed\":0,\"mCheckRemoteCN\":true,\"mVerb\":\"1\",\"mRemoteRandom\":false,\"mRoutenopull\":false,\"mConnectRetry\":\"2\",\"mAllowedAppsVpn\":[],\"mUserEditable\":true,\"mUseUdp\":true,\"mAllowedAppsVpnAreDisallowed\":true,\"mDNS1\":\"8.8.8.8\",\"mDNS2\":\"8.8.4.4\",\"mUseCustomConfig\":false,\"mUseFloat\":false,\"mUseDefaultRoute\":true,\"mConnectRetryMaxTime\":\"300\",\"mNobind\":true,\"mVersion\":0,\"mConnectRetryMax\":\"-1\",\"mOverrideDNS\":false,\"mAuth\":\"\",\"mTunMtu\":0,\"mPassword\":\"\",\"mTLSAuthDirection\":\"\",\"mKeyPassword\":\"\",\"mCustomConfigOptions\":\"\",\"mName\":\"mockProfile\",\"mExpectTLSCert\":false,\"mUsername\":\"\",\"mAllowLocalLAN\":false,\"mDataCiphers\":\"\",\"mSearchDomain\":\"blinkt.de\",\"mTemporaryProfile\":false,\"mUseTLSAuth\":false,\"mRemoteCN\":\"\",\"mCustomRoutesv6\":\"\",\"mPersistTun\":false,\"mX509AuthType\":3,\"mUuid\":\"9d295ca2-3789-48dd-996e-f731dbf50fdc\",\"mServerName\":\"openvpn.example.com\",\"mMssFix\":0,\"mPushPeerInfo\":false,\"mAuthenticationType\":2,\"mBlockUnusedAddressFamilies\":true,\"mServerPort\":\"1194\",\"mUseDefaultRoutev6\":true,\"mConnections\":[{\"mCustomConfiguration\":\"\",\"mServerName\":\"192.168.0.1\",\"mProxyType\":\"SOCKS5\",\"mConnectTimeout\":0,\"mServerPort\":\"1234\",\"mUseUdp\":false,\"mProxyPort\":\"4430\",\"mUseCustomConfig\":false,\"options\":{\"gatewayIP\":\"192.168.0.1\",\"transport\":{\"options\":{\"portCount\":100,\"endpoints\":[{\"ip\":\"1.1.1.1\",\"cert\":\"CERT1\"},{\"ip\":\"2.2.2.2\",\"cert\":\"CERT2\"}],\"iatMode\":\"1\",\"experimental\":true,\"portSeed\":200},\"type\":\"obfs4\",\"protocols\":[\"tcp\"],\"ports\":[\"1234\"]}},\"mProxyName\":\"127.0.0.1\",\"mUseProxyAuth\":false,\"ConnectionAdapter.META_TYPE\":\"de.blinkt.openvpn.core.connection.Obfs4Connection\",\"mEnabled\":true}],\"mUseLzo\":false,\"mTransportType\":3,\"mAllowAppVpnBypass\":false,\"mUsePull\":true,\"mUseRandomHostname\":false,\"mAuthRetry\":0}\n";
+ private static final String OBFS4CONNECTION_PROFILE_OBFSVPN_HOP = "{\"mCipher\":\"\",\"mProfileVersion\":7,\"mLastUsed\":0,\"mCheckRemoteCN\":true,\"mVerb\":\"1\",\"mRemoteRandom\":false,\"mRoutenopull\":false,\"mConnectRetry\":\"2\",\"mAllowedAppsVpn\":[],\"mUserEditable\":true,\"mUseUdp\":true,\"mAllowedAppsVpnAreDisallowed\":true,\"mDNS1\":\"8.8.8.8\",\"mDNS2\":\"8.8.4.4\",\"mUseCustomConfig\":false,\"mUseFloat\":false,\"mUseDefaultRoute\":true,\"mConnectRetryMaxTime\":\"300\",\"mNobind\":true,\"mVersion\":0,\"mConnectRetryMax\":\"-1\",\"mOverrideDNS\":false,\"mAuth\":\"\",\"mTunMtu\":0,\"mPassword\":\"\",\"mTLSAuthDirection\":\"\",\"mKeyPassword\":\"\",\"mCustomConfigOptions\":\"\",\"mName\":\"mockProfile\",\"mExpectTLSCert\":false,\"mUsername\":\"\",\"mAllowLocalLAN\":false,\"mDataCiphers\":\"\",\"mSearchDomain\":\"blinkt.de\",\"mTemporaryProfile\":false,\"mUseTLSAuth\":false,\"mRemoteCN\":\"\",\"mCustomRoutesv6\":\"\",\"mPersistTun\":false,\"mX509AuthType\":3,\"mUuid\":\"9d295ca2-3789-48dd-996e-f731dbf50fdc\",\"mServerName\":\"openvpn.example.com\",\"mMssFix\":0,\"mPushPeerInfo\":false,\"mAuthenticationType\":2,\"mBlockUnusedAddressFamilies\":true,\"mServerPort\":\"1194\",\"mUseDefaultRoutev6\":true,\"mConnections\":[{\"mCustomConfiguration\":\"\",\"mServerName\":\"127.0.0.1\",\"mProxyType\":\"NONE\",\"mConnectTimeout\":0,\"mServerPort\":\"8080\",\"mUseUdp\":true,\"mProxyPort\":\"\",\"mUseCustomConfig\":false,\"options\":{\"bridgeIP\":\"192.168.0.1\",\"transport\":{\"options\":{\"minHopSeconds\":10,\"portCount\":100,\"endpoints\":[{\"ip\":\"1.1.1.1\",\"cert\":\"CERT1\"},{\"ip\":\"2.2.2.2\",\"cert\":\"CERT2\"}],\"iatMode\":\"1\",\"experimental\":true,\"minHopPort\":40000,\"portSeed\":2500,\"hopJitter\":10,\"maxHopPort\":64000},\"type\":\"obfs4\",\"protocols\":[\"tcp\"],\"ports\":[\"1234\"]}},\"mProxyName\":\"\",\"mUseProxyAuth\":false,\"ConnectionAdapter.META_TYPE\":\"de.blinkt.openvpn.core.connection.Obfs4Connection\",\"mEnabled\":true}],\"mUseLzo\":false,\"mTransportType\":3,\"mAllowAppVpnBypass\":false,\"mUsePull\":true,\"mUseRandomHostname\":false,\"mAuthRetry\":0}\n";
- private static final String OBFS4CONNECTION_PROFILE_OBFSVPN_HOP_KCP = "{\"mCipher\":\"\",\"mProfileVersion\":7,\"mLastUsed\":0,\"mCheckRemoteCN\":true,\"mVerb\":\"1\",\"mRemoteRandom\":false,\"mRoutenopull\":false,\"mConnectRetry\":\"2\",\"mAllowedAppsVpn\":[],\"mUserEditable\":true,\"mUseUdp\":true,\"mAllowedAppsVpnAreDisallowed\":true,\"mDNS1\":\"8.8.8.8\",\"mDNS2\":\"8.8.4.4\",\"mUseCustomConfig\":false,\"mUseFloat\":false,\"mUseDefaultRoute\":true,\"mConnectRetryMaxTime\":\"300\",\"mNobind\":true,\"mVersion\":0,\"mConnectRetryMax\":\"-1\",\"mOverrideDNS\":false,\"mAuth\":\"\",\"mTunMtu\":0,\"mPassword\":\"\",\"mTLSAuthDirection\":\"\",\"mKeyPassword\":\"\",\"mCustomConfigOptions\":\"\",\"mName\":\"mockProfile\",\"mExpectTLSCert\":false,\"mUsername\":\"\",\"mAllowLocalLAN\":false,\"mDataCiphers\":\"\",\"mSearchDomain\":\"blinkt.de\",\"mTemporaryProfile\":false,\"mUseTLSAuth\":false,\"mRemoteCN\":\"\",\"mCustomRoutesv6\":\"\",\"mPersistTun\":false,\"mX509AuthType\":3,\"mUuid\":\"9d295ca2-3789-48dd-996e-f731dbf50fdc\",\"mServerName\":\"openvpn.example.com\",\"mMssFix\":0,\"mPushPeerInfo\":false,\"mAuthenticationType\":2,\"mBlockUnusedAddressFamilies\":true,\"mServerPort\":\"1194\",\"mUseDefaultRoutev6\":true,\"mConnections\":[{\"mCustomConfiguration\":\"\",\"mServerName\":\"192.168.0.1\",\"mProxyType\":\"SOCKS5\",\"mConnectTimeout\":0,\"mServerPort\":\"1234\",\"mUseUdp\":false,\"mProxyPort\":\"4430\",\"mUseCustomConfig\":false,\"options\":{\"gatewayIP\":\"192.168.0.1\",\"transport\":{\"options\":{\"portCount\":100,\"endpoints\":[{\"ip\":\"1.1.1.1\",\"cert\":\"CERT1\"},{\"ip\":\"2.2.2.2\",\"cert\":\"CERT2\"}],\"iatMode\":\"1\",\"experimental\":true,\"portSeed\":2500},\"type\":\"obfs4\",\"protocols\":[\"kcp\"],\"ports\":[\"1234\"]}},\"mProxyName\":\"127.0.0.1\",\"mUseProxyAuth\":false,\"ConnectionAdapter.META_TYPE\":\"de.blinkt.openvpn.core.connection.Obfs4Connection\",\"mEnabled\":true}],\"mUseLzo\":false,\"mTransportType\":3,\"mAllowAppVpnBypass\":false,\"mUsePull\":true,\"mUseRandomHostname\":false,\"mAuthRetry\":0}\n";
+ private static final String OBFS4CONNECTION_PROFILE_OBFSVPN_HOP_KCP = "{\"mCipher\":\"\",\"mProfileVersion\":7,\"mLastUsed\":0,\"mCheckRemoteCN\":true,\"mVerb\":\"1\",\"mRemoteRandom\":false,\"mRoutenopull\":false,\"mConnectRetry\":\"2\",\"mAllowedAppsVpn\":[],\"mUserEditable\":true,\"mUseUdp\":true,\"mAllowedAppsVpnAreDisallowed\":true,\"mDNS1\":\"8.8.8.8\",\"mDNS2\":\"8.8.4.4\",\"mUseCustomConfig\":false,\"mUseFloat\":false,\"mUseDefaultRoute\":true,\"mConnectRetryMaxTime\":\"300\",\"mNobind\":true,\"mVersion\":0,\"mConnectRetryMax\":\"-1\",\"mOverrideDNS\":false,\"mAuth\":\"\",\"mTunMtu\":0,\"mPassword\":\"\",\"mTLSAuthDirection\":\"\",\"mKeyPassword\":\"\",\"mCustomConfigOptions\":\"\",\"mName\":\"mockProfile\",\"mExpectTLSCert\":false,\"mUsername\":\"\",\"mAllowLocalLAN\":false,\"mDataCiphers\":\"\",\"mSearchDomain\":\"blinkt.de\",\"mTemporaryProfile\":false,\"mUseTLSAuth\":false,\"mRemoteCN\":\"\",\"mCustomRoutesv6\":\"\",\"mPersistTun\":false,\"mX509AuthType\":3,\"mUuid\":\"9d295ca2-3789-48dd-996e-f731dbf50fdc\",\"mServerName\":\"openvpn.example.com\",\"mMssFix\":0,\"mPushPeerInfo\":false,\"mAuthenticationType\":2,\"mBlockUnusedAddressFamilies\":true,\"mServerPort\":\"1194\",\"mUseDefaultRoutev6\":true,\"mConnections\":[{\"mCustomConfiguration\":\"\",\"mServerName\":\"127.0.0.1\",\"mProxyType\":\"NONE\",\"mConnectTimeout\":0,\"mServerPort\":\"8080\",\"mUseUdp\":true,\"mProxyPort\":\"\",\"mUseCustomConfig\":false,\"options\":{\"bridgeIP\":\"192.168.0.1\",\"transport\":{\"options\":{\"minHopSeconds\":10,\"portCount\":100,\"endpoints\":[{\"ip\":\"1.1.1.1\",\"cert\":\"CERT1\"},{\"ip\":\"2.2.2.2\",\"cert\":\"CERT2\"}],\"iatMode\":\"1\",\"experimental\":true,\"minHopPort\":40000,\"portSeed\":2500,\"hopJitter\":10,\"maxHopPort\":64000},\"type\":\"obfs4\",\"protocols\":[\"kcp\"],\"ports\":[\"1234\"]}},\"mProxyName\":\"\",\"mUseProxyAuth\":false,\"ConnectionAdapter.META_TYPE\":\"de.blinkt.openvpn.core.connection.Obfs4Connection\",\"mEnabled\":true}],\"mUseLzo\":false,\"mTransportType\":3,\"mAllowAppVpnBypass\":false,\"mUsePull\":true,\"mUseRandomHostname\":false,\"mAuthRetry\":0}\n";
- private static final String OBFS4CONNECTION_PROFILE_OBFSVPN_PORTHOPPING = "{\"mCipher\":\"\",\"mProfileVersion\":7,\"mLastUsed\":0,\"mCheckRemoteCN\":true,\"mVerb\":\"1\",\"mRemoteRandom\":false,\"mRoutenopull\":false,\"mConnectRetry\":\"2\",\"mAllowedAppsVpn\":[],\"mUserEditable\":true,\"mUseUdp\":true,\"mAllowedAppsVpnAreDisallowed\":true,\"mDNS1\":\"8.8.8.8\",\"mDNS2\":\"8.8.4.4\",\"mUseCustomConfig\":false,\"mUseFloat\":false,\"mUseDefaultRoute\":true,\"mConnectRetryMaxTime\":\"300\",\"mNobind\":true,\"mVersion\":0,\"mConnectRetryMax\":\"-1\",\"mOverrideDNS\":false,\"mAuth\":\"\",\"mTunMtu\":0,\"mPassword\":\"\",\"mTLSAuthDirection\":\"\",\"mKeyPassword\":\"\",\"mCustomConfigOptions\":\"\",\"mName\":\"mockProfile\",\"mExpectTLSCert\":false,\"mUsername\":\"\",\"mAllowLocalLAN\":false,\"mDataCiphers\":\"\",\"mSearchDomain\":\"blinkt.de\",\"mTemporaryProfile\":false,\"mUseTLSAuth\":false,\"mRemoteCN\":\"\",\"mCustomRoutesv6\":\"\",\"mPersistTun\":false,\"mX509AuthType\":3,\"mUuid\":\"9d295ca2-3789-48dd-996e-f731dbf50fdc\",\"mServerName\":\"openvpn.example.com\",\"mMssFix\":0,\"mPushPeerInfo\":false,\"mAuthenticationType\":2,\"mBlockUnusedAddressFamilies\":true,\"mServerPort\":\"1194\",\"mUseDefaultRoutev6\":true,\"mConnections\":[{\"mCustomConfiguration\":\"\",\"mServerName\":\"192.168.0.1\",\"mProxyType\":\"SOCKS5\",\"mConnectTimeout\":0,\"mServerPort\":\"1234\",\"mUseUdp\":true,\"mProxyPort\":\"8080\",\"mUseCustomConfig\":false,\"options\":{\"gatewayIP\":\"192.168.0.1\",\"transport\":{\"options\":{\"portCount\":100,\"iatMode\":\"1\",\"cert\":\"CERT\",\"experimental\":true,\"portSeed\":200},\"type\":\"obfs4-hop\",\"protocols\":[\"tcp\"],\"ports\":[\"1234\"]}},\"mProxyName\":\"127.0.0.1\",\"mUseProxyAuth\":false,\"ConnectionAdapter.META_TYPE\":\"de.blinkt.openvpn.core.connection.Obfs4Connection\",\"mEnabled\":true}],\"mUseLzo\":false,\"mTransportType\":3,\"mAllowAppVpnBypass\":false,\"mUsePull\":true,\"mUseRandomHostname\":false,\"mAuthRetry\":0}\n";
+ private static final String OBFS4CONNECTION_PROFILE_OBFSVPN_PORTHOPPING = "{\"mCipher\":\"\",\"mProfileVersion\":7,\"mLastUsed\":0,\"mCheckRemoteCN\":true,\"mVerb\":\"1\",\"mRemoteRandom\":false,\"mRoutenopull\":false,\"mConnectRetry\":\"2\",\"mAllowedAppsVpn\":[],\"mUserEditable\":true,\"mUseUdp\":true,\"mAllowedAppsVpnAreDisallowed\":true,\"mDNS1\":\"8.8.8.8\",\"mDNS2\":\"8.8.4.4\",\"mUseCustomConfig\":false,\"mUseFloat\":false,\"mUseDefaultRoute\":true,\"mConnectRetryMaxTime\":\"300\",\"mNobind\":true,\"mVersion\":0,\"mConnectRetryMax\":\"-1\",\"mOverrideDNS\":false,\"mAuth\":\"\",\"mTunMtu\":0,\"mPassword\":\"\",\"mTLSAuthDirection\":\"\",\"mKeyPassword\":\"\",\"mCustomConfigOptions\":\"\",\"mName\":\"mockProfile\",\"mExpectTLSCert\":false,\"mUsername\":\"\",\"mAllowLocalLAN\":false,\"mDataCiphers\":\"\",\"mSearchDomain\":\"blinkt.de\",\"mTemporaryProfile\":false,\"mUseTLSAuth\":false,\"mRemoteCN\":\"\",\"mCustomRoutesv6\":\"\",\"mPersistTun\":false,\"mX509AuthType\":3,\"mUuid\":\"9d295ca2-3789-48dd-996e-f731dbf50fdc\",\"mServerName\":\"openvpn.example.com\",\"mMssFix\":0,\"mPushPeerInfo\":false,\"mAuthenticationType\":2,\"mBlockUnusedAddressFamilies\":true,\"mServerPort\":\"1194\",\"mUseDefaultRoutev6\":true,\"mConnections\":[{\"mCustomConfiguration\":\"\",\"mServerName\":\"127.0.0.1\",\"mProxyType\":\"NONE\",\"mConnectTimeout\":0,\"mServerPort\":\"8080\",\"mUseUdp\":true,\"mProxyPort\":\"\",\"mUseCustomConfig\":false,\"options\":{\"bridgeIP\":\"192.168.0.1\",\"transport\":{\"options\":{\"minHopSeconds\":10,\"portCount\":100,\"iatMode\":\"1\",\"cert\":\"CERT\",\"experimental\":true,\"minHopPort\":40000,\"portSeed\":2500,\"hopJitter\":10,\"maxHopPort\":64000},\"type\":\"obfs4-hop\",\"protocols\":[\"tcp\"],\"ports\":[\"1234\"]}},\"mProxyName\":\"\",\"mUseProxyAuth\":false,\"ConnectionAdapter.META_TYPE\":\"de.blinkt.openvpn.core.connection.Obfs4Connection\",\"mEnabled\":true}],\"mUseLzo\":false,\"mTransportType\":3,\"mAllowAppVpnBypass\":false,\"mUsePull\":true,\"mUseRandomHostname\":false,\"mAuthRetry\":0}\n";
@Before
public void setup() {
@@ -77,8 +79,6 @@ public class VpnProfileTest {
@Test
public void toJson_obfs4() throws JSONException {
- when(BuildConfigHelper.useObfsVpn()).thenReturn(false);
-
VpnProfile mockVpnProfile = new VpnProfile("mockProfile", OBFS4);
Transport transport = new Transport(OBFS4.toString(), new String[]{"tcp"}, new String[]{"1234"}, "CERT");
@@ -96,7 +96,6 @@ public class VpnProfileTest {
@Test
public void toJson_obfs4_obfsvpn() throws JSONException {
- when(BuildConfigHelper.useObfsVpn()).thenReturn(true);
VpnProfile mockVpnProfile = new VpnProfile("mockProfile", OBFS4);
Transport.Options options = new Transport.Options("CERT", "1");
Transport transport = new Transport(OBFS4.toString(), new String[]{"tcp"}, new String[]{"1234"}, options);
@@ -114,7 +113,6 @@ public class VpnProfileTest {
@Test
public void toJson_obfs4_obfsvpn_kcp() throws JSONException {
- when(BuildConfigHelper.useObfsVpn()).thenReturn(true);
VpnProfile mockVpnProfile = new VpnProfile("mockProfile", OBFS4);
Transport.Options options = new Transport.Options("CERT", "1");
@@ -132,12 +130,29 @@ public class VpnProfileTest {
}
@Test
+ public void toJson_obfs4_obfsvpn_quic() throws JSONException {
+
+ VpnProfile mockVpnProfile = new VpnProfile("mockProfile", OBFS4);
+ Transport.Options options = new Transport.Options("CERT", "1");
+ Transport transport = new Transport(OBFS4.toString(), new String[]{"quic"}, new String[]{"1234"}, options);
+ mockVpnProfile.mConnections[0] = new Obfs4Connection(new Obfs4Options("192.168.0.1", transport));
+ mockVpnProfile.mLastUsed = 0;
+ String s = mockVpnProfile.toJson();
+
+ //ignore UUID in comparison -> set it to fixed value
+ JSONObject actual = new JSONObject(s);
+ actual.put("mUuid", "9d295ca2-3789-48dd-996e-f731dbf50fdc");
+ JSONObject expectation = new JSONObject(OBFS4CONNECTION_PROFILE_OBFSVPN_QUIC);
+
+ assertEquals(expectation.toString(),actual.toString());
+ }
+
+ @Test
public void toJson_obfs4hop_kcp() throws JSONException {
- when(BuildConfigHelper.useObfsVpn()).thenReturn(true);
VpnProfile mockVpnProfile = new VpnProfile("mockProfile", OBFS4_HOP);
- Transport.Options options = new Transport.Options("1", new Transport.Endpoint[]{new Transport.Endpoint("1.1.1.1", "CERT1"), new Transport.Endpoint("2.2.2.2", "CERT2")}, 2500, 100, true);
+ Transport.Options options = new Transport.Options("1", new Transport.Endpoint[]{new Transport.Endpoint("1.1.1.1", "CERT1"), new Transport.Endpoint("2.2.2.2", "CERT2")}, 2500, 100, 40000, 64000, 10, 10, true);
Transport transport = new Transport(OBFS4.toString(), new String[]{"kcp"}, new String[]{"1234"}, options);
mockVpnProfile.mConnections[0] = new Obfs4Connection(new Obfs4Options("192.168.0.1", transport));
@@ -154,11 +169,10 @@ public class VpnProfileTest {
@Test
public void toJson_obfs4hop_portHopping() throws JSONException {
- when(BuildConfigHelper.useObfsVpn()).thenReturn(true);
VpnProfile mockVpnProfile = new VpnProfile("mockProfile", OBFS4_HOP);
- Transport.Options options = new Transport.Options("1", null, "CERT",200, 100, true);
+ Transport.Options options = new Transport.Options("1", null, "CERT",2500, 100, 40000, 64000, 10, 10, true);
Transport transport = new Transport(OBFS4_HOP.toString(), new String[]{"tcp"}, new String[]{"1234"}, options);
mockVpnProfile.mConnections[0] = new Obfs4Connection(new Obfs4Options("192.168.0.1", transport));
@@ -175,10 +189,9 @@ public class VpnProfileTest {
@Test
public void toJson_obfs4hop() throws JSONException {
- when(BuildConfigHelper.useObfsVpn()).thenReturn(true);
VpnProfile mockVpnProfile = new VpnProfile("mockProfile", OBFS4_HOP);
- Transport.Options options = new Transport.Options("1", new Transport.Endpoint[]{new Transport.Endpoint("1.1.1.1", "CERT1"), new Transport.Endpoint("2.2.2.2", "CERT2")}, 200, 100, true);
+ Transport.Options options = new Transport.Options("1", new Transport.Endpoint[]{new Transport.Endpoint("1.1.1.1", "CERT1"), new Transport.Endpoint("2.2.2.2", "CERT2")}, 2500, 100, 40000, 64000, 10, 10, true);
Transport transport = new Transport(OBFS4.toString(), new String[]{"tcp"}, new String[]{"1234"}, options);
mockVpnProfile.mConnections[0] = new Obfs4Connection(new Obfs4Options("192.168.0.1", transport));
@@ -195,13 +208,12 @@ public class VpnProfileTest {
@Test
public void fromJson_obfs4() {
- when(BuildConfigHelper.useObfsVpn()).thenReturn(false);
VpnProfile mockVpnProfile = VpnProfile.fromJson(OBFS4CONNECTION_PROFILE);
assertNotNull(mockVpnProfile);
assertNotNull(mockVpnProfile.mConnections);
assertNotNull(mockVpnProfile.mConnections[0]);
- assertFalse(mockVpnProfile.mConnections[0].isUseUdp());
+ assertTrue(mockVpnProfile.mConnections[0].isUseUdp());
Obfs4Connection obfs4Connection = (Obfs4Connection) mockVpnProfile.mConnections[0];
assertEquals(OBFS4, obfs4Connection.getTransportType());
String[] protocols = obfs4Connection.getObfs4Options().transport.getProtocols();
@@ -210,45 +222,60 @@ public class VpnProfileTest {
}
assertEquals("CERT", obfs4Connection.getObfs4Options().transport.getOptions().getCert());
assertEquals("0", obfs4Connection.getObfs4Options().transport.getOptions().getIatMode());
- assertEquals("192.168.0.1", obfs4Connection.getObfs4Options().gatewayIP);
+ assertEquals("192.168.0.1", obfs4Connection.getObfs4Options().bridgeIP);
assertEquals("1234", obfs4Connection.getObfs4Options().transport.getPorts()[0]);
assertEquals(1, obfs4Connection.getObfs4Options().transport.getPorts().length);
}
@Test
public void fromJson_obfs4_obfsvpn() {
- when(BuildConfigHelper.useObfsVpn()).thenReturn(true);
VpnProfile mockVpnProfile = VpnProfile.fromJson(OBFS4CONNECTION_PROFILE_OBFSVPN);
assertNotNull(mockVpnProfile);
assertNotEquals(null, mockVpnProfile.mConnections);
assertNotNull(mockVpnProfile.mConnections[0]);
- assertFalse(mockVpnProfile.mConnections[0].isUseUdp());
+ assertTrue(mockVpnProfile.mConnections[0].isUseUdp());
Obfs4Connection obfs4Connection = (Obfs4Connection) mockVpnProfile.mConnections[0];
assertEquals(OBFS4, obfs4Connection.getTransportType());
assertEquals("tcp", obfs4Connection.getObfs4Options().transport.getProtocols()[0]);
assertEquals("CERT", obfs4Connection.getObfs4Options().transport.getOptions().getCert());
assertEquals("1", obfs4Connection.getObfs4Options().transport.getOptions().getIatMode());
- assertEquals("192.168.0.1", obfs4Connection.getObfs4Options().gatewayIP);
+ assertEquals("192.168.0.1", obfs4Connection.getObfs4Options().bridgeIP);
assertEquals("1234", obfs4Connection.getObfs4Options().transport.getPorts()[0]);
assertEquals(1, obfs4Connection.getObfs4Options().transport.getPorts().length);
}
@Test
public void fromJson_obfs4_obfsvpn_kcp() {
- when(BuildConfigHelper.useObfsVpn()).thenReturn(true);
VpnProfile mockVpnProfile = VpnProfile.fromJson(OBFS4CONNECTION_PROFILE_OBFSVPN_KCP);
assertNotNull(mockVpnProfile);
assertNotNull(mockVpnProfile.mConnections);
assertNotNull(mockVpnProfile.mConnections[0]);
- assertFalse(mockVpnProfile.mConnections[0].isUseUdp());
+ assertTrue(mockVpnProfile.mConnections[0].isUseUdp());
Obfs4Connection obfs4Connection = (Obfs4Connection) mockVpnProfile.mConnections[0];
assertEquals(OBFS4, obfs4Connection.getTransportType());
assertEquals("kcp", obfs4Connection.getObfs4Options().transport.getProtocols()[0]);
assertEquals("CERT", obfs4Connection.getObfs4Options().transport.getOptions().getCert());
assertEquals("1", obfs4Connection.getObfs4Options().transport.getOptions().getIatMode());
- assertEquals("192.168.0.1", obfs4Connection.getObfs4Options().gatewayIP);
+ assertEquals("192.168.0.1", obfs4Connection.getObfs4Options().bridgeIP);
+ assertEquals("1234", obfs4Connection.getObfs4Options().transport.getPorts()[0]);
+ }
+
+ @Test
+ public void fromJson_obfs4_obfsvpn_quic() {
+
+ VpnProfile mockVpnProfile = VpnProfile.fromJson(OBFS4CONNECTION_PROFILE_OBFSVPN_QUIC);
+ assertNotNull(mockVpnProfile);
+ assertNotNull(mockVpnProfile.mConnections);
+ assertNotNull(mockVpnProfile.mConnections[0]);
+ assertTrue(mockVpnProfile.mConnections[0].isUseUdp());
+ Obfs4Connection obfs4Connection = (Obfs4Connection) mockVpnProfile.mConnections[0];
+ assertEquals(OBFS4, obfs4Connection.getTransportType());
+ assertEquals("quic", obfs4Connection.getObfs4Options().transport.getProtocols()[0]);
+ assertEquals("CERT", obfs4Connection.getObfs4Options().transport.getOptions().getCert());
+ assertEquals("1", obfs4Connection.getObfs4Options().transport.getOptions().getIatMode());
+ assertEquals("192.168.0.1", obfs4Connection.getObfs4Options().bridgeIP);
assertEquals("1234", obfs4Connection.getObfs4Options().transport.getPorts()[0]);
}
} \ No newline at end of file
diff --git a/app/src/test/java/io/swagger/client/JSONTest.java b/app/src/test/java/io/swagger/client/JSONTest.java
new file mode 100644
index 00000000..5baa7e79
--- /dev/null
+++ b/app/src/test/java/io/swagger/client/JSONTest.java
@@ -0,0 +1,31 @@
+package io.swagger.client;
+
+import org.junit.Test;
+
+import java.io.IOException;
+import static org.junit.Assert.*;
+
+import static de.blinkt.openvpn.core.connection.Connection.TransportType.OBFS4;
+
+import com.google.gson.JsonSyntaxException;
+
+import de.blinkt.openvpn.core.ConfigParser;
+import io.swagger.client.model.ModelsProvider;
+import se.leap.bitmaskclient.testutils.TestSetupHelper;
+
+public class JSONTest {
+
+ @Test
+ public void testProviderJsonParsing_testBackwardsCompatibility_v4() throws IOException {
+ String boblove = TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("v4/riseup.net.json"));
+ ModelsProvider p = JSON.createGson().create().fromJson(boblove, ModelsProvider.class);
+ assertNotNull(p);
+ assertEquals("riseup.net", p.getDomain());
+ }
+
+ @Test
+ public void testProvidingNull() throws IOException {
+ String p = JSON.createGson().create().toJson(null);
+ assertEquals("null", p);
+ }
+}
diff --git a/app/src/test/java/se/leap/bitmaskclient/base/models/GatewayJsonTest.java b/app/src/test/java/se/leap/bitmaskclient/base/models/GatewayJsonTest.java
index 801f98ad..1e07b293 100644
--- a/app/src/test/java/se/leap/bitmaskclient/base/models/GatewayJsonTest.java
+++ b/app/src/test/java/se/leap/bitmaskclient/base/models/GatewayJsonTest.java
@@ -12,7 +12,7 @@ public class GatewayJsonTest {
@Test
public void testToString() {
- String gatewayJSON = "{\"location\":\"Unknown Location\",\"ip_address\":\"1.2.3.4\",\"host\":\"pinned.obfuscation.proxy\",\"capabilities\":{\"adblock\":false,\"filter_dns\":false,\"limited\":false,\"transport\":[{\"type\":\"obfs4\",\"protocols\":[\"tcp\"],\"ports\":[\"1194\"],\"options\":{\"cert\":\"xxxxxxx\",\"iatMode\":\"0\",\"experimental\":false,\"portSeed\":0,\"portCount\":0}}],\"user_ips\":false}}";
+ String gatewayJSON = "{\"location\":\"Unknown Location\",\"ip_address\":\"1.2.3.4\",\"host\":\"pinned.obfuscation.proxy\",\"capabilities\":{\"adblock\":false,\"filter_dns\":false,\"limited\":false,\"transport\":[{\"type\":\"obfs4\",\"protocols\":[\"tcp\"],\"ports\":[\"1194\"],\"options\":{\"cert\":\"xxxxxxx\",\"iatMode\":\"0\",\"experimental\":false,\"portSeed\":0,\"portCount\":0,\"minHopPort\":0,\"maxHopPort\":0,\"minHopSeconds\":0,\"hopJitter\":0}}],\"user_ips\":false}}";
Connection.TransportType transportType = OBFS4;
Transport[] transports = new Transport[]{
diff --git a/app/src/test/java/se/leap/bitmaskclient/base/models/IntroducerTest.java b/app/src/test/java/se/leap/bitmaskclient/base/models/IntroducerTest.java
new file mode 100644
index 00000000..b53f06fe
--- /dev/null
+++ b/app/src/test/java/se/leap/bitmaskclient/base/models/IntroducerTest.java
@@ -0,0 +1,83 @@
+package se.leap.bitmaskclient.base.models;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThrows;
+
+import android.net.Uri;
+import android.os.Build;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URISyntaxException;
+import java.net.URLEncoder;
+
+
+@RunWith(RobolectricTestRunner.class)
+@Config(sdk = {Build.VERSION_CODES.P})
+public class IntroducerTest {
+
+ @Test
+ public void testGetQueryParam() {
+ try {
+ String auth = "solitech_w4gOlm+abcdefaF2DE1Q6dg==";
+ String encodedAuth = URLEncoder.encode(auth, "UTF-8");
+ Uri uri = Uri.parse("obfsvpn://example.org:443?auth=" + encodedAuth);
+ assertEquals(auth, uri.getQueryParameter("auth"));
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+
+ @Test
+ public void testFromUrl() {
+ try {
+ Introducer intro = Introducer.fromUrl("obfsvpnintro://37.2.240.90:443?fqdn=ft1.example.org&kcp=1&cert=XXXXXXX&auth=solitech_w4gOlm%2BsbF8spFL8E1Q6dg%3D%3D");
+ assertEquals(intro.getFullyQualifiedDomainName(), "ft1.example.org");
+ assertEquals("solitech_w4gOlm+sbF8spFL8E1Q6dg==", intro.getAuthToken());
+ assertEquals("obfsvpnintro://37.2.240.90:443?fqdn=ft1.example.org&kcp=1&cert=XXXXXXX&auth=solitech_w4gOlm%2BsbF8spFL8E1Q6dg%3D%3D", intro.toUrl());
+ } catch (URISyntaxException | UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Test
+ public void testFromUrl_homograph_attack() {
+ String code = "obfsvpnintro://37.2.240.90:443?fqdn=ft1.bitmasк.net&kcp=0&cert=XXXXXXX&auth=solitech_w4gOlm%2BseC5spDL8E1Q6dg";
+ assertThrows(IllegalArgumentException.class, () -> Introducer.fromUrl(code));
+ }
+
+ @Test
+ public void testFromUrl_invalid_fqdn() {
+ String code = "obfsvpnintro://37.2.240.90:443?fqdn=file://var/wwww&kcp=0&cert=XXXXXXX&auth=solitech_w4gOlm%2BseC5spDL8E1Q6dg";
+ assertThrows(IllegalArgumentException.class, () -> Introducer.fromUrl(code));
+ }
+
+ @Test
+ public void testFromUrl_missing_fqdn() {
+ String code = "obfsvpnintro://37.2.240.90:443?fqdn=&kcp=0&cert=XXXXXXX&auth=solitech_w4gOlm%2BseC5spDL8E1Q6dg";
+ assertThrows(IllegalArgumentException.class, () -> Introducer.fromUrl(code));
+
+ String code2 = "obfsvpnintro://37.2.240.90:443?kcp=0&cert=XXXXXXX&auth=solitech_w4gOlm%2BseC5spDL8E1Q6dg";
+ assertThrows(IllegalArgumentException.class, () -> Introducer.fromUrl(code2));
+ }
+
+ @Test
+ public void testFromUrl_missing_cert() {
+ String code = "obfsvpnintro://37.2.240.90:443?fqdn=ft1.bitmask.net&kcp=0&cert=&auth=solitech_w4gOlm%2BseC5spDL8E1Q6dg";
+ assertThrows(IllegalArgumentException.class, () -> Introducer.fromUrl(code));
+ }
+
+ @Test
+ public void testFromUrl_missing_auth() {
+ String code = "obfsvpnintro://37.2.240.90:443?fqdn=ft1.bitmask.net&kcp=0&cert=XXXXXXX&auth=";
+ assertThrows(IllegalArgumentException.class, () -> Introducer.fromUrl(code));
+
+ String code2 = "obfsvpnintro://37.2.240.90:443?fqdn=ft1.bitmask.net&kcp=0&cert=XXXXXXX";
+ assertThrows(IllegalArgumentException.class, () -> Introducer.fromUrl(code2));
+ }
+}
diff --git a/app/src/test/java/se/leap/bitmaskclient/base/models/ProviderTest.java b/app/src/test/java/se/leap/bitmaskclient/base/models/ProviderTest.java
index 4fcc6bac..fc2e6d03 100644
--- a/app/src/test/java/se/leap/bitmaskclient/base/models/ProviderTest.java
+++ b/app/src/test/java/se/leap/bitmaskclient/base/models/ProviderTest.java
@@ -5,8 +5,13 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
+import android.os.Build;
+
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
import se.leap.bitmaskclient.base.utils.BuildConfigHelper;
import se.leap.bitmaskclient.testutils.MockHelper;
@@ -16,6 +21,8 @@ import se.leap.bitmaskclient.testutils.TestSetupHelper;
* Created by cyberta on 12.02.18.
*/
+@RunWith(RobolectricTestRunner.class)
+@Config(sdk = {Build.VERSION_CODES.P})
public class ProviderTest {
@Before
@@ -118,7 +125,7 @@ public class ProviderTest {
}
@Test
- public void testSupportsPluggableTransports_Obfs4Kcp_noObsvpn_returnsFalse() throws Exception {
+ public void testIsExperimentalPluggableTransportsSupported_Obfs4Quic_returnsTrue() throws Exception {
Provider p1 = TestSetupHelper.getProvider(
"https://pt.demo.bitmask.net",
null,
@@ -126,9 +133,9 @@ public class ProviderTest {
null,
null,
null,
- "ptdemo_only_experimental_transports_gateways.json",
+ "multiple_pts_per_host_eip-service.json",
null);
- assertFalse(p1.supportsPluggableTransports());
+ assertTrue(p1.supportsExperimentalPluggableTransports());
}
@Test
@@ -147,4 +154,20 @@ public class ProviderTest {
assertTrue(p1.supportsPluggableTransports());
}
+ @Test
+ public void testSupportsPluggableTransports_Obfs4Quic_obsvpn_returnsTrue() throws Exception {
+ BuildConfigHelper helper = MockHelper.mockBuildConfigHelper(true);
+
+ Provider p1 = TestSetupHelper.getProvider(
+ "https://pt.demo.bitmask.net",
+ null,
+ null,
+ null,
+ null,
+ null,
+ "ptdemo_only_experimental_transports_gateways.json",
+ null);
+ assertTrue(p1.supportsPluggableTransports());
+ }
+
}
diff --git a/app/src/test/java/se/leap/bitmaskclient/base/utils/ConfigHelperTest.java b/app/src/test/java/se/leap/bitmaskclient/base/utils/ConfigHelperTest.java
index 6e0ceb56..fd862f2b 100644
--- a/app/src/test/java/se/leap/bitmaskclient/base/utils/ConfigHelperTest.java
+++ b/app/src/test/java/se/leap/bitmaskclient/base/utils/ConfigHelperTest.java
@@ -1,6 +1,8 @@
package se.leap.bitmaskclient.base.utils;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
import com.tngtech.java.junit.dataprovider.DataProvider;
import com.tngtech.java.junit.dataprovider.DataProviderRunner;
@@ -11,6 +13,12 @@ import org.junit.runner.RunWith;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.modules.junit4.PowerMockRunnerDelegate;
+import java.io.IOException;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+
+import se.leap.bitmaskclient.testutils.TestSetupHelper;
+
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(DataProviderRunner.class)
public class ConfigHelperTest {
@@ -57,4 +65,27 @@ public class ConfigHelperTest {
assertEquals("domain.co.uk", ConfigHelper.getDomainFromMainURL("https://subdomain.domain.co.uk"));
assertEquals("domain.co.uk", ConfigHelper.getDomainFromMainURL("https://domain.co.uk"));
}
+
+ @Test
+ public void testGetDomainFromMainURL_returnNullIfInvalid() {
+ assertNull(ConfigHelper.getDomainFromMainURL("https://localhost"));
+ assertNull(ConfigHelper.getDomainFromMainURL("http://localhost"));
+ assertNull(ConfigHelper.getDomainFromMainURL("invalidrandomstring"));
+ assertNull(ConfigHelper.getDomainFromMainURL(null));
+ }
+
+ @Test
+ public void testParseX509CertificatesFromString() throws IOException {
+ ArrayList<X509Certificate> certs = ConfigHelper.parseX509CertificatesFromString(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("updated_cert.pem")));
+ assertTrue(certs != null);
+ }
+
+ @Test
+ public void testParseX509CertificatesToString() throws IOException {
+ String certsString = TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("updated_cert.pem"));
+ ArrayList<X509Certificate> certs = ConfigHelper.parseX509CertificatesFromString(certsString);
+ String parsedCerts = ConfigHelper.parseX509CertificatesToString(certs);
+ assertEquals(certsString, parsedCerts);
+ }
+
} \ No newline at end of file
diff --git a/app/src/test/java/se/leap/bitmaskclient/base/utils/CredentialsParserTest.java b/app/src/test/java/se/leap/bitmaskclient/base/utils/CredentialsParserTest.java
new file mode 100644
index 00000000..55a9e94f
--- /dev/null
+++ b/app/src/test/java/se/leap/bitmaskclient/base/utils/CredentialsParserTest.java
@@ -0,0 +1,57 @@
+package se.leap.bitmaskclient.base.utils;
+
+import static org.junit.Assert.assertEquals;
+
+import android.os.Build;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+
+import se.leap.bitmaskclient.base.models.Provider;
+import se.leap.bitmaskclient.testutils.TestSetupHelper;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(sdk = {Build.VERSION_CODES.LOLLIPOP, Build.VERSION_CODES.P})
+public class CredentialsParserTest {
+
+ @Test
+ public void testCertificateResponse() throws IOException, XmlPullParserException {
+ String ed25519_creds = TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ed25519_credentials.pem"));
+ Provider provider = new Provider("https://demo.bitmask.net");
+ CredentialsParser.parseXml(ed25519_creds, provider);
+ assertEquals(
+ "-----BEGIN PRIVATE KEY-----\n" +
+ "MC4CAQAwBQYDK2VwBCIEIF+HZvpSdhnTbYeT635bT2+IU4FbW3EWlHuUnXvhb10m\n" +
+ "-----END PRIVATE KEY-----", provider.getPrivateKeyString());
+ assertEquals(
+ "-----BEGIN CERTIFICATE-----\n" +
+ "MIIBgzCCASigAwIBAgIRALD3Z4SsobpcU7tcC0r9JOQwCgYIKoZIzj0EAwIwNzE1\n" +
+ "MDMGA1UEAwwsUHJvdmlkZXIgUm9vdCBDQSAoY2xpZW50IGNlcnRpZmljYXRlcyBv\n" +
+ "bmx5ISkwHhcNMjQxMTA1MTU0MjU0WhcNMjQxMTI5MTU0MjU0WjAUMRIwEAYDVQQD\n" +
+ "EwlVTkxJTUlURUQwKjAFBgMrZXADIQC5QkZAcpkQ3Rm54gN5iLEU1Zp1w+patXVT\n" +
+ "W9GRXmFz+6NnMGUwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMC\n" +
+ "MB0GA1UdDgQWBBRMxeMW4vqGK7FBkDt2+8upfkK1kzAfBgNVHSMEGDAWgBS0pVQs\n" +
+ "1wnvNYG0AnmkxUcLOw+BLDAKBggqhkjOPQQDAgNJADBGAiEAg112+zWMm9qrPTvK\n" +
+ "99IMa+wbeNzZLSoN9xewf5rxOX0CIQCvMi08JcajsAJ9Dg6YAQgpmFdb35HDCzve\n" +
+ "lhkTCWJpgQ==\n" +
+ "-----END CERTIFICATE-----", provider.getVpnCertificate());
+ assertEquals(
+ "-----BEGIN CERTIFICATE-----\n" +
+ "MIIBozCCAUigAwIBAgIBATAKBggqhkjOPQQDAjA3MTUwMwYDVQQDDCxQcm92aWRl\n" +
+ "ciBSb290IENBIChjbGllbnQgY2VydGlmaWNhdGVzIG9ubHkhKTAeFw0yNDEwMjMx\n" +
+ "MjA0MjRaFw0yOTEwMjMxMjA5MjRaMDcxNTAzBgNVBAMMLFByb3ZpZGVyIFJvb3Qg\n" +
+ "Q0EgKGNsaWVudCBjZXJ0aWZpY2F0ZXMgb25seSEpMFkwEwYHKoZIzj0CAQYIKoZI\n" +
+ "zj0DAQcDQgAEMImwbNTDrXMeWfyTb2TMNzXNr79OsKjLDdZWqVT0iHMI8apo2P4H\n" +
+ "eXCHVGjS2Z+jpyI1u9ic3igThsKEmdZMSKNFMEMwDgYDVR0PAQH/BAQDAgKkMBIG\n" +
+ "A1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYEFLSlVCzXCe81gbQCeaTFRws7D4Es\n" +
+ "MAoGCCqGSM49BAMCA0kAMEYCIQCw88nXg/vs/KgGqH1uPs9oZkOxucVn/ZEznYzg\n" +
+ "szLhtAIhAPY32oHwmj3yHO9H2Jp7x0CoHuu1fKd9fQTBvEEbi7o9\n" +
+ "-----END CERTIFICATE-----", provider.getCaCert());
+ }
+
+}
diff --git a/app/src/test/java/se/leap/bitmaskclient/base/utils/PreferenceHelperTest.java b/app/src/test/java/se/leap/bitmaskclient/base/utils/PreferenceHelperTest.java
index e03fccff..1b093f62 100644
--- a/app/src/test/java/se/leap/bitmaskclient/base/utils/PreferenceHelperTest.java
+++ b/app/src/test/java/se/leap/bitmaskclient/base/utils/PreferenceHelperTest.java
@@ -1,5 +1,13 @@
package se.leap.bitmaskclient.base.utils;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_EIP_DEFINITION;
+import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_PRIVATE_KEY;
+import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_VPN_CERTIFICATE;
+import static se.leap.bitmaskclient.base.utils.PreferenceHelper.getSavedProviderFromSharedPreferences;
+import static se.leap.bitmaskclient.testutils.TestSetupHelper.getInputAsString;
+
import android.content.SharedPreferences;
import org.junit.Before;
@@ -8,15 +16,6 @@ import org.junit.Test;
import se.leap.bitmaskclient.base.models.Provider;
import se.leap.bitmaskclient.testutils.MockSharedPreferences;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_EIP_DEFINITION;
-import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_PRIVATE_KEY;
-import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_VPN_CERTIFICATE;
-import static se.leap.bitmaskclient.base.utils.PreferenceHelper.preferUDP;
-import static se.leap.bitmaskclient.testutils.TestSetupHelper.getInputAsString;
-import static se.leap.bitmaskclient.base.utils.PreferenceHelper.getSavedProviderFromSharedPreferences;
-
/**
* Created by cyberta on 17.01.18.
*/
diff --git a/app/src/test/java/se/leap/bitmaskclient/base/utils/PrivateKeyHelperTest.java b/app/src/test/java/se/leap/bitmaskclient/base/utils/PrivateKeyHelperTest.java
new file mode 100644
index 00000000..5b1d4554
--- /dev/null
+++ b/app/src/test/java/se/leap/bitmaskclient/base/utils/PrivateKeyHelperTest.java
@@ -0,0 +1,48 @@
+package se.leap.bitmaskclient.base.utils;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import android.os.Build;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+
+import java.io.IOException;
+import java.security.PrivateKey;
+import java.security.interfaces.ECPrivateKey;
+import java.security.interfaces.EdECPrivateKey;
+import java.security.interfaces.RSAPrivateKey;
+
+import se.leap.bitmaskclient.testutils.TestSetupHelper;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(sdk = {Build.VERSION_CODES.UPSIDE_DOWN_CAKE, Build.VERSION_CODES.P, Build.VERSION_CODES.O, Build.VERSION_CODES.N})
+public class PrivateKeyHelperTest {
+
+ @Test
+ public void parsePrivateKeyFromString_testRSA() throws IOException {
+ String rsa_key = TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("private_rsa_key.pem"));
+ PrivateKey pk = PrivateKeyHelper.parsePrivateKeyFromString(rsa_key);
+ assertNotNull(pk);
+ assertTrue(pk instanceof RSAPrivateKey);
+ }
+
+ @Test
+ public void parsePrivateKeyFromString_testEd25519() throws IOException {
+ String ed25519_key = TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("private_PKCS8_encoded_ed25519_key.pem"));
+ PrivateKey pk = PrivateKeyHelper.parsePrivateKeyFromString(ed25519_key);
+ assertNotNull(pk);
+ assertTrue(pk instanceof EdECPrivateKey);
+ }
+
+ @Test
+ public void parsePrivateKeyFromString_testEcDSA() throws IOException {
+ String ed_dsa_key = TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("private_PKCS8_encoded_ecdsa_key.pem"));
+ PrivateKey pk = PrivateKeyHelper.parsePrivateKeyFromString(ed_dsa_key);
+ assertNotNull(pk);
+ assertTrue(pk instanceof ECPrivateKey);
+ }
+} \ No newline at end of file
diff --git a/app/src/test/java/se/leap/bitmaskclient/eip/GatewayTest.java b/app/src/test/java/se/leap/bitmaskclient/eip/GatewayTest.java
new file mode 100644
index 00000000..fc062079
--- /dev/null
+++ b/app/src/test/java/se/leap/bitmaskclient/eip/GatewayTest.java
@@ -0,0 +1,159 @@
+package se.leap.bitmaskclient.eip;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static se.leap.bitmaskclient.base.models.Constants.GATEWAYS;
+import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_VPN_CERTIFICATE;
+import static se.leap.bitmaskclient.testutils.TestSetupHelper.getProvider;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.os.Build;
+
+import androidx.annotation.Nullable;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashSet;
+
+import de.blinkt.openvpn.VpnProfile;
+import de.blinkt.openvpn.core.ConfigParser;
+import de.blinkt.openvpn.core.connection.Connection;
+import de.blinkt.openvpn.core.connection.Obfs4Connection;
+import se.leap.bitmaskclient.base.models.Provider;
+import se.leap.bitmaskclient.base.utils.PreferenceHelper;
+import se.leap.bitmaskclient.testutils.MockSharedPreferences;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(sdk = {Build.VERSION_CODES.P})
+public class GatewayTest {
+
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+ private Context mockContext;
+
+ private SharedPreferences sharedPreferences;
+
+ @Before
+ public void setUp() throws IOException, JSONException {
+ sharedPreferences = new MockSharedPreferences();
+
+ PreferenceHelper preferenceHelper = new PreferenceHelper(sharedPreferences);
+ }
+
+
+ private Gateway createGatewayFromProvider(int nClosest, @Nullable String eipServiceJsonPath) throws ConfigParser.ConfigParseError, JSONException, IOException {
+ Provider provider = getProvider(null, null, null, null, null, null, eipServiceJsonPath, null);
+ JSONObject eipServiceJson = provider.getEipServiceJson();
+
+ JSONObject gatewayJson = eipServiceJson.getJSONArray(GATEWAYS).getJSONObject(0);
+ JSONObject secrets = new JSONObject();
+ try {
+ secrets.put(Provider.CA_CERT, provider.getCaCert());
+ secrets.put(PROVIDER_VPN_CERTIFICATE, provider.getVpnCertificate());
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+
+
+ return new Gateway(eipServiceJson, secrets, gatewayJson);
+ }
+ @Test
+ public void testGetProfile_OpenVPN_obfuscationProtocols_ignored_OpenVPNfound() throws ConfigParser.ConfigParseError, JSONException, IOException {
+ Gateway gateway = createGatewayFromProvider(0, "ptdemo_three_mixed_gateways.json");
+ VpnProfile profile = gateway.getProfile(Connection.TransportType.OPENVPN, new HashSet<>(Arrays.asList("invalid")));
+ assertNotNull(profile);
+ }
+
+ @Test
+ public void testGetProfile_obfs4_obfuscationProtocolsTakenIntoAccount_Obfs4Notfound() throws ConfigParser.ConfigParseError, JSONException, IOException {
+ Gateway gateway = createGatewayFromProvider(0, "ptdemo_three_mixed_gateways.json");
+ VpnProfile profile = gateway.getProfile(Connection.TransportType.OBFS4, new HashSet<>(Arrays.asList("invalid")));
+ assertNull(profile);
+ }
+
+ @Test
+ public void testGetProfile_obfs4_obfuscationProtocolsTakenIntoAccount_Obfs4found() throws ConfigParser.ConfigParseError, JSONException, IOException {
+ Gateway gateway = createGatewayFromProvider(0, "ptdemo_three_mixed_gateways.json");
+ VpnProfile profile = gateway.getProfile(Connection.TransportType.OBFS4, new HashSet<>(Arrays.asList("tcp")));
+ assertNotNull(profile);
+ }
+
+ @Test
+ public void testGetProfile_obfs4_obfuscationProtocolsTakenIntoAccount_Obfs4KCPfound() throws ConfigParser.ConfigParseError, JSONException, IOException {
+ Gateway gateway = createGatewayFromProvider(0, "multiple_pts_per_host_eip-service.json");
+ VpnProfile profile = gateway.getProfile(Connection.TransportType.OBFS4, new HashSet<>(Arrays.asList("kcp")));
+ assertNotNull(profile);
+ }
+
+ @Test
+ public void testGetProfile_obfs4_multipleProfiles_randomlySelected() throws ConfigParser.ConfigParseError, JSONException, IOException {
+ Gateway gateway = createGatewayFromProvider(0, "multiple_pts_per_host_eip-service.json");
+ VpnProfile profile1 = gateway.getProfile(Connection.TransportType.OBFS4, new HashSet<>(Arrays.asList("kcp", "tcp")));
+ assertNotNull(profile1);
+ assertEquals(1, profile1.mConnections.length);
+ assertTrue(profile1.mConnections[0] instanceof Obfs4Connection);
+ String[] transportLayerProtocols = ((Obfs4Connection)profile1.mConnections[0]).getObfs4Options().transport.getProtocols();
+
+ boolean profileWithDifferentTransportLayerProtosFound = false;
+ for (int i = 0; i < 1000; i++) {
+ VpnProfile otherProfile = gateway.getProfile(Connection.TransportType.OBFS4, new HashSet<>(Arrays.asList("kcp", "tcp")));
+ String[] otherProtocols = ((Obfs4Connection)otherProfile.mConnections[0]).getObfs4Options().transport.getProtocols();
+ if (!transportLayerProtocols[0].equals(otherProtocols[0])) {
+ profileWithDifferentTransportLayerProtosFound = true;
+ System.out.println(i + 1 + " attempts");
+ break;
+ }
+ }
+ assertTrue(profileWithDifferentTransportLayerProtosFound);
+ }
+
+ @Test
+ public void testSupportsTransport() throws ConfigParser.ConfigParseError, JSONException, IOException {
+ Gateway gateway = createGatewayFromProvider(0, "multiple_pts_per_host_eip-service.json");
+ assertFalse(gateway.supportsTransport(Connection.TransportType.OBFS4_HOP, null));
+ assertTrue(gateway.supportsTransport(Connection.TransportType.OBFS4, null));
+ assertTrue(gateway.supportsTransport(Connection.TransportType.OBFS4, new HashSet<>(Arrays.asList("kcp"))));
+ assertTrue(gateway.supportsTransport(Connection.TransportType.OBFS4, new HashSet<>(Arrays.asList("tcp"))));
+ assertTrue(gateway.supportsTransport(Connection.TransportType.OBFS4, new HashSet<>(Arrays.asList("quic"))));
+ assertFalse(gateway.supportsTransport(Connection.TransportType.OBFS4, new HashSet<>(Arrays.asList("invalid"))));
+ }
+
+ @Test
+ public void testGetSupportedTransports() throws ConfigParser.ConfigParseError, JSONException, IOException {
+ Gateway gateway = createGatewayFromProvider(0, "multiple_pts_per_host_eip-service.json");
+ assertEquals(2, gateway.getSupportedTransports().size());
+ assertTrue(gateway.getSupportedTransports().contains(Connection.TransportType.OBFS4));
+ assertTrue(gateway.getSupportedTransports().contains(Connection.TransportType.OPENVPN));
+ }
+
+ @Test
+ public void testHasProfile() throws ConfigParser.ConfigParseError, JSONException, IOException {
+ Gateway gateway = createGatewayFromProvider(0, "multiple_pts_per_host_eip-service.json");
+ VpnProfile profile = gateway.getProfiles().get(0);
+ String profileString = profile.toJson();
+ VpnProfile newProfile = VpnProfile.fromJson(profileString);
+ assertTrue(gateway.hasProfile(newProfile));
+
+ newProfile.mGatewayIp = "XXXX";
+ assertFalse(gateway.hasProfile(newProfile));
+
+ VpnProfile newProfile2 = VpnProfile.fromJson(profileString);
+ newProfile2.mConnections = new Connection[0];
+ assertFalse(gateway.hasProfile(newProfile2));
+ }
+
+
+} \ No newline at end of file
diff --git a/app/src/test/java/se/leap/bitmaskclient/eip/GatewaysManagerTest.java b/app/src/test/java/se/leap/bitmaskclient/eip/GatewaysManagerTest.java
index d66fedbe..a9a73628 100644
--- a/app/src/test/java/se/leap/bitmaskclient/eip/GatewaysManagerTest.java
+++ b/app/src/test/java/se/leap/bitmaskclient/eip/GatewaysManagerTest.java
@@ -3,6 +3,8 @@ package se.leap.bitmaskclient.eip;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNull;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThrows;
import static org.junit.Assert.assertTrue;
import static de.blinkt.openvpn.core.connection.Connection.TransportType.OBFS4;
import static de.blinkt.openvpn.core.connection.Connection.TransportType.OPENVPN;
@@ -18,13 +20,19 @@ import static se.leap.bitmaskclient.testutils.TestSetupHelper.getProvider;
import android.content.Context;
import android.content.SharedPreferences;
+import android.os.Build;
+
+import androidx.annotation.Nullable;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
import java.io.IOException;
import java.util.ArrayList;
@@ -32,9 +40,11 @@ import java.util.List;
import de.blinkt.openvpn.VpnProfile;
import de.blinkt.openvpn.core.ConfigParser;
+import de.blinkt.openvpn.core.connection.Connection;
import se.leap.bitmaskclient.base.models.Location;
import se.leap.bitmaskclient.base.models.Provider;
import se.leap.bitmaskclient.base.models.ProviderObservable;
+import se.leap.bitmaskclient.base.models.Transport;
import se.leap.bitmaskclient.base.utils.PreferenceHelper;
import se.leap.bitmaskclient.base.utils.TimezoneHelper;
import se.leap.bitmaskclient.testutils.MockSharedPreferences;
@@ -43,6 +53,8 @@ import se.leap.bitmaskclient.testutils.TestSetupHelper;
/**
* Created by cyberta on 09.10.17.
*/
+@RunWith(RobolectricTestRunner.class)
+@Config(sdk = {Build.VERSION_CODES.P})
public class GatewaysManagerTest {
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
@@ -85,6 +97,18 @@ public class GatewaysManagerTest {
assertEquals(3, gatewaysManager.size());
}
+ @Nullable
+ private static VpnProfile createProfile(VpnConfigGenerator configGenerator, Connection.TransportType transportType) throws IOException, ConfigParser.ConfigParseError, JSONException {
+ VpnProfile profile = null;
+ for (Transport transport : configGenerator.transports) {
+ if (transport.getTransportType() == transportType) {
+ profile = configGenerator.createProfile(transport);
+ break;
+ }
+ }
+ return profile;
+ }
+
@Test
public void TestGetPosition_VpnProfileExtistingObfs4_returnPositionZero() throws JSONException, ConfigParser.ConfigParseError, IOException {
Provider provider = getProvider(null, null, null, null, null, null, "ptdemo_three_mixed_gateways.json", null);
@@ -96,10 +120,12 @@ public class GatewaysManagerTest {
VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
configuration.apiVersion = 3;
configuration.remoteGatewayIP = "37.218.247.60";
- VpnConfigGenerator configGenerator = new VpnConfigGenerator(provider.getDefinition(), secrets, gateway1, configuration);
- VpnProfile profile = configGenerator.createProfile(OBFS4);
-
+ configuration.transports = Transport.createTransportsFrom(gateway1, 3);
+ VpnConfigGenerator configGenerator = new VpnConfigGenerator(provider.getDefinition(), secrets, configuration);
+ VpnProfile profile = createProfile(configGenerator, OBFS4);
+ assertNotNull(profile);
assertEquals(0, gatewaysManager.getPosition(profile));
+
}
@Test
@@ -113,13 +139,30 @@ public class GatewaysManagerTest {
VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
configuration.apiVersion = 3;
configuration.remoteGatewayIP = "37.218.247.60";
- VpnConfigGenerator configGenerator = new VpnConfigGenerator(provider.getDefinition(), secrets, gateway1, configuration);
- VpnProfile profile = configGenerator.createProfile(OPENVPN);
-
+ configuration.transports = Transport.createTransportsFrom(gateway1, 3);
+ VpnConfigGenerator configGenerator = new VpnConfigGenerator(provider.getDefinition(), secrets, configuration);
+ VpnProfile profile = createProfile(configGenerator, OPENVPN);
+ assertNotNull(profile);
assertEquals(0, gatewaysManager.getPosition(profile));
}
@Test
+ public void TestGetPosition_IncompatibleProviderBridges_returnParseError() throws JSONException, ConfigParser.ConfigParseError, IOException {
+ Provider provider = getProvider(null, null, null, null, null, null, "ptdemo.bitmask.eip-service.json", null);
+ JSONObject eipServiceJson = provider.getEipServiceJson();
+ JSONObject gateway1 = eipServiceJson.getJSONArray(GATEWAYS).getJSONObject(0);
+ providerObservable.updateProvider(provider);
+ GatewaysManager gatewaysManager = new GatewaysManager(mockContext);
+
+ VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
+ configuration.apiVersion = 3;
+ configuration.remoteGatewayIP = "37.218.247.60";
+ configuration.transports = Transport.createTransportsFrom(gateway1, 3);
+ VpnConfigGenerator configGenerator = new VpnConfigGenerator(provider.getDefinition(), secrets, configuration);
+ assertThrows(ConfigParser.ConfigParseError.class, () -> createProfile(configGenerator, OBFS4));
+ }
+
+ @Test
public void TestGetPosition_VpnProfileExistingObfs4FromPresortedList_returnsPositionOne() throws JSONException, ConfigParser.ConfigParseError, IOException {
Provider provider = getProvider(null, null, null, null, null, null, "ptdemo_three_mixed_gateways.json", "ptdemo_three_mixed_gateways.geoip.json");
JSONObject eipServiceJson = provider.getEipServiceJson();
@@ -130,10 +173,11 @@ public class GatewaysManagerTest {
VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
configuration.apiVersion = 3;
configuration.remoteGatewayIP = "37.218.247.60";
- VpnConfigGenerator configGenerator = new VpnConfigGenerator(provider.getDefinition(), secrets, gateway1, configuration);
- VpnProfile profile = configGenerator.createProfile(OBFS4);
+ configuration.transports = Transport.createTransportsFrom(gateway1, 3);
+ VpnConfigGenerator configGenerator = new VpnConfigGenerator(provider.getDefinition(), secrets, configuration);
+ VpnProfile profile = createProfile(configGenerator, OBFS4);
- assertEquals(1, gatewaysManager.getPosition(profile));
+ assertEquals(2, gatewaysManager.getPosition(profile));
}
@Test
@@ -147,8 +191,9 @@ public class GatewaysManagerTest {
VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
configuration.apiVersion = 3;
configuration.remoteGatewayIP = "37.218.247.60";
- VpnConfigGenerator configGenerator = new VpnConfigGenerator(provider.getDefinition(), secrets, gateway1, configuration);
- VpnProfile profile = configGenerator.createProfile(OPENVPN);
+ configuration.transports = Transport.createTransportsFrom(gateway1, 3);
+ VpnConfigGenerator configGenerator = new VpnConfigGenerator(provider.getDefinition(), secrets, configuration);
+ VpnProfile profile = createProfile(configGenerator, OPENVPN);
assertEquals(2, gatewaysManager.getPosition(profile));
}
@@ -164,8 +209,9 @@ public class GatewaysManagerTest {
VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
configuration.apiVersion = 3;
configuration.remoteGatewayIP = "37.218.247.61";
- VpnConfigGenerator configGenerator = new VpnConfigGenerator(provider.getDefinition(), secrets, gateway1, configuration);
- VpnProfile profile = configGenerator.createProfile(OBFS4);
+ configuration.transports = Transport.createTransportsFrom(gateway1, 3);
+ VpnConfigGenerator configGenerator = new VpnConfigGenerator(provider.getDefinition(), secrets, configuration);
+ VpnProfile profile = createProfile(configGenerator, OBFS4);
assertEquals(-1, gatewaysManager.getPosition(profile));
}
@@ -181,8 +227,9 @@ public class GatewaysManagerTest {
VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
configuration.apiVersion = 3;
configuration.remoteGatewayIP = "3.21.247.89";
- VpnConfigGenerator configGenerator = new VpnConfigGenerator(provider.getDefinition(), secrets, gateway1, configuration);
- VpnProfile profile = configGenerator.createProfile(OBFS4);
+ configuration.transports = Transport.createTransportsFrom(gateway1, 3);
+ VpnConfigGenerator configGenerator = new VpnConfigGenerator(provider.getDefinition(), secrets, configuration);
+ VpnProfile profile = createProfile(configGenerator, OBFS4);
assertEquals(1, gatewaysManager.getPosition(profile));
}
@@ -195,7 +242,7 @@ public class GatewaysManagerTest {
sharedPreferences.edit().putBoolean(USE_BRIDGES, true).commit();
GatewaysManager gatewaysManager = new GatewaysManager(mockContext);
- assertEquals("37.12.247.10", gatewaysManager.select(0).gateway.getRemoteIP());
+ assertEquals("37.12.247.10", gatewaysManager.selectVpnProfile(0).mGatewayIp);
}
@Test
@@ -209,11 +256,11 @@ public class GatewaysManagerTest {
commit();
GatewaysManager gatewaysManager = new GatewaysManager(mockContext);
ArrayList<String> hosts = new ArrayList<>();
- hosts.add(gatewaysManager.select(0).gateway.getHost());
- hosts.add(gatewaysManager.select(1).gateway.getHost());
+ hosts.add(gatewaysManager.selectVpnProfile(0).mGatewayIp);
+ hosts.add(gatewaysManager.selectVpnProfile(1).mGatewayIp);
- assertTrue(hosts.contains("bridge-nyc1-02.bitmask-dev.leapvpn.net"));
- assertTrue(hosts.contains("bridge-nyc1-01.bitmask-dev.leapvpn.net"));
+ assertTrue(hosts.contains("192.81.208.164"));
+ assertTrue(hosts.contains("104.248.232.240"));
}
@@ -229,10 +276,10 @@ public class GatewaysManagerTest {
GatewaysManager gatewaysManager = new GatewaysManager(mockContext);
ArrayList<String> hosts = new ArrayList<>();
- hosts.add(gatewaysManager.select(0).gateway.getHost());
- hosts.add(gatewaysManager.select(1).gateway.getHost());
- assertTrue(hosts.contains("bridge-nyc1-02.bitmask-dev.leapvpn.net"));
- assertTrue(hosts.contains("bridge-nyc1-01.bitmask-dev.leapvpn.net"));
+ hosts.add(gatewaysManager.selectVpnProfile(0).mGatewayIp);
+ hosts.add(gatewaysManager.selectVpnProfile(1).mGatewayIp);
+ assertTrue(hosts.contains("192.81.208.164"));
+ assertTrue(hosts.contains("104.248.232.240"));
}
@Test
@@ -247,7 +294,7 @@ public class GatewaysManagerTest {
for (int i = 0; i < 1000; i++) {
GatewaysManager gatewaysManager = new GatewaysManager(mockContext);
- assertEquals("bridge-nyc1-01.bitmask-dev.leapvpn.net", gatewaysManager.select(0).gateway.getHost());
+ assertEquals("104.248.232.240", gatewaysManager.selectVpnProfile(0).mGatewayIp);
}
}
@@ -262,8 +309,8 @@ public class GatewaysManagerTest {
commit();
GatewaysManager gatewaysManager = new GatewaysManager(mockContext);
- assertEquals("bridge-nyc1-01.bitmask-dev.leapvpn.net", gatewaysManager.select(0).gateway.getHost());
- assertNull(gatewaysManager.select(1));
+ assertEquals("104.248.232.240", gatewaysManager.selectVpnProfile(0).mGatewayIp);
+ assertNull(gatewaysManager.selectVpnProfile(1));
}
@Test
@@ -278,11 +325,11 @@ public class GatewaysManagerTest {
GatewaysManager gatewaysManager = new GatewaysManager(mockContext);
ArrayList<String> hosts = new ArrayList<>();
- hosts.add(gatewaysManager.select(0).gateway.getHost());
- hosts.add(gatewaysManager.select(1).gateway.getHost());
+ hosts.add(gatewaysManager.selectVpnProfile(0).mGatewayIp);
+ hosts.add(gatewaysManager.selectVpnProfile(1).mGatewayIp);
- assertTrue(hosts.contains("pt.demo.bitmask.net"));
- assertTrue(hosts.contains("manila.bitmask.net"));
+ assertTrue(hosts.contains("37.218.247.60"));
+ assertTrue(hosts.contains("37.12.247.10"));
}
@Test
@@ -292,9 +339,9 @@ public class GatewaysManagerTest {
providerObservable.updateProvider(provider);
GatewaysManager gatewaysManager = new GatewaysManager(mockContext);
- assertEquals("manila.bitmask.net", gatewaysManager.select(0).gateway.getHost());
- assertEquals("moscow.bitmask.net", gatewaysManager.select(1).gateway.getHost());
- assertEquals("pt.demo.bitmask.net", gatewaysManager.select(2).gateway.getHost());
+ assertEquals("37.12.247.10", gatewaysManager.selectVpnProfile(0).mGatewayIp);
+ assertEquals("3.21.247.89", gatewaysManager.selectVpnProfile(1).mGatewayIp);
+ assertEquals("37.218.247.60", gatewaysManager.selectVpnProfile(2).mGatewayIp);
}
@Test
@@ -308,9 +355,9 @@ public class GatewaysManagerTest {
commit();
GatewaysManager gatewaysManager = new GatewaysManager(mockContext);
- assertEquals("moscow.bitmask.net", gatewaysManager.select(0).gateway.getHost());
- assertEquals("pt.demo.bitmask.net", gatewaysManager.select(1).gateway.getHost());
- assertNull(gatewaysManager.select(2));
+ assertEquals("3.21.247.89", gatewaysManager.selectVpnProfile(0).mGatewayIp);
+ assertEquals("37.218.247.60", gatewaysManager.selectVpnProfile(1).mGatewayIp);
+ assertNull(gatewaysManager.selectVpnProfile(2));
}
@@ -325,9 +372,9 @@ public class GatewaysManagerTest {
commit();
GatewaysManager gatewaysManager = new GatewaysManager(mockContext);
- assertEquals("mouette.riseup.net", gatewaysManager.select(0).gateway.getHost());
- assertEquals("hoatzin.riseup.net", gatewaysManager.select(1).gateway.getHost());
- assertEquals("zarapito.riseup.net", gatewaysManager.select(2).gateway.getHost());
+ assertEquals("163.172.126.44", gatewaysManager.selectVpnProfile(0).mGatewayIp);
+ assertEquals("212.83.143.67", gatewaysManager.selectVpnProfile(1).mGatewayIp);
+ assertEquals("212.129.62.247", gatewaysManager.selectVpnProfile(2).mGatewayIp);
}
@Test
@@ -341,9 +388,9 @@ public class GatewaysManagerTest {
commit();
GatewaysManager gatewaysManager = new GatewaysManager(mockContext);
- assertEquals("mouette.riseup.net", gatewaysManager.select(0).gateway.getHost());
- assertEquals("hoatzin.riseup.net", gatewaysManager.select(1).gateway.getHost());
- assertEquals("zarapito.riseup.net", gatewaysManager.select(2).gateway.getHost());
+ assertEquals("163.172.126.44", gatewaysManager.selectVpnProfile(0).mGatewayIp);
+ assertEquals("212.83.143.67", gatewaysManager.selectVpnProfile(1).mGatewayIp);
+ assertEquals("212.129.62.247", gatewaysManager.selectVpnProfile(2).mGatewayIp);
}
@Test
@@ -358,10 +405,10 @@ public class GatewaysManagerTest {
commit();
GatewaysManager gatewaysManager = new GatewaysManager(mockContext);
- assertEquals("Paris", gatewaysManager.select(0).gateway.getName());
- assertEquals("Paris", gatewaysManager.select(1).gateway.getName());
- assertEquals("Paris", gatewaysManager.select(2).gateway.getName());
- assertEquals(null, gatewaysManager.select(3));
+ assertEquals("Paris", gatewaysManager.selectVpnProfile(0).getName());
+ assertEquals("Paris", gatewaysManager.selectVpnProfile(1).getName());
+ assertEquals("Paris", gatewaysManager.selectVpnProfile(2).getName());
+ assertEquals(null, gatewaysManager.selectVpnProfile(3));
}
@Test
@@ -371,9 +418,9 @@ public class GatewaysManagerTest {
providerObservable.updateProvider(provider);
GatewaysManager gatewaysManager = new GatewaysManager(mockContext);
- assertEquals("mouette.riseup.net", gatewaysManager.select(0, "Paris").gateway.getHost());
- assertEquals("hoatzin.riseup.net", gatewaysManager.select(1, "Paris").gateway.getHost());
- assertEquals("zarapito.riseup.net", gatewaysManager.select(2, "Paris").gateway.getHost());
+ assertEquals("163.172.126.44", gatewaysManager.selectVpnProfile(0, "Paris").mGatewayIp);
+ assertEquals("212.83.143.67", gatewaysManager.selectVpnProfile(1, "Paris").mGatewayIp);
+ assertEquals("212.129.62.247", gatewaysManager.selectVpnProfile(2, "Paris").mGatewayIp);
}
@Test
@@ -383,9 +430,9 @@ public class GatewaysManagerTest {
providerObservable.updateProvider(provider);
GatewaysManager gatewaysManager = new GatewaysManager(mockContext);
- assertEquals("mouette.riseup.net", gatewaysManager.select(0, "Paris").gateway.getHost());
- assertEquals("hoatzin.riseup.net", gatewaysManager.select(1, "Paris").gateway.getHost());
- assertEquals("zarapito.riseup.net", gatewaysManager.select(2, "Paris").gateway.getHost());
+ assertEquals("163.172.126.44", gatewaysManager.selectVpnProfile(0, "Paris").mGatewayIp);
+ assertEquals("212.83.143.67", gatewaysManager.selectVpnProfile(1, "Paris").mGatewayIp);
+ assertEquals("212.129.62.247", gatewaysManager.selectVpnProfile(2, "Paris").mGatewayIp);
}
@Test
@@ -396,10 +443,10 @@ public class GatewaysManagerTest {
providerObservable.updateProvider(provider);
GatewaysManager gatewaysManager = new GatewaysManager(mockContext);
- assertEquals("Paris", gatewaysManager.select(0, "Paris").gateway.getName());
- assertEquals("Paris", gatewaysManager.select(1, "Paris").gateway.getName());
- assertEquals("Paris", gatewaysManager.select(2, "Paris").gateway.getName());
- assertEquals(null, gatewaysManager.select(3, "Paris"));
+ assertEquals("Paris", gatewaysManager.selectVpnProfile(0, "Paris").getName());
+ assertEquals("Paris", gatewaysManager.selectVpnProfile(1, "Paris").getName());
+ assertEquals("Paris", gatewaysManager.selectVpnProfile(2, "Paris").getName());
+ assertEquals(null, gatewaysManager.selectVpnProfile(3, "Paris"));
}
@Test
@@ -409,7 +456,7 @@ public class GatewaysManagerTest {
provider.setGeoIpJson(new JSONObject());
providerObservable.updateProvider(provider);
GatewaysManager gatewaysManager = new GatewaysManager(mockContext);
- assertNull(gatewaysManager.select(0, "Stockholm"));
+ assertNull(gatewaysManager.selectVpnProfile(0, "Stockholm"));
}
@Test
diff --git a/app/src/test/java/se/leap/bitmaskclient/eip/VpnCertificateValidatorTest.java b/app/src/test/java/se/leap/bitmaskclient/eip/VpnCertificateValidatorTest.java
index a951f144..09e831dd 100644
--- a/app/src/test/java/se/leap/bitmaskclient/eip/VpnCertificateValidatorTest.java
+++ b/app/src/test/java/se/leap/bitmaskclient/eip/VpnCertificateValidatorTest.java
@@ -25,7 +25,7 @@ public class VpnCertificateValidatorTest {
@Test
public void test_isValid() throws NoSuchAlgorithmException, CertificateEncodingException, IOException {
String cert = getInputAsString(getClass().getClassLoader().getResourceAsStream("riseup.net.pem"));
- Calendar c = new Calendar.Builder().setDate(2018, 1, 1).setCalendarType("gregorian").build();
+ Calendar c = new Calendar.Builder().setDate(2024, 11, 2).setCalendarType("gregorian").build();
CertificateHelper helper = mockCertificateHelper("falseFingerPrint");
VpnCertificateValidator validator = new VpnCertificateValidator(cert);
validator.setCalendarProvider(new TestCalendarProvider(c.getTimeInMillis()));
@@ -35,7 +35,7 @@ public class VpnCertificateValidatorTest {
@Test
public void test_isValid_lessThan1day_returnFalse() throws NoSuchAlgorithmException, CertificateEncodingException, IOException {
String cert = getInputAsString(getClass().getClassLoader().getResourceAsStream("riseup.net.pem"));
- Calendar c = new Calendar.Builder().setDate(2024, 3, 28).setCalendarType("gregorian").build();
+ Calendar c = new Calendar.Builder().setDate(2026, 11, 2).setCalendarType("gregorian").build();
CertificateHelper helper = mockCertificateHelper("falseFingerPrint");
VpnCertificateValidator validator = new VpnCertificateValidator(cert);
validator.setCalendarProvider(new TestCalendarProvider(c.getTimeInMillis()));
diff --git a/app/src/test/java/se/leap/bitmaskclient/eip/VpnConfigGeneratorTest.java b/app/src/test/java/se/leap/bitmaskclient/eip/VpnConfigGeneratorTest.java
index 4b9e5d65..fa5d888b 100644
--- a/app/src/test/java/se/leap/bitmaskclient/eip/VpnConfigGeneratorTest.java
+++ b/app/src/test/java/se/leap/bitmaskclient/eip/VpnConfigGeneratorTest.java
@@ -8,27 +8,35 @@ import static org.mockito.Mockito.when;
import static de.blinkt.openvpn.core.connection.Connection.TransportType.OBFS4;
import static de.blinkt.openvpn.core.connection.Connection.TransportType.OBFS4_HOP;
import static de.blinkt.openvpn.core.connection.Connection.TransportType.OPENVPN;
+import static se.leap.bitmaskclient.base.models.Constants.IP_ADDRESS;
+import static se.leap.bitmaskclient.base.models.Constants.IP_ADDRESS6;
import static se.leap.bitmaskclient.base.models.Constants.OPENVPN_CONFIGURATION;
+import static se.leap.bitmaskclient.base.models.Transport.createTransportsFrom;
+import static se.leap.bitmaskclient.eip.VpnConfigGenerator.Configuration.createProfileConfig;
import android.content.Context;
import android.content.SharedPreferences;
+import android.os.Build;
import org.json.JSONObject;
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
import java.io.File;
-import java.util.HashMap;
+import java.util.Vector;
import de.blinkt.openvpn.VpnProfile;
import de.blinkt.openvpn.core.ConfigParser;
import de.blinkt.openvpn.core.connection.Connection;
import de.blinkt.openvpn.core.connection.Obfs4Connection;
-import de.blinkt.openvpn.core.connection.Obfs4HopConnection;
import se.leap.bitmaskclient.base.models.ProviderObservable;
+import se.leap.bitmaskclient.base.models.Transport;
import se.leap.bitmaskclient.base.utils.BuildConfigHelper;
import se.leap.bitmaskclient.base.utils.PreferenceHelper;
-import se.leap.bitmaskclient.base.utils.RSAHelper;
+import se.leap.bitmaskclient.base.utils.PrivateKeyHelper;
import se.leap.bitmaskclient.testutils.MockHelper;
import se.leap.bitmaskclient.testutils.MockSharedPreferences;
import se.leap.bitmaskclient.testutils.TestSetupHelper;
@@ -36,6 +44,8 @@ import se.leap.bitmaskclient.testutils.TestSetupHelper;
/**
* Created by cyberta on 03.10.17.
*/
+@RunWith(RobolectricTestRunner.class)
+@Config(sdk = {Build.VERSION_CODES.P})
public class VpnConfigGeneratorTest {
Context context;
@@ -55,7 +65,7 @@ public class VpnConfigGeneratorTest {
"management-hold\n" +
"\n" +
"setenv IV_GUI_VER \"se.leap.bitmaskclient 0.9.10\" \n" +
- "setenv IV_PLAT_VER \"0 null JUNIT null null null\"\n" +
+ "setenv IV_PLAT_VER \"28 9 ROBO Android unknown robolectric\"\n" +
"machine-readable-output\n" +
"allow-recursive-routing\n" +
"ifconfig-nowarn\n" +
@@ -151,7 +161,7 @@ public class VpnConfigGeneratorTest {
"management-hold\n" +
"\n" +
"setenv IV_GUI_VER \"se.leap.bitmaskclient 0.9.10\" \n" +
- "setenv IV_PLAT_VER \"0 null JUNIT null null null\"\n" +
+ "setenv IV_PLAT_VER \"28 9 ROBO Android unknown robolectric\"\n" +
"machine-readable-output\n" +
"allow-recursive-routing\n" +
"ifconfig-nowarn\n" +
@@ -247,7 +257,7 @@ public class VpnConfigGeneratorTest {
"management-hold\n" +
"\n" +
"setenv IV_GUI_VER \"se.leap.bitmaskclient 0.9.10\" \n" +
- "setenv IV_PLAT_VER \"0 null JUNIT null null null\"\n" +
+ "setenv IV_PLAT_VER \"28 9 ROBO Android unknown robolectric\"\n" +
"machine-readable-output\n" +
"allow-recursive-routing\n" +
"ifconfig-nowarn\n" +
@@ -256,7 +266,7 @@ public class VpnConfigGeneratorTest {
"connect-retry 2 300\n" +
"resolv-retry 60\n" +
"dev tun\n" +
- "remote 127.0.0.1 4430 tcp-client\n" +
+ "remote 127.0.0.1 8080 udp\n" +
"<ca>\n" +
"-----BEGIN CERTIFICATE-----\n" +
"MIIFbzCCA1egAwIBAgIBATANBgkqhkiG9w0BAQ0FADBKMRgwFgYDVQQDDA9CaXRt\n" +
@@ -343,7 +353,7 @@ public class VpnConfigGeneratorTest {
"management-hold\n" +
"\n" +
"setenv IV_GUI_VER \"se.leap.bitmaskclient 0.9.10\" \n" +
- "setenv IV_PLAT_VER \"0 null JUNIT null null null\"\n" +
+ "setenv IV_PLAT_VER \"28 9 ROBO Android unknown robolectric\"\n" +
"machine-readable-output\n" +
"allow-recursive-routing\n" +
"ifconfig-nowarn\n" +
@@ -352,7 +362,7 @@ public class VpnConfigGeneratorTest {
"connect-retry 2 300\n" +
"resolv-retry 60\n" +
"dev tun\n" +
- "remote 37.218.247.60 23049 tcp-client\n" +
+ "remote 127.0.0.1 8080 udp\n" +
"<ca>\n" +
"-----BEGIN CERTIFICATE-----\n" +
"MIIFbzCCA1egAwIBAgIBATANBgkqhkiG9w0BAQ0FADBKMRgwFgYDVQQDDA9CaXRt\n" +
@@ -439,7 +449,7 @@ public class VpnConfigGeneratorTest {
"management-hold\n" +
"\n" +
"setenv IV_GUI_VER \"se.leap.bitmaskclient 0.9.10\" \n" +
- "setenv IV_PLAT_VER \"0 null JUNIT null null null\"\n" +
+ "setenv IV_PLAT_VER \"28 9 ROBO Android unknown robolectric\"\n" +
"machine-readable-output\n" +
"allow-recursive-routing\n" +
"ifconfig-nowarn\n" +
@@ -535,7 +545,7 @@ public class VpnConfigGeneratorTest {
"management-hold\n" +
"\n" +
"setenv IV_GUI_VER \"se.leap.bitmaskclient 0.9.10\" \n" +
- "setenv IV_PLAT_VER \"0 null JUNIT null null null\"\n" +
+ "setenv IV_PLAT_VER \"28 9 ROBO Android unknown robolectric\"\n" +
"machine-readable-output\n" +
"allow-recursive-routing\n" +
"ifconfig-nowarn\n" +
@@ -631,7 +641,7 @@ public class VpnConfigGeneratorTest {
"management-hold\n" +
"\n" +
"setenv IV_GUI_VER \"se.leap.bitmaskclient 0.9.10\" \n" +
- "setenv IV_PLAT_VER \"0 null JUNIT null null null\"\n" +
+ "setenv IV_PLAT_VER \"28 9 ROBO Android unknown robolectric\"\n" +
"machine-readable-output\n" +
"allow-recursive-routing\n" +
"ifconfig-nowarn\n" +
@@ -727,7 +737,7 @@ public class VpnConfigGeneratorTest {
"management-hold\n" +
"\n" +
"setenv IV_GUI_VER \"se.leap.bitmaskclient 0.9.10\" \n" +
- "setenv IV_PLAT_VER \"0 null JUNIT null null null\"\n" +
+ "setenv IV_PLAT_VER \"28 9 ROBO Android unknown robolectric\"\n" +
"machine-readable-output\n" +
"allow-recursive-routing\n" +
"ifconfig-nowarn\n" +
@@ -829,7 +839,7 @@ public class VpnConfigGeneratorTest {
"management-hold\n" +
"\n" +
"setenv IV_GUI_VER \"se.leap.bitmaskclient 0.9.10\" \n" +
- "setenv IV_PLAT_VER \"0 null JUNIT null null null\"\n" +
+ "setenv IV_PLAT_VER \"28 9 ROBO Android unknown robolectric\"\n" +
"machine-readable-output\n" +
"allow-recursive-routing\n" +
"ifconfig-nowarn\n" +
@@ -931,7 +941,7 @@ public class VpnConfigGeneratorTest {
"management-hold\n" +
"\n" +
"setenv IV_GUI_VER \"se.leap.bitmaskclient 0.9.10\" \n" +
- "setenv IV_PLAT_VER \"0 null JUNIT null null null\"\n" +
+ "setenv IV_PLAT_VER \"28 9 ROBO Android unknown robolectric\"\n" +
"machine-readable-output\n" +
"allow-recursive-routing\n" +
"ifconfig-nowarn\n" +
@@ -1042,7 +1052,7 @@ public class VpnConfigGeneratorTest {
"management-hold\n" +
"\n" +
"setenv IV_GUI_VER \"se.leap.bitmaskclient 0.9.10\" \n" +
- "setenv IV_PLAT_VER \"0 null JUNIT null null null\"\n" +
+ "setenv IV_PLAT_VER \"28 9 ROBO Android unknown robolectric\"\n" +
"machine-readable-output\n" +
"allow-recursive-routing\n" +
"ifconfig-nowarn\n" +
@@ -1145,7 +1155,7 @@ public class VpnConfigGeneratorTest {
"management-hold\n" +
"\n" +
"setenv IV_GUI_VER \"se.leap.bitmaskclient 0.9.10\" \n" +
- "setenv IV_PLAT_VER \"0 null JUNIT null null null\"\n" +
+ "setenv IV_PLAT_VER \"28 9 ROBO Android unknown robolectric\"\n" +
"machine-readable-output\n" +
"allow-recursive-routing\n" +
"ifconfig-nowarn\n" +
@@ -1218,7 +1228,6 @@ public class VpnConfigGeneratorTest {
"management-external-key nopadding pkcs1 pss digest\n" +
//"# crl-verify file missing in config profile\n" +
"route 192.81.208.164 255.255.255.255 net_gateway\n"+
- "tun-mtu 48000\n"+
"nobind\n"+
"remote-cert-tls server\n" +
"data-ciphers AES-256-GCM\n" +
@@ -1234,12 +1243,10 @@ public class VpnConfigGeneratorTest {
"# You are on your on own here :)\n" +
"# These options found in the config file do not map to config settings:\n" +
"keepalive 10 30 \n" +
- "replay-window 65535 \n" +
+ "tls-cipher TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384 \n" +
"sndbuf 0 \n" +
"rcvbuf 0 \n" +
- "tls-version-min 1.2 \n" +
- "ping-restart 300 \n" +
- "tls-cipher TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384 \n";
+ "tls-version-min 1.2 \n";
String expectedVPNConfig_hopping_pt_portAndIpHopping = "# Config for OpenVPN 2.x\n" +
"# Enables connection to GUI\n" +
@@ -1249,7 +1256,7 @@ public class VpnConfigGeneratorTest {
"management-hold\n" +
"\n" +
"setenv IV_GUI_VER \"se.leap.bitmaskclient 0.9.10\" \n" +
- "setenv IV_PLAT_VER \"0 null JUNIT null null null\"\n" +
+ "setenv IV_PLAT_VER \"28 9 ROBO Android unknown robolectric\"\n" +
"machine-readable-output\n" +
"allow-recursive-routing\n" +
"ifconfig-nowarn\n" +
@@ -1324,7 +1331,6 @@ public class VpnConfigGeneratorTest {
"route 192.81.208.164 255.255.255.255 net_gateway\n"+
"route 192.81.208.165 255.255.255.255 net_gateway\n"+
"route 192.81.208.166 255.255.255.255 net_gateway\n"+
- "tun-mtu 48000\n"+
"nobind\n"+
"remote-cert-tls server\n" +
"data-ciphers AES-256-GCM\n" +
@@ -1340,9 +1346,6 @@ public class VpnConfigGeneratorTest {
"# You are on your on own here :)\n" +
"# These options found in the config file do not map to config settings:\n" +
"keepalive 10 30 \n" +
- "replay-window 65535 \n" +
- "sndbuf 0 \n" +
- "rcvbuf 0 \n" +
"tls-version-min 1.2 \n" +
"ping-restart 300 \n" +
"tls-cipher TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384 \n";
@@ -1355,109 +1358,121 @@ public class VpnConfigGeneratorTest {
context = MockHelper.mockContext();
ProviderObservable providerObservable = MockHelper.mockProviderObservable(TestSetupHelper.getConfiguredProvider());
- RSAHelper rsaHelper = MockHelper.mockRSAHelper();
+ PrivateKeyHelper privateKeyHelper = MockHelper.mockPrivateKeyHelper();
sharedPreferences = new MockSharedPreferences();
preferenceHelper = new PreferenceHelper(new MockSharedPreferences());
when(context.getCacheDir()).thenReturn(new File("/data/data/se.leap.bitmask"));
}
+ private static boolean containsKey(Vector<VpnProfile> profiles, Connection.TransportType transportType) {
+ for (VpnProfile profile : profiles) {
+ if (profile.getTransportType() == transportType) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private static VpnProfile getVpnProfile(Vector<VpnProfile> profiles, Connection.TransportType transportType) {
+ for (VpnProfile profile : profiles) {
+ if (profile.getTransportType() == transportType) {
+ return profile;
+ }
+ }
+ return null;
+ }
+
@Test
public void testGenerateVpnProfile_v1_tcp_udp() throws Exception {
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("gateway_tcp_udp.json")));
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 1;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertFalse(vpnProfiles.containsKey(OBFS4));
- assertEquals(expectedVPNConfig_v1_tcp_udp.trim(), vpnProfiles.get(OPENVPN).getConfigFile(context, false).trim());
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 1), 1, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertFalse(containsKey(vpnProfiles, OBFS4));
+ assertEquals(expectedVPNConfig_v1_tcp_udp.trim(), getVpnProfile(vpnProfiles, OPENVPN).getConfigFile(context, false).trim());
}
@Test
public void testGenerateVpnProfile_v1_udp_tcp() throws Exception {
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("gateway_udp_tcp.json")));
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 1;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertFalse(vpnProfiles.containsKey(OBFS4));
- assertEquals(expectedVPNConfig_v1_udp_tcp.trim(), vpnProfiles.get(OPENVPN).getConfigFile(context, false).trim());
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 1), 1, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertFalse(containsKey(vpnProfiles, OBFS4));
+ assertEquals(expectedVPNConfig_v1_udp_tcp.trim(), getVpnProfile(vpnProfiles, OPENVPN).getConfigFile(context, false).trim());
}
@Test
public void testGenerateVpnProfile_v2_tcp_udp() throws Exception {
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("gateway_tcp_udp.json")));
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 2;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertFalse(vpnProfiles.containsKey(OBFS4));
- assertEquals(expectedVPNConfig_v1_tcp_udp.trim(), vpnProfiles.get(OPENVPN).getConfigFile(context, false).trim());
+
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 2), 2, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertFalse(containsKey(vpnProfiles, OBFS4));
+ assertEquals(expectedVPNConfig_v1_tcp_udp.trim(), getVpnProfile(vpnProfiles, OPENVPN).getConfigFile(context, false).trim());
}
@Test
public void testGenerateVpnProfile_v2_udp_tcp() throws Exception {
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("gateway_udp_tcp.json")));
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 2;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertFalse(vpnProfiles.containsKey(OBFS4));
- assertEquals(expectedVPNConfig_v1_udp_tcp.trim(), vpnProfiles.get(OPENVPN).getConfigFile(context, false).trim());
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 2), 2, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertFalse(containsKey(vpnProfiles, OBFS4));
+ assertEquals(expectedVPNConfig_v1_udp_tcp.trim(), getVpnProfile(vpnProfiles, OPENVPN).getConfigFile(context, false).trim());
}
@Test
public void testGenerateVpnProfile_v3_obfs4() throws Exception {
BuildConfigHelper buildConfigHelper = MockHelper.mockBuildConfigHelper(false);
- gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo.bitmask.eip-service.json"))).getJSONArray("gateways").getJSONObject(0);
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 3;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertTrue(vpnProfiles.containsKey(OBFS4));
- assertTrue(vpnProfiles.containsKey(OPENVPN));
- System.out.println(vpnProfiles.get(OBFS4).getConfigFile(context, false));
- assertEquals(expectedVPNConfig_v3_obfs4.trim(), vpnProfiles.get(OBFS4).getConfigFile(context, false).trim());
+ gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo.bitmask.eip-service-obfsvpn1.0.0.json"))).getJSONArray("gateways").getJSONObject(0);
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 3), 3, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertTrue(containsKey(vpnProfiles, OBFS4));
+ assertTrue(containsKey(vpnProfiles, OPENVPN));
+ System.out.println(getVpnProfile(vpnProfiles, OBFS4).getConfigFile(context, false));
+ assertEquals(expectedVPNConfig_v3_obfs4.trim(), getVpnProfile(vpnProfiles, OBFS4).getConfigFile(context, false).trim());
}
@Test
public void testGenerateVpnProfile_v3_obfs4_obfsvpn() throws Exception {
BuildConfigHelper buildConfigHelper = MockHelper.mockBuildConfigHelper(true);
- gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo.bitmask.eip-service.json"))).getJSONArray("gateways").getJSONObject(0);
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 3;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertTrue(vpnProfiles.containsKey(OBFS4));
- assertTrue(vpnProfiles.containsKey(OPENVPN));
- System.out.println(vpnProfiles.get(OBFS4).getConfigFile(context, false));
- assertEquals(expectedVPNConfig_v3_obfsvpn_obfs4.trim(), vpnProfiles.get(OBFS4).getConfigFile(context, false).trim());
+ gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo.bitmask.eip-service-obfsvpn1.0.0.json"))).getJSONArray("gateways").getJSONObject(0);
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 3), 3, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertTrue(containsKey(vpnProfiles, OBFS4));
+ assertTrue(containsKey(vpnProfiles, OPENVPN));
+ System.out.println(getVpnProfile(vpnProfiles, OBFS4).getConfigFile(context, false));
+ assertEquals(expectedVPNConfig_v3_obfsvpn_obfs4.trim(), getVpnProfile(vpnProfiles, OBFS4).getConfigFile(context, false).trim());
}
@Test
public void testGenerateVpnProfile_v3_ovpn_tcp_udp() throws Exception {
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_pt_tcp_udp.eip-service.json"))).getJSONArray("gateways").getJSONObject(0);
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 3;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertTrue(vpnProfiles.containsKey(OBFS4));
- assertTrue(vpnProfiles.containsKey(OPENVPN));
- System.out.println(vpnProfiles.get(OPENVPN).getConfigFile(context, false));
- assertEquals(expectedVPNConfig_v3_ovpn_tcp_udp.trim(), vpnProfiles.get(OPENVPN).getConfigFile(context, false).trim());
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 3), 3, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
+ configuration.preferUDP = false;
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertTrue(containsKey(vpnProfiles, OBFS4));
+ assertTrue(containsKey(vpnProfiles, OPENVPN));
+ System.out.println(getVpnProfile(vpnProfiles, OPENVPN).getConfigFile(context, false));
+ assertEquals(expectedVPNConfig_v3_ovpn_tcp_udp.trim(), getVpnProfile(vpnProfiles, OPENVPN).getConfigFile(context, false).trim());
}
@Test
public void testGenerateVpnProfile_v3_ovpn_udp_tcp() throws Exception {
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_pt_udp_tcp.eip-service.json"))).getJSONArray("gateways").getJSONObject(0);
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 3;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertTrue(vpnProfiles.containsKey(OBFS4));
- assertTrue(vpnProfiles.containsKey(OPENVPN));
- System.out.println(vpnProfiles.get(OPENVPN).getConfigFile(context, false));
- assertEquals(expectedVPNConfig_v3_ovpn_udp_tcp.trim(), vpnProfiles.get(OPENVPN).getConfigFile(context, false).trim());
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 3), 3, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertTrue(containsKey(vpnProfiles, OBFS4));
+ assertTrue(containsKey(vpnProfiles, OPENVPN));
+ System.out.println(getVpnProfile(vpnProfiles, OPENVPN).getConfigFile(context, false));
+ assertEquals(expectedVPNConfig_v3_ovpn_udp_tcp.trim(), getVpnProfile(vpnProfiles, OPENVPN).getConfigFile(context, false).trim());
}
@Test
@@ -1465,64 +1480,60 @@ public class VpnConfigGeneratorTest {
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_pt_udp_tcp.eip-service.json"))).getJSONArray("gateways").getJSONObject(0);
//delete "data-ciphers" from config to test if the resulting openvpn config file will contain the default value taken from "cipher" flag
generalConfig.put("data-ciphers", null);
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 3;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertTrue(vpnProfiles.containsKey(OBFS4));
- assertTrue(vpnProfiles.containsKey(OPENVPN));
- System.out.println(vpnProfiles.get(OPENVPN).getConfigFile(context, false));
- assertEquals(expectedVPNConfig_v3_ovpn_udp_tcp_defaultDataCiphers.trim(), vpnProfiles.get(OPENVPN).getConfigFile(context, false).trim());
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 3), 3, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertTrue(containsKey(vpnProfiles, OBFS4));
+ assertTrue(containsKey(vpnProfiles, OPENVPN));
+ System.out.println(getVpnProfile(vpnProfiles, OPENVPN).getConfigFile(context, false));
+ assertEquals(expectedVPNConfig_v3_ovpn_udp_tcp_defaultDataCiphers.trim(), getVpnProfile(vpnProfiles, OPENVPN).getConfigFile(context, false).trim());
}
@Test
public void testGenerateVpnProfile_v4_ovpn_tcp_udp() throws Exception {
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("v4/ptdemo_pt_tcp_udp.eip-service.json"))).getJSONArray("gateways").getJSONObject(0);
generalConfig = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("v4/ptdemo_pt_tcp_udp.eip-service.json"))).getJSONObject(OPENVPN_CONFIGURATION);
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 4;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertTrue(vpnProfiles.containsKey(OBFS4));
- assertTrue(vpnProfiles.containsKey(OPENVPN));
- System.out.println(vpnProfiles.get(OPENVPN).getConfigFile(context, false));
- assertEquals(expectedVPNConfig_v4_ovpn_tcp_udp.trim(), vpnProfiles.get(OPENVPN).getConfigFile(context, false).trim());
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 4), 4, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
+ configuration.preferUDP = false;
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertTrue(containsKey(vpnProfiles, OBFS4));
+ assertTrue(containsKey(vpnProfiles, OPENVPN));
+ System.out.println(getVpnProfile(vpnProfiles, OPENVPN).getConfigFile(context, false));
+ assertEquals(expectedVPNConfig_v4_ovpn_tcp_udp.trim(), getVpnProfile(vpnProfiles, OPENVPN).getConfigFile(context, false).trim());
}
@Test
public void testGenerateVpnProfile_v4_ovpn_udp_tcp() throws Exception {
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("v4/ptdemo_pt_udp_tcp.eip-service.json"))).getJSONArray("gateways").getJSONObject(0);
generalConfig = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("v4/ptdemo_pt_udp_tcp.eip-service.json"))).getJSONObject(OPENVPN_CONFIGURATION);
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 4;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertTrue(vpnProfiles.containsKey(OBFS4));
- assertTrue(vpnProfiles.containsKey(OPENVPN));
- System.out.println(vpnProfiles.get(OPENVPN).getConfigFile(context, false));
- assertEquals(expectedVPNConfig_v4_ovpn_udp_tcp.trim(), vpnProfiles.get(OPENVPN).getConfigFile(context, false).trim());
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 4), 4, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertTrue(containsKey(vpnProfiles, OBFS4));
+ assertTrue(containsKey(vpnProfiles, OPENVPN));
+ System.out.println(getVpnProfile(vpnProfiles, OPENVPN).getConfigFile(context, false));
+ assertEquals(expectedVPNConfig_v4_ovpn_udp_tcp.trim(), getVpnProfile(vpnProfiles, OPENVPN).getConfigFile(context, false).trim());
}
@Test
public void testGenerateVpnProfile_v3_ipv6only_allowOpenvpnIPv6Only() throws Exception {
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_misconfigured_ipv6.json"))).getJSONArray("gateways").getJSONObject(0);
generalConfig = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_misconfigured_ipv6.json"))).getJSONObject(OPENVPN_CONFIGURATION);
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 3;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertTrue(vpnProfiles.containsKey(OPENVPN));
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 3), 3, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertTrue(containsKey(vpnProfiles, OPENVPN));
}
@Test
public void testGenerateVpnProfile_v3_obfs4IPv6_skip() throws Exception {
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_misconfigured_ipv6.json"))).getJSONArray("gateways").getJSONObject(0);
generalConfig = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_misconfigured_ipv6.json"))).getJSONObject(OPENVPN_CONFIGURATION);
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 3;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertFalse(vpnProfiles.containsKey(OBFS4));
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 3), 3, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertFalse(containsKey(vpnProfiles, OBFS4));
}
/**
@@ -1532,14 +1543,13 @@ public class VpnConfigGeneratorTest {
public void testGenerateVpnProfile_v3_obfs4IPv4AndIPv6_skipIPv6() throws Exception {
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_misconfigured_ipv4ipv6.json"))).getJSONArray("gateways").getJSONObject(0);
generalConfig = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_misconfigured_ipv4ipv6.json"))).getJSONObject(OPENVPN_CONFIGURATION);
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 3;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertTrue(vpnProfiles.containsKey(OBFS4));
- assertTrue(vpnProfiles.containsKey(OPENVPN));
- assertEquals(1, vpnProfiles.get(OBFS4).mConnections.length);
- assertEquals("37.218.247.60/32", vpnProfiles.get(OBFS4).mExcludedRoutes.trim());
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 3), 3, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertTrue(containsKey(vpnProfiles, OBFS4));
+ assertTrue(containsKey(vpnProfiles, OPENVPN));
+ assertEquals(1, getVpnProfile(vpnProfiles, OBFS4).mConnections.length);
+ assertEquals("37.218.247.60/32", getVpnProfile(vpnProfiles, OBFS4).mExcludedRoutes.trim());
}
/**
@@ -1549,95 +1559,88 @@ public class VpnConfigGeneratorTest {
public void testGenerateVpnProfile_v3_obfs4udp_skip() throws Exception {
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_misconfigured_udp.json"))).getJSONArray("gateways").getJSONObject(0);
generalConfig = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_misconfigured_udp.json"))).getJSONObject(OPENVPN_CONFIGURATION);
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 3;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertFalse(vpnProfiles.containsKey(OBFS4));
- assertTrue(vpnProfiles.containsKey(OPENVPN));
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 3), 3, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertFalse(containsKey(vpnProfiles, OBFS4));
+ assertTrue(containsKey(vpnProfiles, OPENVPN));
}
/**
- * obfs4 cannot be used with UDP, openvpn needs to support TCP
+ * obfs4 cannot be used with UDP (only TCP or KCP), openvpn needs to support UDP
*/
@Test
- public void testGenerateVpnProfile_v3_obfs4TCP_openvpnUDP_skip() throws Exception {
- gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_misconfigured_udp2.json"))).getJSONArray("gateways").getJSONObject(0);
- generalConfig = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_misconfigured_udp2.json"))).getJSONObject(OPENVPN_CONFIGURATION);
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 3;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertFalse(vpnProfiles.containsKey(OBFS4));
- assertTrue(vpnProfiles.containsKey(OPENVPN));
+ public void testGenerateVpnProfile_v3_obfs4TCP_openvpnTCP_skip() throws Exception {
+ gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_misconfigured_tcp2.json"))).getJSONArray("gateways").getJSONObject(0);
+ generalConfig = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_misconfigured_tcp2.json"))).getJSONObject(OPENVPN_CONFIGURATION);
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 3), 3, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertFalse(containsKey(vpnProfiles, OBFS4));
+ assertTrue(containsKey(vpnProfiles, OPENVPN));
}
@Test
public void testGenerateVpnProfile_v3_obfs4UDPAndTCP_skipUDP() throws Exception {
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_misconfigured_udptcp.json"))).getJSONArray("gateways").getJSONObject(0);
generalConfig = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_misconfigured_udptcp.json"))).getJSONObject(OPENVPN_CONFIGURATION);
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 3;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertTrue(vpnProfiles.containsKey(OBFS4));
- assertTrue(vpnProfiles.containsKey(OPENVPN));
- assertEquals(1, vpnProfiles.get(OBFS4).mConnections.length);
- assertFalse(vpnProfiles.get(OBFS4).mConnections[0].isUseUdp());
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 3), 3, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertTrue(containsKey(vpnProfiles, OBFS4));
+ assertTrue(containsKey(vpnProfiles, OPENVPN));
+ assertEquals(1, getVpnProfile(vpnProfiles, OBFS4).mConnections.length);
}
@Test
public void testGenerateVpnProfile_preferUDP_firstRemotesUDP() throws Exception {
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("v4/multiport_tcpudp_eip-service.json"))).getJSONArray("gateways").getJSONObject(0);
generalConfig = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("v4/multiport_tcpudp_eip-service.json"))).getJSONObject(OPENVPN_CONFIGURATION);
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 3;
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 3), 3, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
configuration.preferUDP = true;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertTrue(vpnProfiles.containsKey(OBFS4));
- assertTrue(vpnProfiles.containsKey(OPENVPN));
- System.out.println(vpnProfiles.get(OPENVPN).getConfigFile(context, false));
- assertEquals(expectedVPNConfig_v4_ovpn_multiport_tcpudp.trim(), vpnProfiles.get(OPENVPN).getConfigFile(context, false).trim());
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertTrue(containsKey(vpnProfiles, OBFS4));
+ assertTrue(containsKey(vpnProfiles, OPENVPN));
+ System.out.println(getVpnProfile(vpnProfiles, OPENVPN).getConfigFile(context, false));
+ assertEquals(expectedVPNConfig_v4_ovpn_multiport_tcpudp.trim(), getVpnProfile(vpnProfiles, OPENVPN).getConfigFile(context, false).trim());
}
@Test
public void testGenerateVpnProfile_testNewCiphers() throws Exception {
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("v4/ptdemo_pt_tcp_udp_new_ciphers.eip-service.json"))).getJSONArray("gateways").getJSONObject(0);
generalConfig = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("v4/ptdemo_pt_tcp_udp_new_ciphers.eip-service.json"))).getJSONObject(OPENVPN_CONFIGURATION);
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 4;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- System.out.println(vpnProfiles.get(OPENVPN).getConfigFile(context, false));
- assertEquals(expectedVPNConfig_v4_ovpn_tcp_udp_new_ciphers.trim(), vpnProfiles.get(OPENVPN).getConfigFile(context, false).trim());
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 4), 4, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
+ configuration.preferUDP = false;
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ System.out.println(getVpnProfile(vpnProfiles, OPENVPN).getConfigFile(context, false));
+ assertEquals(expectedVPNConfig_v4_ovpn_tcp_udp_new_ciphers.trim(), getVpnProfile(vpnProfiles, OPENVPN).getConfigFile(context, false).trim());
}
@Test
public void testGenerateVpnProfileExperimentalTransportsEnabled () throws Exception {
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_kcp_gateways.json"))).getJSONArray("gateways").getJSONObject(2);
generalConfig = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_kcp_gateways.json"))).getJSONObject(OPENVPN_CONFIGURATION);
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 3;
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 3), 3, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
configuration.experimentalTransports = true;
configuration.preferUDP = true;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertTrue(vpnProfiles.containsKey(OBFS4) && ((Obfs4Connection)vpnProfiles.get(OBFS4).mConnections[0]).getObfs4Options().transport.getProtocols()[0].equals("kcp"));
- assertTrue(vpnProfiles.containsKey(OPENVPN));
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertTrue(containsKey(vpnProfiles, OBFS4) && ((Obfs4Connection)getVpnProfile(vpnProfiles, OBFS4).mConnections[0]).getObfs4Options().transport.getProtocols()[0].equals("kcp"));
+ assertTrue(containsKey(vpnProfiles, OPENVPN));
}
@Test
public void testGenerateVpnProfile_experimentalTransportsEnabled_KCPMisconfiguredWithUDP_SkippingObfsKCP () throws Exception {
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_misconfigured_kcp_gateways.json"))).getJSONArray("gateways").getJSONObject(2);
generalConfig = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_misconfigured_kcp_gateways.json"))).getJSONObject(OPENVPN_CONFIGURATION);
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 3;
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 3), 3, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
configuration.experimentalTransports = true;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertFalse(vpnProfiles.containsKey(OBFS4));
- assertTrue(vpnProfiles.containsKey(OPENVPN));
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertFalse(containsKey(vpnProfiles, OBFS4));
+ assertTrue(containsKey(vpnProfiles, OPENVPN));
}
@Test
@@ -1650,13 +1653,14 @@ public class VpnConfigGeneratorTest {
configuration.obfuscationProxyPort = "443";
configuration.obfuscationProxyIP = "5.6.7.8";
configuration.obfuscationProxyCert = "asdfasdf";
- configuration.obfuscationProxyKCP = true;
+ configuration.obfuscationProxyTransportProtocol = "kcp";
configuration.remoteGatewayIP = "1.2.3.4";
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertTrue("has openvpn profile", vpnProfiles.containsKey(OPENVPN));
- assertTrue("has obfs4 profile", vpnProfiles.containsKey(OBFS4));
- assertTrue("bridge is running KCP", vpnProfiles.get(OBFS4).mGatewayIp.equals("1.2.3.4"));
+ configuration.transports = createTransportsFrom(gateway, 3);
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertTrue("has openvpn profile", containsKey(vpnProfiles, OPENVPN));
+ assertTrue("has obfs4 profile", containsKey(vpnProfiles, OBFS4));
+ assertTrue("bridge is running KCP", getVpnProfile(vpnProfiles, OBFS4).mGatewayIp.equals("1.2.3.4"));
}
@@ -1667,17 +1671,18 @@ public class VpnConfigGeneratorTest {
VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
configuration.apiVersion = 3;
configuration.useObfuscationPinning = true;
- configuration.obfuscationProxyKCP = false;
+ configuration.obfuscationProxyTransportProtocol = "tcp";
configuration.obfuscationProxyPort = "443";
configuration.obfuscationProxyIP = "5.6.7.8";
configuration.obfuscationProxyCert = "asdfasdf";
configuration.remoteGatewayIP = "1.2.3.4";
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertFalse("has openvpn profile", vpnProfiles.containsKey(OPENVPN));
- assertTrue("has obfs4 profile", vpnProfiles.containsKey(OBFS4));
- assertTrue("bridge is pinned one", vpnProfiles.get(OBFS4).getTransportType() == OBFS4 && !vpnProfiles.get(OBFS4).mConnections[0].isUseUdp() );
- assertTrue("bridge is running TCP", ((Obfs4Connection) vpnProfiles.get(OBFS4).mConnections[0]).getObfs4Options().transport.getProtocols()[0].equals("tcp"));
+ configuration.transports = createTransportsFrom(gateway, 3);
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertFalse("has openvpn profile", containsKey(vpnProfiles, OPENVPN));
+ assertTrue("has obfs4 profile", containsKey(vpnProfiles, OBFS4));
+ assertTrue("bridge is pinned one", getVpnProfile(vpnProfiles, OBFS4).getTransportType() == OBFS4 && getVpnProfile(vpnProfiles, OBFS4).mConnections[0].isUseUdp());
+ assertTrue("bridge is running TCP", ((Obfs4Connection) getVpnProfile(vpnProfiles, OBFS4).mConnections[0]).getObfs4Options().transport.getProtocols()[0].equals("tcp"));
}
@Test
@@ -1687,43 +1692,64 @@ public class VpnConfigGeneratorTest {
VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
configuration.apiVersion = 3;
configuration.useObfuscationPinning = true;
- configuration.obfuscationProxyKCP = true;
+ configuration.obfuscationProxyTransportProtocol = "kcp";
configuration.obfuscationProxyPort = "443";
configuration.obfuscationProxyIP = "5.6.7.8";
configuration.obfuscationProxyCert = "asdfasdf";
configuration.remoteGatewayIP = "1.2.3.4";
+ configuration.transports = createTransportsFrom(gateway, 3);
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertFalse("has openvpn profile", vpnProfiles.containsKey(OPENVPN));
- assertTrue("has no obfs4 profile", vpnProfiles.containsKey(OBFS4));
- assertTrue("bridge is pinned one", vpnProfiles.get(OBFS4).getTransportType() == OBFS4 && vpnProfiles.get(OBFS4).mGatewayIp.equals("1.2.3.4"));
- assertTrue("bridge is running KCP", ((Obfs4Connection) vpnProfiles.get(OBFS4).mConnections[0]).getObfs4Options().transport.getProtocols()[0].equals("kcp"));
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertFalse("has openvpn profile", containsKey(vpnProfiles, OPENVPN));
+ assertTrue("has no obfs4 profile", containsKey(vpnProfiles, OBFS4));
+ assertTrue("bridge is pinned one", getVpnProfile(vpnProfiles, OBFS4).getTransportType() == OBFS4 && getVpnProfile(vpnProfiles, OBFS4).mGatewayIp.equals("1.2.3.4"));
+ assertTrue("bridge is running KCP", ((Obfs4Connection) getVpnProfile(vpnProfiles, OBFS4).mConnections[0]).getObfs4Options().transport.getProtocols()[0].equals("kcp"));
+ }
+
+ @Test
+ public void testGenerateVpnProfile_ObfuscationPinningEnabled_quic_obfs4QuicProfile () throws Exception {
+ gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_kcp_gateways.json"))).getJSONArray("gateways").getJSONObject(0);
+ generalConfig = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_kcp_gateways.json"))).getJSONObject(OPENVPN_CONFIGURATION);
+ VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
+ configuration.apiVersion = 3;
+ configuration.useObfuscationPinning = true;
+ configuration.obfuscationProxyTransportProtocol = "quic";
+ configuration.obfuscationProxyPort = "443";
+ configuration.obfuscationProxyIP = "5.6.7.8";
+ configuration.obfuscationProxyCert = "asdfasdf";
+ configuration.remoteGatewayIP = "1.2.3.4";
+ configuration.transports = createTransportsFrom(gateway, 3);
+
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertFalse("has openvpn profile", containsKey(vpnProfiles, OPENVPN));
+ assertTrue("has no obfs4 profile", containsKey(vpnProfiles, OBFS4));
+ assertTrue("bridge is pinned one", getVpnProfile(vpnProfiles, OBFS4).getTransportType() == OBFS4 && getVpnProfile(vpnProfiles, OBFS4).mGatewayIp.equals("1.2.3.4"));
+ assertTrue("bridge is running QUIC", ((Obfs4Connection) getVpnProfile(vpnProfiles, OBFS4).mConnections[0]).getObfs4Options().transport.getProtocols()[0].equals("quic"));
}
@Test
public void testGenerateVpnProfile_obfs4hop_tcp () throws Exception {
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_obfs4hop_tcp_gateways.json"))).getJSONArray("gateways").getJSONObject(2);
generalConfig = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_obfs4hop_tcp_gateways.json"))).getJSONObject(OPENVPN_CONFIGURATION);
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 3;
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 3), 3, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
configuration.experimentalTransports = true;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertTrue(vpnProfiles.containsKey(OBFS4_HOP) && ((Obfs4HopConnection)vpnProfiles.get(OBFS4_HOP).mConnections[0]).getObfs4Options().transport.getProtocols()[0].equals("tcp"));
- assertTrue(vpnProfiles.containsKey(OPENVPN));
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertTrue(containsKey(vpnProfiles, OBFS4_HOP) && ((Obfs4Connection)getVpnProfile(vpnProfiles, OBFS4_HOP).mConnections[0]).getObfs4Options().transport.getProtocols()[0].equals("tcp"));
+ assertTrue(containsKey(vpnProfiles, OPENVPN));
}
@Test
public void testGenerateVpnProfile_obfs4hop_kcp () throws Exception {
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_obfs4hop_kcp_gateways.json"))).getJSONArray("gateways").getJSONObject(2);
generalConfig = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo_obfs4hop_kcp_gateways.json"))).getJSONObject(OPENVPN_CONFIGURATION);
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 3;
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 3), 3, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
configuration.experimentalTransports = true;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertTrue(vpnProfiles.containsKey(OBFS4_HOP) && ((Obfs4HopConnection)vpnProfiles.get(OBFS4_HOP).mConnections[0]).getObfs4Options().transport.getProtocols()[0].equals("kcp"));
- assertTrue(vpnProfiles.containsKey(OPENVPN));
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertTrue(containsKey(vpnProfiles, OBFS4_HOP) && ((Obfs4Connection)getVpnProfile(vpnProfiles, OBFS4_HOP).mConnections[0]).getObfs4Options().transport.getProtocols()[0].equals("kcp"));
+ assertTrue(containsKey(vpnProfiles, OPENVPN));
}
@Test
@@ -1731,13 +1757,12 @@ public class VpnConfigGeneratorTest {
BuildConfigHelper buildConfigHelper = MockHelper.mockBuildConfigHelper(true);
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("decoupled_pt_portHopping.eip-service.json"))).getJSONArray("gateways").getJSONObject(2);
generalConfig = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("decoupled_pt_portHopping.eip-service.json"))).getJSONObject(OPENVPN_CONFIGURATION);
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 3;
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 3), 3, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
configuration.experimentalTransports = true;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- System.out.println(vpnProfiles.get(OBFS4_HOP).getConfigFile(context, false));
- assertEquals(expectedVPNConfig_hopping_pt_portHopping.trim(), vpnProfiles.get(OBFS4_HOP).getConfigFile(context, false).trim());
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ System.out.println(getVpnProfile(vpnProfiles, OBFS4_HOP).getConfigFile(context, false));
+ assertEquals(expectedVPNConfig_hopping_pt_portHopping.trim(), getVpnProfile(vpnProfiles, OBFS4_HOP).getConfigFile(context, false).trim());
}
@Test
@@ -1745,27 +1770,25 @@ public class VpnConfigGeneratorTest {
BuildConfigHelper buildConfigHelper = MockHelper.mockBuildConfigHelper(true);
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("decoupled_pt_portHopping.eip-service.json"))).getJSONArray("gateways").getJSONObject(2);
generalConfig = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("decoupled_pt_portHopping.eip-service.json"))).getJSONObject(OPENVPN_CONFIGURATION);
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 3;
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 3), 3, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
configuration.experimentalTransports = true;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- System.out.println(vpnProfiles.get(OBFS4_HOP).getConfigFile(context, false));
- assertEquals(expectedVPNConfig_hopping_pt_portHopping.trim(), vpnProfiles.get(OBFS4_HOP).getConfigFile(context, false).trim());
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ System.out.println(getVpnProfile(vpnProfiles, OBFS4_HOP).getConfigFile(context, false));
+ assertEquals(expectedVPNConfig_hopping_pt_portHopping.trim(), getVpnProfile(vpnProfiles, OBFS4_HOP).getConfigFile(context, false).trim());
}
@Test
public void testGenerateVpnProfile_obfs4_decoupled() throws Exception {
BuildConfigHelper buildConfigHelper = MockHelper.mockBuildConfigHelper(true);
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("decoupled_pt.eip-service.json"))).getJSONArray("gateways").getJSONObject(1);
generalConfig = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("decoupled_pt.eip-service.json"))).getJSONObject(OPENVPN_CONFIGURATION);
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 3;
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 3), 3, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
configuration.experimentalTransports = true;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertTrue(vpnProfiles.containsKey(OBFS4));
- assertTrue(((Obfs4Connection)vpnProfiles.get(OBFS4).mConnections[0]).getObfs4Options().transport.getProtocols()[0].equals("tcp"));
- assertFalse(vpnProfiles.containsKey(OPENVPN));
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertTrue(containsKey(vpnProfiles, OBFS4));
+ assertTrue(((Obfs4Connection)getVpnProfile(vpnProfiles, OBFS4).mConnections[0]).getObfs4Options().transport.getProtocols()[0].equals("tcp"));
+ assertFalse(containsKey(vpnProfiles, OPENVPN));
}
@Test
@@ -1773,15 +1796,14 @@ public class VpnConfigGeneratorTest {
BuildConfigHelper buildConfigHelper = MockHelper.mockBuildConfigHelper(true);
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("decoupled_pt.eip-service.json"))).getJSONArray("gateways").getJSONObject(2);
generalConfig = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("decoupled_pt.eip-service.json"))).getJSONObject(OPENVPN_CONFIGURATION);
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 3;
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 3), 3, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
configuration.experimentalTransports = true;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertTrue(vpnProfiles.containsKey(OBFS4_HOP));
- assertTrue(((Obfs4HopConnection)vpnProfiles.get(OBFS4_HOP).mConnections[0]).getObfs4Options().transport.getProtocols()[0].equals("tcp"));
- assertFalse(vpnProfiles.containsKey(OPENVPN));
- assertFalse(vpnProfiles.containsKey(OBFS4));
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertTrue(containsKey(vpnProfiles, OBFS4_HOP));
+ assertTrue(((Obfs4Connection)getVpnProfile(vpnProfiles, OBFS4_HOP).mConnections[0]).getObfs4Options().transport.getProtocols()[0].equals("tcp"));
+ assertFalse(containsKey(vpnProfiles, OPENVPN));
+ assertFalse(containsKey(vpnProfiles, OBFS4));
}
@Test
@@ -1789,10 +1811,9 @@ public class VpnConfigGeneratorTest {
BuildConfigHelper buildConfigHelper = MockHelper.mockBuildConfigHelper(true);
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("decoupled_pt.eip-service.json"))).getJSONArray("gateways").getJSONObject(2);
generalConfig = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("decoupled_pt.eip-service.json"))).getJSONObject(OPENVPN_CONFIGURATION);
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 3;
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 3), 3, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
configuration.experimentalTransports = false;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
Exception exception = null;
try {
vpnConfigGenerator.generateVpnProfiles();
@@ -1807,14 +1828,13 @@ public class VpnConfigGeneratorTest {
BuildConfigHelper buildConfigHelper = MockHelper.mockBuildConfigHelper(true);
gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("decoupled_pt_portHopping.eip-service.json"))).getJSONArray("gateways").getJSONObject(2);
generalConfig = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("decoupled_pt_portHopping.eip-service.json"))).getJSONObject(OPENVPN_CONFIGURATION);
- VpnConfigGenerator.Configuration configuration = new VpnConfigGenerator.Configuration();
- configuration.apiVersion = 3;
+ VpnConfigGenerator.Configuration configuration = createProfileConfig(createTransportsFrom(gateway, 3), 3, gateway.optString(IP_ADDRESS), gateway.optString(IP_ADDRESS6), "");
configuration.experimentalTransports = true;
- vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, gateway, configuration);
- HashMap<Connection.TransportType, VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
- assertTrue(vpnProfiles.containsKey(OBFS4_HOP));
- assertTrue(((Obfs4HopConnection)vpnProfiles.get(OBFS4_HOP).mConnections[0]).getObfs4Options().transport.getProtocols()[0].equals("tcp"));
- assertFalse(vpnProfiles.containsKey(OPENVPN));
- assertFalse(vpnProfiles.containsKey(OBFS4));
+ vpnConfigGenerator = new VpnConfigGenerator(generalConfig, secrets, configuration);
+ Vector<VpnProfile> vpnProfiles = vpnConfigGenerator.generateVpnProfiles();
+ assertTrue(containsKey(vpnProfiles, OBFS4_HOP));
+ assertTrue(((Obfs4Connection)getVpnProfile(vpnProfiles, OBFS4_HOP).mConnections[0]).getObfs4Options().transport.getProtocols()[0].equals("tcp"));
+ assertFalse(containsKey(vpnProfiles, OPENVPN));
+ assertFalse(containsKey(vpnProfiles, OBFS4));
}
} \ No newline at end of file
diff --git a/app/src/test/java/se/leap/bitmaskclient/pluggableTransports/models/KcpConfigTest.java b/app/src/test/java/se/leap/bitmaskclient/pluggableTransports/models/KcpConfigTest.java
new file mode 100644
index 00000000..9310fd89
--- /dev/null
+++ b/app/src/test/java/se/leap/bitmaskclient/pluggableTransports/models/KcpConfigTest.java
@@ -0,0 +1,15 @@
+package se.leap.bitmaskclient.pluggableTransports.models;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+public class KcpConfigTest {
+
+ private static final String KCP_DEFAULTS = "{\"enabled\":true,\"send_window_size\":65535,\"receive_window_size\":65535,\"read_buffer\":16777216,\"write_buffer\":16777216,\"no_delay\":true,\"disable_flow_control\":true,\"interval\":10,\"resend\":2,\"mtu\":1400}";
+ @Test
+ public void testToString() {
+ KcpConfig config = new KcpConfig(true);
+ assertEquals(KCP_DEFAULTS, config.toString());
+ }
+} \ No newline at end of file
diff --git a/app/src/test/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerTest.java b/app/src/test/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerTest.java
new file mode 100644
index 00000000..adbcf8cb
--- /dev/null
+++ b/app/src/test/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerTest.java
@@ -0,0 +1,276 @@
+package se.leap.bitmaskclient.providersetup;
+
+import static org.junit.Assert.*;
+
+import static se.leap.bitmaskclient.base.models.Constants.BROADCAST_RESULT_KEY;
+import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_KEY;
+import static se.leap.bitmaskclient.base.models.Constants.USE_BRIDGES;
+import static se.leap.bitmaskclient.base.models.Constants.USE_SNOWFLAKE;
+import static se.leap.bitmaskclient.providersetup.ProviderAPI.CORRECTLY_UPDATED_INVALID_VPN_CERTIFICATE;
+import static se.leap.bitmaskclient.providersetup.ProviderAPI.ERRORS;
+import static se.leap.bitmaskclient.providersetup.ProviderAPI.MISSING_NETWORK_CONNECTION;
+import static se.leap.bitmaskclient.providersetup.ProviderAPI.PARAMETERS;
+import static se.leap.bitmaskclient.providersetup.ProviderAPI.PROVIDER_OK;
+import static se.leap.bitmaskclient.providersetup.ProviderAPI.TOR_EXCEPTION;
+import static se.leap.bitmaskclient.providersetup.ProviderAPI.TOR_TIMEOUT;
+import static se.leap.bitmaskclient.providersetup.ProviderAPI.UPDATE_INVALID_VPN_CERTIFICATE;
+import static se.leap.bitmaskclient.testutils.BackendMockResponses.BackendMockProvider.TestBackendErrorCase.NO_ERROR;
+import static se.leap.bitmaskclient.testutils.BackendMockResponses.BackendMockProvider.TestBackendErrorCase.NO_ERROR_API_V4;
+import static se.leap.bitmaskclient.testutils.MockHelper.mockBuildConfigHelper;
+import static se.leap.bitmaskclient.testutils.MockHelper.mockCertificateHelper;
+import static se.leap.bitmaskclient.testutils.MockHelper.mockClientGenerator;
+import static se.leap.bitmaskclient.testutils.MockHelper.mockContext;
+import static se.leap.bitmaskclient.testutils.MockHelper.mockPreferenceHelper;
+import static se.leap.bitmaskclient.testutils.MockHelper.mockProviderApiConnector;
+import static se.leap.bitmaskclient.testutils.MockHelper.mockPrivateKeyHelper;
+import static se.leap.bitmaskclient.testutils.MockHelper.mockResources;
+import static se.leap.bitmaskclient.testutils.MockHelper.mockResultReceiver;
+import static se.leap.bitmaskclient.testutils.TestSetupHelper.getConfiguredProvider;
+import static se.leap.bitmaskclient.testutils.TestSetupHelper.getConfiguredProviderAPIv4;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.os.Build;
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+
+import org.json.JSONException;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+
+import java.io.IOException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateEncodingException;
+import java.util.concurrent.TimeoutException;
+
+import se.leap.bitmaskclient.base.models.Provider;
+import se.leap.bitmaskclient.base.utils.BuildConfigHelper;
+import se.leap.bitmaskclient.base.utils.CertificateHelper;
+import se.leap.bitmaskclient.base.utils.HandlerProvider;
+import se.leap.bitmaskclient.base.utils.PreferenceHelper;
+import se.leap.bitmaskclient.base.utils.PrivateKeyHelper;
+import se.leap.bitmaskclient.testutils.MockSharedPreferences;
+import se.leap.bitmaskclient.tor.TorStatusObservable;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(sdk = {Build.VERSION_CODES.P})
+public class ProviderApiManagerTest {
+
+ private Resources mockResources;
+ private Context mockContext;
+
+ private ProviderApiManager providerApiManager;
+
+ static class TestProviderApiServiceCallback implements ProviderApiManagerBase.ProviderApiServiceCallback {
+ Throwable startTorServiceException;
+ boolean hasNetworkConnection;
+ boolean torTimeout;
+ TorStatusObservable torStatusObservable;
+
+ TestProviderApiServiceCallback() {
+ this(null, true);
+ }
+ TestProviderApiServiceCallback(@Nullable Throwable startTorServiceException, boolean hasNetworkConnection) {
+ this.startTorServiceException = startTorServiceException;
+ this.hasNetworkConnection = hasNetworkConnection;
+ this.torStatusObservable = TorStatusObservable.getInstance();
+ }
+
+ TestProviderApiServiceCallback(boolean torTimeout, boolean hasNetworkConnection) {
+ this.hasNetworkConnection = hasNetworkConnection;
+ this.torStatusObservable = TorStatusObservable.getInstance();
+ this.torTimeout = torTimeout;
+ }
+
+ @Override
+ public void broadcastEvent(Intent intent) {
+ }
+
+ @Override
+ public boolean startTorService() throws InterruptedException, IllegalStateException {
+ if (startTorServiceException != null) {
+ if (startTorServiceException instanceof InterruptedException) {
+ throw (InterruptedException) startTorServiceException;
+ }
+ if (startTorServiceException instanceof IllegalStateException) {
+ throw (IllegalStateException) startTorServiceException;
+ }
+ }
+ if (!torTimeout) {
+ try {
+ TorStatusObservable.updateState(mockContext(), TorStatusObservable.TorStatus.ON.toString());
+ } catch (PackageManager.NameNotFoundException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public void stopTorService() {
+ }
+
+ @Override
+ public int getTorHttpTunnelPort() {
+ return 8118;
+ }
+
+ @Override
+ public int getTorSocksProxyPort() {
+ return 9050;
+ }
+
+ @Override
+ public boolean hasNetworkConnection() {
+ return hasNetworkConnection;
+ }
+
+ @Override
+ public void saveProvider(Provider p) {
+
+ }
+
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ mockContext = mockContext();
+ mockResources = mockResources(getClass().getClassLoader().getResourceAsStream("error_messages.json"));
+
+ HandlerProvider handlerProvider = new HandlerProvider((r, delay) -> new Thread(r).start());
+ BuildConfigHelper buildConfigHelper = mockBuildConfigHelper(true);
+ TorStatusObservable torStatusObservable = TorStatusObservable.getInstance();
+ TorStatusObservable.setProxyPort(-1);
+ TorStatusObservable.setLastError(null);
+ TorStatusObservable.updateState(mockContext, TorStatusObservable.TorStatus.OFF.toString());
+ }
+
+ @Test
+ public void test_handleIntentSetupProvider_TorBridgesPreferencesEnabledTimeout_TimeoutError() throws IOException, CertificateEncodingException, NoSuchAlgorithmException, TimeoutException, InterruptedException {
+ Provider provider = getConfiguredProviderAPIv4();
+ SharedPreferences sharedPreferences = new MockSharedPreferences();
+ sharedPreferences.edit().putBoolean(USE_BRIDGES, true).putBoolean(USE_SNOWFLAKE, true).commit();
+ PreferenceHelper preferenceHelper = mockPreferenceHelper(provider, sharedPreferences);
+ ProviderApiConnector mockedApiConnector = mockProviderApiConnector(NO_ERROR_API_V4);
+
+ providerApiManager = new ProviderApiManager(mockResources, new ProviderApiManagerTest.TestProviderApiServiceCallback(true, true));
+
+ Bundle expectedResult = new Bundle();
+ expectedResult.putBoolean(BROADCAST_RESULT_KEY, false);
+ expectedResult.putString(ERRORS, "{\"errors\":\"Starting bridges failed. Do you want to retry or continue with an unobfuscated secure connection to configure Bitmask?\",\"errorId\":\"ERROR_TOR_TIMEOUT\",\"initalAction\":\"setUpProvider\"}");
+ expectedResult.putParcelable(PROVIDER_KEY, provider);
+
+ Intent providerApiCommand = new Intent();
+ providerApiCommand.putExtra(PROVIDER_KEY, provider);
+ providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER);
+ providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(TOR_TIMEOUT, expectedResult));
+ providerApiCommand.putExtra(PARAMETERS, new Bundle());
+
+ providerApiManager.handleIntent(providerApiCommand);
+ //providerApiManager.handleAction(SET_UP_PROVIDER, provider, new Bundle(), mockResultReceiver(TOR_TIMEOUT, expectedResult));
+ assertEquals(-1, TorStatusObservable.getProxyPort());
+ }
+
+ @Test
+ public void test_handleIntentSetupProvider_noNetwork_NetworkError() throws IOException, CertificateEncodingException, NoSuchAlgorithmException, JSONException {
+ Provider provider = getConfiguredProvider();
+
+ CertificateHelper certHelper = mockCertificateHelper("a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
+ ProviderApiConnector mockedApiConnector = mockProviderApiConnector(NO_ERROR);
+ providerApiManager = new ProviderApiManager(mockResources, new ProviderApiManagerTest.TestProviderApiServiceCallback(null, false));
+ Bundle expectedResult = new Bundle();
+
+ expectedResult.putBoolean(BROADCAST_RESULT_KEY, false);
+ expectedResult.putString(ERRORS, "{\"errors\":\"Bitmask has no internet connection. Please check your WiFi and cellular data settings.\"}");
+ expectedResult.putParcelable(PROVIDER_KEY, provider);
+
+ Intent providerApiCommand = new Intent();
+
+ providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER);
+ providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(MISSING_NETWORK_CONNECTION, expectedResult));
+ providerApiCommand.putExtra(PROVIDER_KEY, provider);
+ providerApiCommand.putExtra(PARAMETERS, new Bundle());
+ providerApiManager.handleIntent(providerApiCommand);
+ }
+
+
+ @Test
+ public void test_handleIntentSetupProvider_TorBridgesPreferenceEnabled_Success() throws IOException, CertificateEncodingException, NoSuchAlgorithmException, TimeoutException, InterruptedException {
+ Provider provider = getConfiguredProviderAPIv4();
+
+ SharedPreferences sharedPreferences = new MockSharedPreferences();
+ sharedPreferences.edit().putBoolean(USE_BRIDGES, true).putBoolean(USE_SNOWFLAKE, true).commit();
+ PreferenceHelper preferenceHelper = mockPreferenceHelper(provider, sharedPreferences);
+ CertificateHelper certHelper = mockCertificateHelper(" a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
+ ProviderApiConnector mockedApiConnector = mockProviderApiConnector(NO_ERROR_API_V4);
+
+ providerApiManager = new ProviderApiManager(mockResources, new ProviderApiManagerTest.TestProviderApiServiceCallback());
+
+ Intent providerApiCommand = new Intent();
+ providerApiCommand.putExtra(PROVIDER_KEY, provider);
+ providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER);
+ providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(PROVIDER_OK));
+ providerApiCommand.putExtra(PARAMETERS, new Bundle());
+
+ providerApiManager.handleIntent(providerApiCommand);
+ assertEquals(8118, TorStatusObservable.getProxyPort());
+ }
+
+
+ @Test
+ public void test_handleIntentUpdateVPNCertificate_TorBridgesPreferencesTrue_TorStartedAndSuccess() throws IOException, CertificateEncodingException, NoSuchAlgorithmException, TimeoutException, InterruptedException {
+ Provider provider = getConfiguredProviderAPIv4();
+
+ SharedPreferences sharedPreferences = new MockSharedPreferences();
+ sharedPreferences.edit().putBoolean(USE_BRIDGES, true).putBoolean(USE_SNOWFLAKE, true).commit();
+ PreferenceHelper preferenceHelper = mockPreferenceHelper(provider, sharedPreferences);
+ CertificateHelper certHelper = mockCertificateHelper(" a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
+ PrivateKeyHelper privateKeyHelper = mockPrivateKeyHelper();
+ ProviderApiConnector mockedApiConnector = mockProviderApiConnector(NO_ERROR_API_V4);
+
+ providerApiManager = new ProviderApiManager(mockResources, new ProviderApiManagerTest.TestProviderApiServiceCallback());
+
+ Intent providerApiCommand = new Intent();
+ providerApiCommand.putExtra(PROVIDER_KEY, provider);
+ providerApiCommand.setAction(UPDATE_INVALID_VPN_CERTIFICATE);
+ providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(CORRECTLY_UPDATED_INVALID_VPN_CERTIFICATE));
+ providerApiCommand.putExtra(PARAMETERS, new Bundle());
+
+ providerApiManager.handleIntent(providerApiCommand);
+ assertNotEquals(-1, TorStatusObservable.getProxyPort());
+ }
+
+ @Test
+ public void test_handleIntentUpdateVPNCertificate_TorBridgesPreferencesTrue_TorException_Failure() throws IOException, CertificateEncodingException, NoSuchAlgorithmException, TimeoutException, InterruptedException {
+ Provider provider = getConfiguredProviderAPIv4();
+
+ SharedPreferences sharedPreferences = new MockSharedPreferences();
+ sharedPreferences.edit().putBoolean(USE_BRIDGES, true).putBoolean(USE_SNOWFLAKE, true).commit();
+ PreferenceHelper preferenceHelper = mockPreferenceHelper(provider, sharedPreferences);
+ CertificateHelper certHelper = mockCertificateHelper(" a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
+ ProviderApiConnector mockedApiConnector = mockProviderApiConnector(NO_ERROR_API_V4);
+
+ providerApiManager = new ProviderApiManager(mockResources, new ProviderApiManagerTest.TestProviderApiServiceCallback(new IllegalStateException("Nothing works always."), true));
+
+ Bundle expectedResult = new Bundle();
+ expectedResult.putBoolean(BROADCAST_RESULT_KEY, false);
+ expectedResult.putString(ERRORS, "{\"initalAction\":\"ProviderAPI.UPDATE_INVALID_VPN_CERTIFICATE\"}");
+ expectedResult.putParcelable(PROVIDER_KEY, provider);
+
+ Intent providerApiCommand = new Intent();
+ providerApiCommand.putExtra(PROVIDER_KEY, provider);
+ providerApiCommand.setAction(UPDATE_INVALID_VPN_CERTIFICATE);
+ providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(TOR_EXCEPTION, expectedResult));
+ providerApiCommand.putExtra(PARAMETERS, new Bundle());
+
+ providerApiManager.handleIntent(providerApiCommand);
+ assertEquals(-1, TorStatusObservable.getProxyPort());
+ }
+} \ No newline at end of file
diff --git a/app/src/test/java/se/leap/bitmaskclient/eip/ProviderApiManagerTest.java b/app/src/test/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerV3Test.java
index e78db39c..5751d1c5 100644
--- a/app/src/test/java/se/leap/bitmaskclient/eip/ProviderApiManagerTest.java
+++ b/app/src/test/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerV3Test.java
@@ -15,7 +15,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-package se.leap.bitmaskclient.eip;
+package se.leap.bitmaskclient.providersetup;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
@@ -26,15 +26,14 @@ import static se.leap.bitmaskclient.base.models.Constants.USE_BRIDGES;
import static se.leap.bitmaskclient.base.models.Constants.USE_SNOWFLAKE;
import static se.leap.bitmaskclient.providersetup.ProviderAPI.CORRECTLY_DOWNLOADED_GEOIP_JSON;
import static se.leap.bitmaskclient.providersetup.ProviderAPI.CORRECTLY_UPDATED_INVALID_VPN_CERTIFICATE;
+import static se.leap.bitmaskclient.providersetup.ProviderAPI.DOWNLOAD_GEOIP_JSON;
import static se.leap.bitmaskclient.providersetup.ProviderAPI.ERRORS;
import static se.leap.bitmaskclient.providersetup.ProviderAPI.INCORRECTLY_DOWNLOADED_GEOIP_JSON;
import static se.leap.bitmaskclient.providersetup.ProviderAPI.INCORRECTLY_UPDATED_INVALID_VPN_CERTIFICATE;
-import static se.leap.bitmaskclient.providersetup.ProviderAPI.MISSING_NETWORK_CONNECTION;
-import static se.leap.bitmaskclient.providersetup.ProviderAPI.PARAMETERS;
import static se.leap.bitmaskclient.providersetup.ProviderAPI.PROVIDER_NOK;
import static se.leap.bitmaskclient.providersetup.ProviderAPI.PROVIDER_OK;
-import static se.leap.bitmaskclient.providersetup.ProviderAPI.TOR_EXCEPTION;
-import static se.leap.bitmaskclient.providersetup.ProviderAPI.TOR_TIMEOUT;
+import static se.leap.bitmaskclient.providersetup.ProviderAPI.SET_UP_PROVIDER;
+import static se.leap.bitmaskclient.providersetup.ProviderAPI.UPDATE_INVALID_VPN_CERTIFICATE;
import static se.leap.bitmaskclient.testutils.BackendMockResponses.BackendMockProvider.TestBackendErrorCase.ERROR_CASE_FETCH_EIP_SERVICE_CERTIFICATE_INVALID;
import static se.leap.bitmaskclient.testutils.BackendMockResponses.BackendMockProvider.TestBackendErrorCase.ERROR_CASE_MICONFIGURED_PROVIDER;
import static se.leap.bitmaskclient.testutils.BackendMockResponses.BackendMockProvider.TestBackendErrorCase.ERROR_CASE_UPDATED_CERTIFICATE;
@@ -48,8 +47,8 @@ import static se.leap.bitmaskclient.testutils.MockHelper.mockCertificateHelper;
import static se.leap.bitmaskclient.testutils.MockHelper.mockClientGenerator;
import static se.leap.bitmaskclient.testutils.MockHelper.mockContext;
import static se.leap.bitmaskclient.testutils.MockHelper.mockPreferenceHelper;
+import static se.leap.bitmaskclient.testutils.MockHelper.mockPrivateKeyHelper;
import static se.leap.bitmaskclient.testutils.MockHelper.mockProviderApiConnector;
-import static se.leap.bitmaskclient.testutils.MockHelper.mockRSAHelper;
import static se.leap.bitmaskclient.testutils.MockHelper.mockResources;
import static se.leap.bitmaskclient.testutils.MockHelper.mockResultReceiver;
import static se.leap.bitmaskclient.testutils.TestSetupHelper.getConfiguredProvider;
@@ -61,6 +60,7 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.res.Resources;
+import android.os.Build;
import android.os.Bundle;
import androidx.annotation.Nullable;
@@ -69,23 +69,21 @@ import org.json.JSONException;
import org.json.JSONObject;
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateEncodingException;
import java.util.concurrent.TimeoutException;
-import se.leap.bitmaskclient.BuildConfig;
import se.leap.bitmaskclient.base.models.Provider;
import se.leap.bitmaskclient.base.utils.BuildConfigHelper;
import se.leap.bitmaskclient.base.utils.CertificateHelper;
import se.leap.bitmaskclient.base.utils.HandlerProvider;
import se.leap.bitmaskclient.base.utils.PreferenceHelper;
-import se.leap.bitmaskclient.base.utils.RSAHelper;
-import se.leap.bitmaskclient.providersetup.ProviderAPI;
-import se.leap.bitmaskclient.providersetup.ProviderApiConnector;
-import se.leap.bitmaskclient.providersetup.ProviderApiManager;
-import se.leap.bitmaskclient.providersetup.ProviderApiManagerBase;
+import se.leap.bitmaskclient.base.utils.PrivateKeyHelper;
import se.leap.bitmaskclient.testutils.MockSharedPreferences;
import se.leap.bitmaskclient.tor.TorStatusObservable;
@@ -93,13 +91,14 @@ import se.leap.bitmaskclient.tor.TorStatusObservable;
/**
* Created by cyberta on 04.01.18.
*/
-
-public class ProviderApiManagerTest {
+@RunWith(RobolectricTestRunner.class)
+@Config(sdk = {Build.VERSION_CODES.P})
+public class ProviderApiManagerV3Test {
private Resources mockResources;
private Context mockContext;
- private ProviderApiManager providerApiManager;
+ private ProviderApiManagerV3 providerApiManager;
static class TestProviderApiServiceCallback implements ProviderApiManagerBase.ProviderApiServiceCallback {
Throwable startTorServiceException;
@@ -156,6 +155,11 @@ public class ProviderApiManagerTest {
}
@Override
+ public int getTorSocksProxyPort() {
+ return 9050;
+ }
+
+ @Override
public boolean hasNetworkConnection() {
return hasNetworkConnection;
}
@@ -171,8 +175,9 @@ public class ProviderApiManagerTest {
public void setUp() throws Exception {
mockContext = mockContext();
mockResources = mockResources(getClass().getClassLoader().getResourceAsStream("error_messages.json"));
+
HandlerProvider handlerProvider = new HandlerProvider((r, delay) -> new Thread(r).start());
- BuildConfigHelper buildConfigHelper = mockBuildConfigHelper(true, true);
+ BuildConfigHelper buildConfigHelper = mockBuildConfigHelper(true);
TorStatusObservable torStatusObservable = TorStatusObservable.getInstance();
TorStatusObservable.setProxyPort(-1);
TorStatusObservable.setLastError(null);
@@ -183,20 +188,14 @@ public class ProviderApiManagerTest {
public void test_handleIntentSetupProvider_noProviderMainURL() throws IOException, JSONException {
Provider provider = new Provider("");
PreferenceHelper preferenceHelper = mockPreferenceHelper(provider);
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
Bundle expectedResult = new Bundle();
expectedResult.putBoolean(BROADCAST_RESULT_KEY, false);
expectedResult.putString(ERRORS, "{\"errors\":\"It doesn't seem to be a Bitmask provider.\"}");
expectedResult.putParcelable(PROVIDER_KEY, provider);
- Intent providerApiCommand = new Intent();
- providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(PROVIDER_NOK, expectedResult));
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
-
- providerApiManager.handleIntent(providerApiCommand);
+ providerApiManager.handleAction(SET_UP_PROVIDER, provider, new Bundle(), mockResultReceiver(PROVIDER_NOK, expectedResult));
}
@Test
@@ -206,17 +205,12 @@ public class ProviderApiManagerTest {
CertificateHelper certHelper = mockCertificateHelper(" a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
ProviderApiConnector providerApiConnector = mockProviderApiConnector(NO_ERROR);
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
Bundle expectedResult = new Bundle();
expectedResult.putBoolean(BROADCAST_RESULT_KEY, true);
expectedResult.putParcelable(PROVIDER_KEY, provider);
- Intent providerApiCommand = new Intent();
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
- providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(PROVIDER_OK, expectedResult));
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
- providerApiManager.handleIntent(providerApiCommand);
+ providerApiManager.handleAction(SET_UP_PROVIDER, provider, new Bundle(), mockResultReceiver(PROVIDER_OK, expectedResult));
}
@Test
@@ -226,20 +220,13 @@ public class ProviderApiManagerTest {
CertificateHelper certHelper = mockCertificateHelper("a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
ProviderApiConnector mockedApiConnector = mockProviderApiConnector(NO_ERROR);
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
Bundle expectedResult = new Bundle();
expectedResult.putBoolean(BROADCAST_RESULT_KEY, true);
expectedResult.putParcelable(PROVIDER_KEY, provider);
- Intent providerApiCommand = new Intent();
-
- providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(PROVIDER_OK, expectedResult));
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
-
- providerApiManager.handleIntent(providerApiCommand);
+ providerApiManager.handleAction(SET_UP_PROVIDER, provider, new Bundle(), mockResultReceiver(PROVIDER_OK, expectedResult));
}
@Test
@@ -249,19 +236,13 @@ public class ProviderApiManagerTest {
CertificateHelper certHelper = mockCertificateHelper("a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
ProviderApiConnector mockedApiConnector = mockProviderApiConnector(NO_ERROR);
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
Bundle expectedResult = new Bundle();
expectedResult.putBoolean(BROADCAST_RESULT_KEY, true);
expectedResult.putParcelable(PROVIDER_KEY, provider);
- Intent providerApiCommand = new Intent();
- providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(PROVIDER_OK, expectedResult));
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
-
- providerApiManager.handleIntent(providerApiCommand);
+ providerApiManager.handleAction(SET_UP_PROVIDER, provider, new Bundle(), mockResultReceiver(PROVIDER_OK, expectedResult));
}
@Test
@@ -271,19 +252,13 @@ public class ProviderApiManagerTest {
PreferenceHelper preferenceHelper = mockPreferenceHelper(provider);
CertificateHelper certHelper = mockCertificateHelper(" a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29495");
ProviderApiConnector mockedApiConnector = mockProviderApiConnector(NO_ERROR);
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
Bundle expectedResult = new Bundle();
expectedResult.putBoolean(BROADCAST_RESULT_KEY, false);
- expectedResult.putString(ERRORS, "{\"errorId\":\"ERROR_CERTIFICATE_PINNING\",\"errors\":\"Stored provider certificate is invalid. You can either update Bitmask (recommended) or update the provider certificate using a commercial CA certificate.\"}");
+ expectedResult.putString(ERRORS, "{\"errors\":\"Stored provider certificate is invalid. You can either update Bitmask (recommended) or update the provider certificate using a commercial CA certificate.\",\"errorId\":\"ERROR_CERTIFICATE_PINNING\"}");
expectedResult.putParcelable(PROVIDER_KEY, provider);
- Intent providerApiCommand = new Intent();
- providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(PROVIDER_NOK, expectedResult));
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
-
- providerApiManager.handleIntent(providerApiCommand);
+ providerApiManager.handleAction(SET_UP_PROVIDER, provider, new Bundle(), mockResultReceiver(PROVIDER_NOK, expectedResult));
}
@Test
@@ -293,20 +268,14 @@ public class ProviderApiManagerTest {
CertificateHelper certHelper = mockCertificateHelper("a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29495");
ProviderApiConnector mockedApiConnector = mockProviderApiConnector(NO_ERROR);
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
Bundle expectedResult = new Bundle();
expectedResult.putBoolean(BROADCAST_RESULT_KEY, false);
- expectedResult.putString(ERRORS, "{\"errorId\":\"ERROR_CERTIFICATE_PINNING\",\"errors\":\"Stored provider certificate is invalid. You can either update Bitmask (recommended) or update the provider certificate using a commercial CA certificate.\"}");
+ expectedResult.putString(ERRORS, "{\"errors\":\"Stored provider certificate is invalid. You can either update Bitmask (recommended) or update the provider certificate using a commercial CA certificate.\",\"errorId\":\"ERROR_CERTIFICATE_PINNING\"}");
expectedResult.putParcelable(PROVIDER_KEY, provider);
- Intent providerApiCommand = new Intent();
- providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(PROVIDER_NOK, expectedResult));
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
-
- providerApiManager.handleIntent(providerApiCommand);
+ providerApiManager.handleAction(SET_UP_PROVIDER, provider, new Bundle(), mockResultReceiver(PROVIDER_NOK, expectedResult));
}
@Test
@@ -316,20 +285,14 @@ public class ProviderApiManagerTest {
CertificateHelper certHelper = mockCertificateHelper("a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29495");
ProviderApiConnector mockedApiConnector = mockProviderApiConnector(NO_ERROR);
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
Bundle expectedResult = new Bundle();
expectedResult.putBoolean(BROADCAST_RESULT_KEY, false);
- expectedResult.putString(ERRORS, "{\"errorId\":\"ERROR_CERTIFICATE_PINNING\",\"errors\":\"Stored provider certificate is invalid. You can either update Bitmask (recommended) or update the provider certificate using a commercial CA certificate.\"}");
+ expectedResult.putString(ERRORS, "{\"errors\":\"Stored provider certificate is invalid. You can either update Bitmask (recommended) or update the provider certificate using a commercial CA certificate.\",\"errorId\":\"ERROR_CERTIFICATE_PINNING\"}");
expectedResult.putParcelable(PROVIDER_KEY, provider);
- Intent providerApiCommand = new Intent();
- providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(PROVIDER_NOK, expectedResult));
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
-
- providerApiManager.handleIntent(providerApiCommand);
+ providerApiManager.handleAction(SET_UP_PROVIDER, provider, new Bundle(), mockResultReceiver(PROVIDER_NOK, expectedResult));
}
@@ -339,20 +302,14 @@ public class ProviderApiManagerTest {
PreferenceHelper preferenceHelper = mockPreferenceHelper(provider);
ProviderApiConnector mockedApiConnector = mockProviderApiConnector(NO_ERROR);
CertificateHelper certHelper = mockCertificateHelper("a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
Bundle expectedResult = new Bundle();
expectedResult.putBoolean(BROADCAST_RESULT_KEY, false);
- expectedResult.putString(ERRORS, "{\"errorId\":\"ERROR_INVALID_CERTIFICATE\",\"errors\":\"Stored provider certificate is expired. You can either update Bitmask (recommended) or update the provider certificate using a commercial CA certificate.\"}");
+ expectedResult.putString(ERRORS, "{\"errors\":\"Stored provider certificate is expired. You can either update Bitmask (recommended) or update the provider certificate using a commercial CA certificate.\",\"errorId\":\"ERROR_INVALID_CERTIFICATE\"}");
expectedResult.putParcelable(PROVIDER_KEY, provider);
- Intent providerApiCommand = new Intent();
- providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(PROVIDER_NOK, expectedResult));
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
-
- providerApiManager.handleIntent(providerApiCommand);
+ providerApiManager.handleAction(SET_UP_PROVIDER, provider, new Bundle(), mockResultReceiver(PROVIDER_NOK, expectedResult));
}
@Test
@@ -362,20 +319,14 @@ public class ProviderApiManagerTest {
PreferenceHelper.getEipDefinitionFromPreferences();
ProviderApiConnector mockedApiConnector = mockProviderApiConnector(NO_ERROR);
CertificateHelper certHelper = mockCertificateHelper("a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
Bundle expectedResult = new Bundle();
expectedResult.putBoolean(BROADCAST_RESULT_KEY, false);
- expectedResult.putString(ERRORS, "{\"errorId\":\"ERROR_INVALID_CERTIFICATE\",\"errors\":\"Stored provider certificate is expired. You can either update Bitmask (recommended) or update the provider certificate using a commercial CA certificate.\"}");
+ expectedResult.putString(ERRORS, "{\"errors\":\"Stored provider certificate is expired. You can either update Bitmask (recommended) or update the provider certificate using a commercial CA certificate.\",\"errorId\":\"ERROR_INVALID_CERTIFICATE\"}");
expectedResult.putParcelable(PROVIDER_KEY, provider);
- Intent providerApiCommand = new Intent();
- providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(PROVIDER_NOK, expectedResult));
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
-
- providerApiManager.handleIntent(providerApiCommand);
+ providerApiManager.handleAction(SET_UP_PROVIDER, provider, new Bundle(), mockResultReceiver(PROVIDER_NOK, expectedResult));
}
@Test
@@ -385,99 +336,70 @@ public class ProviderApiManagerTest {
CertificateHelper certHelper = mockCertificateHelper("a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
ProviderApiConnector mockedApiConnector = mockProviderApiConnector(ERROR_CASE_UPDATED_CERTIFICATE);
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
Bundle expectedResult = new Bundle();
expectedResult.putBoolean(BROADCAST_RESULT_KEY, false);
- expectedResult.putString(ERRORS, "{\"errorId\":\"ERROR_INVALID_CERTIFICATE\",\"errors\":\"Stored provider certificate is invalid. You can either update Bitmask (recommended) or update the provider certificate using a commercial CA certificate.\"}");
+ expectedResult.putString(ERRORS, "{\"errors\":\"Stored provider certificate is invalid. You can either update Bitmask (recommended) or update the provider certificate using a commercial CA certificate.\",\"errorId\":\"ERROR_INVALID_CERTIFICATE\"}");
expectedResult.putParcelable(PROVIDER_KEY, provider);
Intent providerApiCommand = new Intent();
- providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(PROVIDER_NOK, expectedResult));
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
-
- providerApiManager.handleIntent(providerApiCommand);
+ providerApiManager.handleAction(SET_UP_PROVIDER, provider, new Bundle(), mockResultReceiver(PROVIDER_NOK, expectedResult));
}
@Test
public void test_handleIntentSetupProvider_storedProviderAndCAFromPreviousSetup_ValidCertificateButUpdatedCertificateOnServerSide() throws IOException, CertificateEncodingException, NoSuchAlgorithmException, JSONException {
- Provider provider = new Provider("https://riseup.net");
- PreferenceHelper preferenceHelper = mockPreferenceHelper(getConfiguredProvider());
+ Provider provider = getConfiguredProvider();
+ PreferenceHelper preferenceHelper = mockPreferenceHelper(provider);
CertificateHelper certHelper = mockCertificateHelper("a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
ProviderApiConnector mockedApiConnector = mockProviderApiConnector(ERROR_CASE_UPDATED_CERTIFICATE);
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
Bundle expectedResult = new Bundle();
expectedResult.putBoolean(BROADCAST_RESULT_KEY, false);
- expectedResult.putString(ERRORS, "{\"errorId\":\"ERROR_INVALID_CERTIFICATE\",\"errors\":\"Stored provider certificate is invalid. You can either update Bitmask (recommended) or update the provider certificate using a commercial CA certificate.\"}");
+ expectedResult.putString(ERRORS, "{\"errors\":\"Stored provider certificate is invalid. You can either update Bitmask (recommended) or update the provider certificate using a commercial CA certificate.\",\"errorId\":\"ERROR_INVALID_CERTIFICATE\"}");
expectedResult.putParcelable(PROVIDER_KEY, provider);
- Intent providerApiCommand = new Intent();
-
- providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(PROVIDER_NOK, expectedResult));
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
-
- providerApiManager.handleIntent(providerApiCommand);
+ providerApiManager.handleAction(SET_UP_PROVIDER, provider, new Bundle(), mockResultReceiver(PROVIDER_NOK, expectedResult));
}
@Test
public void test_handleIntentSetupProvider_preseededProviderAndCA_failedConfiguration() throws IOException, CertificateEncodingException, NoSuchAlgorithmException, JSONException {
- Provider provider = getConfiguredProvider();
+ Provider provider = getProvider(null, null, null, null, null, "riseup_net_invalid_config.json", null, null);
PreferenceHelper preferenceHelper = mockPreferenceHelper(provider);
CertificateHelper certHelper = mockCertificateHelper("a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
- ProviderApiConnector mockedApiConnector = mockProviderApiConnector(ERROR_CASE_MICONFIGURED_PROVIDER);
+ ProviderApiConnector mockedApiConnector = mockProviderApiConnector(NO_ERROR);
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
Bundle expectedResult = new Bundle();
expectedResult.putBoolean(BROADCAST_RESULT_KEY, false);
expectedResult.putString(ERRORS, "{\"errors\":\"There was an error configuring Bitmask with your chosen provider.\"}");
expectedResult.putParcelable(PROVIDER_KEY, provider);
- Intent providerApiCommand = new Intent();
-
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
- providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(PROVIDER_NOK, expectedResult));
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
-
- providerApiManager.handleIntent(providerApiCommand);
+ providerApiManager.handleAction(SET_UP_PROVIDER, provider, new Bundle(), mockResultReceiver(PROVIDER_NOK, expectedResult));
}
@Test
public void test_handleIntentSetupProvider_preseededCustomProviderAndCA_failedConfiguration() throws IOException, CertificateEncodingException, NoSuchAlgorithmException, JSONException {
- if ("insecure".equals(BuildConfig.FLAVOR_implementation )) {
- return;
- }
- Provider provider = getConfiguredProvider();
- PreferenceHelper preferenceHelper = mockPreferenceHelper(provider);
+ Provider provider = new Provider("riseup.net");
+ PreferenceHelper preferenceHelper = new PreferenceHelper(new MockSharedPreferences());
ProviderApiConnector mockedApiConnector = mockProviderApiConnector(ERROR_CASE_MICONFIGURED_PROVIDER);
CertificateHelper certHelper = mockCertificateHelper("a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
- BuildConfigHelper buildConfigHelper = mockBuildConfigHelper(true, false);
+ BuildConfigHelper buildConfigHelper = mockBuildConfigHelper(false);
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
Bundle expectedResult = new Bundle();
expectedResult.putBoolean(BROADCAST_RESULT_KEY, false);
expectedResult.putString(ERRORS, "{\"errors\":\"There was an error configuring RiseupVPN.\"}");
expectedResult.putParcelable(PROVIDER_KEY, provider);
- Intent providerApiCommand = new Intent();
-
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
- providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(PROVIDER_NOK, expectedResult));
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
-
- providerApiManager.handleIntent(providerApiCommand);
+ providerApiManager.handleAction(SET_UP_PROVIDER, provider, new Bundle(), mockResultReceiver(PROVIDER_NOK, expectedResult));
}
@Test
@@ -488,88 +410,56 @@ public class ProviderApiManagerTest {
CertificateHelper certHelper = mockCertificateHelper(" a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
ProviderApiConnector mockedApiConnector = mockProviderApiConnector(NO_ERROR);
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
Bundle expectedResult = new Bundle();
expectedResult.putBoolean(BROADCAST_RESULT_KEY, true);
expectedResult.putParcelable(PROVIDER_KEY, provider);
- Intent providerApiCommand = new Intent();
-
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
- providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(PROVIDER_OK, expectedResult));
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
-
- providerApiManager.handleIntent(providerApiCommand);
+ providerApiManager.handleAction(SET_UP_PROVIDER, provider, new Bundle(), mockResultReceiver(PROVIDER_OK, expectedResult));
}
@Test
public void test_handleIntentSetupProvider_failingEipServiceFetch_failedConfiguration() throws IOException, NoSuchAlgorithmException, CertificateEncodingException {
- if ("insecure".equals(BuildConfig.FLAVOR_implementation )) {
- return;
- }
-
Provider provider = new Provider("https://riseup.net");
PreferenceHelper preferenceHelper = mockPreferenceHelper(provider);
CertificateHelper certHelper = mockCertificateHelper("a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
ProviderApiConnector mockedApiConnector = mockProviderApiConnector(ERROR_CASE_FETCH_EIP_SERVICE_CERTIFICATE_INVALID);
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
Bundle expectedResult = new Bundle();
expectedResult.putBoolean(BROADCAST_RESULT_KEY, false);
expectedResult.putParcelable(PROVIDER_KEY, provider);
expectedResult.putString(ERRORS, "This is not a trusted Bitmask provider.");
- Intent providerApiCommand = new Intent();
- providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(PROVIDER_NOK, expectedResult));
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
-
- providerApiManager.handleIntent(providerApiCommand);
+ providerApiManager.handleAction(SET_UP_PROVIDER, provider, new Bundle(), mockResultReceiver(PROVIDER_NOK, expectedResult));
}
@Test
public void test_handleIntentGetGeoip_happyPath() throws IOException, NoSuchAlgorithmException, CertificateEncodingException, JSONException {
- if ("insecure".equals(BuildConfig.FLAVOR_implementation )) {
- return;
- }
-
- Provider inputProvider = getConfiguredProvider();
- inputProvider.setGeoIpJson(new JSONObject());
- PreferenceHelper preferenceHelper = mockPreferenceHelper(inputProvider);
+ Provider provider = getConfiguredProvider();
+ provider.setGeoIpJson(new JSONObject());
+ PreferenceHelper preferenceHelper = mockPreferenceHelper(provider);
Provider expectedProvider = getConfiguredProvider();
CertificateHelper certHelper = mockCertificateHelper("a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
ProviderApiConnector mockedApiConnector = mockProviderApiConnector(NO_ERROR);
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
Bundle expectedResult = new Bundle();
expectedResult.putBoolean(EIP_ACTION_START, true);
expectedResult.putBoolean(BROADCAST_RESULT_KEY, true);
expectedResult.putParcelable(PROVIDER_KEY, expectedProvider);
- Intent providerApiCommand = new Intent();
-
- providerApiCommand.setAction(ProviderAPI.DOWNLOAD_GEOIP_JSON);
Bundle extrasBundle = new Bundle();
extrasBundle.putBoolean(EIP_ACTION_START, true);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(CORRECTLY_DOWNLOADED_GEOIP_JSON, expectedResult));
- providerApiCommand.putExtra(PROVIDER_KEY, inputProvider);
- providerApiCommand.putExtra(PARAMETERS, extrasBundle);
-
- providerApiManager.handleIntent(providerApiCommand);
+ providerApiManager.handleAction(DOWNLOAD_GEOIP_JSON, provider, extrasBundle, mockResultReceiver(CORRECTLY_DOWNLOADED_GEOIP_JSON, expectedResult));
}
@Test
public void test_handleIntentGetGeoip_serviceDown_failToDownload() throws IOException, NoSuchAlgorithmException, CertificateEncodingException, JSONException {
- if ("insecure".equals(BuildConfig.FLAVOR_implementation)) {
- return;
- }
-
Provider provider = getConfiguredProvider();
SharedPreferences mockSharedPref = new MockSharedPreferences();
mockSharedPref.edit().
@@ -578,53 +468,35 @@ public class ProviderApiManagerTest {
PreferenceHelper preferenceHelper = mockPreferenceHelper(provider, mockSharedPref);
CertificateHelper certHelper = mockCertificateHelper("a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
ProviderApiConnector mockedApiConnector = mockProviderApiConnector(ERROR_GEOIP_SERVICE_IS_DOWN);
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
Bundle expectedResult = new Bundle();
expectedResult.putBoolean(EIP_ACTION_START, true);
expectedResult.putBoolean(BROADCAST_RESULT_KEY, false);
expectedResult.putParcelable(PROVIDER_KEY, provider);
- Intent providerApiCommand = new Intent();
-
- providerApiCommand.setAction(ProviderAPI.DOWNLOAD_GEOIP_JSON);
Bundle extrasBundle = new Bundle();
extrasBundle.putBoolean(EIP_ACTION_START, true);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(INCORRECTLY_DOWNLOADED_GEOIP_JSON, expectedResult));
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
- providerApiCommand.putExtra(PARAMETERS, extrasBundle);
-
- providerApiManager.handleIntent(providerApiCommand);
-
+ providerApiManager.handleAction(DOWNLOAD_GEOIP_JSON, provider, extrasBundle, mockResultReceiver(INCORRECTLY_DOWNLOADED_GEOIP_JSON, expectedResult));
}
@Test
public void test_handleIntentGetGeoip_serviceDown_torNotStarted() throws IOException, NoSuchAlgorithmException, CertificateEncodingException, JSONException, TimeoutException, InterruptedException {
- if ("insecure".equals(BuildConfig.FLAVOR_implementation)) {
- return;
- }
-
Provider provider = getConfiguredProvider();
PreferenceHelper preferenceHelper = mockPreferenceHelper(provider);
CertificateHelper certHelper = mockCertificateHelper("a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
ProviderApiConnector mockedApiConnector = mockProviderApiConnector(ERROR_GEOIP_SERVICE_IS_DOWN_TOR_FALLBACK);
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
Bundle expectedResult = new Bundle();
expectedResult.putBoolean(EIP_ACTION_START, true);
expectedResult.putBoolean(BROADCAST_RESULT_KEY, false);
expectedResult.putParcelable(PROVIDER_KEY, provider);
- Intent providerApiCommand = new Intent();
-
- providerApiCommand.setAction(ProviderAPI.DOWNLOAD_GEOIP_JSON);
Bundle extrasBundle = new Bundle();
extrasBundle.putBoolean(EIP_ACTION_START, true);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(INCORRECTLY_DOWNLOADED_GEOIP_JSON, expectedResult));
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
- providerApiCommand.putExtra(PARAMETERS, extrasBundle);
-
- providerApiManager.handleIntent(providerApiCommand);
+ providerApiManager.handleAction(DOWNLOAD_GEOIP_JSON, provider, extrasBundle, mockResultReceiver(INCORRECTLY_DOWNLOADED_GEOIP_JSON, expectedResult));
+
// also assert that Tor was not allowed to start
assertEquals(-1, TorStatusObservable.getProxyPort());
@@ -632,39 +504,26 @@ public class ProviderApiManagerTest {
@Test
public void test_handleIntentGetGeoip_didNotReachTimeoutToFetchNew_returnsFailure() throws IOException, NoSuchAlgorithmException, CertificateEncodingException, JSONException {
- if ("insecure".equals(BuildConfig.FLAVOR_implementation)) {
- return;
- }
-
Provider provider = getConfiguredProvider();
provider.setLastGeoIpUpdate(System.currentTimeMillis());
PreferenceHelper preferenceHelper = mockPreferenceHelper(provider);
CertificateHelper certHelper = mockCertificateHelper("a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
ProviderApiConnector mockedApiConnector = mockProviderApiConnector(NO_ERROR);
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
Bundle expectedResult = new Bundle();
expectedResult.putBoolean(EIP_ACTION_START, true);
expectedResult.putBoolean(BROADCAST_RESULT_KEY, false);
expectedResult.putParcelable(PROVIDER_KEY, provider);
- Intent providerApiCommand = new Intent();
-
- providerApiCommand.setAction(ProviderAPI.DOWNLOAD_GEOIP_JSON);
Bundle extrasBundle = new Bundle();
extrasBundle.putBoolean(EIP_ACTION_START, true);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(INCORRECTLY_DOWNLOADED_GEOIP_JSON, expectedResult));
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
- providerApiCommand.putExtra(PARAMETERS, extrasBundle);
-
- providerApiManager.handleIntent(providerApiCommand);
+ providerApiManager.handleAction(DOWNLOAD_GEOIP_JSON, provider, extrasBundle, mockResultReceiver(INCORRECTLY_DOWNLOADED_GEOIP_JSON, expectedResult));
+
}
@Test
public void test_handleIntentGetGeoip_noGeoipServiceURLDefined_returnsFailure() throws IOException, NoSuchAlgorithmException, CertificateEncodingException, JSONException {
- if ("insecure".equals(BuildConfig.FLAVOR_implementation)) {
- return;
- }
Provider provider = getConfiguredProvider();
provider.setGeoipUrl(null);
@@ -672,23 +531,14 @@ public class ProviderApiManagerTest {
PreferenceHelper preferenceHelper = mockPreferenceHelper(provider);
CertificateHelper certHelper = mockCertificateHelper("a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
ProviderApiConnector mockedApiConnector = mockProviderApiConnector(NO_ERROR);
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
Bundle expectedResult = new Bundle();
expectedResult.putBoolean(EIP_ACTION_START, true);
expectedResult.putBoolean(BROADCAST_RESULT_KEY, false);
expectedResult.putParcelable(PROVIDER_KEY, provider);
- Intent providerApiCommand = new Intent();
-
- providerApiCommand.setAction(ProviderAPI.DOWNLOAD_GEOIP_JSON);
- Bundle extrasBundle = new Bundle();
- extrasBundle.putBoolean(EIP_ACTION_START, true);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(INCORRECTLY_DOWNLOADED_GEOIP_JSON, expectedResult));
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
- providerApiCommand.putExtra(PARAMETERS, extrasBundle);
-
- providerApiManager.handleIntent(providerApiCommand);
+ providerApiManager.handleAction(DOWNLOAD_GEOIP_JSON, provider, new Bundle(), mockResultReceiver(CORRECTLY_DOWNLOADED_GEOIP_JSON, expectedResult));
}
@Test
@@ -698,36 +548,24 @@ public class ProviderApiManagerTest {
CertificateHelper certHelper = mockCertificateHelper(" a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
ProviderApiConnector mockedApiConnector = mockProviderApiConnector(NO_ERROR_API_V4);
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
Bundle expectedResult = new Bundle();
expectedResult.putBoolean(BROADCAST_RESULT_KEY, true);
expectedResult.putParcelable(PROVIDER_KEY, provider);
- Intent providerApiCommand = new Intent();
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
- providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(PROVIDER_OK, expectedResult));
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
-
- providerApiManager.handleIntent(providerApiCommand);
+ providerApiManager.handleAction(SET_UP_PROVIDER, provider, new Bundle(), mockResultReceiver(PROVIDER_OK, expectedResult));
}
@Test
public void test_handleIntentSetupProvider_TorFallback_SecondTryHappyPath() throws IOException, CertificateEncodingException, NoSuchAlgorithmException, TimeoutException, InterruptedException {
- Provider provider = getConfiguredProviderAPIv4();
+ Provider provider = new Provider("riseup.net");
PreferenceHelper preferenceHelper = mockPreferenceHelper(provider);
CertificateHelper certHelper = mockCertificateHelper(" a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
ProviderApiConnector mockedApiConnector = mockProviderApiConnector(ERROR_DNS_RESUOLUTION_TOR_FALLBACK);
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
- Intent providerApiCommand = new Intent();
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
- providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(PROVIDER_OK));
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
-
- providerApiManager.handleIntent(providerApiCommand);
+ providerApiManager.handleAction(SET_UP_PROVIDER, provider, new Bundle(), mockResultReceiver(PROVIDER_OK));
assertNotEquals(-1, TorStatusObservable.getProxyPort());
}
@@ -738,15 +576,9 @@ public class ProviderApiManagerTest {
PreferenceHelper preferenceHelper = mockPreferenceHelper(provider);
CertificateHelper certHelper = mockCertificateHelper(" a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
ProviderApiConnector mockedApiConnector = mockProviderApiConnector(ERROR_DNS_RESUOLUTION_TOR_FALLBACK);
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback(new IllegalStateException("Tor service start not failed."), true));
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback(new IllegalStateException("Tor service start not failed."), true));
- Intent providerApiCommand = new Intent();
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
- providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(PROVIDER_NOK));
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
-
- providerApiManager.handleIntent(providerApiCommand);
+ providerApiManager.handleAction(SET_UP_PROVIDER, provider, new Bundle(), mockResultReceiver(PROVIDER_NOK));
assertEquals(-1, TorStatusObservable.getProxyPort());
}
@@ -756,41 +588,13 @@ public class ProviderApiManagerTest {
PreferenceHelper preferenceHelper = mockPreferenceHelper(provider);
CertificateHelper certHelper = mockCertificateHelper(" a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
ProviderApiConnector mockedApiConnector = mockProviderApiConnector(ERROR_DNS_RESUOLUTION_TOR_FALLBACK);
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback(true, true));
-
- Intent providerApiCommand = new Intent();
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
- providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(PROVIDER_NOK));
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback(true, true));
- providerApiManager.handleIntent(providerApiCommand);
+ providerApiManager.handleAction(SET_UP_PROVIDER, provider, new Bundle(), mockResultReceiver(PROVIDER_NOK));
assertEquals(-1, TorStatusObservable.getProxyPort());
}
@Test
- public void test_handleIntentSetupProvider_TorBridgesPreferenceEnabled_Success() throws IOException, CertificateEncodingException, NoSuchAlgorithmException, TimeoutException, InterruptedException {
- Provider provider = getConfiguredProviderAPIv4();
-
- SharedPreferences sharedPreferences = new MockSharedPreferences();
- sharedPreferences.edit().putBoolean(USE_BRIDGES, true).putBoolean(USE_SNOWFLAKE, true).commit();
- PreferenceHelper preferenceHelper = mockPreferenceHelper(provider, sharedPreferences);
- CertificateHelper certHelper = mockCertificateHelper(" a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
- ProviderApiConnector mockedApiConnector = mockProviderApiConnector(NO_ERROR_API_V4);
-
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
-
- Intent providerApiCommand = new Intent();
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
- providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(PROVIDER_OK));
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
-
- providerApiManager.handleIntent(providerApiCommand);
- assertEquals(8118, TorStatusObservable.getProxyPort());
- }
-
- @Test
public void test_handleIntentSetupProvider_TorBridgesDisabled_TorNotStarted() throws IOException, CertificateEncodingException, NoSuchAlgorithmException, TimeoutException, InterruptedException {
Provider provider = getConfiguredProviderAPIv4();
@@ -800,15 +604,9 @@ public class ProviderApiManagerTest {
CertificateHelper certHelper = mockCertificateHelper(" a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
ProviderApiConnector mockedApiConnector = mockProviderApiConnector(NO_ERROR_API_V4);
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
- Intent providerApiCommand = new Intent();
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
- providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(PROVIDER_OK));
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
-
- providerApiManager.handleIntent(providerApiCommand);
+ providerApiManager.handleAction(SET_UP_PROVIDER, provider, new Bundle(), mockResultReceiver(PROVIDER_OK));
assertEquals(-1, TorStatusObservable.getProxyPort());
}
@@ -817,18 +615,12 @@ public class ProviderApiManagerTest {
Provider provider = getConfiguredProviderAPIv4();
PreferenceHelper preferenceHelper = mockPreferenceHelper(provider);
CertificateHelper certHelper = mockCertificateHelper(" a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
- RSAHelper rsaHelper = mockRSAHelper();
+ PrivateKeyHelper privateKeyHelper = mockPrivateKeyHelper();
ProviderApiConnector mockedApiConnector = mockProviderApiConnector(ERROR_DNS_RESUOLUTION_TOR_FALLBACK);
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
- Intent providerApiCommand = new Intent();
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
- providerApiCommand.setAction(ProviderAPI.UPDATE_INVALID_VPN_CERTIFICATE);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(CORRECTLY_UPDATED_INVALID_VPN_CERTIFICATE));
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
-
- providerApiManager.handleIntent(providerApiCommand);
+ providerApiManager.handleAction(UPDATE_INVALID_VPN_CERTIFICATE, provider, new Bundle(), mockResultReceiver(CORRECTLY_UPDATED_INVALID_VPN_CERTIFICATE));
assertEquals(8118, TorStatusObservable.getProxyPort());
}
@@ -842,112 +634,9 @@ public class ProviderApiManagerTest {
CertificateHelper certHelper = mockCertificateHelper(" a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
ProviderApiConnector mockedApiConnector = mockProviderApiConnector(ERROR_DNS_RESUOLUTION_TOR_FALLBACK);
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
+ providerApiManager = new ProviderApiManagerV3(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
- Intent providerApiCommand = new Intent();
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
- providerApiCommand.setAction(ProviderAPI.UPDATE_INVALID_VPN_CERTIFICATE);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(INCORRECTLY_UPDATED_INVALID_VPN_CERTIFICATE));
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
-
- providerApiManager.handleIntent(providerApiCommand);
+ providerApiManager.handleAction(UPDATE_INVALID_VPN_CERTIFICATE, provider, new Bundle(), mockResultReceiver(INCORRECTLY_UPDATED_INVALID_VPN_CERTIFICATE));
assertEquals(-1, TorStatusObservable.getProxyPort());
}
-
- @Test
- public void test_handleIntentUpdateVPNCertificate_TorBridgesPreferencesTrue_TorStartedAndSuccess() throws IOException, CertificateEncodingException, NoSuchAlgorithmException, TimeoutException, InterruptedException {
- Provider provider = getConfiguredProviderAPIv4();
-
- SharedPreferences sharedPreferences = new MockSharedPreferences();
- sharedPreferences.edit().putBoolean(USE_BRIDGES, true).putBoolean(USE_SNOWFLAKE, true).commit();
- PreferenceHelper preferenceHelper = mockPreferenceHelper(provider, sharedPreferences);
- CertificateHelper certHelper = mockCertificateHelper(" a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
- RSAHelper rsaHelper = mockRSAHelper();
- ProviderApiConnector mockedApiConnector = mockProviderApiConnector(NO_ERROR_API_V4);
-
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback());
-
- Intent providerApiCommand = new Intent();
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
- providerApiCommand.setAction(ProviderAPI.UPDATE_INVALID_VPN_CERTIFICATE);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(CORRECTLY_UPDATED_INVALID_VPN_CERTIFICATE));
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
-
- providerApiManager.handleIntent(providerApiCommand);
- assertNotEquals(-1, TorStatusObservable.getProxyPort());
- }
-
- @Test
- public void test_handleIntentUpdateVPNCertificate_TorBridgesPreferencesTrue_TorException_Failure() throws IOException, CertificateEncodingException, NoSuchAlgorithmException, TimeoutException, InterruptedException {
- Provider provider = getConfiguredProviderAPIv4();
-
- SharedPreferences sharedPreferences = new MockSharedPreferences();
- sharedPreferences.edit().putBoolean(USE_BRIDGES, true).putBoolean(USE_SNOWFLAKE, true).commit();
- PreferenceHelper preferenceHelper = mockPreferenceHelper(provider, sharedPreferences);
- CertificateHelper certHelper = mockCertificateHelper(" a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
- ProviderApiConnector mockedApiConnector = mockProviderApiConnector(NO_ERROR_API_V4);
-
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback(new IllegalStateException("Nothing works always."), true));
-
- Bundle expectedResult = new Bundle();
- expectedResult.putBoolean(BROADCAST_RESULT_KEY, false);
- expectedResult.putString(ERRORS, "{\"initalAction\":\"ProviderAPI.UPDATE_INVALID_VPN_CERTIFICATE\"}");
- expectedResult.putParcelable(PROVIDER_KEY, provider);
-
- Intent providerApiCommand = new Intent();
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
- providerApiCommand.setAction(ProviderAPI.UPDATE_INVALID_VPN_CERTIFICATE);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(TOR_EXCEPTION, expectedResult));
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
-
- providerApiManager.handleIntent(providerApiCommand);
- assertEquals(-1, TorStatusObservable.getProxyPort());
- }
-
- @Test
- public void test_handleIntentSetupProvider_TorBridgesPreferencesEnabledTimeout_TimeoutError() throws IOException, CertificateEncodingException, NoSuchAlgorithmException, TimeoutException, InterruptedException {
- Provider provider = getConfiguredProviderAPIv4();
- SharedPreferences sharedPreferences = new MockSharedPreferences();
- sharedPreferences.edit().putBoolean(USE_BRIDGES, true).putBoolean(USE_SNOWFLAKE, true).commit();
- PreferenceHelper preferenceHelper = mockPreferenceHelper(provider, sharedPreferences);
- ProviderApiConnector mockedApiConnector = mockProviderApiConnector(NO_ERROR_API_V4);
-
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback(true, true));
-
- Bundle expectedResult = new Bundle();
- expectedResult.putBoolean(BROADCAST_RESULT_KEY, false);
- expectedResult.putString(ERRORS, "{\"errorId\":\"ERROR_TOR_TIMEOUT\",\"initalAction\":\"setUpProvider\",\"errors\":\"Starting bridges failed. Do you want to retry or continue with an unobfuscated secure connection to configure Bitmask?\"}");
- expectedResult.putParcelable(PROVIDER_KEY, provider);
-
- Intent providerApiCommand = new Intent();
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
- providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(TOR_TIMEOUT, expectedResult));
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
-
- providerApiManager.handleIntent(providerApiCommand);
- assertEquals(-1, TorStatusObservable.getProxyPort());
- }
-
- @Test
- public void test_handleIntentSetupProvider_noNetwork_NetworkError() throws IOException, CertificateEncodingException, NoSuchAlgorithmException, JSONException {
- Provider provider = getConfiguredProvider();
-
- CertificateHelper certHelper = mockCertificateHelper("a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494");
- ProviderApiConnector mockedApiConnector = mockProviderApiConnector(NO_ERROR);
- providerApiManager = new ProviderApiManager(mockResources, mockClientGenerator(), new TestProviderApiServiceCallback(null, false));
- Bundle expectedResult = new Bundle();
-
- expectedResult.putBoolean(BROADCAST_RESULT_KEY, false);
- expectedResult.putString(ERRORS, "{\"errors\":\"Bitmask has no internet connection. Please check your WiFi and cellular data settings.\"}");
- expectedResult.putParcelable(PROVIDER_KEY, provider);
-
- Intent providerApiCommand = new Intent();
-
- providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER);
- providerApiCommand.putExtra(ProviderAPI.RECEIVER_KEY, mockResultReceiver(MISSING_NETWORK_CONNECTION, expectedResult));
- providerApiCommand.putExtra(PROVIDER_KEY, provider);
- providerApiCommand.putExtra(PARAMETERS, new Bundle());
- providerApiManager.handleIntent(providerApiCommand);
- }
}
diff --git a/app/src/test/java/se/leap/bitmaskclient/providersetup/ProviderManagerTest.java b/app/src/test/java/se/leap/bitmaskclient/providersetup/ProviderManagerTest.java
index 925d2464..b6a2becd 100644
--- a/app/src/test/java/se/leap/bitmaskclient/providersetup/ProviderManagerTest.java
+++ b/app/src/test/java/se/leap/bitmaskclient/providersetup/ProviderManagerTest.java
@@ -9,26 +9,36 @@ import static org.mockito.Mockito.when;
import android.content.SharedPreferences;
import android.content.res.AssetManager;
+import android.os.Build;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
import java.io.InputStream;
import java.util.HashSet;
import java.util.Set;
+import mobile.BitmaskMobile;
+import mobilemodels.BitmaskMobileCore;
import se.leap.bitmaskclient.base.models.Constants;
import se.leap.bitmaskclient.base.models.Provider;
+import se.leap.bitmaskclient.base.utils.BitmaskCoreProvider;
import se.leap.bitmaskclient.base.utils.PreferenceHelper;
import se.leap.bitmaskclient.testutils.MockHelper;
import se.leap.bitmaskclient.testutils.MockSharedPreferences;
+import se.leap.bitmaskclient.testutils.TestSetupHelper;
/**
* Created by cyberta on 20.02.18.
*/
+@RunWith(RobolectricTestRunner.class)
+@Config(sdk = {Build.VERSION_CODES.P})
public class ProviderManagerTest {
private AssetManager assetManager;
@@ -40,6 +50,7 @@ public class ProviderManagerTest {
@Before
public void setup() throws Exception {
assetManager = mock(AssetManager.class);
+ BitmaskCoreProvider.initBitmaskMobile(TestSetupHelper.getCustomBitmaskCore());
when(assetManager.open(anyString())).thenAnswer(new Answer<InputStream>() {
@Override
@@ -67,7 +78,7 @@ public class ProviderManagerTest {
preferenceHelper = new PreferenceHelper(mockSharedPrefs);
HashSet<Provider> customProviders = new HashSet<>();
- customProviders.add(Provider.createCustomProvider("https://leapcolombia.org", "leapcolombia.org"));
+ customProviders.add(Provider.createCustomProvider("https://leapcolombia.org", "leapcolombia.org", null));
PreferenceHelper.setCustomProviders(customProviders);
}
@@ -162,7 +173,7 @@ public class ProviderManagerTest {
providerManager.setAddDummyEntry(true);
providerManager.clear();
assertEquals("1 providers", 1, providerManager.providers().size());
- assertEquals("provider is dummy element", "https://example.net", providerManager.get(0).getMainUrlString());
+ assertEquals("provider is dummy element", "", providerManager.get(0).getMainUrl());
}
@Test
@@ -195,8 +206,8 @@ public class ProviderManagerTest {
providerManager.add(secondCustomProvider);
providerManager.saveCustomProviders();
Set<String> providerSet = mockSharedPrefs.getStringSet(Constants.CUSTOM_PROVIDER_DOMAINS, new HashSet<>());
- assertEquals("persist was called twice", 2, providerSet.size());
- assertEquals("PreferenceHelper has 2 providers", 2, PreferenceHelper.getCustomProviders().size());
+ assertEquals("persist was called twice", 3, providerSet.size());
+ assertEquals("PreferenceHelper has 2 providers", 3, PreferenceHelper.getCustomProviders().size());
}
diff --git a/app/src/test/java/se/leap/bitmaskclient/testutils/BackendMockResponses/NoErrorBackendResponseAPIv4.java b/app/src/test/java/se/leap/bitmaskclient/testutils/BackendMockResponses/NoErrorBackendResponseAPIv4.java
index bbbed821..dfdae967 100644
--- a/app/src/test/java/se/leap/bitmaskclient/testutils/BackendMockResponses/NoErrorBackendResponseAPIv4.java
+++ b/app/src/test/java/se/leap/bitmaskclient/testutils/BackendMockResponses/NoErrorBackendResponseAPIv4.java
@@ -59,7 +59,7 @@ public class NoErrorBackendResponseAPIv4 implements ProviderApiConnector.Provide
return getInputAsString(getClass().getClassLoader().getResourceAsStream("riseup.geoip.json"));
} else if (url.contains("/cert")) {
// download vpn key and cert
- return getInputAsString(getClass().getClassLoader().getResourceAsStream("v4/riseup.net.cert"));
+ return getInputAsString(getClass().getClassLoader().getResourceAsStream("v4/generictest.cert"));
}
return null;
diff --git a/app/src/test/java/se/leap/bitmaskclient/testutils/BackendMockResponses/TorFallbackBackendResponse.java b/app/src/test/java/se/leap/bitmaskclient/testutils/BackendMockResponses/TorFallbackBackendResponse.java
index 45dd36e4..76f6bea4 100644
--- a/app/src/test/java/se/leap/bitmaskclient/testutils/BackendMockResponses/TorFallbackBackendResponse.java
+++ b/app/src/test/java/se/leap/bitmaskclient/testutils/BackendMockResponses/TorFallbackBackendResponse.java
@@ -73,7 +73,7 @@ public class TorFallbackBackendResponse implements ProviderApiConnector.Provider
throw new UnknownHostException("DNS blocked by censor ;)");
}
// download vpn certificate for authentication
- return getInputAsString(getClass().getClassLoader().getResourceAsStream("v4/riseup.net.cert"));
+ return getInputAsString(getClass().getClassLoader().getResourceAsStream("v4/generictest.cert"));
}
return null;
diff --git a/app/src/test/java/se/leap/bitmaskclient/testutils/MockHelper.java b/app/src/test/java/se/leap/bitmaskclient/testutils/MockHelper.java
index a7d3e19c..cb226033 100644
--- a/app/src/test/java/se/leap/bitmaskclient/testutils/MockHelper.java
+++ b/app/src/test/java/se/leap/bitmaskclient/testutils/MockHelper.java
@@ -10,7 +10,6 @@ import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
-import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_CONFIGURED;
import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_EIP_DEFINITION;
import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_MOTD;
import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_MOTD_HASHES;
@@ -21,7 +20,6 @@ import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_VPN_CERTIFICA
import static se.leap.bitmaskclient.base.utils.PreferenceHelper.getEipDefinitionFromPreferences;
import android.content.Context;
-import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
@@ -30,9 +28,6 @@ import android.os.Bundle;
import android.os.Parcelable;
import android.os.ResultReceiver;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
import org.json.JSONException;
import org.json.JSONObject;
import org.mockito.Mockito;
@@ -47,17 +42,9 @@ import java.math.BigInteger;
import java.net.UnknownHostException;
import java.security.interfaces.RSAPrivateKey;
import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Base64;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
import java.util.Set;
-import java.util.Vector;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicBoolean;
import okhttp3.OkHttpClient;
import se.leap.bitmaskclient.R;
@@ -65,16 +52,14 @@ import se.leap.bitmaskclient.base.models.Provider;
import se.leap.bitmaskclient.base.models.ProviderObservable;
import se.leap.bitmaskclient.base.utils.CertificateHelper;
import se.leap.bitmaskclient.base.utils.FileHelper;
-import se.leap.bitmaskclient.base.utils.InputStreamHelper;
import se.leap.bitmaskclient.base.utils.BuildConfigHelper;
import se.leap.bitmaskclient.base.utils.PreferenceHelper;
-import se.leap.bitmaskclient.base.utils.RSAHelper;
+import se.leap.bitmaskclient.base.utils.PrivateKeyHelper;
import se.leap.bitmaskclient.providersetup.ProviderApiConnector;
import se.leap.bitmaskclient.providersetup.connectivity.DnsResolver;
import se.leap.bitmaskclient.providersetup.connectivity.OkHttpClientGenerator;
import se.leap.bitmaskclient.testutils.BackendMockResponses.BackendMockProvider;
import se.leap.bitmaskclient.testutils.matchers.BundleMatcher;
-import se.leap.bitmaskclient.tor.TorStatusObservable;
/**
* Created by cyberta on 29.01.18.
@@ -160,8 +145,8 @@ public class MockHelper {
return new FileHelper(new MockFileHelper(mockedFile));
}
- public static RSAHelper mockRSAHelper() {
- return new RSAHelper(rsaKeyString -> new RSAPrivateKey() {
+ public static PrivateKeyHelper mockPrivateKeyHelper() {
+ return new PrivateKeyHelper(rsaKeyString -> new RSAPrivateKey() {
@Override
public BigInteger getPrivateExponent() {
return BigInteger.TEN;
@@ -190,16 +175,12 @@ public class MockHelper {
}
- public static BuildConfigHelper mockBuildConfigHelper(boolean useObfsvpn) {
- return mockBuildConfigHelper(useObfsvpn, true);
+ public static BuildConfigHelper mockBuildConfigHelper() {
+ return mockBuildConfigHelper(true);
}
- public static BuildConfigHelper mockBuildConfigHelper(boolean useObfsvpn, boolean isDefaultBitmask) {
+ public static BuildConfigHelper mockBuildConfigHelper(boolean isDefaultBitmask) {
return new BuildConfigHelper(new BuildConfigHelper.BuildConfigHelperInterface() {
- @Override
- public boolean useObfsVpn() {
- return useObfsvpn;
- }
@Override
public boolean hasObfuscationPinningDefaults() {
@@ -222,8 +203,8 @@ public class MockHelper {
}
@Override
- public boolean useKcp() {
- return false;
+ public String obfsvpnTransportProtocol() {
+ return "tcp";
}
@Override
@@ -241,7 +222,7 @@ public class MockHelper {
PreferenceHelper preferenceHelper = new PreferenceHelper(sharedPreferences);
sharedPreferences.edit().
- putString(PROVIDER_PRIVATE_KEY, providerFromPrefs.getPrivateKey()).
+ putString(PROVIDER_PRIVATE_KEY, providerFromPrefs.getPrivateKeyString()).
putString(PROVIDER_VPN_CERTIFICATE, providerFromPrefs.getVpnCertificate()).
putString(Provider.KEY, providerFromPrefs.getDefinitionString()).
putString(Provider.CA_CERT_FINGERPRINT, providerFromPrefs.getCaCertFingerprint()).
@@ -261,7 +242,7 @@ public class MockHelper {
PreferenceHelper preferenceHelper = new PreferenceHelper(sharedPreferences);
sharedPreferences.edit().
- putString(PROVIDER_PRIVATE_KEY, provider.getPrivateKey()).
+ putString(PROVIDER_PRIVATE_KEY, provider.getPrivateKeyString()).
putString(PROVIDER_VPN_CERTIFICATE, provider.getVpnCertificate()).
putString(Provider.KEY, provider.getDefinitionString()).
putString(Provider.CA_CERT_FINGERPRINT, provider.getCaCertFingerprint()).
@@ -278,9 +259,9 @@ public class MockHelper {
sharedPreferences.edit().
putString(Provider.PROVIDER_IP + "." + providerDomain, provider.getProviderIp()).
putString(Provider.PROVIDER_API_IP + "." + providerDomain, provider.getProviderApiIp()).
- putString(Provider.MAIN_URL + "." + providerDomain, provider.getMainUrlString()).
- putString(Provider.GEOIP_URL + "." + providerDomain, provider.getGeoipUrl().toString()).
- putString(Provider.MOTD_URL + "." + providerDomain, provider.getMotdUrl().toString()).
+ putString(Provider.MAIN_URL + "." + providerDomain, provider.getMainUrl()).
+ putString(Provider.GEOIP_URL + "." + providerDomain, provider.getGeoipUrl()).
+ putString(Provider.MOTD_URL + "." + providerDomain, provider.getMotdUrl()).
putString(Provider.KEY + "." + providerDomain, provider.getDefinitionString()).
putString(Provider.CA_CERT + "." + providerDomain, provider.getCaCert()).
putString(PROVIDER_EIP_DEFINITION + "." + providerDomain, provider.getEipServiceJsonString()).
diff --git a/app/src/test/java/se/leap/bitmaskclient/testutils/TestSetupHelper.java b/app/src/test/java/se/leap/bitmaskclient/testutils/TestSetupHelper.java
index 72791ba6..752a5336 100644
--- a/app/src/test/java/se/leap/bitmaskclient/testutils/TestSetupHelper.java
+++ b/app/src/test/java/se/leap/bitmaskclient/testutils/TestSetupHelper.java
@@ -25,6 +25,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
+import mobilemodels.BitmaskMobileCore;
import se.leap.bitmaskclient.base.models.Provider;
/**
@@ -105,4 +106,83 @@ public class TestSetupHelper {
return null;
}
+ public static BitmaskMobileCore getCustomBitmaskCore() {
+ return new BitmaskMobileCore() {
+ @Override
+ public String getAllBridges(String s, String s1, String s2, String s3) throws Exception {
+ return null;
+ }
+
+ @Override
+ public String getAllGateways(String s, String s1, String s2) throws Exception {
+ return null;
+ }
+
+ @Override
+ public String getGeolocation() throws Exception {
+ return null;
+ }
+
+ @Override
+ public String getIntroducerURLByDomain(String s) throws Exception {
+ return null;
+ }
+
+ @Override
+ public String getOpenVPNCert() throws Exception {
+ return null;
+ }
+
+ @Override
+ public String getProvider() throws Exception {
+ return null;
+ }
+
+ @Override
+ public String getService() throws Exception {
+ return null;
+ }
+
+ @Override
+ public void setCountryCode(String s) {
+
+ }
+
+ @Override
+ public void setCountryCodeLookupURL(String s) throws Exception {
+
+ }
+
+ @Override
+ public void setDebug(boolean b) {
+
+ }
+
+ @Override
+ public void setIntroducer(String s) throws Exception {
+
+ }
+
+ @Override
+ public void setResolveWithDoH(boolean b) {
+
+ }
+
+ @Override
+ public void setSocksProxy(String s) {
+
+ }
+
+ @Override
+ public void setStunServers(String s) throws Exception {
+
+ }
+
+ @Override
+ public void setUseTls(boolean b) {
+
+ }
+ };
+ }
+
}
diff --git a/app/src/test/resources/ed25519_credentials.pem b/app/src/test/resources/ed25519_credentials.pem
new file mode 100644
index 00000000..1c10ed28
--- /dev/null
+++ b/app/src/test/resources/ed25519_credentials.pem
@@ -0,0 +1,31 @@
+<key>
+-----BEGIN PRIVATE KEY-----
+MC4CAQAwBQYDK2VwBCIEIF+HZvpSdhnTbYeT635bT2+IU4FbW3EWlHuUnXvhb10m
+-----END PRIVATE KEY-----
+</key>
+<cert>
+-----BEGIN CERTIFICATE-----
+MIIBgzCCASigAwIBAgIRALD3Z4SsobpcU7tcC0r9JOQwCgYIKoZIzj0EAwIwNzE1
+MDMGA1UEAwwsUHJvdmlkZXIgUm9vdCBDQSAoY2xpZW50IGNlcnRpZmljYXRlcyBv
+bmx5ISkwHhcNMjQxMTA1MTU0MjU0WhcNMjQxMTI5MTU0MjU0WjAUMRIwEAYDVQQD
+EwlVTkxJTUlURUQwKjAFBgMrZXADIQC5QkZAcpkQ3Rm54gN5iLEU1Zp1w+patXVT
+W9GRXmFz+6NnMGUwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMC
+MB0GA1UdDgQWBBRMxeMW4vqGK7FBkDt2+8upfkK1kzAfBgNVHSMEGDAWgBS0pVQs
+1wnvNYG0AnmkxUcLOw+BLDAKBggqhkjOPQQDAgNJADBGAiEAg112+zWMm9qrPTvK
+99IMa+wbeNzZLSoN9xewf5rxOX0CIQCvMi08JcajsAJ9Dg6YAQgpmFdb35HDCzve
+lhkTCWJpgQ==
+-----END CERTIFICATE-----
+</cert>
+<ca>
+-----BEGIN CERTIFICATE-----
+MIIBozCCAUigAwIBAgIBATAKBggqhkjOPQQDAjA3MTUwMwYDVQQDDCxQcm92aWRl
+ciBSb290IENBIChjbGllbnQgY2VydGlmaWNhdGVzIG9ubHkhKTAeFw0yNDEwMjMx
+MjA0MjRaFw0yOTEwMjMxMjA5MjRaMDcxNTAzBgNVBAMMLFByb3ZpZGVyIFJvb3Qg
+Q0EgKGNsaWVudCBjZXJ0aWZpY2F0ZXMgb25seSEpMFkwEwYHKoZIzj0CAQYIKoZI
+zj0DAQcDQgAEMImwbNTDrXMeWfyTb2TMNzXNr79OsKjLDdZWqVT0iHMI8apo2P4H
+eXCHVGjS2Z+jpyI1u9ic3igThsKEmdZMSKNFMEMwDgYDVR0PAQH/BAQDAgKkMBIG
+A1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYEFLSlVCzXCe81gbQCeaTFRws7D4Es
+MAoGCCqGSM49BAMCA0kAMEYCIQCw88nXg/vs/KgGqH1uPs9oZkOxucVn/ZEznYzg
+szLhtAIhAPY32oHwmj3yHO9H2Jp7x0CoHuu1fKd9fQTBvEEbi7o9
+-----END CERTIFICATE-----
+</ca>
diff --git a/app/src/test/resources/multiple_pts_per_host_eip-service.json b/app/src/test/resources/multiple_pts_per_host_eip-service.json
new file mode 100644
index 00000000..c2fec356
--- /dev/null
+++ b/app/src/test/resources/multiple_pts_per_host_eip-service.json
@@ -0,0 +1,145 @@
+{
+ "gateways":[
+ {
+ "capabilities":{
+ "adblock":false,
+ "filter_dns":false,
+ "limited":false,
+ "transport":[
+ {
+ "ports":[
+ "80"
+ ],
+ "protocols":[
+ "tcp",
+ "udp"
+ ],
+ "type":"openvpn"
+ },
+ {
+ "options":{
+ "cert":"XXXX",
+ "iatMode":"0"
+ },
+ "ports":[
+ "443"
+ ],
+ "protocols":[
+ "tcp"
+ ],
+ "type":"obfs4"
+ },
+ {
+ "options":{
+ "cert":"XXXX",
+ "iatMode":"0"
+ },
+ "ports":[
+ "4431"
+ ],
+ "protocols":[
+ "kcp"
+ ],
+ "type":"obfs4"
+ },
+ {
+ "options":{
+ "cert":"XXXX",
+ "iatMode":"0"
+ },
+ "ports":[
+ "4432"
+ ],
+ "protocols":[
+ "quic"
+ ],
+ "type":"obfs4"
+ }
+ ]
+ },
+ "host":"cod.demo.bitmask.net",
+ "ip_address":"37.218.245.94",
+ "location":"North Brabant"
+ },
+ {
+ "capabilities":{
+ "adblock":false,
+ "filter_dns":false,
+ "limited":false,
+ "transport":[
+ {
+ "ports":[
+ "80"
+ ],
+ "protocols":[
+ "tcp",
+ "udp"
+ ],
+ "type":"openvpn"
+ },
+ {
+ "options":{
+ "cert":"XXXX",
+ "iatMode":"0"
+ },
+ "ports":[
+ "443"
+ ],
+ "protocols":[
+ "udp"
+ ],
+ "type":"obfs4"
+ },
+ {
+ "options":{
+ "cert":"XXXX",
+ "iatMode":"0"
+ },
+ "ports":[
+ "4431"
+ ],
+ "protocols":[
+ "kcp"
+ ],
+ "type":"obfs4"
+ }
+ ]
+ },
+ "host":"mullet.demo.bitmask.net",
+ "ip_address":"37.218.241.208",
+ "location":"Florida"
+ }
+ ],
+ "locations":{
+ "Florida":{
+ "country_code":"US",
+ "hemisphere":"N",
+ "name":"United States",
+ "timezone":"-6"
+ },
+ "North Brabant":{
+ "country_code":"NL",
+ "hemisphere":"N",
+ "name":"Netherlands",
+ "timezone":"+2"
+ }
+ },
+ "openvpn_configuration":{
+ "auth":"SHA512",
+ "cipher":"AES-256-GCM",
+ "data-ciphers":"AES-256-GCM",
+ "dev":"tun",
+ "float":"",
+ "keepalive":"10 30",
+ "key-direction":"1",
+ "nobind":true,
+ "persist-key":true,
+ "rcvbuf":"0",
+ "sndbuf":"0",
+ "tls-cipher":"TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384",
+ "tls-version-min":"1.2",
+ "verb":"3"
+ },
+ "serial":3,
+ "version":3
+} \ No newline at end of file
diff --git a/app/src/test/resources/preconfigured/riseup.net.pem b/app/src/test/resources/preconfigured/riseup.net.pem
index c890aff4..4f801cc1 100644
--- a/app/src/test/resources/preconfigured/riseup.net.pem
+++ b/app/src/test/resources/preconfigured/riseup.net.pem
@@ -1,32 +1,10 @@
-----BEGIN CERTIFICATE-----
-MIIFjTCCA3WgAwIBAgIBATANBgkqhkiG9w0BAQ0FADBZMRgwFgYDVQQKDA9SaXNl
-dXAgTmV0d29ya3MxGzAZBgNVBAsMEmh0dHBzOi8vcmlzZXVwLm5ldDEgMB4GA1UE
-AwwXUmlzZXVwIE5ldHdvcmtzIFJvb3QgQ0EwHhcNMTQwNDI4MDAwMDAwWhcNMjQw
-NDI4MDAwMDAwWjBZMRgwFgYDVQQKDA9SaXNldXAgTmV0d29ya3MxGzAZBgNVBAsM
-Emh0dHBzOi8vcmlzZXVwLm5ldDEgMB4GA1UEAwwXUmlzZXVwIE5ldHdvcmtzIFJv
-b3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC76J4ciMJ8Sg0m
-TP7DF2DT9zNe0Csk4myoMFC57rfJeqsAlJCv1XMzBmXrw8wq/9z7XHv6n/0sWU7a
-7cF2hLR33ktjwODlx7vorU39/lXLndo492ZBhXQtG1INMShyv+nlmzO6GT7ESfNE
-LliFitEzwIegpMqxCIHXFuobGSCWF4N0qLHkq/SYUMoOJ96O3hmPSl1kFDRMtWXY
-iw1SEKjUvpyDJpVs3NGxeLCaA7bAWhDY5s5Yb2fA1o8ICAqhowurowJpW7n5ZuLK
-5VNTlNy6nZpkjt1QycYvNycffyPOFm/Q/RKDlvnorJIrihPkyniV3YY5cGgP+Qkx
-HUOT0uLA6LHtzfiyaOqkXwc4b0ZcQD5Vbf6Prd20Ppt6ei0zazkUPwxld3hgyw58
-m/4UIjG3PInWTNf293GngK2Bnz8Qx9e/6TueMSAn/3JBLem56E0WtmbLVjvko+LF
-PM5xA+m0BmuSJtrD1MUCXMhqYTtiOvgLBlUm5zkNxALzG+cXB28k6XikXt6MRG7q
-hzIPG38zwkooM55yy5i1YfcIi5NjMH6A+t4IJxxwb67MSb6UFOwg5kFokdONZcwj
-shczHdG9gLKSBIvrKa03Nd3W2dF9hMbRu//STcQxOailDBQCnXXfAATj9pYzdY4k
-ha8VCAREGAKTDAex9oXf1yRuktES4QIDAQABo2AwXjAdBgNVHQ4EFgQUC4tdmLVu
-f9hwfK4AGliaet5KkcgwDgYDVR0PAQH/BAQDAgIEMAwGA1UdEwQFMAMBAf8wHwYD
-VR0jBBgwFoAUC4tdmLVuf9hwfK4AGliaet5KkcgwDQYJKoZIhvcNAQENBQADggIB
-AGzL+GRnYu99zFoy0bXJKOGCF5XUXP/3gIXPRDqQf5g7Cu/jYMID9dB3No4Zmf7v
-qHjiSXiS8jx1j/6/Luk6PpFbT7QYm4QLs1f4BlfZOti2KE8r7KRDPIecUsUXW6P/
-3GJAVYH/+7OjA39za9AieM7+H5BELGccGrM5wfl7JeEz8in+V2ZWDzHQO4hMkiTQ
-4ZckuaL201F68YpiItBNnJ9N5nHr1MRiGyApHmLXY/wvlrOpclh95qn+lG6/2jk7
-3AmihLOKYMlPwPakJg4PYczm3icFLgTpjV5sq2md9bRyAg3oPGfAuWHmKj2Ikqch
-Td5CHKGxEEWbGUWEMP0s1A/JHWiCbDigc4Cfxhy56CWG4q0tYtnc2GMw8OAUO6Wf
-Xu5pYKNkzKSEtT/MrNJt44tTZWbKV/Pi/N2Fx36my7TgTUj7g3xcE9eF4JV2H/sg
-tsK3pwE0FEqGnT4qMFbixQmc8bGyuakr23wjMvfO7eZUxBuWYR2SkcP26sozF9PF
-tGhbZHQVGZUTVPyvwahMUEhbPGVerOW0IYpxkm0x/eaWdTc4vPpf/rIlgbAjarnJ
-UN9SaWRlWKSdP4haujnzCoJbM7dU9bjvlGZNyXEekgeT0W2qFeGGp+yyUWw8tNsp
-0BuC1b7uW/bBn/xKm319wXVDvBgZgcktMolak39V7DVO
------END CERTIFICATE----- \ No newline at end of file
+MIIBYjCCAQigAwIBAgIBATAKBggqhkjOPQQDAjAXMRUwEwYDVQQDEwxMRUFQIFJv
+b3QgQ0EwHhcNMjExMTAyMTkwNTM3WhcNMjYxMTAyMTkxMDM3WjAXMRUwEwYDVQQD
+EwxMRUFQIFJvb3QgQ0EwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQxOXBGu+gf
+pjHzVteGTWL6XnFxtEnKMFpKaJkA/VOHmESzoLsZRQxt88GssxaqC01J17idQiqv
+zgNpedmtvFtyo0UwQzAOBgNVHQ8BAf8EBAMCAqQwEgYDVR0TAQH/BAgwBgEB/wIB
+ATAdBgNVHQ4EFgQUZdoUlJrCIUNFrpffAq+LQjnwEz4wCgYIKoZIzj0EAwIDSAAw
+RQIgfr3w4tnRG+NdI3LsGPlsRktGK20xHTzsB3orB0yC6cICIQCB+/9y8nmSStfN
+VUMUyk2hNd7/kC8nL222TTD7VZUtsg==
+-----END CERTIFICATE-----
diff --git a/app/src/test/resources/private_PKCS8_encoded_ecdsa_key.pem b/app/src/test/resources/private_PKCS8_encoded_ecdsa_key.pem
new file mode 100644
index 00000000..568783a1
--- /dev/null
+++ b/app/src/test/resources/private_PKCS8_encoded_ecdsa_key.pem
@@ -0,0 +1,8 @@
+-----BEGIN PRIVATE KEY-----
+MIHuAgEAMBAGByqGSM49AgEGBSuBBAAjBIHWMIHTAgEBBEIAQHgofCij0Tdc8aO5
+lNnxhjXiU2Z+84/vz0RpCdoZt0H8ytLb5AOUOaPMu5gNGC2SssTkJhGc/dDX7jdw
+8/GEQQ2hgYkDgYYABABnVEIseHS5WQ/8J3x//uTaU9G5d3HR/dOo+RI7PLizxj8p
+pLKptfPDLTWHMujqE5yPe4GYnU2S1KMws853VBTucwF4AVz1sxYMEpFcYUys+Xr1
+JyTDsxA/o4yeV4ZcuqaofNFYUL6YRFjXg7UAlUPp0s6ongQzJ0/10wGDbUI7vR0I
+Lg==
+-----END PRIVATE KEY----- \ No newline at end of file
diff --git a/app/src/test/resources/private_PKCS8_encoded_ed25519_key.pem b/app/src/test/resources/private_PKCS8_encoded_ed25519_key.pem
new file mode 100644
index 00000000..eac4d4db
--- /dev/null
+++ b/app/src/test/resources/private_PKCS8_encoded_ed25519_key.pem
@@ -0,0 +1,3 @@
+-----BEGIN PRIVATE KEY-----
+MC4CAQAwBQYDK2VwBCIEIGVuE1J3PTf1TRv1xz5bXCyh5oXa3MieBg+Re9qGNZvU
+-----END PRIVATE KEY----- \ No newline at end of file
diff --git a/app/src/test/resources/ptdemo.bitmask.eip-service-obfsvpn1.0.0.json b/app/src/test/resources/ptdemo.bitmask.eip-service-obfsvpn1.0.0.json
new file mode 100644
index 00000000..2b3d7fd7
--- /dev/null
+++ b/app/src/test/resources/ptdemo.bitmask.eip-service-obfsvpn1.0.0.json
@@ -0,0 +1,64 @@
+{
+ "gateways":[
+ {
+ "capabilities":{
+ "adblock":false,
+ "filter_dns":false,
+ "limited":false,
+ "transport":[
+ {
+ "type":"obfs4",
+ "protocols":[
+ "tcp"
+ ],
+ "ports":[
+ "23049"
+ ],
+ "options": {
+ "cert": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX1",
+ "iatMode": "0"
+ }
+ },
+ {
+ "type":"openvpn",
+ "protocols":[
+ "udp"
+ ],
+ "ports":[
+ "1195"
+ ]
+ }
+ ],
+ "user_ips":false
+ },
+ "host":"pt.demo.bitmask.net",
+ "ip_address":"37.218.247.60",
+ "location":"Amsterdam"
+ }
+ ],
+ "locations":{
+ "Amsterdam":{
+ "country_code":"NL",
+ "hemisphere":"N",
+ "name":"Amsterdam",
+ "timezone":"-1"
+ }
+ },
+ "openvpn_configuration":{
+ "auth":"SHA1",
+ "cipher":"AES-256-CBC",
+ "keepalive":"10 30",
+ "tls-cipher":"DHE-RSA-AES128-SHA",
+ "tun-ipv6":true,
+ "dev" : "tun",
+ "sndbuf" : "0",
+ "rcvbuf" : "0",
+ "nobind" : true,
+ "persist-key" : true,
+ "comp-lzo" : true,
+ "key-direction" : "1",
+ "verb" : "3"
+ },
+ "serial":2,
+ "version":3
+} \ No newline at end of file
diff --git a/app/src/test/resources/ptdemo_kcp_gateways.json b/app/src/test/resources/ptdemo_kcp_gateways.json
index 8c2c9d32..afd7db69 100644
--- a/app/src/test/resources/ptdemo_kcp_gateways.json
+++ b/app/src/test/resources/ptdemo_kcp_gateways.json
@@ -22,7 +22,8 @@
{
"type":"openvpn",
"protocols":[
- "tcp"
+ "tcp",
+ "udp"
],
"ports":[
"1195"
@@ -57,7 +58,8 @@
{
"type":"openvpn",
"protocols":[
- "tcp"
+ "tcp",
+ "udp"
],
"ports":[
"1195"
diff --git a/app/src/test/resources/ptdemo_misconfigured_ipv4ipv6.json b/app/src/test/resources/ptdemo_misconfigured_ipv4ipv6.json
index 5c913c14..9412e099 100644
--- a/app/src/test/resources/ptdemo_misconfigured_ipv4ipv6.json
+++ b/app/src/test/resources/ptdemo_misconfigured_ipv4ipv6.json
@@ -22,7 +22,8 @@
{
"type":"openvpn",
"protocols":[
- "tcp"
+ "tcp",
+ "udp"
],
"ports":[
"1195"
diff --git a/app/src/test/resources/ptdemo_misconfigured_udp2.json b/app/src/test/resources/ptdemo_misconfigured_tcp2.json
index d2a54cef..5c913c14 100644
--- a/app/src/test/resources/ptdemo_misconfigured_udp2.json
+++ b/app/src/test/resources/ptdemo_misconfigured_tcp2.json
@@ -22,7 +22,7 @@
{
"type":"openvpn",
"protocols":[
- "udp"
+ "tcp"
],
"ports":[
"1195"
diff --git a/app/src/test/resources/ptdemo_misconfigured_udptcp.json b/app/src/test/resources/ptdemo_misconfigured_udptcp.json
index 42d55de9..016d45da 100644
--- a/app/src/test/resources/ptdemo_misconfigured_udptcp.json
+++ b/app/src/test/resources/ptdemo_misconfigured_udptcp.json
@@ -23,7 +23,8 @@
{
"type":"openvpn",
"protocols":[
- "tcp"
+ "tcp",
+ "udp"
],
"ports":[
"1195"
diff --git a/app/src/test/resources/ptdemo_obfs4hop_tcp_gateways.json b/app/src/test/resources/ptdemo_obfs4hop_tcp_gateways.json
index 34bcecb3..1d234ce2 100644
--- a/app/src/test/resources/ptdemo_obfs4hop_tcp_gateways.json
+++ b/app/src/test/resources/ptdemo_obfs4hop_tcp_gateways.json
@@ -22,7 +22,8 @@
{
"type":"openvpn",
"protocols":[
- "tcp"
+ "tcp",
+ "udp"
],
"ports":[
"1195"
diff --git a/app/src/test/resources/ptdemo_three_mixed_gateways.json b/app/src/test/resources/ptdemo_three_mixed_gateways.json
index 9b04cab4..e48e6cca 100644
--- a/app/src/test/resources/ptdemo_three_mixed_gateways.json
+++ b/app/src/test/resources/ptdemo_three_mixed_gateways.json
@@ -22,7 +22,7 @@
{
"type":"openvpn",
"protocols":[
- "tcp"
+ "udp"
],
"ports":[
"1195"
@@ -57,7 +57,7 @@
{
"type":"openvpn",
"protocols":[
- "tcp"
+ "udp"
],
"ports":[
"1195"
diff --git a/app/src/test/resources/riseup.net.pem b/app/src/test/resources/riseup.net.pem
index c890aff4..4f801cc1 100644
--- a/app/src/test/resources/riseup.net.pem
+++ b/app/src/test/resources/riseup.net.pem
@@ -1,32 +1,10 @@
-----BEGIN CERTIFICATE-----
-MIIFjTCCA3WgAwIBAgIBATANBgkqhkiG9w0BAQ0FADBZMRgwFgYDVQQKDA9SaXNl
-dXAgTmV0d29ya3MxGzAZBgNVBAsMEmh0dHBzOi8vcmlzZXVwLm5ldDEgMB4GA1UE
-AwwXUmlzZXVwIE5ldHdvcmtzIFJvb3QgQ0EwHhcNMTQwNDI4MDAwMDAwWhcNMjQw
-NDI4MDAwMDAwWjBZMRgwFgYDVQQKDA9SaXNldXAgTmV0d29ya3MxGzAZBgNVBAsM
-Emh0dHBzOi8vcmlzZXVwLm5ldDEgMB4GA1UEAwwXUmlzZXVwIE5ldHdvcmtzIFJv
-b3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC76J4ciMJ8Sg0m
-TP7DF2DT9zNe0Csk4myoMFC57rfJeqsAlJCv1XMzBmXrw8wq/9z7XHv6n/0sWU7a
-7cF2hLR33ktjwODlx7vorU39/lXLndo492ZBhXQtG1INMShyv+nlmzO6GT7ESfNE
-LliFitEzwIegpMqxCIHXFuobGSCWF4N0qLHkq/SYUMoOJ96O3hmPSl1kFDRMtWXY
-iw1SEKjUvpyDJpVs3NGxeLCaA7bAWhDY5s5Yb2fA1o8ICAqhowurowJpW7n5ZuLK
-5VNTlNy6nZpkjt1QycYvNycffyPOFm/Q/RKDlvnorJIrihPkyniV3YY5cGgP+Qkx
-HUOT0uLA6LHtzfiyaOqkXwc4b0ZcQD5Vbf6Prd20Ppt6ei0zazkUPwxld3hgyw58
-m/4UIjG3PInWTNf293GngK2Bnz8Qx9e/6TueMSAn/3JBLem56E0WtmbLVjvko+LF
-PM5xA+m0BmuSJtrD1MUCXMhqYTtiOvgLBlUm5zkNxALzG+cXB28k6XikXt6MRG7q
-hzIPG38zwkooM55yy5i1YfcIi5NjMH6A+t4IJxxwb67MSb6UFOwg5kFokdONZcwj
-shczHdG9gLKSBIvrKa03Nd3W2dF9hMbRu//STcQxOailDBQCnXXfAATj9pYzdY4k
-ha8VCAREGAKTDAex9oXf1yRuktES4QIDAQABo2AwXjAdBgNVHQ4EFgQUC4tdmLVu
-f9hwfK4AGliaet5KkcgwDgYDVR0PAQH/BAQDAgIEMAwGA1UdEwQFMAMBAf8wHwYD
-VR0jBBgwFoAUC4tdmLVuf9hwfK4AGliaet5KkcgwDQYJKoZIhvcNAQENBQADggIB
-AGzL+GRnYu99zFoy0bXJKOGCF5XUXP/3gIXPRDqQf5g7Cu/jYMID9dB3No4Zmf7v
-qHjiSXiS8jx1j/6/Luk6PpFbT7QYm4QLs1f4BlfZOti2KE8r7KRDPIecUsUXW6P/
-3GJAVYH/+7OjA39za9AieM7+H5BELGccGrM5wfl7JeEz8in+V2ZWDzHQO4hMkiTQ
-4ZckuaL201F68YpiItBNnJ9N5nHr1MRiGyApHmLXY/wvlrOpclh95qn+lG6/2jk7
-3AmihLOKYMlPwPakJg4PYczm3icFLgTpjV5sq2md9bRyAg3oPGfAuWHmKj2Ikqch
-Td5CHKGxEEWbGUWEMP0s1A/JHWiCbDigc4Cfxhy56CWG4q0tYtnc2GMw8OAUO6Wf
-Xu5pYKNkzKSEtT/MrNJt44tTZWbKV/Pi/N2Fx36my7TgTUj7g3xcE9eF4JV2H/sg
-tsK3pwE0FEqGnT4qMFbixQmc8bGyuakr23wjMvfO7eZUxBuWYR2SkcP26sozF9PF
-tGhbZHQVGZUTVPyvwahMUEhbPGVerOW0IYpxkm0x/eaWdTc4vPpf/rIlgbAjarnJ
-UN9SaWRlWKSdP4haujnzCoJbM7dU9bjvlGZNyXEekgeT0W2qFeGGp+yyUWw8tNsp
-0BuC1b7uW/bBn/xKm319wXVDvBgZgcktMolak39V7DVO
------END CERTIFICATE----- \ No newline at end of file
+MIIBYjCCAQigAwIBAgIBATAKBggqhkjOPQQDAjAXMRUwEwYDVQQDEwxMRUFQIFJv
+b3QgQ0EwHhcNMjExMTAyMTkwNTM3WhcNMjYxMTAyMTkxMDM3WjAXMRUwEwYDVQQD
+EwxMRUFQIFJvb3QgQ0EwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQxOXBGu+gf
+pjHzVteGTWL6XnFxtEnKMFpKaJkA/VOHmESzoLsZRQxt88GssxaqC01J17idQiqv
+zgNpedmtvFtyo0UwQzAOBgNVHQ8BAf8EBAMCAqQwEgYDVR0TAQH/BAgwBgEB/wIB
+ATAdBgNVHQ4EFgQUZdoUlJrCIUNFrpffAq+LQjnwEz4wCgYIKoZIzj0EAwIDSAAw
+RQIgfr3w4tnRG+NdI3LsGPlsRktGK20xHTzsB3orB0yC6cICIQCB+/9y8nmSStfN
+VUMUyk2hNd7/kC8nL222TTD7VZUtsg==
+-----END CERTIFICATE-----
diff --git a/app/src/test/resources/v4/generictest.cert b/app/src/test/resources/v4/generictest.cert
new file mode 100644
index 00000000..a06b2921
--- /dev/null
+++ b/app/src/test/resources/v4/generictest.cert
@@ -0,0 +1,49 @@
+-----BEGIN CERTIFICATE-----
+MIIDbzCCAlegAwIBAgIRAJ13v8he4G1gJrAmxoaq9V4wDQYJKoZIhvcNAQELBQAw
+FjEUMBIGA1UEAwwLRWFzeS1SU0EgQ0EwHhcNMjQwNjI0MjIyMzAxWhcNMjYwOTI3
+MjIyMzAxWjArMSkwJwYDVQQDDCB5UnhiNmQwdnRiZW1UYW51NHJ2MkVIMHEzSEhZ
+ZzBxNTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMdIIe89GksectVQ
+i52g660W4Fvs7fQ6DecXxiEbTu4kfxo3WmxmsdI6h4BFf+3SOiUHVWYNf1IjKR+V
+mG5oCybSjz0GFzcBj+SjkhM4lggkQKhRPzjqWDL2GTTrGoKHWdcV6tCcphCB3Zgz
+o5ObuW0SEYACHJ535H9QrDvB75mMervd0ZHdmDCtJgxze6rwrNMGrU28CIOUFIM7
+uhobdcNvFFlZ/kTzPC0/UTNWS7TwT8IhAlSYN7A7hX5cb1H/PK7TrBzux37VvRt4
+TUPiMpiUi0Ha6pNxnNtNX0jbQhPJMFA69ZD3R+ViiET63/J2ZdC5w+t3JkYxJj+K
+9PcjRX8CAwEAAaOBojCBnzAJBgNVHRMEAjAAMB0GA1UdDgQWBBRD9M3aA0xwS49h
+tPZ5cBIIZUVNqDBRBgNVHSMESjBIgBQfgnyX5vtKuv9mzvmKnXmTH8Cc2KEapBgw
+FjEUMBIGA1UEAwwLRWFzeS1SU0EgQ0GCFFgV0SauPQ7erBxVTSSB8oskg1EPMBMG
+A1UdJQQMMAoGCCsGAQUFBwMCMAsGA1UdDwQEAwIHgDANBgkqhkiG9w0BAQsFAAOC
+AQEAPmlNsl5Z5qeRzUDhzddw5c4fOacTgmHbS0jces6suoE81A8al6lbpY0g3vZa
+nDK7V/U/+M3XLzyQg4WQTR/bRSX1flDEy7KABUjt9N2m3fAirRnErJhEWPT+s4N6
+HpfRWQJ+z6H0Pp0uh6U+13KjuYVG1q/+MJ+7cF5UvLW1WZQ2eDOjf1Glt7tUW2ZZ
+TOfKfeyRHZlnU2ChfqOK2IoN7u3Ofe3ve6ZYSTKXVdaDUMJ9AxOU5m7SqBPEexBM
+tCXkJuFyPufFDwgmRzI/ohVHF8ZJUIat5jYnrHEJPaneoFdT+2QtkfLLzaGHiRnE
+Od22VQH8UFSKu7odZF8sHBGSVA==
+-----END CERTIFICATE-----
+-----BEGIN PRIVATE KEY-----
+MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDHSCHvPRpLHnLV
+UIudoOutFuBb7O30Og3nF8YhG07uJH8aN1psZrHSOoeARX/t0jolB1VmDX9SIykf
+lZhuaAsm0o89Bhc3AY/ko5ITOJYIJECoUT846lgy9hk06xqCh1nXFerQnKYQgd2Y
+M6OTm7ltEhGAAhyed+R/UKw7we+ZjHq73dGR3ZgwrSYMc3uq8KzTBq1NvAiDlBSD
+O7oaG3XDbxRZWf5E8zwtP1EzVku08E/CIQJUmDewO4V+XG9R/zyu06wc7sd+1b0b
+eE1D4jKYlItB2uqTcZzbTV9I20ITyTBQOvWQ90flYohE+t/ydmXQucPrdyZGMSY/
+ivT3I0V/AgMBAAECggEADxlOhOdexiFE9xeWtHc8VA1/K0fc0ZvScNdyyhBdHxsB
+zFU0UzFGuNR5bsUVR8odYK/ZDxXntyv10jBN79OPQL5EXw3GlYLXSa4BA9bOO0iv
+43Dgdun+i8Hsr/8+L3Sc4HiHJY4w4OBOD1meQ7FRT8vGKqo+S91uoRzWJ+LuSfZh
+8d7vMCvd1qX2p2wLW/GEB8UPim/6elnoXtr0iqjfZzZHKuMoWp0HYuyjdN6OC/UK
+38GyFtix2soIUDSP5hHk2vLVUq0RbEuNwz4Gf7W7YLMWAjUBK8qh3WM2HaPFwqv6
+yppN7jCzOc0Wi41C8sEbo7Ct0WqLrkG2qQ2Eo8/y1QKBgQD5vsoI0jl6wfjvlrjL
+3fR7u9joFGbXRBtu5QPwqozIXnxU5VBZvZ5Q/mgG9XfSWrUizOTHZP7qViPsHTqB
+f3paY53946wVrx2H2aDl8HagblDfJMxKVDBvSqoXfyVTQYYzk+EzyAQnddzArcQ4
+Egpl5Sa3qruEgs4/nZDsWcw17QKBgQDMRc2JVGBlYLDlx/NOYwTNjCdwVmjDG57C
+z5DUNHqX1vRTlxQsY8pCcYbrtr2pwz7e3IK9mg2gluhyNejTXhC7lWN/5n5QTQBO
+RbF40SCAVJFUjofW++g8fUZTREpKJ7qMAT/6NoZSmWvUSr2TvkoBEJnNHjKXfPDd
+KJRbFjU7mwKBgQCb8om/xl3EDLmAChKsopUWam8ARDUPeGTU80ZpkmXEfFOQw3xP
+/TqNgr68kazXenKfH2hAJg2TkGRv/LRaxppFNO0j63W6OJXtDXUOAABjH196Z0T1
+qOpxpCLf9zH8ce716AJ4zg3iAhPtcNQU2xcJF3T8vSzIitF1IdOr8kq05QKBgQCN
+keL8xkl4eSagWY86SE3P1s6OgJRihAXnpcsOBsDf8s2qEQ6eJRrMKboEKsYPnY05
+D0Jc/SNspKm8XbhapNqb5tDql2f7ZyJLHOn+fZE032dJXu6uBC/TnE7c7ns+IYKb
+/VHFq3w0Srf8jUAN4NeRHVw6WC9f5etYmwMWjbGe+QKBgQCJKVPdIy3dkjwdul3Y
+BEBDYkxDj34dGDWlfwddtMgCaVBbSlvwkb4h/HgaD7gBf/GhgYR1UAXafoRCQCE0
+tq/bQhRZ+Xin7qhVHi4FS4ig91TQHUwFaYQVrpEbWZSCgE6NGAbsbkp4uKOY1WDd
+igAuQb29cbkbSO5F7lsQjRrmAw==
+-----END PRIVATE KEY-----
diff --git a/app/src/test/resources/v4/riseup.net.cert b/app/src/test/resources/v4/riseup.net.cert
index 5181a66b..68f1a31d 100644
--- a/app/src/test/resources/v4/riseup.net.cert
+++ b/app/src/test/resources/v4/riseup.net.cert
@@ -1,43 +1,43 @@
-----BEGIN RSA PRIVATE KEY-----
-MIIEpAIBAAKCAQEAoubdIK609+1LgeOFWDt++yaizzQRgmYWGfV7MtK3H5FB4BG9
-dE0Y6Psfs1T9wgtZ1qf4gI0njpS7m5PlwDFkBCbbQ+frhSVwi9tJoQo8Npvc9VU8
-+0h1JTyySPNgKKrXzOTtkRgnVenf5HLJoBsMOyqlFkcoV3Rw3ca+n/pw87iriCyY
-HdQkh/i/psCG46s+p1O/C41dRoO4DQonCB68K0kA/EUM9KpTHxAw0f2Ug0X31st/
-z1apnCJn2LdzlW3qcgkrJgWJ0VkX1tImjuepfqYHme0m1yalavgUW27Hargl/MjY
-420BDA+hVyxfq0BpXCDUb8JmHvL5j7g+7SR4BwIDAQABAoIBABI3oSkDgKdtORF4
-gTQBy0yI4JItb3vWsMgMZM+lMudr1iMZuMclzBBZ7QygB5TIsi5IMIknv/G4/lYC
-ryHUJCw2sDSi3frQ2go55r0EqQEuYwJomt47Fyan6AQye2Fw4Zs/SrX8LoH0Gp6w
-m421GKQRO88G/CLzmZ+jlzPKzRDkO06RBK0kt2d6c2avOsk5KCLy/VhvLyMrbORe
-dSM+xHGIj1y83vgqy6mHFnDxRQrKTRskMrlZ04wIFf+ewke7eE7pBREki4ZPOGfi
-/CIpI0G6i5B3QnoJxdQcpFIYOYFu/ty3wsDEzfsRqEc+VPcgzGkvRGG1ewsrgIQ7
-bQQQGRkCgYEAxSxKPb1rVb5blIP+Mq8TqK7TeLL8ZXzkclIhtVh4lcCNTJpRN0Yk
-SnhlScWDg3gJ8Zb79pYz1PEiFjW0xK34VLXAWGeR2+YB8FUM1DpAJ1MEob1dA5ka
-fifc865AQLRB6bkM9xSqdTb7pQp5E88CE5w3ZCyQlPuBPGuS/zblLU0CgYEA04EA
-zaOZuaX0q/OvzLtsQqjbXHoCrd0pxEC2KZn+88sRvX0nk2sv8B58PMzYTrpKUHWg
-dJhwqGHNJVI5+v+1kyMtDgyIi0Yqqe5IqBzuk24ts0znODCXP4rVz9u5WdcIpofl
-Hhzg1svDtHPexswCaWF5HqHtyFA9dcENR0ZLIKMCgYEAvxAF+QHeSr4lXCrzXgXN
-VP3kKee3MFjvvd/cji/m2aY2xe4bmSY88HTuIahlojXl3Ndj3TT7kPMBBuiP/K5g
-HyXn90KVUrL1Wf/waI7xr6mAqYIn6d6oj2rtbqyB0rFZ1bPd3meGLgNTokAdx5Ym
-+v27pzSP/e4g832CehClz1kCgYEAoTeNCDKzQ7qHVObMUy9t5yXVB5mNH0AczRZS
-hEV4/BYHMLwMhadHhC2In8O5AdGoQcpXg2iLPx5FhDQ4M+XkXwKKHlJZZmgWry8N
-vO9Iv6JVPX3aJY+MSogmUGl40E1Dr8SYVarHi5MIWy2TW084a2E8NKhTmsPnBTIh
-T/n53CcCgYBuDeK4NoLne7h8q6TpSk/1p7fDkE/G5ueCcBOOrZBHan8y+VkUH1ZM
-rPkO8MprbJ+q/wBBfUvurycdHxtOQaahv7ZwIfKsXxGHShrhZseOTi1Wkkfw9kt2
-CE2U7O5Pn9KBKUwuPihaEqCtSjiSJKZr02UapFjS9R0FTAbf7LwYNg==
+MIIEowIBAAKCAQEA0OFWdcdiZtUfFQuADyIZyuFcIS5HIJIVaVY+D9g5bNqeqp6S
+xvtxTxykmm4A68Huwp99J20FWVUeNcPkscjtDxyWAcN9QcDFpgiYd0cQAsSDWX86
+sFd9pTzrWzO19kDfoHyMRlOEh0PAND5g/qTUPCDQzBudnf+0KwsxsoZUguRpWl7J
+jApGSWkuVH9gUmHSZFTX4U5jTgs3OVs9uih8aGtUlJPrH+1vlcQPMCSFopnziwq8
+OlTrunwUl7E2JN8E304vxZb6OrVo3VBqaVcY0emI0BFgqLDRokeDfhJfeLFV9IzX
+mI+e7K9e18Wx/8Ne8z2NfZx1usDEzT0PKZVHqQIDAQABAoIBAHHY388CBVgXAQHv
+arTU2UoC2rwbBRlzhcgMAXeRWntCDQjhtQ5PLcr4yZ6CJm5ZHVFmrEg425l9EyIq
+yxM7eDmsUvZTHoogD5oXRUJ9sPRRN2YoOkyy4wCU25Kx9JNreHd4atxJ2QoAm1ne
+Re+E10iOej9FLftXy1NKnqO3I4jTCKK6aUj3gayT7ot9Kr4v09S7G7gtgklbDqHY
+7Y88YNgb4E/P7j36BawiHE6tLT4ssrV8BpA5c9Tfc4208Z8s7PO9hOmr4VowJGk1
+JStWhZI4OBdTWFX3qYiKI1mDN1B7B02DYXz5g0zsA0ItLstTpY3/8dFNw0Ki0FoD
+EkF3MAECgYEA/Okk6yV/d7cRdnN6IKI6tMPSPRO254OWB21aJgLZEmprkVqtxDL5
+7hw7le7duZt+xmVlo7QqfRuVC4dbCO11+iTcS7FTe2ZnIYY3rdibqqSmGIFtuwI6
+B5ZRbl+sTpLp3QdVlazpyokwX4qtMkpJda95pBo4jU03CHIV+QF168ECgYEA026C
+bQaALllPyJ/56L6VLyOHIYQxwQCLJWJW3qquwuLnOGRh5QFq9yOW+eigU224ueNu
+p/IDL58qZpjnlSKNBMK9oCSn3fYuEQjSzLr2In1RlXaiY1yd5SomgKcYXxNmoqmZ
+TqVyzLeNydIb/US9C0ChObSUUrlKiAg41Gsi9ekCgYB81yDwKdxX3bfy/mGEhk/w
+NtEqcPbSJPQDyoi7RqCcJIfggiBQPtF8JdeL1RMBsa3MhPS88AwhIWJbBH99Uqnv
+xg4wFuIcgZnaxIPrfoaonwmWAx2FOD4ozJx5nSRSzNY/0oT+kxH8dee44Z1Iu76z
+JuEmjgLoTPsjYh1SgtQQgQKBgG8rbQKcZ2t3ZF7t1r5M7y4Q9S1nT63WdlNayKhd
+gHRSUBczmNGLlE2L9gdDDIGxcG61Keq+cnRosSevAB1HRHSbXI9Glsk7du9X/1bM
+ezyZPftjnHC4MwFaz1HYChV7ovymRki274y6eqACjNr3eJrhCaTI0TBJ4ulxwUfX
+aVN5AoGBAOAOfg8N2u+uZ1xrAKOoEkyYFzrkn2pq7e/9ewELoQEOCfF/Ad35Vz8h
+7cjmCkyZaTls6onJNHodK2H/O6DOZE/A1onUlyimScrfKiuwErCFSRMdulqFLEH+
+/i462yddISZFriuuWH/Q4HktO+kWVtl5eLNAXUj8+8s82cN/O9or
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
-MIICdjCCAh2gAwIBAgIQEvFlsBeZpYERAhfR59N3ijAKBggqhkjOPQQDAjAzMTEw
+MIICdzCCAh2gAwIBAgIQAh39shpuOn8d0h0Ce/7QdDAKBggqhkjOPQQDAjAzMTEw
LwYDVQQDDChMRUFQIFJvb3QgQ0EgKGNsaWVudCBjZXJ0aWZpY2F0ZXMgb25seSEp
-MB4XDTI0MDIxNzE2MDgxNVoXDTI0MDMyMzE2MDgxNVowFDESMBAGA1UEAxMJVU5M
-SU1JVEVEMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoubdIK609+1L
-geOFWDt++yaizzQRgmYWGfV7MtK3H5FB4BG9dE0Y6Psfs1T9wgtZ1qf4gI0njpS7
-m5PlwDFkBCbbQ+frhSVwi9tJoQo8Npvc9VU8+0h1JTyySPNgKKrXzOTtkRgnVenf
-5HLJoBsMOyqlFkcoV3Rw3ca+n/pw87iriCyYHdQkh/i/psCG46s+p1O/C41dRoO4
-DQonCB68K0kA/EUM9KpTHxAw0f2Ug0X31st/z1apnCJn2LdzlW3qcgkrJgWJ0VkX
-1tImjuepfqYHme0m1yalavgUW27Hargl/MjY420BDA+hVyxfq0BpXCDUb8JmHvL5
-j7g+7SR4BwIDAQABo2cwZTAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYIKwYB
-BQUHAwIwHQYDVR0OBBYEFIPsBEktjxealc2usc6QdNNK2xHFMB8GA1UdIwQYMBaA
-FH1KYtj/K0nEebaisdyOPmMHXKj+MAoGCCqGSM49BAMCA0cAMEQCIHMF70zfZQ7Y
-lcz0IDjFbHO/Xd+Mh0QSdcz6lU4OdXO4AiABPaZ/DUa2qBX8AWO4itwTEQYroeF8
-0onH42V60UWxEA==
+MB4XDTI0MDQwODEwNDI0OFoXDTI0MDUxMzEwNDI0OFowFDESMBAGA1UEAxMJVU5M
+SU1JVEVEMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0OFWdcdiZtUf
+FQuADyIZyuFcIS5HIJIVaVY+D9g5bNqeqp6SxvtxTxykmm4A68Huwp99J20FWVUe
+NcPkscjtDxyWAcN9QcDFpgiYd0cQAsSDWX86sFd9pTzrWzO19kDfoHyMRlOEh0PA
+ND5g/qTUPCDQzBudnf+0KwsxsoZUguRpWl7JjApGSWkuVH9gUmHSZFTX4U5jTgs3
+OVs9uih8aGtUlJPrH+1vlcQPMCSFopnziwq8OlTrunwUl7E2JN8E304vxZb6OrVo
+3VBqaVcY0emI0BFgqLDRokeDfhJfeLFV9IzXmI+e7K9e18Wx/8Ne8z2NfZx1usDE
+zT0PKZVHqQIDAQABo2cwZTAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYIKwYB
+BQUHAwIwHQYDVR0OBBYEFETwjXTp5v7YT0/Xp9Nt2HpZcOzfMB8GA1UdIwQYMBaA
+FH1KYtj/K0nEebaisdyOPmMHXKj+MAoGCCqGSM49BAMCA0gAMEUCIQCMavb+KPlg
+gdx7YX0wllm3hP/06rdnGsljxCwJAtBztgIgd1EHzAYmWQ2pmcW3/8utGdCj+41x
+fOUCgjLYY1ww/Sw=
-----END CERTIFICATE-----
diff --git a/app/src/test/resources/v4/riseup_eipservice_for_geoip_v4.json b/app/src/test/resources/v4/riseup_eipservice_for_geoip_v4.json
index 76fbea52..f3ce4b5f 100644
--- a/app/src/test/resources/v4/riseup_eipservice_for_geoip_v4.json
+++ b/app/src/test/resources/v4/riseup_eipservice_for_geoip_v4.json
@@ -9,7 +9,8 @@
{
"type":"openvpn",
"protocols":[
- "tcp"
+ "tcp",
+ "udp"
],
"ports":[
"443"
@@ -44,7 +45,8 @@
{
"type":"openvpn",
"protocols":[
- "tcp"
+ "tcp",
+ "udp"
],
"ports":[
"443"
@@ -66,7 +68,8 @@
{
"type":"openvpn",
"protocols":[
- "tcp"
+ "tcp",
+ "udp"
],
"ports":[
"443"
@@ -88,7 +91,8 @@
{
"type":"openvpn",
"protocols":[
- "tcp"
+ "tcp",
+ "udp"
],
"ports":[
"443"
@@ -123,7 +127,8 @@
{
"type":"openvpn",
"protocols":[
- "tcp"
+ "tcp",
+ "udp"
],
"ports":[
"443"