1d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk/* 2d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk * Copyright (C) 2016 The Android Open Source Project 3d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk * 4d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk * Licensed under the Apache License, Version 2.0 (the "License"); 5d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk * you may not use this file except in compliance with the License. 6d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk * You may obtain a copy of the License at 7d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk * 8d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk * http://www.apache.org/licenses/LICENSE-2.0 9d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk * 10d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk * Unless required by applicable law or agreed to in writing, software 11d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk * distributed under the License is distributed on an "AS IS" BASIS, 12d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk * See the License for the specific language governing permissions and 14d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk * limitations under the License. 15d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk */ 16d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk 175ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk// Unit tests for AAudio Marshalling of RingBuffer information. 18d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk 19d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk#include <stdlib.h> 20d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk#include <math.h> 21d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk 22d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk#include <binder/Parcel.h> 23d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk#include <binder/Parcelable.h> 24d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk#include <cutils/ashmem.h> 25d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk#include <gtest/gtest.h> 26d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk#include <sys/mman.h> 27d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk 28a4eb0d86a29be2763be5fac51727858d5095794bPhil Burk#include <aaudio/AAudio.h> 29d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk#include <binding/AudioEndpointParcelable.h> 30d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk 31d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burkusing namespace android; 325ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burkusing namespace aaudio; 33d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk 34d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk// Test adding one value. 355ed503c7a66c90f93759c90237a9b432dbd93f9fPhil BurkTEST(test_marshalling, aaudio_one_read_write) { 36d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk Parcel parcel; 37d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk size_t pos = parcel.dataPosition(); 38d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk const int arbitraryValue = 235; 39d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk parcel.writeInt32(arbitraryValue); 40d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk parcel.setDataPosition(pos); 41d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk int32_t y; 42d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk parcel.readInt32(&y); 43d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk EXPECT_EQ(arbitraryValue, y); 44d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk} 45d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk 46d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk// Test SharedMemoryParcel. 475ed503c7a66c90f93759c90237a9b432dbd93f9fPhil BurkTEST(test_marshalling, aaudio_shared_memory) { 48d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk SharedMemoryParcelable sharedMemoryA; 49d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk SharedMemoryParcelable sharedMemoryB; 50d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk const size_t memSizeBytes = 840; 51d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk int fd = ashmem_create_region("TestMarshalling", memSizeBytes); 52d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk ASSERT_LE(0, fd); 53d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk sharedMemoryA.setup(fd, memSizeBytes); 54d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk void *region1; 555ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk EXPECT_EQ(AAUDIO_OK, sharedMemoryA.resolve(0, 16, ®ion1)); // fits in region 565ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk EXPECT_NE(AAUDIO_OK, sharedMemoryA.resolve(-2, 16, ®ion1)); // offset is negative 575ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk EXPECT_NE(AAUDIO_OK, sharedMemoryA.resolve(0, memSizeBytes + 8, ®ion1)); // size too big 585ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk EXPECT_NE(AAUDIO_OK, sharedMemoryA.resolve(memSizeBytes - 8, 16, ®ion1)); // goes past the end 59d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk int32_t *buffer1 = (int32_t *)region1; 60d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk buffer1[0] = 98735; // arbitrary value 61d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk 62d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk Parcel parcel; 63d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk size_t pos = parcel.dataPosition(); 64d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk sharedMemoryA.writeToParcel(&parcel); 65d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk 66d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk parcel.setDataPosition(pos); 67d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk sharedMemoryB.readFromParcel(&parcel); 68d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk EXPECT_EQ(sharedMemoryA.getSizeInBytes(), sharedMemoryB.getSizeInBytes()); 69d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk 70d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk // should see same value at two different addresses 71d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk void *region2; 725ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk EXPECT_EQ(AAUDIO_OK, sharedMemoryB.resolve(0, 16, ®ion2)); 73d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk int32_t *buffer2 = (int32_t *)region2; 74d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk EXPECT_NE(buffer1, buffer2); 75d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk EXPECT_EQ(buffer1[0], buffer2[0]); 76d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk} 77d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk 78d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk// Test SharedRegionParcel. 795ed503c7a66c90f93759c90237a9b432dbd93f9fPhil BurkTEST(test_marshalling, aaudio_shared_region) { 80d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk SharedMemoryParcelable sharedMemories[2]; 81d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk SharedRegionParcelable sharedRegionA; 82d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk SharedRegionParcelable sharedRegionB; 83d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk const size_t memSizeBytes = 840; 84d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk int fd = ashmem_create_region("TestMarshalling", memSizeBytes); 85d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk ASSERT_LE(0, fd); 86d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk sharedMemories[0].setup(fd, memSizeBytes); 87d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk int32_t regionOffset1 = 32; 88d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk int32_t regionSize1 = 16; 89d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk sharedRegionA.setup(0, regionOffset1, regionSize1); 90d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk 91d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk void *region1; 925ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk EXPECT_EQ(AAUDIO_OK, sharedRegionA.resolve(sharedMemories, ®ion1)); 93d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk int32_t *buffer1 = (int32_t *)region1; 94d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk buffer1[0] = 336677; // arbitrary value 95d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk 96d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk Parcel parcel; 97d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk size_t pos = parcel.dataPosition(); 98d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk sharedRegionA.writeToParcel(&parcel); 99d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk 100d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk parcel.setDataPosition(pos); 101d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk sharedRegionB.readFromParcel(&parcel); 102d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk 103d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk // should see same value 104d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk void *region2; 1055ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk EXPECT_EQ(AAUDIO_OK, sharedRegionB.resolve(sharedMemories, ®ion2)); 106d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk int32_t *buffer2 = (int32_t *)region2; 107d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk EXPECT_EQ(buffer1[0], buffer2[0]); 108d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk} 109d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk 110d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk// Test RingBufferParcelable. 1115ed503c7a66c90f93759c90237a9b432dbd93f9fPhil BurkTEST(test_marshalling, aaudio_ring_buffer_parcelable) { 112d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk SharedMemoryParcelable sharedMemories[2]; 113d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk RingBufferParcelable ringBufferA; 114d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk RingBufferParcelable ringBufferB; 115d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk 116d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk const size_t bytesPerFrame = 8; 117d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk const size_t framesPerBurst = 32; 118d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk const size_t dataSizeBytes = 2048; 119d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk const int32_t counterSizeBytes = sizeof(int64_t); 120d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk const size_t memSizeBytes = dataSizeBytes + (2 * counterSizeBytes); 121d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk 122d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk int fd = ashmem_create_region("TestMarshalling", memSizeBytes); 123d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk ASSERT_LE(0, fd); 124d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk sharedMemories[0].setup(fd, memSizeBytes); 125d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk 126d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk int32_t sharedMemoryIndex = 0; 127d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk // arrange indices and data in the shared memory 128d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk int32_t readOffset = 0; 129d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk int32_t writeOffset = readOffset + counterSizeBytes; 130d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk int32_t dataOffset = writeOffset + counterSizeBytes; 131d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk ringBufferA.setupMemory(sharedMemoryIndex, dataOffset, dataSizeBytes, 132d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk readOffset, writeOffset, counterSizeBytes); 133d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk ringBufferA.setFramesPerBurst(framesPerBurst); 134d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk ringBufferA.setBytesPerFrame(bytesPerFrame); 135d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk ringBufferA.setCapacityInFrames(dataSizeBytes / bytesPerFrame); 136d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk 137d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk // setup A 138d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk RingBufferDescriptor descriptorA; 1395ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk EXPECT_EQ(AAUDIO_OK, ringBufferA.resolve(sharedMemories, &descriptorA)); 140d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk descriptorA.dataAddress[0] = 95; 141d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk descriptorA.dataAddress[1] = 57; 142d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk descriptorA.readCounterAddress[0] = 17; 143d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk descriptorA.writeCounterAddress[0] = 39; 144d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk 145d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk // write A to parcel 146d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk Parcel parcel; 147d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk size_t pos = parcel.dataPosition(); 148d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk ringBufferA.writeToParcel(&parcel); 149d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk 150d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk // read B from parcel 151d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk parcel.setDataPosition(pos); 152d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk ringBufferB.readFromParcel(&parcel); 153d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk 154d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk RingBufferDescriptor descriptorB; 1555ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk EXPECT_EQ(AAUDIO_OK, ringBufferB.resolve(sharedMemories, &descriptorB)); 156d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk 157d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk // A and B should match 158d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk EXPECT_EQ(descriptorA.dataAddress[0], descriptorB.dataAddress[0]); 159d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk EXPECT_EQ(descriptorA.dataAddress[1], descriptorB.dataAddress[1]); 160d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk EXPECT_EQ(descriptorA.readCounterAddress[0], descriptorB.readCounterAddress[0]); 161d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk EXPECT_EQ(descriptorA.writeCounterAddress[0], descriptorB.writeCounterAddress[0]); 162d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk 163d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk EXPECT_EQ(ringBufferA.getFramesPerBurst(), ringBufferB.getFramesPerBurst()); 164d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk EXPECT_EQ(ringBufferA.getBytesPerFrame(), ringBufferB.getBytesPerFrame()); 165d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk EXPECT_EQ(ringBufferA.getCapacityInFrames(), ringBufferB.getCapacityInFrames()); 166d0ffd62e89bf97fa20a63f282d034b6745328210Phil Burk} 167