diff options
Diffstat (limited to 'app/src/test')
22 files changed, 1526 insertions, 743 deletions
diff --git a/app/src/test/java/de/blinkt/openvpn/VpnProfileTest.java b/app/src/test/java/de/blinkt/openvpn/VpnProfileTest.java index 43df146b..aa098b94 100644 --- a/app/src/test/java/de/blinkt/openvpn/VpnProfileTest.java +++ b/app/src/test/java/de/blinkt/openvpn/VpnProfileTest.java @@ -33,15 +33,16 @@ import se.leap.bitmaskclient.pluggableTransports.models.Obfs4Options; 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\":\"8080\",\"mUseUdp\":true,\"mProxyPort\":\"\",\"mUseCustomConfig\":false,\"options\":{\"bridgeIP\":\"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\":\"127.0.0.1\",\"mProxyType\":\"NONE\",\"mConnectTimeout\":0,\"mServerPort\":\"8080\",\"mUseUdp\":true,\"mProxyPort\":\"\",\"mUseCustomConfig\":false,\"options\":{\"bridgeIP\":\"192.168.0.1\",\"transport\":{\"options\":{\"portCount\":0,\"iatMode\":\"1\",\"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_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\":{\"portCount\":0,\"iatMode\":\"1\",\"cert\":\"CERT\",\"experimental\":false,\"portSeed\":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 = "{\"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\":\"127.0.0.1\",\"mProxyType\":\"NONE\",\"mConnectTimeout\":0,\"mServerPort\":\"8080\",\"mUseUdp\":true,\"mProxyPort\":\"\",\"mUseCustomConfig\":false,\"options\":{\"bridgeIP\":\"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\":\"\",\"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\":\"127.0.0.1\",\"mProxyType\":\"NONE\",\"mConnectTimeout\":0,\"mServerPort\":\"8080\",\"mUseUdp\":true,\"mProxyPort\":\"\",\"mUseCustomConfig\":false,\"options\":{\"bridgeIP\":\"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\":\"\",\"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\":\"127.0.0.1\",\"mProxyType\":\"NONE\",\"mConnectTimeout\":0,\"mServerPort\":\"8080\",\"mUseUdp\":true,\"mProxyPort\":\"\",\"mUseCustomConfig\":false,\"options\":{\"bridgeIP\":\"192.168.0.1\",\"transport\":{\"options\":{\"portCount\":100,\"iatMode\":\"1\",\"cert\":\"CERT\",\"experimental\":true,\"portSeed\":200},\"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"; + 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() { @@ -129,11 +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 { 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)); @@ -153,7 +172,7 @@ public class VpnProfileTest { 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)); @@ -172,7 +191,7 @@ public class VpnProfileTest { public void toJson_obfs4hop() throws JSONException { 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)); @@ -242,4 +261,21 @@ public class VpnProfileTest { 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 ee6cd30f..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,6 +125,20 @@ public class ProviderTest { } @Test + public void testIsExperimentalPluggableTransportsSupported_Obfs4Quic_returnsTrue() throws Exception { + Provider p1 = TestSetupHelper.getProvider( + "https://pt.demo.bitmask.net", + null, + null, + null, + null, + null, + "multiple_pts_per_host_eip-service.json", + null); + assertTrue(p1.supportsExperimentalPluggableTransports()); + } + + @Test public void testSupportsPluggableTransports_Obfs4Kcp_obsvpn_returnsTrue() throws Exception { BuildConfigHelper helper = MockHelper.mockBuildConfigHelper(true); @@ -133,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 9286a787..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,7 @@ 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; @@ -19,14 +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.function.ThrowingRunnable; +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; @@ -34,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; @@ -45,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) @@ -87,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); @@ -98,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 @@ -115,9 +139,10 @@ 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)); } @@ -132,8 +157,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); - assertThrows(ConfigParser.ConfigParseError.class, () -> configGenerator.createProfile(OBFS4)); + configuration.transports = Transport.createTransportsFrom(gateway1, 3); + VpnConfigGenerator configGenerator = new VpnConfigGenerator(provider.getDefinition(), secrets, configuration); + assertThrows(ConfigParser.ConfigParseError.class, () -> createProfile(configGenerator, OBFS4)); } @Test @@ -147,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 @@ -164,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)); } @@ -181,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)); } @@ -198,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)); } @@ -212,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 @@ -226,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")); } @@ -246,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 @@ -264,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); } } @@ -279,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 @@ -295,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 @@ -309,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 @@ -325,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)); } @@ -342,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 @@ -358,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 @@ -375,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 @@ -388,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 @@ -400,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 @@ -413,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 @@ -426,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/VpnConfigGeneratorTest.java b/app/src/test/java/se/leap/bitmaskclient/eip/VpnConfigGeneratorTest.java index 7581a395..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,26 +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 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; @@ -35,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; @@ -54,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" + @@ -150,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" + @@ -246,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" + @@ -342,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" + @@ -438,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" + @@ -534,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" + @@ -630,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" + @@ -726,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" + @@ -828,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" + @@ -930,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" + @@ -1041,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" + @@ -1144,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" + @@ -1245,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" + @@ -1347,54 +1358,69 @@ 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()); } @@ -1402,54 +1428,51 @@ public class VpnConfigGeneratorTest { public void testGenerateVpnProfile_v3_obfs4() throws Exception { BuildConfigHelper buildConfigHelper = MockHelper.mockBuildConfigHelper(false); gateway = new JSONObject(TestSetupHelper.getInputAsString(getClass().getClassLoader().getResourceAsStream("ptdemo.bitmask.eip-service-obfsvpn1.0.0.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()); + 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-obfsvpn1.0.0.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()); + 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 @@ -1457,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)); } /** @@ -1524,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()); } /** @@ -1541,12 +1559,11 @@ 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)); } /** @@ -1556,79 +1573,74 @@ public class VpnConfigGeneratorTest { 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 = 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)); } @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); + 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 @@ -1641,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")); } @@ -1658,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 @@ -1678,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) && ((Obfs4Connection)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) && ((Obfs4Connection)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 @@ -1722,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 @@ -1736,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 @@ -1764,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(((Obfs4Connection)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 @@ -1780,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(); @@ -1798,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(((Obfs4Connection)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 b8c6d0c9..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,6 +175,7 @@ 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); TorStatusObservable torStatusObservable = TorStatusObservable.getInstance(); @@ -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(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/MockHelper.java b/app/src/test/java/se/leap/bitmaskclient/testutils/MockHelper.java index 1b94042e..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; @@ -218,8 +203,8 @@ public class MockHelper { } @Override - public boolean useKcp() { - return false; + public String obfsvpnTransportProtocol() { + return "tcp"; } @Override @@ -237,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()). @@ -257,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()). @@ -274,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/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 |