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