blob: 4f11b5111a3a9c3907c1c17d9bd11162ae001b91 [file] [log] [blame]
Ytai Ben-Tsvi37934a22020-08-11 15:53:04 -07001/*
2 * Copyright (C) 2020 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#include <gtest/gtest.h>
17
18#include "binder/MemoryBase.h"
19#include "binder/MemoryHeapBase.h"
20#include "media/ShmemCompat.h"
21#include "media/ShmemUtil.h"
22
23namespace android {
24namespace media {
25namespace {
26
27// Creates a SharedFileRegion instance with a null FD.
28SharedFileRegion makeSharedFileRegion(int64_t offset, int64_t size) {
29 SharedFileRegion shmem;
30 shmem.offset = offset;
31 shmem.size = size;
32 return shmem;
33}
34
35sp<IMemory> makeIMemory(const std::vector<uint8_t>& content) {
36 constexpr size_t kOffset = 19;
37
38 sp<MemoryHeapBase> heap = new MemoryHeapBase(content.size());
39 sp<IMemory> result = sp<MemoryBase>::make(heap, kOffset, content.size());
40 memcpy(result->unsecurePointer(), content.data(), content.size());
41 return result;
42}
43
44TEST(ShmemTest, Validate) {
45 EXPECT_TRUE(validateSharedFileRegion(makeSharedFileRegion(0, 0)));
46 EXPECT_TRUE(validateSharedFileRegion(makeSharedFileRegion(1, 2)));
47 EXPECT_FALSE(validateSharedFileRegion(makeSharedFileRegion(-1, 2)));
48 EXPECT_FALSE(validateSharedFileRegion(makeSharedFileRegion(2, -1)));
49 EXPECT_TRUE(validateSharedFileRegion(makeSharedFileRegion(
50 std::numeric_limits<int64_t>::max(),
51 std::numeric_limits<int64_t>::max())));
52}
53
54TEST(ShmemTest, Conversion) {
55 sp<IMemory> reconstructed;
56 {
57 SharedFileRegion shmem;
58 sp<IMemory> imem = makeIMemory({6, 5, 3});
59 ASSERT_TRUE(convertIMemoryToSharedFileRegion(imem, &shmem));
60 ASSERT_EQ(3, shmem.size);
61 ASSERT_GE(shmem.fd.get(), 0);
62 ASSERT_TRUE(convertSharedFileRegionToIMemory(shmem, &reconstructed));
63 }
64 ASSERT_EQ(3, reconstructed->size());
65 const uint8_t* p =
66 reinterpret_cast<const uint8_t*>(reconstructed->unsecurePointer());
67 EXPECT_EQ(6, p[0]);
68 EXPECT_EQ(5, p[1]);
69 EXPECT_EQ(3, p[2]);
70}
71
72TEST(ShmemTest, NullConversion) {
73 sp<IMemory> reconstructed;
74 {
75 SharedFileRegion shmem;
76 sp<IMemory> imem;
77 ASSERT_TRUE(convertIMemoryToSharedFileRegion(imem, &shmem));
78 ASSERT_EQ(0, shmem.size);
79 ASSERT_LT(shmem.fd.get(), 0);
80 ASSERT_TRUE(convertSharedFileRegionToIMemory(shmem, &reconstructed));
81 }
82 ASSERT_EQ(nullptr, reconstructed);
83}
84
85} // namespace
86} // namespace media
87} // namespace android