blob: c5893e7a1d90e7a19381b068f6bbe6b5ee784620 [file] [log] [blame]
// Copyright (c) 2013 The Chromium OS 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/sysmacros.h>
#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
#include "gtest/gtest.h"
#include "posix_translation/dev_null.h"
#include "posix_translation/test_util/file_system_test_common.h"
// We use random numbers for this test.
const int kNullMajorId = 42;
const int kNullMinorId = 43;
const int kFooBarMajorId = 44;
const int kFooBarMinorId = 45;
namespace posix_translation {
class DevNullTest : public FileSystemTestCommon {
protected:
DevNullTest()
: handler_(new DevNullHandler),
handler_with_mode_(new DevNullHandler(S_IFREG | 0644)) {
}
scoped_ptr<FileSystemHandler> handler_;
scoped_ptr<FileSystemHandler> handler_with_mode_;
private:
virtual void SetUp() OVERRIDE {
FileSystemTestCommon::SetUp();
DeviceHandler::AddDeviceId("/dev/null", kNullMajorId, kNullMinorId);
DeviceHandler::AddDeviceId("/foo/bar", kFooBarMajorId, kFooBarMinorId);
}
DISALLOW_COPY_AND_ASSIGN(DevNullTest);
};
TEST_F(DevNullTest, TestInit) {
}
TEST_F(DevNullTest, TestMkdir) {
EXPECT_EQ(-1, handler_->mkdir("/dev/null", 0700));
EXPECT_EQ(EEXIST, errno);
}
TEST_F(DevNullTest, TestRename) {
EXPECT_EQ(-1, handler_->rename("/dev/null", "/dev/foo"));
EXPECT_EQ(EACCES, errno);
EXPECT_EQ(0, handler_->rename("/dev/null", "/dev/null"));
}
TEST_F(DevNullTest, TestStat) {
struct stat st = {};
EXPECT_EQ(0, handler_->stat("/dev/null", &st));
EXPECT_NE(0U, st.st_ino);
EXPECT_EQ(S_IFCHR | 0666U, st.st_mode);
// Tests the constructor with a mode_t parameter.
EXPECT_EQ(0, handler_with_mode_->stat("/foo/bar", &st));
EXPECT_NE(0U, st.st_ino);
EXPECT_EQ(S_IFREG | 0644U, st.st_mode);
EXPECT_EQ(makedev(kFooBarMajorId, kFooBarMinorId), st.st_rdev);
}
TEST_F(DevNullTest, TestStatfs) {
struct statfs st = {};
EXPECT_EQ(0, handler_->statfs("/dev/null", &st));
EXPECT_NE(0U, st.f_type); // check something is filled.
}
TEST_F(DevNullTest, TestTruncate) {
EXPECT_EQ(-1, handler_->truncate("/dev/null", 0));
EXPECT_EQ(EINVAL, errno);
}
TEST_F(DevNullTest, TestUnlink) {
EXPECT_EQ(-1, handler_->unlink("/dev/null"));
EXPECT_EQ(EACCES, errno);
}
TEST_F(DevNullTest, TestUtimes) {
struct timeval times[2] = {};
EXPECT_EQ(-1, handler_->utimes("/dev/null", times));
EXPECT_EQ(EPERM, errno);
}
TEST_F(DevNullTest, TestOpenClose) {
scoped_refptr<FileStream> stream =
handler_->open(512, "/dev/null", O_RDONLY, 0);
ASSERT_TRUE(stream != NULL);
}
TEST_F(DevNullTest, TestFstat) {
scoped_refptr<FileStream> stream =
handler_->open(512, "/dev/null", O_RDONLY, 0);
ASSERT_TRUE(stream != NULL);
struct stat st = {};
stream->fstat(&st);
EXPECT_NE(0U, st.st_ino);
EXPECT_EQ(S_IFCHR | 0666U, st.st_mode);
EXPECT_EQ(makedev(kNullMajorId, kNullMinorId), st.st_rdev);
// Tests the constructor with a mode_t parameter.
stream = handler_with_mode_->open(512, "/foo/bar", O_RDONLY, 0);
ASSERT_TRUE(stream != NULL);
stream->fstat(&st);
EXPECT_NE(0U, st.st_ino);
EXPECT_EQ(S_IFREG | 0644U, st.st_mode);
}
TEST_F(DevNullTest, TestMmapShared) {
scoped_refptr<FileStream> stream =
handler_->open(512, "/dev/null", O_RDONLY, 0);
ASSERT_TRUE(stream != NULL);
EXPECT_EQ(MAP_FAILED, stream->mmap(NULL, 128, PROT_READ, MAP_SHARED, 0));
EXPECT_EQ(ENODEV, errno);
}
TEST_F(DevNullTest, TestMmapPrivate) {
scoped_refptr<FileStream> stream =
handler_->open(512, "/dev/null", O_RDWR, 0);
ASSERT_TRUE(stream != NULL);
char* p = static_cast<char*>(
stream->mmap(NULL, 128, PROT_READ | PROT_WRITE, MAP_PRIVATE, 0));
EXPECT_NE(MAP_FAILED, p);
EXPECT_EQ(0, p[0]);
p[1] = 1;
EXPECT_EQ(1, p[1]);
EXPECT_EQ(0, stream->munmap(p, 128));
}
TEST_F(DevNullTest, TestRead) {
scoped_refptr<FileStream> stream =
handler_->open(512, "/dev/null", O_RDONLY, 0);
ASSERT_TRUE(stream != NULL);
char buf[16] = {};
EXPECT_EQ(0, stream->read(buf, sizeof(buf)));
}
TEST_F(DevNullTest, TestWrite) {
scoped_refptr<FileStream> stream =
handler_->open(512, "/dev/null", O_RDONLY, 0);
ASSERT_TRUE(stream != NULL);
EXPECT_EQ(3, stream->write("abc", 3));
}
} // namespace posix_translation