blob: d2512c6823fee92d9030179bbf183469b1841e3e [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "shared-memory.h"
#include <zircon/errors.h>
#include <gtest/gtest.h>
namespace fuzzing {
TEST(SharedMemoryTest, Create) {
SharedMemory shmem;
// Bad length
EXPECT_EQ(shmem.Create(0), ZX_ERR_INVALID_ARGS);
EXPECT_EQ(shmem.addr(), 0u);
EXPECT_EQ(shmem.len(), 0u);
// Valid
size_t size = 0x1000;
EXPECT_EQ(shmem.Create(size), ZX_OK);
EXPECT_NE(shmem.addr(), 0u);
EXPECT_EQ(shmem.len(), size);
size_t actual;
EXPECT_EQ(shmem.vmo().get_size(&actual), ZX_OK);
EXPECT_EQ(size, actual);
// Can recreate
size *= 2;
EXPECT_EQ(shmem.Create(size), ZX_OK);
EXPECT_NE(shmem.addr(), 0u);
EXPECT_EQ(shmem.len(), size);
}
TEST(SharedMemoryTest, Share) {
SharedMemory shmem;
// Not created
zx::vmo vmo;
EXPECT_EQ(shmem.Share(&vmo), ZX_ERR_BAD_HANDLE);
// Bad pointer
size_t size = 0x1000;
EXPECT_EQ(shmem.Create(size), ZX_OK);
EXPECT_EQ(shmem.Share(nullptr), ZX_ERR_INVALID_ARGS);
// Valid
EXPECT_EQ(shmem.Share(&vmo), ZX_OK);
size_t actual;
EXPECT_EQ(vmo.get_size(&actual), ZX_OK);
EXPECT_EQ(size, actual);
}
TEST(SharedMemoryTest, Link) {
SharedMemory shmem;
// Bad VMO.
zx::vmo vmo;
size_t size = 0x1000;
EXPECT_EQ(shmem.Link(vmo, size), ZX_ERR_BAD_HANDLE);
EXPECT_EQ(shmem.addr(), 0u);
// Bad length.
EXPECT_EQ(zx::vmo::create(size, 0, &vmo), ZX_OK);
EXPECT_EQ(shmem.Link(vmo, size + 1), ZX_ERR_BUFFER_TOO_SMALL);
EXPECT_EQ(shmem.addr(), 0u);
// Valid
EXPECT_EQ(shmem.Link(vmo, size), ZX_OK);
EXPECT_NE(shmem.addr(), 0u);
EXPECT_EQ(shmem.len(), size);
// Can remap.
size *= 2;
EXPECT_EQ(zx::vmo::create(size, 0, &vmo), ZX_OK);
EXPECT_EQ(shmem.Link(vmo, size), ZX_OK);
EXPECT_NE(shmem.addr(), 0u);
EXPECT_EQ(shmem.len(), size);
}
TEST(SharedMemoryTest, Reset) {
SharedMemory shmem;
// Valid even if unmapped
shmem.Reset();
// Valid
size_t size = 0x1000;
EXPECT_EQ(shmem.Create(size), ZX_OK);
EXPECT_NE(shmem.addr(), 0u);
EXPECT_EQ(shmem.len(), size);
shmem.Reset();
EXPECT_EQ(shmem.addr(), 0u);
EXPECT_EQ(shmem.len(), 0u);
// Can map again after reset.
EXPECT_EQ(shmem.Create(size), ZX_OK);
EXPECT_NE(shmem.addr(), 0u);
EXPECT_EQ(shmem.len(), size);
}
} // namespace fuzzing