1f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis/*
2f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis * Copyright (C) 2010 The Android Open Source Project
3f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis *
4f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis * Licensed under the Apache License, Version 2.0 (the "License");
5f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis * you may not use this file except in compliance with the License.
6f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis * You may obtain a copy of the License at
7f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis *
8f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis *      http://www.apache.org/licenses/LICENSE-2.0
9f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis *
10f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis * Unless required by applicable law or agreed to in writing, software
11f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis * distributed under the License is distributed on an "AS IS" BASIS,
12f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis * See the License for the specific language governing permissions and
14f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis * limitations under the License.
15f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis */
16f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
17f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis#include <gtest/gtest.h>
18f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
19f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis#include <errno.h>
20f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis#include <unistd.h>
21f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis#include <fcntl.h>
22f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis#include <sys/mman.h>
23f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
24f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis#include "pmemalloc.h"
25f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
26f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennisclass DepsStub : public PmemUserspaceAllocator::Deps, public PmemKernelAllocator::Deps {
27f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
28f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis public:
29f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
30f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual size_t getPmemTotalSize(int fd, size_t* size) {
31f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return 0;
32f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
33f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
34f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int connectPmem(int fd, int master_fd) {
35f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return 0;
36f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
37f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
38f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int mapPmem(int fd, int offset, size_t size) {
39f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return 0;
40f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
41f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
42f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int unmapPmem(int fd, int offset, size_t size) {
43f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return 0;
44f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
45f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
46f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int getErrno() {
47f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return 0;
48f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
49f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
50f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual void* mmap(void* start, size_t length, int prot, int flags, int fd,
51f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis            off_t offset) {
52f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return 0;
53f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
54f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
55f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int munmap(void* start, size_t length) {
56f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return 0;
57f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
58f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
59f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int open(const char* pathname, int flags, int mode) {
60f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return 0;
61f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
62f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
63f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int close(int fd) {
64f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return 0;
65f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
66f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis};
67f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
68f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis/******************************************************************************/
69f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
70f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennisclass AllocatorStub : public PmemUserspaceAllocator::Deps::Allocator {
71f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual ssize_t setSize(size_t size) {
72f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return 0;
73f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
74f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
75f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual size_t  size() const {
76f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return 0;
77f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
78f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
79f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual ssize_t allocate(size_t size, uint32_t flags = 0) {
80f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return 0;
81f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
82f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
83f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual ssize_t deallocate(size_t offset) {
84f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return 0;
85f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
86f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis};
87f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
88f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis/******************************************************************************/
89f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
90f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennisstatic const char* fakePmemDev = "/foo/bar";
91f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
92f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis/******************************************************************************/
93f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
94f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennisstruct Deps_InitPmemAreaLockedWithSuccessfulCompletion : public DepsStub {
95f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
96f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int open(const char* pathname, int flags, int mode) {
97f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(fakePmemDev, pathname);
98f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(O_RDWR, flags);
99f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(0, mode);
100f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return 1234;
101f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
102f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
103f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual size_t getPmemTotalSize(int fd, size_t* size) {
104f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(1234, fd);
105f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        *size = 16 << 20;
106f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return 0;
107f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
108f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
109f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual void* mmap(void* start, size_t length, int prot, int flags, int fd,
110f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis            off_t offset) {
111f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(1234, fd);
112f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return (void*)0x87654321;
113f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
114f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
115f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis};
116f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
117f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennisstruct Allocator_InitPmemAreaLockedWithSuccessfulCompletion : public AllocatorStub {
118f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
119f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual ssize_t setSize(size_t size) {
120f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(size_t(16 << 20), size);
121f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return 0;
122f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
123f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis};
124f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
125f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie GennisTEST(test_pmem_userspace_allocator, testInitPmemAreaLockedWithSuccessfulCompletion) {
126f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    Deps_InitPmemAreaLockedWithSuccessfulCompletion depsMock;
127f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    Allocator_InitPmemAreaLockedWithSuccessfulCompletion allocMock;
128f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    PmemUserspaceAllocator pma(depsMock, allocMock, fakePmemDev);
129f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
130f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int result = pma.init_pmem_area_locked();
131f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(0, result);
132f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis}
133f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
134f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis/******************************************************************************/
135f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
136f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennisstruct Deps_InitPmemAreaLockedWithEnomemOnMmap : public DepsStub {
137f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
138f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int open(const char* pathname, int flags, int mode) {
139f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(fakePmemDev, pathname);
140f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(O_RDWR, flags);
141f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(0, mode);
142f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return 1234;
143f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
144f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
145f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual size_t getPmemTotalSize(int fd, size_t* size) {
146f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(1234, fd);
147f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        *size = 16 << 20;
148f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return 0;
149f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
150f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
151f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int getErrno() {
152f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return ENOMEM;
153f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
154f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
155f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual void* mmap(void* start, size_t length, int prot, int flags, int fd,
156f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis            off_t offset) {
157f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return (void*)MAP_FAILED;
158f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
159f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
160f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis};
161f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
162f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennisstruct Allocator_InitPmemAreaLockedWithEnomemOnMmap : public AllocatorStub {
163f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
164f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual ssize_t setSize(size_t size) {
165f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(size_t(16 << 20), size);
166f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return 0;
167f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
168f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis};
169f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
170f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie GennisTEST(test_pmem_userspace_allocator, testInitPmemAreaLockedWthEnomemOnMmap) {
171f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    Deps_InitPmemAreaLockedWithEnomemOnMmap depsMock;
172f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    Allocator_InitPmemAreaLockedWithEnomemOnMmap allocMock;
173f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    PmemUserspaceAllocator pma(depsMock, allocMock, fakePmemDev);
174f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
175f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int result = pma.init_pmem_area_locked();
176f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(-ENOMEM, result);
177f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis}
178f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
179f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis/******************************************************************************/
180f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
181f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennisstruct Deps_InitPmemAreaLockedWithEaccesOnGetPmemTotalSize : public DepsStub {
182f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
183f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int open(const char* pathname, int flags, int mode) {
184f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(fakePmemDev, pathname);
185f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(O_RDWR, flags);
186f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(0, mode);
187f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return 1234;
188f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
189f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
190f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual size_t getPmemTotalSize(int fd, size_t* size) {
191f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(1234, fd);
192f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return -EACCES;
193f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
194f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis};
195f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
196f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie GennisTEST(test_pmem_userspace_allocator, testInitPmemAreaLockedWthEaccesOnGetPmemTotalSize) {
197f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    Deps_InitPmemAreaLockedWithEaccesOnGetPmemTotalSize depsMock;
198f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    AllocatorStub allocStub;
199f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    PmemUserspaceAllocator pma(depsMock, allocStub, fakePmemDev);
200f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
201f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int result = pma.init_pmem_area_locked();
202f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(-EACCES, result);
203f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis}
204f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
205f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis/******************************************************************************/
206f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
207f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennisstruct Deps_InitPmemAreaLockedWithEaccesOnOpen : public DepsStub {
208f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
209f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int getErrno() {
210f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return EACCES;
211f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
212f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
213f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int open(const char* pathname, int flags, int mode) {
214f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(fakePmemDev, pathname);
215f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(O_RDWR, flags);
216f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(0, mode);
217f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return -1;
218f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
219f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis};
220f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
221f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie GennisTEST(test_pmem_userspace_allocator, testInitPmemAreaLockedWithEaccesOnOpenMaster) {
222f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    Deps_InitPmemAreaLockedWithEaccesOnOpen depsMock;
223f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    AllocatorStub allocStub;
224f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    PmemUserspaceAllocator pma(depsMock, allocStub, fakePmemDev);
225f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
226f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int result = pma.init_pmem_area_locked();
227f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(-EACCES, result);
228f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis}
229f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
230f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis/******************************************************************************/
231f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
232f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennistypedef Deps_InitPmemAreaLockedWithSuccessfulCompletion Deps_InitPmemAreaWithSuccessfulInitialCompletion;
233f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
234f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie GennisTEST(test_pmem_userspace_allocator, testInitPmemAreaWithSuccessfulInitialCompletion) {
235f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    Deps_InitPmemAreaWithSuccessfulInitialCompletion depsMock;
236f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    AllocatorStub allocStub;
237f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    PmemUserspaceAllocator pma(depsMock, allocStub, fakePmemDev);
238f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
239f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int result = pma.init_pmem_area();
240f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(0, result);
241f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis}
242f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
243f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis/******************************************************************************/
244f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
245f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennistypedef Deps_InitPmemAreaLockedWithEaccesOnOpen Deps_InitPmemAreaWithEaccesOnInitLocked;
246f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
247f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie GennisTEST(test_pmem_userspace_allocator, testInitPmemAreaWithEaccesOnInitLocked) {
248f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    Deps_InitPmemAreaWithEaccesOnInitLocked depsMock;
249f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    AllocatorStub allocStub;
250f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    PmemUserspaceAllocator pma(depsMock, allocStub, fakePmemDev);
251f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
252f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int result = pma.init_pmem_area();
253f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(-EACCES, result);
254f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis}
255f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
256f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis/******************************************************************************/
257f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
258f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie GennisTEST(test_pmem_userspace_allocator, testInitPmemAreaAfterSuccessfulInitialCompletion) {
259f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    DepsStub depsStub;
260f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    AllocatorStub allocStub;
261f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    PmemUserspaceAllocator pma(depsStub, allocStub, fakePmemDev);
262f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
263f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    pma.set_master_values(1234, 0); // Indicate that the pma has been successfully init'd
264f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
265f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int result = pma.init_pmem_area();
266f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(0, result);
267f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    //XXX JMG: Add this back in maybe? ASSERT_EQ(1234, pmi.master); // Make sure the master fd wasn't changed
268f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis}
269f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
270f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis/******************************************************************************/
271f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
272f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie GennisTEST(test_pmem_userspace_allocator, testInitPmemAreaAfterFailedInit) {
273f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    DepsStub depsStub;
274f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    AllocatorStub allocStub;
275f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    PmemUserspaceAllocator pma(depsStub, allocStub, fakePmemDev);
276f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
277f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    pma.set_master_values(-EACCES, 0); // Indicate that the pma has failed init
278f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
279f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int result = pma.init_pmem_area();
280f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(-EACCES, result);
281f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis}
282f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
283f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis/******************************************************************************/
284f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
285f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennisstruct Deps_InitPmemAreaLockedWithSuccessfulCompletionWithNoFlags : public DepsStub {
286f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
287f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int open(const char* pathname, int flags, int mode) {
288f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(fakePmemDev, pathname);
289f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(O_RDWR, flags & O_RDWR);
290f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(0, mode);
291f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return 5678;
292f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
293f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
294f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int connectPmem(int fd, int master_fd) {
295f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(5678, fd);
296f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(1234, master_fd);
297f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return 0;
298f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
299f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
300f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int mapPmem(int fd, int offset, size_t size) {
301f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(5678, fd);
302f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(0x300, offset);
303f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(size_t(0x100), size);
304f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return 0;
305f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
306f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis};
307f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
308f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
309f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennisstruct Allocator_AllocPmemBufferWithSuccessfulCompletionWithNoFlags : public AllocatorStub {
310f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
311f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual ssize_t allocate(size_t size, uint32_t flags = 0) {
312f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(size_t(0x100), size);
313f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(uint32_t(0x0), flags);
314f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return 0x300;
315f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
316f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis};
317f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
318f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie GennisTEST(test_pmem_userspace_allocator, testAllocPmemBufferWithSuccessfulCompletionWithNoFlags) {
319f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    Deps_InitPmemAreaLockedWithSuccessfulCompletionWithNoFlags depsMock;
320f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    Allocator_AllocPmemBufferWithSuccessfulCompletionWithNoFlags allocMock;
321f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    PmemUserspaceAllocator pma(depsMock, allocMock, fakePmemDev);
322f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
323f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    uint8_t buf[0x300 + 0x100]; // Create a buffer to get memzero'd
324f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    pma.set_master_values(1234, buf); // Indicate that the pma has been successfully init'd
325f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
326f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    void* base = 0;
327f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int offset = -9182, fd = -9182;
328f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int size = 0x100;
329f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int flags = 0;
330f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int result = pma.alloc_pmem_buffer(size, flags, &base, &offset, &fd);
331f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(0, result);
332f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(0x300, offset);
333f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(5678, fd);
334f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    for (int i = 0x300; i < 0x400; ++i) {
335f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        ASSERT_EQ(uint8_t(0), buf[i]);
336f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
337f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis}
338f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
339f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis/******************************************************************************/
340f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
341f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennistypedef Deps_InitPmemAreaLockedWithSuccessfulCompletionWithNoFlags Deps_InitPmemAreaLockedWithSuccessfulCompletionWithAllFlags;
342f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
343f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennistypedef Allocator_AllocPmemBufferWithSuccessfulCompletionWithNoFlags Allocator_AllocPmemBufferWithSuccessfulCompletionWithAllFlags;
344f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
345f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie GennisTEST(test_pmem_userspace_allocator, testAllocPmemBufferWithSuccessfulCompletionWithAllFlags) {
346f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    Deps_InitPmemAreaLockedWithSuccessfulCompletionWithAllFlags depsMock;
347f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    Allocator_AllocPmemBufferWithSuccessfulCompletionWithAllFlags allocMock;
348f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    PmemUserspaceAllocator pma(depsMock, allocMock, fakePmemDev);
349f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
350f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    uint8_t buf[0x300 + 0x100]; // Create a buffer to get memzero'd
351f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    pma.set_master_values(1234, buf); // Indicate that the pma has been successfully init'd
352f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
353f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    void* base = 0;
354f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int offset = -9182, fd = -9182;
355f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int size = 0x100;
356f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int flags = ~0;
357f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int result = pma.alloc_pmem_buffer(size, flags, &base, &offset, &fd);
358f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(0, result);
359f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(0x300, offset);
360f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(5678, fd);
361f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    for (int i = 0x300; i < 0x400; ++i) {
362f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        ASSERT_EQ(0, buf[i]);
363f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
364f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis}
365f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
366f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis/******************************************************************************/
367f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
368f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennisstruct Deps_InitPmemAreaLockedWithEnodevOnOpen : public Deps_InitPmemAreaLockedWithSuccessfulCompletionWithNoFlags {
369f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
370f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int getErrno() {
371f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return ENODEV;
372f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
373f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
374f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int open(const char* pathname, int flags, int mode) {
375f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(fakePmemDev, pathname);
376f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(O_RDWR, flags & O_RDWR);
377f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(0, mode);
378f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return -1;
379f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
380f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis};
381f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
382f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennistypedef Allocator_AllocPmemBufferWithSuccessfulCompletionWithNoFlags Allocator_AllocPmemBufferWithEnodevOnOpen;
383f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
384f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie GennisTEST(test_pmem_userspace_allocator, testAllocPmemBufferWithSuccessfulCompletionWithEnodevOnOpen) {
385f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    Deps_InitPmemAreaLockedWithEnodevOnOpen depsMock;
386f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    Allocator_AllocPmemBufferWithEnodevOnOpen allocMock;
387f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    PmemUserspaceAllocator pma(depsMock, allocMock, fakePmemDev);
388f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
389f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    uint8_t buf[0x300 + 0x100]; // Create a buffer to get memzero'd
390f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    pma.set_master_values(1234, buf); // Indicate that the pma has been successfully init'd
391f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
392f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    void* base = 0;
393f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int offset = -9182, fd = -9182;
394f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int size = 0x100;
395f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int flags = ~0;
396f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int result = pma.alloc_pmem_buffer(size, flags, &base, &offset, &fd);
397f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(-ENODEV, result);
398f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis}
399f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
400f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis/******************************************************************************/
401f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
402f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennisstruct Deps_InitPmemAreaLockedWithEnomemOnConnectPmem : public Deps_InitPmemAreaLockedWithSuccessfulCompletionWithNoFlags {
403f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
404f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int getErrno() {
405f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return ENOMEM;
406f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
407f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
408f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int connectPmem(int fd, int master_fd) {
409f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(5678, fd);
410f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(1234, master_fd);
411f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return -1;
412f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
413f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis};
414f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
415f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennistypedef Allocator_AllocPmemBufferWithSuccessfulCompletionWithNoFlags Allocator_AllocPmemBufferWithEnomemOnConnectPmem;
416f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
417f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie GennisTEST(test_pmem_userspace_allocator, testAllocPmemBufferWithSuccessfulCompletionWithEnomemOnConnectPmem) {
418f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    Deps_InitPmemAreaLockedWithEnomemOnConnectPmem depsMock;
419f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    Allocator_AllocPmemBufferWithEnomemOnConnectPmem allocMock;
420f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    PmemUserspaceAllocator pma(depsMock, allocMock, fakePmemDev);
421f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
422f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    uint8_t buf[0x300 + 0x100]; // Create a buffer to get memzero'd
423f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    pma.set_master_values(1234, buf); // Indicate that the pma has been successfully init'd
424f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
425f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    void* base = 0;
426f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int offset = -9182, fd = -9182;
427f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int size = 0x100;
428f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int flags = ~0;
429f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int result = pma.alloc_pmem_buffer(size, flags, &base, &offset, &fd);
430f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(-ENOMEM, result);
431f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis}
432f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
433f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis/******************************************************************************/
434f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
435f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennisstruct Deps_InitPmemAreaLockedWithEnomemOnMapPmem : public Deps_InitPmemAreaLockedWithSuccessfulCompletionWithNoFlags {
436f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
437f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int getErrno() {
438f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return ENOMEM;
439f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
440f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
441f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int mapPmem(int fd, int offset, size_t size) {
442f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(5678, fd);
443f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(0x300, offset);
444f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(size_t(0x100), size);
445f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return -1;
446f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
447f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis};
448f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
449f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennistypedef Allocator_AllocPmemBufferWithSuccessfulCompletionWithNoFlags Allocator_AllocPmemBufferWithEnomemOnMapPmem;
450f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
451f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie GennisTEST(test_pmem_userspace_allocator, testAllocPmemBufferWithEnomemOnMapPmem) {
452f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    Deps_InitPmemAreaLockedWithEnomemOnMapPmem depsMock;
453f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    Allocator_AllocPmemBufferWithEnomemOnMapPmem allocMock;
454f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    PmemUserspaceAllocator pma(depsMock, allocMock, fakePmemDev);
455f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
456f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    uint8_t buf[0x300 + 0x100]; // Create a buffer to get memzero'd
457f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    pma.set_master_values(1234, buf); // Indicate that the pma has been successfully init'd
458f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
459f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    void* base = 0;
460f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int offset = -9182, fd = -9182;
461f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int size = 0x100;
462f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int flags = ~0;
463f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int result = pma.alloc_pmem_buffer(size, flags, &base, &offset, &fd);
464f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(-ENOMEM, result);
465f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis}
466f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
467f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis/******************************************************************************/
468f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
469f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennisstruct Deps_KernelAllocPmemBufferWithSuccessfulCompletionWithNoFlags : public DepsStub {
470f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
471f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    void* mmapResult;
472f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
473f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    Deps_KernelAllocPmemBufferWithSuccessfulCompletionWithNoFlags(void* mmapResult) :
474f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis            mmapResult(mmapResult) {}
475f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
476f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int open(const char* pathname, int flags, int mode) {
477f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(fakePmemDev, pathname);
478f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(O_RDWR, flags & O_RDWR);
479f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(0, mode);
480f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return 5678;
481f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
482f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
483f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual void* mmap(void* start, size_t length, int prot, int flags, int fd,
484f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis            off_t offset) {
485f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(5678, fd);
486f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return mmapResult;
487f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
488f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis};
489f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
490f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie GennisTEST(test_pmem_kernel_allocator, testAllocPmemBufferWithSuccessfulCompletionWithNoFlags) {
491f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    uint8_t buf[0x100]; // Create a buffer to get memzero'd
492f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    Deps_KernelAllocPmemBufferWithSuccessfulCompletionWithNoFlags depsMock(buf);
493f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    PmemKernelAllocator pma(depsMock, fakePmemDev);
494f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
495f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    void* base = 0;
496f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int offset = -9182, fd = -9182;
497f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int size = 0x100;
498f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int flags = 0;
499f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int result = pma.alloc_pmem_buffer(size, flags, &base, &offset, &fd);
500f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(0, result);
501f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(buf, base);
502f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(0, offset);
503f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(5678, fd);
504f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    for (int i = 0; i < 0x100; ++i) {
505f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        ASSERT_EQ(0, buf[i]);
506f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
507f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis}
508f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
509f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis/******************************************************************************/
510f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
511f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennistypedef Deps_KernelAllocPmemBufferWithSuccessfulCompletionWithNoFlags Deps_KernelAllocPmemBufferWithSuccessfulCompletionWithAllFlags;
512f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
513f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie GennisTEST(test_pmem_kernel_allocator, testAllocPmemBufferWithSuccessfulCompletionWithAllFlags) {
514f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    uint8_t buf[0x100]; // Create a buffer to get memzero'd
515f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    Deps_KernelAllocPmemBufferWithSuccessfulCompletionWithAllFlags depsMock(buf);
516f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    PmemKernelAllocator pma(depsMock, fakePmemDev);
517f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
518f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    void* base = 0;
519f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int offset = -9182, fd = -9182;
520f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int size = 0x100;
521f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int flags = ~0;
522f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int result = pma.alloc_pmem_buffer(size, flags, &base, &offset, &fd);
523f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(0, result);
524f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(buf, base);
525f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(0, offset);
526f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(5678, fd);
527f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    for (int i = 0; i < 0x100; ++i) {
528f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        ASSERT_EQ(0, buf[i]);
529f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
530f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis}
531f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
532f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis/******************************************************************************/
533f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
534f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennisstruct Deps_KernelAllocPmemBufferWithEpermOnOpen : public DepsStub {
535f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
536f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int getErrno() {
537f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return EPERM;
538f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
539f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
540f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int open(const char* pathname, int flags, int mode) {
541f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(fakePmemDev, pathname);
542f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(O_RDWR, flags & O_RDWR);
543f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(0, mode);
544f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return -1;
545f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
546f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis};
547f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
548f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
549f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie GennisTEST(test_pmem_kernel_allocator, testAllocPmemBufferWithEpermOnOpen) {
550f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    Deps_KernelAllocPmemBufferWithEpermOnOpen depsMock;
551f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    PmemKernelAllocator pma(depsMock, fakePmemDev);
552f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
553f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    void* base = 0;
554f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int offset = -9182, fd = -9182;
555f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int size = 0x100;
556f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int flags = ~0;
557f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int result = pma.alloc_pmem_buffer(size, flags, &base, &offset, &fd);
558f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(-EPERM, result);
559f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(0, base);
560f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(0, offset);
561f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(-1, fd);
562f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis}
563f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
564f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis/******************************************************************************/
565f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
566f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennisstruct Deps_KernelAllocPmemBufferWithEnomemOnMmap : DepsStub {
567f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
568f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int open(const char* pathname, int flags, int mode) {
569f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(fakePmemDev, pathname);
570f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(O_RDWR, flags & O_RDWR);
571f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        EXPECT_EQ(0, mode);
572f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return 5678;
573f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
574f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
575f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual void* mmap(void* start, size_t length, int prot, int flags, int fd,
576f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis            off_t offset) {
577f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return (void*)MAP_FAILED;
578f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
579f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
580f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    virtual int getErrno() {
581f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis        return ENOMEM;
582f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    }
583f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis};
584f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
585f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
586f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie GennisTEST(test_pmem_kernel_allocator, testAllocPmemBufferWithEnomemOnMmap) {
587f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    Deps_KernelAllocPmemBufferWithEnomemOnMmap depsMock;
588f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    PmemKernelAllocator pma(depsMock, fakePmemDev);
589f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
590f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    void* base = 0;
591f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int offset = -9182, fd = -9182;
592f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int size = 0x100;
593f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int flags = ~0;
594f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    int result = pma.alloc_pmem_buffer(size, flags, &base, &offset, &fd);
595f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(-ENOMEM, result);
596f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(0, base);
597f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(0, offset);
598f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis    ASSERT_EQ(-1, fd);
599f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis}
600f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis
601f5a83a9c024dee0617dbc3dab98cd307e8d54665Jamie Gennis/******************************************************************************/
602