Index: native_client_sdk/src/libraries/nacl_mounts_test/mount_test.cc |
diff --git a/native_client_sdk/src/libraries/nacl_mounts_test/mount_test.cc b/native_client_sdk/src/libraries/nacl_mounts_test/mount_test.cc |
deleted file mode 100644 |
index 34c7ce6aa26bcd97f194b12165bc9a017ae96bac..0000000000000000000000000000000000000000 |
--- a/native_client_sdk/src/libraries/nacl_mounts_test/mount_test.cc |
+++ /dev/null |
@@ -1,227 +0,0 @@ |
-/* Copyright (c) 2012 The Chromium 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 <errno.h> |
-#include <fcntl.h> |
-#include <string.h> |
-#include <string> |
-#include <sys/stat.h> |
- |
-#include "nacl_mounts/mount.h" |
-#include "nacl_mounts/mount_dev.h" |
-#include "nacl_mounts/mount_mem.h" |
-#include "nacl_mounts/osdirent.h" |
- |
-#include "gtest/gtest.h" |
- |
-namespace { |
- |
-class MountMemMock : public MountMem { |
- public: |
- MountMemMock() { |
- StringMap_t map; |
- Init(1, map, NULL); |
- }; |
- |
- int num_nodes() { |
- return (int) inode_pool_.size(); |
- } |
-}; |
- |
-class MountDevMock : public MountDev { |
- public: |
- MountDevMock() { |
- StringMap_t map; |
- Init(1, map, NULL); |
- } |
- int num_nodes() { |
- return (int) inode_pool_.size(); |
- } |
-}; |
- |
-} // namespace |
- |
- |
-#define NULL_NODE ((MountNode *) NULL) |
- |
-TEST(MountTest, Sanity) { |
- MountMemMock* mnt = new MountMemMock(); |
- MountNode* file; |
- MountNode* root; |
- |
- char buf1[1024]; |
- |
- // A memory mount starts with one directory node: the root. |
- EXPECT_EQ(1, mnt->num_nodes()); |
- |
- // Fail to open non existant file |
- EXPECT_EQ(NULL_NODE, mnt->Open(Path("/foo"), O_RDWR)); |
- EXPECT_EQ(errno, ENOENT); |
- |
- // Create a file |
- file = mnt->Open(Path("/foo"), O_RDWR | O_CREAT); |
- EXPECT_NE(NULL_NODE, file); |
- if (file == NULL) return; |
- EXPECT_EQ(2, file->RefCount()); |
- EXPECT_EQ(2, mnt->num_nodes()); |
- |
- // Open the root directory |
- root = mnt->Open(Path("/"), O_RDWR); |
- EXPECT_NE(NULL_NODE, root); |
- if (NULL != root) { |
- struct dirent dirs[2]; |
- int len = root->GetDents(0, dirs, sizeof(dirs)); |
- EXPECT_EQ(sizeof(struct dirent), len); |
- } |
- |
- // Fail to re-create the same file |
- EXPECT_EQ(NULL_NODE, mnt->Open(Path("/foo"), O_RDWR | O_CREAT | O_EXCL)); |
- EXPECT_EQ(errno, EEXIST); |
- EXPECT_EQ(2, mnt->num_nodes()); |
- |
- // Fail to create a directory with the same name |
- EXPECT_EQ(-1, mnt->Mkdir(Path("/foo"), O_RDWR)); |
- EXPECT_EQ(errno, EEXIST); |
- |
- // Attempt to READ/WRITE |
- EXPECT_EQ(0, file->GetSize()); |
- EXPECT_EQ(sizeof(buf1), file->Write(0, buf1, sizeof(buf1))); |
- EXPECT_EQ(sizeof(buf1), file->GetSize()); |
- EXPECT_EQ(sizeof(buf1), file->Read(0, buf1, sizeof(buf1))); |
- |
- // Attempt to open the same file |
- EXPECT_EQ(file, mnt->Open(Path("/foo"), O_RDWR | O_CREAT)); |
- EXPECT_EQ(sizeof(buf1), file->GetSize()); |
- EXPECT_EQ(3, file->RefCount()); |
- EXPECT_EQ(2, mnt->num_nodes()); |
- |
- // Attempt to close and delete the file |
- mnt->ReleaseNode(file); |
- EXPECT_EQ(2, mnt->num_nodes()); |
- EXPECT_EQ(0, mnt->Unlink(Path("/foo"))); |
- EXPECT_EQ(2, mnt->num_nodes()); |
- EXPECT_EQ(-1, mnt->Unlink(Path("/foo"))); |
- EXPECT_EQ(2, mnt->num_nodes()); |
- EXPECT_EQ(errno, ENOENT); |
- mnt->ReleaseNode(file); |
- EXPECT_EQ(1, mnt->num_nodes()); |
- |
- // Recreate foo as a directory |
- EXPECT_EQ(0, mnt->Mkdir(Path("/foo"), O_RDWR)); |
- |
- // Create a file (exclusively) |
- file = mnt->Open(Path("/foo/bar"), O_RDWR | O_CREAT | O_EXCL); |
- EXPECT_NE(NULL_NODE, file); |
- if (NULL == file) return; |
- |
- // Attempt to delete the directory |
- EXPECT_EQ(-1, mnt->Rmdir(Path("/foo"))); |
- EXPECT_EQ(errno, ENOTEMPTY); |
- |
- // Unlink the file, then delete the directory |
- EXPECT_EQ(0, mnt->Unlink(Path("/foo/bar"))); |
- EXPECT_EQ(0, mnt->Rmdir(Path("/foo"))); |
- EXPECT_EQ(2, mnt->num_nodes()); |
- mnt->ReleaseNode(file); |
- EXPECT_EQ(1, mnt->num_nodes()); |
- |
- // Verify the directory is gone |
- file = mnt->Open(Path("/foo"), O_RDWR); |
- EXPECT_EQ(NULL_NODE, file); |
- EXPECT_EQ(errno, ENOENT); |
-} |
- |
-TEST(MountTest, MemMountRemove) { |
- MountMemMock* mnt = new MountMemMock(); |
- MountNode* file; |
- |
- EXPECT_EQ(0, mnt->Mkdir(Path("/dir"), O_RDWR)); |
- file = mnt->Open(Path("/file"), O_RDWR | O_CREAT | O_EXCL); |
- EXPECT_NE(NULL_NODE, file); |
- mnt->ReleaseNode(file); |
- |
- EXPECT_EQ(0, mnt->Remove(Path("/dir"))); |
- EXPECT_EQ(0, mnt->Remove(Path("/file"))); |
- |
- EXPECT_EQ(NULL_NODE, mnt->Open(Path("/dir/foo"), O_CREAT | O_RDWR)); |
- EXPECT_EQ(ENOENT, errno); |
- EXPECT_EQ(NULL_NODE, mnt->Open(Path("/file"), O_RDONLY)); |
- EXPECT_EQ(ENOENT, errno); |
-} |
- |
-TEST(MountTest, DevNull) { |
- MountDevMock* mnt = new MountDevMock(); |
- MountNode* dev_null = mnt->Open(Path("/null"), O_RDWR); |
- ASSERT_NE(NULL_NODE, dev_null); |
- |
- // Writing to /dev/null should write everything. |
- const char msg[] = "Dummy test message."; |
- EXPECT_EQ(strlen(msg), dev_null->Write(0, &msg[0], strlen(msg))); |
- |
- // Reading from /dev/null should read nothing. |
- const int kBufferLength = 100; |
- char buffer[kBufferLength]; |
- EXPECT_EQ(0, dev_null->Read(0, &buffer[0], kBufferLength)); |
- mnt->ReleaseNode(dev_null); |
-} |
- |
-TEST(MountTest, DevZero) { |
- MountDevMock* mnt = new MountDevMock(); |
- MountNode* dev_zero = mnt->Open(Path("/zero"), O_RDWR); |
- ASSERT_NE(NULL_NODE, dev_zero); |
- |
- // Writing to /dev/zero should write everything. |
- const char msg[] = "Dummy test message."; |
- EXPECT_EQ(strlen(msg), dev_zero->Write(0, &msg[0], strlen(msg))); |
- |
- // Reading from /dev/zero should read all zeroes. |
- const int kBufferLength = 100; |
- char buffer[kBufferLength]; |
- // First fill with all 1s. |
- memset(&buffer[0], 0x1, kBufferLength); |
- EXPECT_EQ(kBufferLength, dev_zero->Read(0, &buffer[0], kBufferLength)); |
- |
- char zero_buffer[kBufferLength]; |
- memset(&zero_buffer[0], 0, kBufferLength); |
- EXPECT_EQ(0, memcmp(&buffer[0], &zero_buffer[0], kBufferLength)); |
- mnt->ReleaseNode(dev_zero); |
-} |
- |
-TEST(MountTest, DevUrandom) { |
- MountDevMock* mnt = new MountDevMock(); |
- MountNode* dev_urandom = mnt->Open(Path("/urandom"), O_RDWR); |
- ASSERT_NE(NULL_NODE, dev_urandom); |
- |
- // Writing to /dev/zero should write everything. |
- const char msg[] = "Dummy test message."; |
- EXPECT_EQ(strlen(msg), dev_urandom->Write(0, &msg[0], strlen(msg))); |
- |
- // Reading from /dev/urandom should read random bytes. |
- const int kSampleBatches = 1000; |
- const int kSampleBatchSize = 1000; |
- const int kTotalSamples = kSampleBatches * kSampleBatchSize; |
- |
- int byte_count[256] = {0}; |
- |
- unsigned char buffer[kSampleBatchSize]; |
- for (int batch = 0; batch < kSampleBatches; ++batch) { |
- int bytes_read = dev_urandom->Read(0, &buffer[0], kSampleBatchSize); |
- EXPECT_EQ(kSampleBatchSize, bytes_read); |
- |
- for (int i = 0; i < bytes_read; ++i) { |
- byte_count[buffer[i]]++; |
- } |
- } |
- |
- double expected_count = kTotalSamples / 256.; |
- double chi_squared = 0; |
- for (int i = 0; i < 256; ++i) { |
- double difference = byte_count[i] - expected_count; |
- chi_squared += difference * difference / expected_count; |
- } |
- |
- // Approximate chi-squared value for p-value 0.05, 255 degrees-of-freedom. |
- EXPECT_LE(chi_squared, 293.24); |
-} |