package com.lechucksoftware.proxy.proxysettings.test;
import android.os.Parcel;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.Smoke;
import com.lechucksoftware.proxy.proxysettings.App;
import com.lechucksoftware.proxy.proxysettings.db.PacEntity;
import com.lechucksoftware.proxy.proxysettings.db.ProxyEntity;
import com.lechucksoftware.proxy.proxysettings.db.WiFiAPEntity;
import com.lechucksoftware.proxy.proxysettings.utils.startup.StartupAction;
import com.lechucksoftware.proxy.proxysettings.utils.startup.StartupActions;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.List;
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.reflection.ReflectionUtils;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
@RunWith(AndroidJUnit4.class)
@Smoke
public class ParcelableTests
{
@Before
public void setUp() throws Exception
{
APL.setup(InstrumentationRegistry.getContext());
TestUtils.addRandomProxy();
}
@After
public void tearDown () throws Exception
{
}
@Test
public void testParcelableWiFiApConfig() throws Exception
{
Map<APLNetworkId, WiFiApConfig> configurations = APL.getWifiAPConfigurations();
for(WiFiApConfig config : configurations.values())
{
testParcelability(WiFiApConfig.class, config);
}
}
@Test
public void testParcelableAPLNetworkId() throws Exception
{
Map<APLNetworkId, WiFiApConfig> configurations = APL.getWifiAPConfigurations();
assertTrue(configurations.size() > 0);
APLNetworkId networkId = (APLNetworkId) configurations.keySet().toArray()[0];
testParcelability(APLNetworkId.class, networkId);
}
@Test
public void testParcelableWiFiAPEntity() throws Exception
{
WiFiAPEntity wiFiAPEntity = App.getDBManager().getRandomWifiAp();
testParcelability(WiFiAPEntity.class, wiFiAPEntity);
}
@Test
public void testParcelableProxyEntity() throws Exception
{
ProxyEntity proxyEntity = App.getDBManager().getRandomProxy();
testParcelability(ProxyEntity.class, proxyEntity);
}
@Test
public void testParcelablePacEntity() throws Exception
{
PacEntity pacEntity = App.getDBManager().getRandomPac();
testParcelability(PacEntity.class, pacEntity);
}
@Test
public void testParcelableStartupAction() throws Exception
{
Collection<StartupAction> availableActions = StartupActions.getAvailableActions().values();
for (StartupAction action : availableActions)
{
testParcelability(StartupAction.class, action);
}
}
public void testParcelability(Class cl, Object originalObject) throws Exception
{
assertNotNull(originalObject);
Method writeToParcelMethod = ReflectionUtils.getMethod(cl.getMethods(),"writeToParcel");
writeToParcelMethod.setAccessible(true);
Class[] knownParam = new Class[1];
knownParam[0] = Parcel.class;
Constructor parcelConstructor = ReflectionUtils.getConstructor(cl.getDeclaredConstructors(), knownParam);
parcelConstructor.setAccessible(true);
Method equalsMethod = ReflectionUtils.getMethod(cl.getMethods(), "equals");
equalsMethod.setAccessible(true);
assertNotNull(writeToParcelMethod);
assertNotNull(parcelConstructor);
assertNotNull(equalsMethod);
// Obtain a Parcel object and write the parcelable object to it:
Parcel parcel = Parcel.obtain();
writeToParcelMethod.invoke(originalObject, parcel, 0);
// After you're done with writing, you need to reset the parcel for reading:
parcel.setDataPosition(0);
Object objectFromParcel = parcelConstructor.newInstance(parcel);
assertNotNull(objectFromParcel);
assertFalse(originalObject == objectFromParcel);
assertTrue((Boolean) equalsMethod.invoke(originalObject, objectFromParcel));
}
}