blob: e6c07177907223b91c5992e320df10b9b944ee50 [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 <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fbl/unique_fd.h>
#include <zxtest/zxtest.h>
// TODO(60236): get the memfd_create symbol from libc instead.
#include "memfd.h"
TEST(MemFDTest, Smoke) {
fbl::unique_fd fd(memfd_create(nullptr, 0));
EXPECT_TRUE(fd.is_valid());
EXPECT_EQ(3, write(fd.get(), "abc", 3));
char buffer[1024] = {};
EXPECT_EQ(3, pread(fd.get(), buffer, sizeof(buffer), 0));
EXPECT_STR_EQ("abc", buffer);
}
TEST(MemFDTest, SeekPastEnd) {
fbl::unique_fd fd(memfd_create(nullptr, 0));
EXPECT_TRUE(fd.is_valid());
EXPECT_EQ(3, write(fd.get(), "abc", 3));
ASSERT_EQ(10543, lseek(fd.get(), 10543, SEEK_SET));
EXPECT_EQ(3, write(fd.get(), "xyz", 3));
char buffer[1024] = {};
EXPECT_EQ(3, pread(fd.get(), buffer, sizeof(buffer), 10543));
EXPECT_STR_EQ("xyz", buffer);
}
TEST(MemFDTest, Truncate) {
fbl::unique_fd fd(memfd_create(nullptr, 0));
EXPECT_TRUE(fd.is_valid());
EXPECT_EQ(0, ftruncate(fd.get(), 10543));
ASSERT_EQ(10540, lseek(fd.get(), -3, SEEK_END));
EXPECT_EQ(3, write(fd.get(), "xyz", 3));
ASSERT_EQ(5530, lseek(fd.get(), -5013, SEEK_CUR));
EXPECT_EQ(3, write(fd.get(), "abc", 3));
char buffer[1024] = {};
EXPECT_EQ(sizeof(buffer), pread(fd.get(), buffer, sizeof(buffer), 5530));
EXPECT_STR_EQ("abc", buffer);
memset(buffer, 0, sizeof(buffer));
EXPECT_EQ(3, pread(fd.get(), buffer, sizeof(buffer), 10540));
EXPECT_STR_EQ("xyz", buffer);
EXPECT_EQ(0, ftruncate(fd.get(), 5530));
EXPECT_EQ(0, ftruncate(fd.get(), 10543));
memset(buffer, 0, sizeof(buffer));
EXPECT_EQ(sizeof(buffer), pread(fd.get(), buffer, sizeof(buffer), 5530));
char zeros[sizeof(buffer)] = {};
EXPECT_EQ(0, memcmp(buffer, zeros, sizeof(buffer)));
memset(buffer, 0, sizeof(buffer));
EXPECT_EQ(3, pread(fd.get(), buffer, sizeof(buffer), 10540));
EXPECT_EQ(0, memcmp(buffer, zeros, 3));
}
TEST(MemFDTest, MMap) {
const size_t kSize = 256;
fbl::unique_fd fd(memfd_create(nullptr, 0));
EXPECT_TRUE(fd.is_valid());
EXPECT_EQ(0, ftruncate(fd.get(), kSize));
EXPECT_EQ(3, write(fd.get(), "abc", 3));
void* ptr = mmap(nullptr, kSize, PROT_READ, MAP_SHARED, fd.get(), 0u);
EXPECT_NE(MAP_FAILED, ptr);
char buffer[kSize] = {};
memcpy(buffer, ptr, 15);
EXPECT_STR_EQ("abc", buffer);
ASSERT_EQ(0, munmap(ptr, kSize));
}