1cfe2669028074a204fc55afebbae630423a806f2Robin Lee/*
2cfe2669028074a204fc55afebbae630423a806f2Robin Lee * Copyright (C) 2016 The Android Open Source Project
3cfe2669028074a204fc55afebbae630423a806f2Robin Lee *
4cfe2669028074a204fc55afebbae630423a806f2Robin Lee * Licensed under the Apache License, Version 2.0 (the "License");
5cfe2669028074a204fc55afebbae630423a806f2Robin Lee * you may not use this file except in compliance with the License.
6cfe2669028074a204fc55afebbae630423a806f2Robin Lee * You may obtain a copy of the License at
7cfe2669028074a204fc55afebbae630423a806f2Robin Lee *
8cfe2669028074a204fc55afebbae630423a806f2Robin Lee *      http://www.apache.org/licenses/LICENSE-2.0
9cfe2669028074a204fc55afebbae630423a806f2Robin Lee *
10cfe2669028074a204fc55afebbae630423a806f2Robin Lee * Unless required by applicable law or agreed to in writing, software
11cfe2669028074a204fc55afebbae630423a806f2Robin Lee * distributed under the License is distributed on an "AS IS" BASIS,
12cfe2669028074a204fc55afebbae630423a806f2Robin Lee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cfe2669028074a204fc55afebbae630423a806f2Robin Lee * See the License for the specific language governing permissions and
14cfe2669028074a204fc55afebbae630423a806f2Robin Lee * limitations under the License.
15cfe2669028074a204fc55afebbae630423a806f2Robin Lee */
16cfe2669028074a204fc55afebbae630423a806f2Robin Lee
17cfe2669028074a204fc55afebbae630423a806f2Robin Leepackage android.net;
18cfe2669028074a204fc55afebbae630423a806f2Robin Lee
19cfe2669028074a204fc55afebbae630423a806f2Robin Leeimport android.os.Parcel;
20cfe2669028074a204fc55afebbae630423a806f2Robin Leeimport android.test.suitebuilder.annotation.SmallTest;
21cfe2669028074a204fc55afebbae630423a806f2Robin Lee
22cfe2669028074a204fc55afebbae630423a806f2Robin Leeimport junit.framework.TestCase;
23cfe2669028074a204fc55afebbae630423a806f2Robin Lee
24cfe2669028074a204fc55afebbae630423a806f2Robin Leeimport static org.junit.Assert.assertArrayEquals;
25cfe2669028074a204fc55afebbae630423a806f2Robin Lee
26cfe2669028074a204fc55afebbae630423a806f2Robin Leepublic class UidRangeTest extends TestCase {
27cfe2669028074a204fc55afebbae630423a806f2Robin Lee
28cfe2669028074a204fc55afebbae630423a806f2Robin Lee    static {
29cfe2669028074a204fc55afebbae630423a806f2Robin Lee        System.loadLibrary("servicestestsjni");
30cfe2669028074a204fc55afebbae630423a806f2Robin Lee    }
31cfe2669028074a204fc55afebbae630423a806f2Robin Lee
32cfe2669028074a204fc55afebbae630423a806f2Robin Lee    private static native byte[] readAndWriteNative(byte[] inParcel);
33cfe2669028074a204fc55afebbae630423a806f2Robin Lee    private static native int getStart(byte[] inParcel);
34cfe2669028074a204fc55afebbae630423a806f2Robin Lee    private static native int getStop(byte[] inParcel);
35cfe2669028074a204fc55afebbae630423a806f2Robin Lee
36cfe2669028074a204fc55afebbae630423a806f2Robin Lee    @SmallTest
37cfe2669028074a204fc55afebbae630423a806f2Robin Lee    public void testNativeParcelUnparcel() {
38cfe2669028074a204fc55afebbae630423a806f2Robin Lee        UidRange original = new UidRange(1234, Integer.MAX_VALUE);
39cfe2669028074a204fc55afebbae630423a806f2Robin Lee
40cfe2669028074a204fc55afebbae630423a806f2Robin Lee        byte[] inParcel = marshall(original);
41cfe2669028074a204fc55afebbae630423a806f2Robin Lee        byte[] outParcel = readAndWriteNative(inParcel);
42cfe2669028074a204fc55afebbae630423a806f2Robin Lee        UidRange roundTrip = unmarshall(outParcel);
43cfe2669028074a204fc55afebbae630423a806f2Robin Lee
44cfe2669028074a204fc55afebbae630423a806f2Robin Lee        assertEquals(original, roundTrip);
45cfe2669028074a204fc55afebbae630423a806f2Robin Lee        assertArrayEquals(inParcel, outParcel);
46cfe2669028074a204fc55afebbae630423a806f2Robin Lee    }
47cfe2669028074a204fc55afebbae630423a806f2Robin Lee
48cfe2669028074a204fc55afebbae630423a806f2Robin Lee    @SmallTest
49cfe2669028074a204fc55afebbae630423a806f2Robin Lee    public void testIndividualNativeFields() {
50cfe2669028074a204fc55afebbae630423a806f2Robin Lee        UidRange original = new UidRange(0x11115678, 0x22224321);
51cfe2669028074a204fc55afebbae630423a806f2Robin Lee        byte[] originalBytes = marshall(original);
52cfe2669028074a204fc55afebbae630423a806f2Robin Lee
53cfe2669028074a204fc55afebbae630423a806f2Robin Lee        assertEquals(original.start, getStart(originalBytes));
54cfe2669028074a204fc55afebbae630423a806f2Robin Lee        assertEquals(original.stop, getStop(originalBytes));
55cfe2669028074a204fc55afebbae630423a806f2Robin Lee    }
56cfe2669028074a204fc55afebbae630423a806f2Robin Lee
57cfe2669028074a204fc55afebbae630423a806f2Robin Lee    @SmallTest
58cfe2669028074a204fc55afebbae630423a806f2Robin Lee    public void testSingleItemUidRangeAllowed() {
59cfe2669028074a204fc55afebbae630423a806f2Robin Lee        new UidRange(123, 123);
60cfe2669028074a204fc55afebbae630423a806f2Robin Lee        new UidRange(0, 0);
61cfe2669028074a204fc55afebbae630423a806f2Robin Lee        new UidRange(Integer.MAX_VALUE, Integer.MAX_VALUE);
62cfe2669028074a204fc55afebbae630423a806f2Robin Lee    }
63cfe2669028074a204fc55afebbae630423a806f2Robin Lee
64cfe2669028074a204fc55afebbae630423a806f2Robin Lee    @SmallTest
65cfe2669028074a204fc55afebbae630423a806f2Robin Lee    public void testNegativeUidsDisallowed() {
66cfe2669028074a204fc55afebbae630423a806f2Robin Lee        try {
67cfe2669028074a204fc55afebbae630423a806f2Robin Lee            new UidRange(-2, 100);
68cfe2669028074a204fc55afebbae630423a806f2Robin Lee            fail("Exception not thrown for negative start UID");
69cfe2669028074a204fc55afebbae630423a806f2Robin Lee        } catch (IllegalArgumentException expected) {
70cfe2669028074a204fc55afebbae630423a806f2Robin Lee        }
71cfe2669028074a204fc55afebbae630423a806f2Robin Lee
72cfe2669028074a204fc55afebbae630423a806f2Robin Lee        try {
73cfe2669028074a204fc55afebbae630423a806f2Robin Lee            new UidRange(-200, -100);
74cfe2669028074a204fc55afebbae630423a806f2Robin Lee            fail("Exception not thrown for negative stop UID");
75cfe2669028074a204fc55afebbae630423a806f2Robin Lee        } catch (IllegalArgumentException expected) {
76cfe2669028074a204fc55afebbae630423a806f2Robin Lee        }
77cfe2669028074a204fc55afebbae630423a806f2Robin Lee    }
78cfe2669028074a204fc55afebbae630423a806f2Robin Lee
79cfe2669028074a204fc55afebbae630423a806f2Robin Lee    @SmallTest
80cfe2669028074a204fc55afebbae630423a806f2Robin Lee    public void testStopLessThanStartDisallowed() {
81cfe2669028074a204fc55afebbae630423a806f2Robin Lee        final int x = 4195000;
82cfe2669028074a204fc55afebbae630423a806f2Robin Lee        try {
83cfe2669028074a204fc55afebbae630423a806f2Robin Lee            new UidRange(x, x - 1);
84cfe2669028074a204fc55afebbae630423a806f2Robin Lee            fail("Exception not thrown for negative-length UID range");
85cfe2669028074a204fc55afebbae630423a806f2Robin Lee        } catch (IllegalArgumentException expected) {
86cfe2669028074a204fc55afebbae630423a806f2Robin Lee        }
87cfe2669028074a204fc55afebbae630423a806f2Robin Lee    }
88cfe2669028074a204fc55afebbae630423a806f2Robin Lee
89cfe2669028074a204fc55afebbae630423a806f2Robin Lee    /**
90cfe2669028074a204fc55afebbae630423a806f2Robin Lee     * Write a {@link UidRange} into an empty parcel and return the underlying data.
91cfe2669028074a204fc55afebbae630423a806f2Robin Lee     *
92cfe2669028074a204fc55afebbae630423a806f2Robin Lee     * @see unmarshall(byte[])
93cfe2669028074a204fc55afebbae630423a806f2Robin Lee     */
94cfe2669028074a204fc55afebbae630423a806f2Robin Lee    private static byte[] marshall(UidRange range) {
95cfe2669028074a204fc55afebbae630423a806f2Robin Lee        Parcel p = Parcel.obtain();
96cfe2669028074a204fc55afebbae630423a806f2Robin Lee        range.writeToParcel(p, /* flags */ 0);
97cfe2669028074a204fc55afebbae630423a806f2Robin Lee        p.setDataPosition(0);
98cfe2669028074a204fc55afebbae630423a806f2Robin Lee        return p.marshall();
99cfe2669028074a204fc55afebbae630423a806f2Robin Lee    }
100cfe2669028074a204fc55afebbae630423a806f2Robin Lee
101cfe2669028074a204fc55afebbae630423a806f2Robin Lee    /**
102cfe2669028074a204fc55afebbae630423a806f2Robin Lee     * Read raw bytes into a parcel, and read a {@link UidRange} back out of them.
103cfe2669028074a204fc55afebbae630423a806f2Robin Lee     *
104cfe2669028074a204fc55afebbae630423a806f2Robin Lee     * @see marshall(UidRange)
105cfe2669028074a204fc55afebbae630423a806f2Robin Lee     */
106cfe2669028074a204fc55afebbae630423a806f2Robin Lee    private static UidRange unmarshall(byte[] data) {
107cfe2669028074a204fc55afebbae630423a806f2Robin Lee        Parcel p = Parcel.obtain();
108cfe2669028074a204fc55afebbae630423a806f2Robin Lee        p.unmarshall(data, 0, data.length);
109cfe2669028074a204fc55afebbae630423a806f2Robin Lee        p.setDataPosition(0);
110cfe2669028074a204fc55afebbae630423a806f2Robin Lee        return UidRange.CREATOR.createFromParcel(p);
111cfe2669028074a204fc55afebbae630423a806f2Robin Lee    }
112cfe2669028074a204fc55afebbae630423a806f2Robin Lee}
113