1873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau/*
2873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau * Copyright (C) 2009 The Android Open Source Project
3873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau *
4873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau * Licensed under the Apache License, Version 2.0 (the "License");
5873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau * you may not use this file except in compliance with the License.
6873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau * You may obtain a copy of the License at
7873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau *
8873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau *      http://www.apache.org/licenses/LICENSE-2.0
9873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau *
10873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau * Unless required by applicable law or agreed to in writing, software
11873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau * distributed under the License is distributed on an "AS IS" BASIS,
12873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau * See the License for the specific language governing permissions and
14873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau * limitations under the License.
15873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau */
16873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau
171a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenpackage android.net.vpn;
18873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau
1953582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyanimport android.content.BroadcastReceiver;
2053582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyanimport android.content.Context;
2153582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyanimport android.content.Intent;
2253582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyanimport android.net.vpn.L2tpProfile;
23873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lauimport android.net.vpn.L2tpIpsecProfile;
2453582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyanimport android.net.vpn.L2tpIpsecPskProfile;
2553582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyanimport android.net.vpn.PptpProfile;
2653582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyanimport android.net.vpn.VpnManager;
2753582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyanimport android.net.vpn.VpnProfile;
2853582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyanimport android.net.vpn.VpnState;
29873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lauimport android.net.vpn.VpnType;
3053582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyanimport android.os.ConditionVariable;
3153582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyanimport android.os.Parcel;
32873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lauimport android.test.AndroidTestCase;
33b42c3a5809b16527b38c82be3165128ce10e77e6Yu Shan Emily Lauimport android.test.suitebuilder.annotation.SmallTest;
3453582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyanimport android.text.TextUtils;
35873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau
36873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau/**
37873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau * Unit test class to test VPN api
38873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau * Use the below command to run the vpn unit test only
39873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau * runtest vpntest or
40873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau * adb shell am instrument -e class 'com.android.unit_tests.VpnTest'
41873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau *   -w com.android.unit_tests/android.test.InstrumentationTestRunner
42873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau */
43873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Laupublic class VpnTest extends AndroidTestCase {
4453582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    private static final String NAME = "a name";
4553582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    private static final String SERVER_NAME = "a server name";
4653582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    private static final String ID = "some id";
4753582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    private static final String SUFFICES = "some suffices";
4853582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    private static final String ROUTES = "some routes";
4953582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    private static final String SAVED_NAME = "some name";
50873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau
51873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau    @Override
52873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau    public void setUp() {
53873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau    }
54873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau
55873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau    @Override
56873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau    public void tearDown() {
57873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau    }
58873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau
59873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau    @SmallTest
6053582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    public void testVpnType() {
6153582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        testVpnType(VpnType.L2TP);
6253582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        testVpnType(VpnType.L2TP_IPSEC);
6353582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        testVpnType(VpnType.L2TP_IPSEC_PSK);
6453582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        testVpnType(VpnType.PPTP);
6553582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    }
6653582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan
6753582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    @SmallTest
6853582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    public void testVpnProfile() {
6953582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        VpnState state = VpnState.CONNECTING;
7053582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        testVpnProfile(createTestProfile(state), state);
7153582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    }
7253582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan
7353582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    @SmallTest
74873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau    public void testGetType() {
7553582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        assertEquals(VpnType.L2TP, new L2tpProfile().getType());
7653582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        assertEquals(VpnType.L2TP_IPSEC, new L2tpIpsecProfile().getType());
7753582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        assertEquals(VpnType.L2TP_IPSEC_PSK,
7853582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan                new L2tpIpsecPskProfile().getType());
7953582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        assertEquals(VpnType.PPTP, new PptpProfile().getType());
8053582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    }
8153582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan
8253582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    @SmallTest
8353582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    public void testVpnTypes() {
8453582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        assertTrue(VpnManager.getSupportedVpnTypes().length > 0);
8553582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    }
8653582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan
8753582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    @SmallTest
8853582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    public void testGetTypeFromManager() {
8953582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        VpnManager m = new VpnManager(getContext());
9053582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        VpnType[] types = VpnManager.getSupportedVpnTypes();
9153582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        for (VpnType t : types) {
9253582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan            assertEquals(t, m.createVpnProfile(t).getType());
9353582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        }
9453582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    }
9553582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan
9653582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    @SmallTest
9753582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    public void testParcelable() {
9853582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        VpnProfile p = createTestProfile(VpnState.CONNECTED);
9953582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        Parcel parcel = Parcel.obtain();
10053582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        p.writeToParcel(parcel, 0);
10153582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        parcel.setDataPosition(0);
10253582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan
10353582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        // VpnState is transient and not saved in the parcel
10453582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        testVpnProfile(VpnProfile.CREATOR.createFromParcel(parcel), null);
10553582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    }
10653582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan
10753582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    @SmallTest
10853582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    public void testReceiver() {
10953582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        final String profileName = "whatever";
11053582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        final VpnState state = VpnState.DISCONNECTING;
11153582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        final ConditionVariable cv = new ConditionVariable();
11253582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        cv.close();
11353582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        BroadcastReceiver r = new BroadcastReceiver() {
11453582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan            public void onReceive(Context c, Intent i) {
11553582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan                assertEquals(profileName,
11653582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan                        i.getStringExtra(VpnManager.BROADCAST_PROFILE_NAME));
11753582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan                assertEquals(state, i.getSerializableExtra(
11853582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan                        VpnManager.BROADCAST_CONNECTION_STATE));
11953582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan                cv.open();
12053582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan            }
12153582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        };
12253582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan
12353582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        VpnManager m = new VpnManager(getContext());
12453582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        m.registerConnectivityReceiver(r);
12553582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        m.broadcastConnectivity(profileName, state);
12653582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan
12753582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        // fail it if onReceive() doesn't get executed in 5 sec
12853582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        assertTrue(cv.block(5000));
12953582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    }
13053582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan
13153582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    private void testVpnType(VpnType type) {
13253582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        assertFalse(TextUtils.isEmpty(type.getDisplayName()));
13353582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        assertNotNull(type.getProfileClass());
13453582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    }
13553582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan
13653582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    private VpnProfile createTestProfile(VpnState state) {
13753582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        VpnProfile p = new L2tpProfile();
13853582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        p.setName(NAME);
13953582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        p.setServerName(SERVER_NAME);
14053582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        p.setId(ID);
14153582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        p.setDomainSuffices(SUFFICES);
14253582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        p.setRouteList(ROUTES);
14353582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        p.setSavedUsername(SAVED_NAME);
14453582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        p.setState(state);
14553582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        return p;
14653582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    }
14753582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan
14853582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan    private void testVpnProfile(VpnProfile p, VpnState state) {
14953582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        assertEquals(NAME, p.getName());
15053582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        assertEquals(SERVER_NAME, p.getServerName());
15153582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        assertEquals(ID, p.getId());
15253582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        assertEquals(SUFFICES, p.getDomainSuffices());
15353582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        assertEquals(ROUTES, p.getRouteList());
15453582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        assertEquals(SAVED_NAME, p.getSavedUsername());
15553582b33e5d36cd993ead3dc87f94cd945fab176Hung-ying Tyan        if (state != null) assertEquals(state, p.getState());
156873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau    }
157873eb573945567a33e0a986e82ec650bf6af905aYu Shan Emily Lau}
158