summaryrefslogtreecommitdiff
path: root/common/tests/unit/src/com/android/net/module/util/async/BufferedFileTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'common/tests/unit/src/com/android/net/module/util/async/BufferedFileTest.java')
-rw-r--r--common/tests/unit/src/com/android/net/module/util/async/BufferedFileTest.java376
1 files changed, 0 insertions, 376 deletions
diff --git a/common/tests/unit/src/com/android/net/module/util/async/BufferedFileTest.java b/common/tests/unit/src/com/android/net/module/util/async/BufferedFileTest.java
deleted file mode 100644
index 11a74f2c..00000000
--- a/common/tests/unit/src/com/android/net/module/util/async/BufferedFileTest.java
+++ /dev/null
@@ -1,376 +0,0 @@
-/*
- * Copyright (C) 2023 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 com.android.net.module.util.async;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.anyInt;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.ignoreStubs;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.when;
-
-import android.os.ParcelFileDescriptor;
-
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.testutils.async.ReadableDataAnswer;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class BufferedFileTest {
- @Mock EventManager mockEventManager;
- @Mock BufferedFile.Listener mockFileListener;
- @Mock AsyncFile mockAsyncFile;
- @Mock ParcelFileDescriptor mockParcelFileDescriptor;
-
- @Before
- public void setUp() throws Exception {
- MockitoAnnotations.initMocks(this);
- }
-
- @After
- public void tearDown() throws Exception {
- verifyNoMoreInteractions(ignoreStubs(mockFileListener, mockAsyncFile, mockEventManager));
- }
-
- @Test
- public void onClosed() throws Exception {
- final int inboundBufferSize = 1024;
- final int outboundBufferSize = 768;
-
- final BufferedFile file = createFile(inboundBufferSize, outboundBufferSize);
-
- file.onClosed(mockAsyncFile);
-
- verify(mockFileListener).onBufferedFileClosed();
- }
-
- @Test
- public void continueReadingAndClose() throws Exception {
- final int inboundBufferSize = 1024;
- final int outboundBufferSize = 768;
-
- final BufferedFile file = createFile(inboundBufferSize, outboundBufferSize);
-
- assertEquals(inboundBufferSize, file.getInboundBufferFreeSizeForTest());
- assertEquals(outboundBufferSize, file.getOutboundBufferFreeSize());
-
- file.continueReading();
- verify(mockAsyncFile).enableReadEvents(true);
-
- file.close();
- verify(mockAsyncFile).close();
- }
-
- @Test
- public void enqueueOutboundData() throws Exception {
- final int inboundBufferSize = 10;
- final int outboundBufferSize = 250;
-
- final BufferedFile file = createFile(inboundBufferSize, outboundBufferSize);
-
- final byte[] data1 = new byte[101];
- final byte[] data2 = new byte[102];
- data1[0] = (byte) 1;
- data2[0] = (byte) 2;
-
- assertEquals(0, file.getOutboundBufferSize());
-
- final int totalLen = data1.length + data2.length;
-
- when(mockAsyncFile.write(any(), anyInt(), anyInt())).thenReturn(0);
- assertTrue(file.enqueueOutboundData(data1, 0, data1.length, null, 0, 0));
- verify(mockAsyncFile).enableWriteEvents(true);
-
- assertEquals(data1.length, file.getOutboundBufferSize());
-
- checkAndResetMocks();
-
- final ArgumentCaptor<byte[]> arrayCaptor = ArgumentCaptor.forClass(byte[].class);
- final ArgumentCaptor<Integer> posCaptor = ArgumentCaptor.forClass(Integer.class);
- final ArgumentCaptor<Integer> lenCaptor = ArgumentCaptor.forClass(Integer.class);
- when(mockAsyncFile.write(
- arrayCaptor.capture(), posCaptor.capture(), lenCaptor.capture())).thenReturn(totalLen);
-
- assertTrue(file.enqueueOutboundData(data2, 0, data2.length, null, 0, 0));
-
- assertEquals(0, file.getInboundBuffer().size());
- assertEquals(0, file.getOutboundBufferSize());
-
- assertEquals(0, posCaptor.getValue().intValue());
- assertEquals(totalLen, lenCaptor.getValue().intValue());
- assertEquals(data1[0], arrayCaptor.getValue()[0]);
- assertEquals(data2[0], arrayCaptor.getValue()[data1.length]);
- }
-
- @Test
- public void enqueueOutboundData_combined() throws Exception {
- final int inboundBufferSize = 10;
- final int outboundBufferSize = 250;
-
- final BufferedFile file = createFile(inboundBufferSize, outboundBufferSize);
-
- final byte[] data1 = new byte[101];
- final byte[] data2 = new byte[102];
- data1[0] = (byte) 1;
- data2[0] = (byte) 2;
-
- assertEquals(0, file.getOutboundBufferSize());
-
- final int totalLen = data1.length + data2.length;
-
- final ArgumentCaptor<byte[]> arrayCaptor = ArgumentCaptor.forClass(byte[].class);
- final ArgumentCaptor<Integer> posCaptor = ArgumentCaptor.forClass(Integer.class);
- final ArgumentCaptor<Integer> lenCaptor = ArgumentCaptor.forClass(Integer.class);
- when(mockAsyncFile.write(
- arrayCaptor.capture(), posCaptor.capture(), lenCaptor.capture())).thenReturn(totalLen);
-
- assertTrue(file.enqueueOutboundData(data1, 0, data1.length, data2, 0, data2.length));
-
- assertEquals(0, file.getInboundBuffer().size());
- assertEquals(0, file.getOutboundBufferSize());
-
- assertEquals(0, posCaptor.getValue().intValue());
- assertEquals(totalLen, lenCaptor.getValue().intValue());
- assertEquals(data1[0], arrayCaptor.getValue()[0]);
- assertEquals(data2[0], arrayCaptor.getValue()[data1.length]);
- }
-
- @Test
- public void enableWriteEvents() throws Exception {
- final int inboundBufferSize = 10;
- final int outboundBufferSize = 250;
-
- final BufferedFile file = createFile(inboundBufferSize, outboundBufferSize);
-
- final byte[] data1 = new byte[101];
- final byte[] data2 = new byte[102];
- final byte[] data3 = new byte[103];
- data1[0] = (byte) 1;
- data2[0] = (byte) 2;
- data3[0] = (byte) 3;
-
- assertEquals(0, file.getOutboundBufferSize());
-
- // Write first 2 buffers, but fail to flush them, causing async write request.
- final int data1And2Len = data1.length + data2.length;
- when(mockAsyncFile.write(any(), eq(0), eq(data1And2Len))).thenReturn(0);
- assertTrue(file.enqueueOutboundData(data1, 0, data1.length, data2, 0, data2.length));
- assertEquals(0, file.getInboundBuffer().size());
- assertEquals(data1And2Len, file.getOutboundBufferSize());
- verify(mockAsyncFile).enableWriteEvents(true);
-
- // Try to write 3rd buffers, which won't fit, then fail to flush.
- when(mockAsyncFile.write(any(), eq(0), eq(data1And2Len))).thenReturn(0);
- assertFalse(file.enqueueOutboundData(data3, 0, data3.length, null, 0, 0));
- assertEquals(0, file.getInboundBuffer().size());
- assertEquals(data1And2Len, file.getOutboundBufferSize());
- verify(mockAsyncFile, times(2)).enableWriteEvents(true);
-
- checkAndResetMocks();
-
- // Simulate writeability event, and successfully flush.
- final ArgumentCaptor<byte[]> arrayCaptor = ArgumentCaptor.forClass(byte[].class);
- final ArgumentCaptor<Integer> posCaptor = ArgumentCaptor.forClass(Integer.class);
- final ArgumentCaptor<Integer> lenCaptor = ArgumentCaptor.forClass(Integer.class);
- when(mockAsyncFile.write(arrayCaptor.capture(),
- posCaptor.capture(), lenCaptor.capture())).thenReturn(data1And2Len);
- file.onWriteReady(mockAsyncFile);
- verify(mockAsyncFile).enableWriteEvents(false);
- verify(mockFileListener).onBufferedFileOutboundSpace();
- assertEquals(0, file.getOutboundBufferSize());
-
- assertEquals(0, posCaptor.getValue().intValue());
- assertEquals(data1And2Len, lenCaptor.getValue().intValue());
- assertEquals(data1[0], arrayCaptor.getValue()[0]);
- assertEquals(data2[0], arrayCaptor.getValue()[data1.length]);
-
- checkAndResetMocks();
-
- // Now write, but fail to flush the third buffer.
- when(mockAsyncFile.write(arrayCaptor.capture(),
- posCaptor.capture(), lenCaptor.capture())).thenReturn(0);
- assertTrue(file.enqueueOutboundData(data3, 0, data3.length, null, 0, 0));
- verify(mockAsyncFile).enableWriteEvents(true);
- assertEquals(data3.length, file.getOutboundBufferSize());
-
- assertEquals(data1And2Len, posCaptor.getValue().intValue());
- assertEquals(outboundBufferSize - data1And2Len, lenCaptor.getValue().intValue());
- assertEquals(data3[0], arrayCaptor.getValue()[data1And2Len]);
- }
-
- @Test
- public void read() throws Exception {
- final int inboundBufferSize = 250;
- final int outboundBufferSize = 10;
-
- final BufferedFile file = createFile(inboundBufferSize, outboundBufferSize);
-
- final byte[] data1 = new byte[101];
- final byte[] data2 = new byte[102];
- data1[0] = (byte) 1;
- data2[0] = (byte) 2;
-
- final ReadableDataAnswer dataAnswer = new ReadableDataAnswer(data1, data2);
- final ReadableByteBuffer inboundBuffer = file.getInboundBuffer();
-
- when(mockAsyncFile.read(any(), anyInt(), anyInt())).thenAnswer(dataAnswer);
- file.onReadReady(mockAsyncFile);
- verify(mockAsyncFile).enableReadEvents(true);
- verify(mockFileListener).onBufferedFileInboundData(eq(data1.length + data2.length));
-
- assertEquals(0, file.getOutboundBufferSize());
- assertEquals(data1.length + data2.length, inboundBuffer.size());
- assertEquals((byte) 1, inboundBuffer.peek(0));
- assertEquals((byte) 2, inboundBuffer.peek(data1.length));
- }
-
- @Test
- public void enableReadEvents() throws Exception {
- final int inboundBufferSize = 250;
- final int outboundBufferSize = 10;
-
- final BufferedFile file = createFile(inboundBufferSize, outboundBufferSize);
-
- final byte[] data1 = new byte[101];
- final byte[] data2 = new byte[102];
- final byte[] data3 = new byte[103];
- data1[0] = (byte) 1;
- data2[0] = (byte) 2;
- data3[0] = (byte) 3;
-
- final ReadableDataAnswer dataAnswer = new ReadableDataAnswer(data1, data2, data3);
- final ReadableByteBuffer inboundBuffer = file.getInboundBuffer();
-
- when(mockAsyncFile.read(any(), anyInt(), anyInt())).thenAnswer(dataAnswer);
- file.onReadReady(mockAsyncFile);
- verify(mockAsyncFile).enableReadEvents(false);
- verify(mockFileListener).onBufferedFileInboundData(eq(inboundBufferSize));
-
- assertEquals(0, file.getOutboundBufferSize());
- assertEquals(inboundBufferSize, inboundBuffer.size());
- assertEquals((byte) 1, inboundBuffer.peek(0));
- assertEquals((byte) 2, inboundBuffer.peek(data1.length));
- assertEquals((byte) 3, inboundBuffer.peek(data1.length + data2.length));
-
- checkAndResetMocks();
-
- // Cannot enable read events since the buffer is full.
- file.continueReading();
-
- checkAndResetMocks();
-
- final byte[] tmp = new byte[inboundBufferSize];
- inboundBuffer.readBytes(tmp, 0, data1.length);
- assertEquals(inboundBufferSize - data1.length, inboundBuffer.size());
-
- file.continueReading();
-
- inboundBuffer.readBytes(tmp, 0, data2.length);
- assertEquals(inboundBufferSize - data1.length - data2.length, inboundBuffer.size());
-
- when(mockAsyncFile.read(any(), anyInt(), anyInt())).thenAnswer(dataAnswer);
- file.onReadReady(mockAsyncFile);
- verify(mockAsyncFile, times(2)).enableReadEvents(true);
- verify(mockFileListener).onBufferedFileInboundData(
- eq(data1.length + data2.length + data3.length - inboundBufferSize));
-
- assertEquals(data3.length, inboundBuffer.size());
- assertEquals((byte) 3, inboundBuffer.peek(0));
- }
-
- @Test
- public void shutdownReading() throws Exception {
- final int inboundBufferSize = 250;
- final int outboundBufferSize = 10;
-
- final BufferedFile file = createFile(inboundBufferSize, outboundBufferSize);
-
- final byte[] data = new byte[100];
- final ReadableDataAnswer dataAnswer = new ReadableDataAnswer(data);
- when(mockAsyncFile.read(any(), anyInt(), anyInt())).thenAnswer(dataAnswer);
-
- file.shutdownReading();
- file.onReadReady(mockAsyncFile);
-
- verify(mockAsyncFile).enableReadEvents(false);
-
- assertEquals(0, file.getInboundBuffer().size());
- assertEquals(data.length, dataAnswer.getRemainingSize());
- }
-
- @Test
- public void shutdownReading_inCallback() throws Exception {
- final int inboundBufferSize = 250;
- final int outboundBufferSize = 10;
-
- final BufferedFile file = createFile(inboundBufferSize, outboundBufferSize);
-
- final byte[] data = new byte[100];
- final ReadableDataAnswer dataAnswer = new ReadableDataAnswer(data);
- when(mockAsyncFile.read(any(), anyInt(), anyInt())).thenAnswer(dataAnswer);
-
- doAnswer(new Answer() {
- @Override public Object answer(InvocationOnMock invocation) {
- file.shutdownReading();
- return null;
- }}).when(mockFileListener).onBufferedFileInboundData(anyInt());
-
- file.onReadReady(mockAsyncFile);
-
- verify(mockAsyncFile).enableReadEvents(false);
-
- assertEquals(0, file.getInboundBuffer().size());
- assertEquals(0, dataAnswer.getRemainingSize());
- }
-
- private void checkAndResetMocks() {
- verifyNoMoreInteractions(ignoreStubs(mockFileListener, mockAsyncFile, mockEventManager,
- mockParcelFileDescriptor));
- reset(mockFileListener, mockAsyncFile, mockEventManager);
- }
-
- private BufferedFile createFile(
- int inboundBufferSize, int outboundBufferSize) throws Exception {
- when(mockEventManager.registerFile(any(), any())).thenReturn(mockAsyncFile);
- return BufferedFile.create(
- mockEventManager,
- FileHandle.fromFileDescriptor(mockParcelFileDescriptor),
- mockFileListener,
- inboundBufferSize,
- outboundBufferSize);
- }
-}