1363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross/*
2363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross * Copyright (C) 2013 The Android Open Source Project
3363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross *
4363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross * Licensed under the Apache License, Version 2.0 (the "License");
5363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross * you may not use this file except in compliance with the License.
6363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross * You may obtain a copy of the License at
7363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross *
8363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross *      http://www.apache.org/licenses/LICENSE-2.0
9363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross *
10363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross * Unless required by applicable law or agreed to in writing, software
11363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross * distributed under the License is distributed on an "AS IS" BASIS,
12363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross * See the License for the specific language governing permissions and
14363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross * limitations under the License.
15363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross */
16363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
17363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross#include <sys/mman.h>
18363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
19363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross#include <gtest/gtest.h>
20363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
21363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross#include <ion/ion.h>
22363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
23363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross#include "ion_test_fixture.h"
24363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
25363441b120aa7ff4ec7c639bac099e775c2ace69Colin Crossclass Map : public IonAllHeapsTest {
26363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross};
27363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
28363441b120aa7ff4ec7c639bac099e775c2ace69Colin CrossTEST_F(Map, MapHandle)
29363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross{
30363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross    static const size_t allocationSizes[] = {4*1024, 64*1024, 1024*1024, 2*1024*1024};
31363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross    for (unsigned int heapMask : m_allHeaps) {
32363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross        for (size_t size : allocationSizes) {
33363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            SCOPED_TRACE(::testing::Message() << "heap " << heapMask);
34363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            SCOPED_TRACE(::testing::Message() << "size " << size);
35363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ion_user_handle_t handle = 0;
36363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
37363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ASSERT_EQ(0, ion_alloc(m_ionFd, size, 0, heapMask, 0, &handle));
38363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ASSERT_TRUE(handle != 0);
39363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
40363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            int map_fd = -1;
41363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            unsigned char *ptr = NULL;
42363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ASSERT_EQ(0, ion_map(m_ionFd, handle, size, PROT_READ | PROT_WRITE, MAP_SHARED, 0, &ptr, &map_fd));
43363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ASSERT_TRUE(ptr != NULL);
44363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ASSERT_GE(map_fd, 0);
45363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
46363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ASSERT_EQ(0, close(map_fd));
47363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
48363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ASSERT_EQ(0, ion_free(m_ionFd, handle));
49363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
50363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            memset(ptr, 0xaa, size);
51363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
52363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ASSERT_EQ(0, munmap(ptr, size));
53363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross        }
54363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross    }
55363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross}
56363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
57363441b120aa7ff4ec7c639bac099e775c2ace69Colin CrossTEST_F(Map, MapFd)
58363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross{
59363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross    static const size_t allocationSizes[] = {4*1024, 64*1024, 1024*1024, 2*1024*1024};
60363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross    for (unsigned int heapMask : m_allHeaps) {
61363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross        for (size_t size : allocationSizes) {
62363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            SCOPED_TRACE(::testing::Message() << "heap " << heapMask);
63363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            SCOPED_TRACE(::testing::Message() << "size " << size);
64363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            int map_fd = -1;
65363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
66363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ASSERT_EQ(0, ion_alloc_fd(m_ionFd, size, 0, heapMask, 0, &map_fd));
67363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ASSERT_GE(map_fd, 0);
68363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
69363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            void *ptr;
70363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0);
71363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ASSERT_TRUE(ptr != NULL);
72363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
73363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ASSERT_EQ(0, close(map_fd));
74363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
75363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            memset(ptr, 0xaa, size);
76363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
77363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ASSERT_EQ(0, munmap(ptr, size));
78363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross        }
79363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross    }
80363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross}
81363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
82363441b120aa7ff4ec7c639bac099e775c2ace69Colin CrossTEST_F(Map, MapOffset)
83363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross{
84363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross    for (unsigned int heapMask : m_allHeaps) {
85363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross        SCOPED_TRACE(::testing::Message() << "heap " << heapMask);
86363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross        int map_fd = -1;
87363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
88363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross        ASSERT_EQ(0, ion_alloc_fd(m_ionFd, PAGE_SIZE * 2, 0, heapMask, 0, &map_fd));
89363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross        ASSERT_GE(map_fd, 0);
90363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
91363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross        unsigned char *ptr;
92363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross        ptr = (unsigned char *)mmap(NULL, PAGE_SIZE * 2, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0);
93363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross        ASSERT_TRUE(ptr != NULL);
94363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
95363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross        memset(ptr, 0, PAGE_SIZE);
96363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross        memset(ptr + PAGE_SIZE, 0xaa, PAGE_SIZE);
97363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
98363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross        ASSERT_EQ(0, munmap(ptr, PAGE_SIZE * 2));
99363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
100363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross        ptr = (unsigned char *)mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, PAGE_SIZE);
101363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross        ASSERT_TRUE(ptr != NULL);
102363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
103363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross        ASSERT_EQ(ptr[0], 0xaa);
104363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross        ASSERT_EQ(ptr[PAGE_SIZE - 1], 0xaa);
105363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
106363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross        ASSERT_EQ(0, munmap(ptr, PAGE_SIZE));
107363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
108363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross        ASSERT_EQ(0, close(map_fd));
109363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross    }
110363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross}
111363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
112363441b120aa7ff4ec7c639bac099e775c2ace69Colin CrossTEST_F(Map, MapCached)
113363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross{
114363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross    static const size_t allocationSizes[] = {4*1024, 64*1024, 1024*1024, 2*1024*1024};
115363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross    for (unsigned int heapMask : m_allHeaps) {
116363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross        for (size_t size : allocationSizes) {
117363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            SCOPED_TRACE(::testing::Message() << "heap " << heapMask);
118363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            SCOPED_TRACE(::testing::Message() << "size " << size);
119363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            int map_fd = -1;
120363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            unsigned int flags = ION_FLAG_CACHED;
121363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
122363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ASSERT_EQ(0, ion_alloc_fd(m_ionFd, size, 0, heapMask, flags, &map_fd));
123363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ASSERT_GE(map_fd, 0);
124363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
125363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            void *ptr;
126363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0);
127363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ASSERT_TRUE(ptr != NULL);
128363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
129363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ASSERT_EQ(0, close(map_fd));
130363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
131363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            memset(ptr, 0xaa, size);
132363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
133363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ASSERT_EQ(0, munmap(ptr, size));
134363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross        }
135363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross    }
136363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross}
137363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
138363441b120aa7ff4ec7c639bac099e775c2ace69Colin CrossTEST_F(Map, MapCachedNeedsSync)
139363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross{
140363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross    static const size_t allocationSizes[] = {4*1024, 64*1024, 1024*1024, 2*1024*1024};
141363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross    for (unsigned int heapMask : m_allHeaps) {
142363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross        for (size_t size : allocationSizes) {
143363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            SCOPED_TRACE(::testing::Message() << "heap " << heapMask);
144363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            SCOPED_TRACE(::testing::Message() << "size " << size);
145363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            int map_fd = -1;
146363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            unsigned int flags = ION_FLAG_CACHED | ION_FLAG_CACHED_NEEDS_SYNC;
147363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
148363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ASSERT_EQ(0, ion_alloc_fd(m_ionFd, size, 0, heapMask, flags, &map_fd));
149363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ASSERT_GE(map_fd, 0);
150363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
151363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            void *ptr;
152363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0);
153363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ASSERT_TRUE(ptr != NULL);
154363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
155363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ASSERT_EQ(0, close(map_fd));
156363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
157363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            memset(ptr, 0xaa, size);
158363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross
159363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross            ASSERT_EQ(0, munmap(ptr, size));
160363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross        }
161363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross    }
162363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross}
163