10fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski/*
20fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski * Copyright (C) 2016 The Android Open Source Project
30fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski *
40fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski * Licensed under the Apache License, Version 2.0 (the "License");
50fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski * you may not use this file except in compliance with the License.
60fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski * You may obtain a copy of the License at
70fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski *
80fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski *      http://www.apache.org/licenses/LICENSE-2.0
90fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski *
100fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski * Unless required by applicable law or agreed to in writing, software
110fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski * distributed under the License is distributed on an "AS IS" BASIS,
120fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski * See the License for the specific language governing permissions and
140fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski * limitations under the License.
150fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski */
160fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski
170fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowskipackage com.android.server.wifi;
180fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski
190fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowskiimport static org.junit.Assert.assertEquals;
200fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowskiimport static org.junit.Assert.assertFalse;
210fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski
220fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowskiimport android.os.Binder;
230fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowskiimport android.test.suitebuilder.annotation.SmallTest;
240fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski
250fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowskiimport org.junit.After;
260fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowskiimport org.junit.Before;
270fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowskiimport org.junit.Test;
280fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski
290fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski/**
300fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski * Unit tests for {@link com.android.server.wifi.BinderUtil}.
310fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski */
320fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski@SmallTest
330fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowskipublic class BinderUtilTest {
340fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    static final int FAKE_UID = 30000000;
350fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski
360fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    private long mToken;
370fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski
380fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    /**
390fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski     * Sets up the test harness before running a test.
400fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski     */
410fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    @Before
420fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    public void setUp() {
430fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        mToken = Binder.clearCallingIdentity();
440fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    }
450fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski
460fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    /**
470fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski     * Cleans up the test harness after running a test.
480fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski     */
490fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    @After
500fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    public void cleanUp() {
510fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        Binder.restoreCallingIdentity(mToken);
520fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    }
530fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski
540fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    /**
550fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski     * Test using {@link BinderUtil.setUid} to set and restore the Binder uid.
560fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski     */
570fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    @Test
580fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    public void setUid() {
590fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        final int pid = Binder.getCallingPid();
600fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        final int uid = Binder.getCallingUid();
610fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        assertFalse(uid == FAKE_UID);
620fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski
630fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        // Verify that setUid() can be used to fake the Binder uid without affecting the pid.
640fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        BinderUtil.setUid(FAKE_UID);
650fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        assertEquals(pid, Binder.getCallingPid());
660fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        assertEquals(FAKE_UID, Binder.getCallingUid());
670fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski
680fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        // Verify that setUid() can be used to restore the original Binder uid without affecting the
690fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        // pid.
700fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        BinderUtil.setUid(uid);
710fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        assertEquals(pid, Binder.getCallingPid());
720fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        assertEquals(uid, Binder.getCallingUid());
730fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    }
740fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski
750fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    /**
760fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski     * Test using {@link BinderUtil.setUid} to set the Binder uid and
770fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski     * {@link Binder.restoreCallingIdentity} to restore it.
780fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski     */
790fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    @Test
800fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    public void setUidAndRestoreCallingIdentity() {
810fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        final int pid = Binder.getCallingPid();
820fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        final int uid = Binder.getCallingUid();
830fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        assertFalse(uid == FAKE_UID);
840fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski
850fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        // Verify that setUid() can be used to fake the Binder uid without affecting the pid.
860fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        BinderUtil.setUid(FAKE_UID);
870fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        assertEquals(pid, Binder.getCallingPid());
880fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        assertEquals(FAKE_UID, Binder.getCallingUid());
890fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski
900fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        // Verify that the setUid() calls above did not break Binder.restoreCallingIdentity().
910fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        Binder.restoreCallingIdentity(mToken);
920fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        assertEquals(pid, Binder.getCallingPid());
930fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        assertEquals(uid, Binder.getCallingUid());
940fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    }
950fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski}
96