/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.util; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import android.os.Parcel; import android.support.test.runner.AndroidJUnit4; import libcore.io.IoUtils; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class MemoryIntArrayTest { @Test public void testSize() throws Exception { MemoryIntArray array = null; try { array = new MemoryIntArray(3, false); assertEquals("size must be three", 3, array.size()); } finally { IoUtils.closeQuietly(array); } } @Test public void testGetSet() throws Exception { MemoryIntArray array = null; try { array = new MemoryIntArray(3, false); array.set(0, 1); array.set(1, 2); array.set(2, 3); assertEquals("First element should be 1", 1, array.get(0)); assertEquals("First element should be 2", 2, array.get(1)); assertEquals("First element should be 3", 3, array.get(2)); } finally { IoUtils.closeQuietly(array); } } @Test public void testWritable() throws Exception { MemoryIntArray array = null; try { array = new MemoryIntArray(3, true); assertTrue("Must be mutable", array.isWritable()); } finally { IoUtils.closeQuietly(array); } } @Test public void testClose() throws Exception { MemoryIntArray array = null; try { array = new MemoryIntArray(3, false); array.close(); assertTrue("Must be closed", array.isClosed()); } finally { if (array != null && !array.isClosed()) { IoUtils.closeQuietly(array); } } } @Test public void testMarshalledGetSet() throws Exception { MemoryIntArray firstArray = null; MemoryIntArray secondArray = null; try { firstArray = new MemoryIntArray(3, false); firstArray.set(0, 1); firstArray.set(1, 2); firstArray.set(2, 3); Parcel parcel = Parcel.obtain(); parcel.writeParcelable(firstArray, 0); parcel.setDataPosition(0); secondArray = parcel.readParcelable(null); parcel.recycle(); assertNotNull("Should marshall file descriptor", secondArray); assertEquals("First element should be 1", 1, secondArray.get(0)); assertEquals("First element should be 2", 2, secondArray.get(1)); assertEquals("First element should be 3", 3, secondArray.get(2)); } finally { IoUtils.closeQuietly(firstArray); IoUtils.closeQuietly(secondArray); } } @Test public void testInteractOnceClosed() throws Exception { MemoryIntArray array = null; try { array = new MemoryIntArray(3, false); array.close(); array.close(); try { array.size(); fail("Cannot interact with a closed instance"); } catch (IllegalStateException e) { /* expected */ } try { array.get(0); fail("Cannot interact with a closed instance"); } catch (IllegalStateException e) { /* expected */ } try { array.set(0, 1); fail("Cannot interact with a closed instance"); } catch (IllegalStateException e) { /* expected */ } try { array.isWritable(); fail("Cannot interact with a closed instance"); } catch (IllegalStateException e) { /* expected */ } } finally { if (array != null && !array.isClosed()) { IoUtils.closeQuietly(array); } } } @Test public void testInteractPutOfBounds() throws Exception { MemoryIntArray array = null; try { array = new MemoryIntArray(3, false); try { array.get(-1); fail("Cannot interact out of array bounds"); } catch (IndexOutOfBoundsException e) { /* expected */ } try { array.get(3); fail("Cannot interact out of array bounds"); } catch (IndexOutOfBoundsException e) { /* expected */ } try { array.set(-1, 0); fail("Cannot interact out of array bounds"); } catch (IndexOutOfBoundsException e) { /* expected */ } try { array.set(3, 0); fail("Cannot interact out of array bounds"); } catch (IndexOutOfBoundsException e) { /* expected */ } } finally { IoUtils.closeQuietly(array); } } @Test public void testOverMaxSize() throws Exception { MemoryIntArray array = null; try { array = new MemoryIntArray(MemoryIntArray.getMaxSize() + 1, false); fail("Cannot use over max size"); } catch (IllegalArgumentException e) { /* expected */ } finally { IoUtils.closeQuietly(array); } } @Test public void testNotMutableByUnprivilegedClients() throws Exception { RemoteIntArray remoteIntArray = new RemoteIntArray(1, false); try { assertNotNull("Couldn't get remote instance", remoteIntArray); MemoryIntArray localIntArray = remoteIntArray.peekInstance(); assertNotNull("Couldn't get local instance", localIntArray); remoteIntArray.set(0, 1); assertSame("Remote should be able to modify", 1, remoteIntArray.get(0)); try { localIntArray.set(0, 0); fail("Local shouldn't be able to modify"); } catch (UnsupportedOperationException e) { /* expected */ } assertSame("Local shouldn't be able to modify", 1, localIntArray.get(0)); assertSame("Local shouldn't be able to modify", 1, remoteIntArray.get(0)); } finally { remoteIntArray.destroy(); } } }