package com.lechucksoftware.proxy.proxysettings.test;
import android.os.Build;
import android.support.test.InstrumentationRegistry;
import android.support.test.espresso.action.ViewActions;
import android.support.test.filters.RequiresDevice;
import android.support.test.filters.SdkSuppress;
import android.support.test.runner.AndroidJUnit4;
import android.test.ActivityInstrumentationTestCase2;
import android.test.suitebuilder.annotation.Smoke;
import android.view.KeyEvent;
import android.view.View;
import com.lechucksoftware.proxy.proxysettings.App;
import com.lechucksoftware.proxy.proxysettings.R;
import com.lechucksoftware.proxy.proxysettings.db.PacEntity;
import com.lechucksoftware.proxy.proxysettings.db.ProxyEntity;
import com.lechucksoftware.proxy.proxysettings.ui.activities.MasterActivity;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.Map;
import be.shouldit.proxy.lib.APL;
import be.shouldit.proxy.lib.APLNetworkId;
import be.shouldit.proxy.lib.WiFiApConfig;
import be.shouldit.proxy.lib.enums.SecurityType;
import be.shouldit.proxy.lib.reflection.android.ProxySetting;
import static android.support.test.espresso.Espresso.onData;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.action.ViewActions.typeText;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.contrib.DrawerActions.openDrawer;
import static android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA;
import static android.support.test.espresso.matcher.ViewMatchers.isRoot;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.hasToString;
import static org.hamcrest.Matchers.notNullValue;
import static org.junit.Assert.assertThat;
@RunWith(AndroidJUnit4.class)
@Smoke
public class BasicAppTests extends ActivityInstrumentationTestCase2<MasterActivity>
{
private MasterActivity mActivity;
public BasicAppTests()
{
super(MasterActivity.class);
}
@Before
@Override
public void setUp() throws Exception
{
super.setUp();
injectInstrumentation(InstrumentationRegistry.getInstrumentation());
mActivity = getActivity();
}
@After
@Override
public void tearDown () throws Exception
{
mActivity.finish();
}
@Test
public void testCheckPreconditions()
{
assertThat(mActivity, notNullValue());
// Check that Instrumentation was correctly injected in setUp()
assertThat(getInstrumentation(), notNullValue());
}
@SuppressWarnings("unchecked")
@Test
public void testCreateNewStaticProxy()
{
openDrawer(R.id.drawer_layout);
onView(withText(R.string.static_proxies)).perform(click());
onView(withId(R.id.add_new_static_proxy)).perform(click());
ProxyEntity staticProxy = TestUtils.createRandomHTTPProxy();
onView(allOf(withId(R.id.field_value), isDescendantOfA(withId(R.id.proxy_host)))).perform(typeText(staticProxy.getHost()));
onView(allOf(withId(R.id.field_value), isDescendantOfA(withId(R.id.proxy_port)))).perform(typeText(String.valueOf(staticProxy.getPort())));
onView(withId(R.id.menu_save)).perform(click());
assertTrue(App.getDBManager().findProxy(staticProxy.getHost(), staticProxy.getPort(), "") != -1);
}
@SuppressWarnings("unchecked")
@Test
@SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP)
public void testCreateNewPACProxy()
{
openDrawer(R.id.drawer_layout);
onView(withText(R.string.pac_proxies)).perform(click());
onView(withId(R.id.add_new_pac_proxy)).perform(click());
PacEntity pacProxy = TestUtils.createRandomPACProxy();
onView(allOf(withId(R.id.field_value), isDescendantOfA(withId(R.id.pac_url)))).perform(typeText(String.valueOf(pacProxy.getPacUriFile())));
onView(withId(R.id.menu_save)).perform(click());
}
@SuppressWarnings("unchecked")
@Test
@RequiresDevice
public void testsEnableStaticProxyForWifiNetwork()
{
assertTrue(APL.getWifiManager().isWifiEnabled());
openDrawer(R.id.drawer_layout);
onView(withText(R.string.wifi_networks)).perform(click());
Map<APLNetworkId, WiFiApConfig> configuredNetworks = APL.getWifiAPConfigurations();
assertTrue(App.getDBManager().getProxiesCount() > 0);
assertTrue(configuredNetworks.size() > 0);
WiFiApConfig selectedWifiApConfig = null;
ProxyEntity selectedProxyEntity = App.getDBManager().getRandomProxy();
for (APLNetworkId networkId : configuredNetworks.keySet())
{
WiFiApConfig wifiApConfig = configuredNetworks.get(networkId);
if ((wifiApConfig.getSecurityType() != SecurityType.SECURITY_EAP)
&& wifiApConfig.getProxySetting() == ProxySetting.NONE)
{
selectedWifiApConfig = wifiApConfig;
break;
}
}
assertNotNull(selectedWifiApConfig);
assertNotNull(selectedProxyEntity);
// Enable proxy
onData(hasToString(containsString(String.format("SSID: %s\n",selectedWifiApConfig.getSSID()))))
.inAdapterView(withId(android.R.id.list))
.perform(click());
onView(withId(R.id.wifi_name)).check(matches(withText(selectedWifiApConfig.getSSID())));
onView(withId(R.id.wifi_proxy_switch)).perform(click());
onView(withId(R.id.proxy_selector)).perform(click());
onData(hasToString(containsString(String.format("%s", selectedProxyEntity.getHost()))))
.inAdapterView(allOf(withId(android.R.id.list), isDescendantOfA(withId(R.id.static_proxy_list))))
.perform(click());
onView(isRoot()).perform(ViewActions.pressBack());
// Disable proxy
onData(hasToString(containsString(String.format("SSID: %s\n",selectedWifiApConfig.getSSID()))))
.inAdapterView(withId(android.R.id.list))
.perform(click());
onView(withId(R.id.wifi_name)).check(matches(withText(selectedWifiApConfig.getSSID())));
onView(withId(R.id.wifi_proxy_switch)).perform(click());
onView(isRoot()).perform(ViewActions.pressBack());
ViewActions.pressKey(KeyEvent.KEYCODE_HOME);
}
@SuppressWarnings("unchecked")
@Test
@RequiresDevice
@SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP)
public void testsEnablePACProxyForWifiNetwork()
{
assertTrue(APL.getWifiManager().isWifiEnabled());
openDrawer(R.id.drawer_layout);
onView(withText(R.string.wifi_networks)).perform(click());
Map<APLNetworkId, WiFiApConfig> configuredNetworks = APL.getWifiAPConfigurations();
assertTrue(App.getDBManager().getPacCount() > 0);
assertTrue(configuredNetworks.size() > 0);
WiFiApConfig selectedWifiApConfig = null;
PacEntity selectedPacProxyEntity = App.getDBManager().getRandomPac();
for (APLNetworkId networkId : configuredNetworks.keySet())
{
WiFiApConfig wifiApConfig = configuredNetworks.get(networkId);
if ((wifiApConfig.getSecurityType() != SecurityType.SECURITY_EAP)
&& wifiApConfig.getProxySetting() == ProxySetting.NONE)
{
selectedWifiApConfig = wifiApConfig;
break;
}
}
assertNotNull(selectedWifiApConfig);
assertNotNull(selectedPacProxyEntity);
onData(hasToString(containsString(String.format("SSID: %s\n",selectedWifiApConfig.getSSID()))))
.inAdapterView(withId(android.R.id.list))
.perform(click());
onView(withId(R.id.wifi_name)).check(matches(withText(selectedWifiApConfig.getSSID())));
onView(withId(R.id.wifi_proxy_switch)).perform(click());
onView(withId(R.id.proxy_selector)).perform(click());
onView(withText(R.string.pac_proxies)).perform(click());
onData(hasToString(containsString(String.format("%s",selectedPacProxyEntity.getPacUriFile().toString()))))
.inAdapterView(allOf(withId(android.R.id.list), isDescendantOfA(withId(R.id.pac_proxy_list))))
.perform(click());
onView(isRoot()).perform(ViewActions.pressBack());
// Disable proxy
onData(hasToString(containsString(String.format("SSID: %s\n",selectedWifiApConfig.getSSID()))))
.inAdapterView(withId(android.R.id.list))
.perform(click());
onView(withId(R.id.wifi_name)).check(matches(withText(selectedWifiApConfig.getSSID())));
onView(withId(R.id.wifi_proxy_switch)).perform(click());
onView(isRoot()).perform(ViewActions.pressBack());
}
}