| Index: native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_filesystem.cc
|
| diff --git a/native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_filesystem.cc b/native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_filesystem.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a60688485d3fa9240259032bedcd1512b67e65d7
|
| --- /dev/null
|
| +++ b/native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_filesystem.cc
|
| @@ -0,0 +1,164 @@
|
| +// Copyright 2016 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 "fake_ppapi/fake_filesystem.h"
|
| +
|
| +#include <algorithm>
|
| +#include <vector>
|
| +
|
| +#include <ppapi/c/pp_completion_callback.h>
|
| +#include <ppapi/c/pp_errors.h>
|
| +
|
| +#include "gtest/gtest.h"
|
| +
|
| +#include "fake_ppapi/fake_node.h"
|
| +
|
| +FakeFilesystem::FakeFilesystem() : filesystem_type_(PP_FILESYSTEMTYPE_INVALID) {
|
| + Clear();
|
| +}
|
| +
|
| +FakeFilesystem::FakeFilesystem(PP_FileSystemType type)
|
| + : filesystem_type_(type) {
|
| + Clear();
|
| +}
|
| +
|
| +FakeFilesystem::FakeFilesystem(const FakeFilesystem& filesystem,
|
| + PP_FileSystemType type)
|
| + : node_map_(filesystem.node_map_), filesystem_type_(type) {}
|
| +
|
| +void FakeFilesystem::Clear() {
|
| + node_map_.clear();
|
| + // Always have a root node.
|
| + AddDirectory("/", NULL);
|
| +}
|
| +
|
| +bool FakeFilesystem::AddEmptyFile(const Path& path, FakeNode** out_node) {
|
| + return AddFile(path, std::vector<uint8_t>(), out_node);
|
| +}
|
| +
|
| +bool FakeFilesystem::AddFile(const Path& path,
|
| + const std::string& contents,
|
| + FakeNode** out_node) {
|
| + std::vector<uint8_t> data;
|
| + std::copy(contents.begin(), contents.end(), std::back_inserter(data));
|
| + return AddFile(path, data, out_node);
|
| +}
|
| +
|
| +bool FakeFilesystem::AddFile(const Path& path,
|
| + const std::vector<uint8_t>& contents,
|
| + FakeNode** out_node) {
|
| + NodeMap::iterator iter = node_map_.find(path);
|
| + if (iter != node_map_.end()) {
|
| + if (out_node)
|
| + *out_node = NULL;
|
| + return false;
|
| + }
|
| +
|
| + PP_FileInfo info;
|
| + info.size = contents.size();
|
| + info.type = PP_FILETYPE_REGULAR;
|
| + info.system_type = filesystem_type_;
|
| + info.creation_time = 0;
|
| + info.last_access_time = 0;
|
| + info.last_modified_time = 0;
|
| +
|
| + FakeNode node(info, contents);
|
| + std::pair<NodeMap::iterator, bool> result =
|
| + node_map_.insert(NodeMap::value_type(path, node));
|
| +
|
| + EXPECT_EQ(true, result.second);
|
| + if (out_node)
|
| + *out_node = &result.first->second;
|
| + return true;
|
| +}
|
| +
|
| +bool FakeFilesystem::AddDirectory(const Path& path, FakeNode** out_node) {
|
| + NodeMap::iterator iter = node_map_.find(path);
|
| + if (iter != node_map_.end()) {
|
| + if (out_node)
|
| + *out_node = NULL;
|
| + return false;
|
| + }
|
| +
|
| + PP_FileInfo info;
|
| + info.size = 0;
|
| + info.type = PP_FILETYPE_DIRECTORY;
|
| + info.system_type = filesystem_type_;
|
| + info.creation_time = 0;
|
| + info.last_access_time = 0;
|
| + info.last_modified_time = 0;
|
| +
|
| + FakeNode node(info);
|
| + std::pair<NodeMap::iterator, bool> result =
|
| + node_map_.insert(NodeMap::value_type(path, node));
|
| +
|
| + EXPECT_EQ(true, result.second);
|
| + if (out_node)
|
| + *out_node = &result.first->second;
|
| + return true;
|
| +}
|
| +
|
| +bool FakeFilesystem::RemoveNode(const Path& path) {
|
| + return node_map_.erase(path) >= 1;
|
| +}
|
| +
|
| +FakeNode* FakeFilesystem::GetNode(const Path& path) {
|
| + NodeMap::iterator iter = node_map_.find(path);
|
| + if (iter == node_map_.end())
|
| + return NULL;
|
| + return &iter->second;
|
| +}
|
| +
|
| +bool FakeFilesystem::GetDirectoryEntries(
|
| + const Path& path,
|
| + DirectoryEntries* out_dir_entries) const {
|
| + out_dir_entries->clear();
|
| +
|
| + NodeMap::const_iterator iter = node_map_.find(path);
|
| + if (iter == node_map_.end())
|
| + return false;
|
| +
|
| + const FakeNode& dir_node = iter->second;
|
| + if (!dir_node.IsDirectory())
|
| + return false;
|
| +
|
| + for (NodeMap::const_iterator iter = node_map_.begin();
|
| + iter != node_map_.end(); ++iter) {
|
| + const Path& node_path = iter->first;
|
| + if (node_path.find(path) == std::string::npos)
|
| + continue;
|
| +
|
| + // A node is not a child of itself.
|
| + if (&iter->second == &dir_node)
|
| + continue;
|
| +
|
| + // Only consider children, not descendants. If we find a forward slash, then
|
| + // the node must be in a subdirectory.
|
| + if (node_path.find('/', path.size() + 1) != std::string::npos)
|
| + continue;
|
| +
|
| + // The directory entry names do not include the path.
|
| + Path entry_path = node_path;
|
| + size_t last_slash = node_path.rfind('/');
|
| + if (last_slash != std::string::npos)
|
| + entry_path.erase(0, last_slash + 1);
|
| +
|
| + DirectoryEntry entry;
|
| + entry.path = entry_path;
|
| + entry.node = &iter->second;
|
| + out_dir_entries->push_back(entry);
|
| + }
|
| +
|
| + return true;
|
| +}
|
| +
|
| +// static
|
| +FakeFilesystem::Path FakeFilesystem::GetParentPath(const Path& path) {
|
| + size_t last_slash = path.rfind('/');
|
| + if (last_slash == 0)
|
| + return "/";
|
| +
|
| + EXPECT_EQ(std::string::npos, last_slash);
|
| + return path.substr(0, last_slash);
|
| +}
|
|
|