1e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum/*
2e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum * Copyright (C) 2017 The Android Open Source Project
3e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum *
4e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum * Licensed under the Apache License, Version 2.0 (the "License");
5e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum * you may not use this file except in compliance with the License.
6e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum * You may obtain a copy of the License at
7e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum *
8e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum *      http://www.apache.org/licenses/LICENSE-2.0
9e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum *
10e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum * Unless required by applicable law or agreed to in writing, software
11e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum * distributed under the License is distributed on an "AS IS" BASIS,
12e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum * See the License for the specific language governing permissions and
14e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum * limitations under the License.
15e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum */
16e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum
17e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaumpackage android.net.lowpan;
18e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum
19e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaumimport static org.junit.Assert.assertEquals;
20e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaumimport static org.junit.Assert.assertArrayEquals;
21e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum
22e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaumimport android.os.Parcel;
23e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaumimport android.support.test.runner.AndroidJUnit4;
24e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaumimport android.test.suitebuilder.annotation.SmallTest;
25e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaumimport org.junit.Test;
26e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaumimport org.junit.runner.RunWith;
27e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum
28e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum@RunWith(AndroidJUnit4.class)
29e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum@SmallTest
30e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaumpublic class LowpanProvisionTest {
31e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum
32e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum    static {
33e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum        System.loadLibrary("frameworkslowpantestsjni");
34e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum    }
35e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum
36e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum    private static native byte[] readAndWriteNative(byte[] inParcel);
37e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum
38e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum    public void testNativeParcelUnparcel(LowpanProvision original) {
39e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum        byte[] inParcel = marshall(original);
40e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum        byte[] outParcel = readAndWriteNative(inParcel);
41e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum        LowpanProvision roundTrip = unmarshall(outParcel);
42e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum
43e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum        assertEquals(original, roundTrip);
44e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum        assertArrayEquals(inParcel, outParcel);
45e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum    }
46e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum
47e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum    @Test
48e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum    public void testNativeParcelUnparcel() {
49e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum        testNativeParcelUnparcel(
50e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                new LowpanProvision.Builder()
51e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                        .setLowpanIdentity(
52e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                new LowpanIdentity.Builder()
53e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                        .setName("TestNet1")
54e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                        .setPanid(0x1234)
55e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                        .setXpanid(
56e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                                new byte[] {
57e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                                    (byte) 0x00,
58e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                                    (byte) 0x11,
59e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                                    (byte) 0x22,
60e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                                    (byte) 0x33,
61e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                                    (byte) 0x44,
62e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                                    (byte) 0x55,
63e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                                    (byte) 0x66,
64e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                                    (byte) 0x77
65e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                                })
66e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                        .setType(LowpanInterface.NETWORK_TYPE_THREAD_V1)
67e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                        .setChannel(15)
68e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                        .build())
69e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                        .build());
70e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum        testNativeParcelUnparcel(
71e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                new LowpanProvision.Builder()
72e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                        .setLowpanIdentity(
73e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                new LowpanIdentity.Builder()
74e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                        .setName("TestNet2")
75e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                        .setPanid(0x5678)
76e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                        .setXpanid(
77e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                                new byte[] {
78e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                                    (byte) 0x88,
79e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                                    (byte) 0x99,
80e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                                    (byte) 0xaa,
81e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                                    (byte) 0xbb,
82e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                                    (byte) 0xcc,
83e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                                    (byte) 0xdd,
84e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                                    (byte) 0xee,
85e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                                    (byte) 0xff
86e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                                })
87e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                        .setType("bork-bork-bork")
88e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                        .setChannel(16)
89e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                        .build())
90e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                        .setLowpanCredential(
91e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                LowpanCredential.createMasterKey(
92e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                        new byte[] {
93e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                            (byte) 0x88,
94e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                            (byte) 0x99,
95e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                            (byte) 0xaa,
96e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                            (byte) 0xbb,
97e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                            (byte) 0xcc,
98e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                            (byte) 0xdd,
99e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                            (byte) 0xee,
100e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                            (byte) 0xff
101e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                                        }))
102e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum                        .build());
103e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum    }
104e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum
105e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum    /**
106e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum     * Write a {@link LowpanProvision} into an empty parcel and return the underlying data.
107e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum     *
108e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum     * @see unmarshall(byte[])
109e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum     */
110e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum    private static byte[] marshall(LowpanProvision addr) {
111e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum        Parcel p = Parcel.obtain();
112e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum        addr.writeToParcel(p, /* flags */ 0);
113e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum        p.setDataPosition(0);
114e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum        return p.marshall();
115e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum    }
116e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum
117e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum    /**
118e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum     * Read raw bytes into a parcel, and read a {@link LowpanProvision} back out of them.
119e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum     *
120e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum     * @see marshall(LowpanProvision)
121e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum     */
122e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum    private static LowpanProvision unmarshall(byte[] data) {
123e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum        Parcel p = Parcel.obtain();
124e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum        p.unmarshall(data, 0, data.length);
125e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum        p.setDataPosition(0);
126e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum        return LowpanProvision.CREATOR.createFromParcel(p);
127e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum    }
128e6a1be5f36c91c12ba89bca99233bdb9d7b448e0Robert Quattlebaum}
129