Index: services/file_manager/file_manager_apptest.cc |
diff --git a/services/file_manager/file_manager_apptest.cc b/services/file_manager/file_manager_apptest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..227821259fc3b170af6badf4aec32aa06a8a43ba |
--- /dev/null |
+++ b/services/file_manager/file_manager_apptest.cc |
@@ -0,0 +1,146 @@ |
+// Copyright 2015 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 <vector> |
+ |
+#include "base/macros.h" |
+#include "mojo/public/cpp/application/application_impl.h" |
+#include "mojo/public/cpp/application/application_test_base.h" |
+#include "mojo/public/cpp/bindings/interface_request.h" |
+#include "mojo/public/cpp/bindings/type_converter.h" |
+#include "services/file_manager/directory.mojom.h" |
+#include "services/file_manager/file.mojom.h" |
+#include "services/file_manager/file_manager.mojom.h" |
+ |
+namespace mojo { |
+namespace files { |
+ |
+class ErrorCallback { |
+ public: |
+ explicit ErrorCallback(Error* error) : error_(error) {} |
+ void Run(Error error) const { *error_ = error; } |
+ |
+ private: |
+ Error* error_; |
+}; |
+ |
+template <typename T> |
+class ErrorAndValueCallback { |
+ public: |
+ explicit ErrorAndValueCallback(Error* error, T* value) |
+ : error_(error), value_(value) {} |
+ void Run(Error error, T value) const { |
+ *error_ = error; |
+ *value_ = value; |
+ } |
+ |
+ private: |
+ Error* error_; |
+ T* value_; |
+}; |
+ |
+template <typename V> |
+class ErrorAndValueCallback<Array<V>> { |
+ public: |
+ explicit ErrorAndValueCallback(Error* error, Array<V>* value) |
+ : error_(error), value_(value) {} |
+ void Run(Error error, Array<V> value) const { |
+ *error_ = error; |
+ value.Swap(value_); |
+ } |
+ |
+ private: |
+ Error* error_; |
+ Array<V>* value_; |
+}; |
+ |
+class FileManagerAppTest : public test::ApplicationTestBase { |
+ public: |
+ FileManagerAppTest() {} |
+ ~FileManagerAppTest() override {} |
+ |
+ void SetUp() override { |
+ test::ApplicationTestBase::SetUp(); |
+ application_impl()->ConnectToService("mojo:file_manager", &file_manager_); |
+ } |
+ |
+ FileManagerPtr& file_manager() { return file_manager_; } |
+ |
+ private: |
+ FileManagerPtr file_manager_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FileManagerAppTest); |
+}; |
+ |
+TEST_F(FileManagerAppTest, CreateWriteCloseRenameOpenRead) { |
+ // Get a temporary root directory. |
+ DirectoryPtr directory; |
+ Error error = ERROR_INTERNAL; |
+ file_manager()->OpenFileSystem(FILE_SYSTEM_TEMPORARY, GetProxy(&directory), |
+ ErrorCallback(&error)); |
+ ASSERT_TRUE(file_manager().WaitForIncomingMethodCall()); |
+ EXPECT_EQ(ERROR_OK, error); |
+ |
+ { |
+ // Create my_file. |
+ FilePtr file; |
+ error = ERROR_INTERNAL; |
+ directory->OpenFile("my_file", GetProxy(&file), kAccessFlagWrite, |
+ kOpenFlagCreate, ErrorCallback(&error)); |
+ ASSERT_TRUE(directory.WaitForIncomingMethodCall()); |
+ EXPECT_EQ(ERROR_OK, error); |
+ |
+ // Write to it. |
+ std::vector<uint8_t> bytes_to_write; |
+ bytes_to_write.push_back(static_cast<uint8_t>('h')); |
+ bytes_to_write.push_back(static_cast<uint8_t>('e')); |
+ bytes_to_write.push_back(static_cast<uint8_t>('l')); |
+ bytes_to_write.push_back(static_cast<uint8_t>('l')); |
+ bytes_to_write.push_back(static_cast<uint8_t>('o')); |
+ error = ERROR_INTERNAL; |
+ uint32_t num_bytes_written = 0; |
+ file->Write(Array<uint8_t>::From(bytes_to_write), 0, WHENCE_FROM_CURRENT, |
+ ErrorAndValueCallback<uint32_t>(&error, &num_bytes_written)); |
+ ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
+ EXPECT_EQ(ERROR_OK, error); |
+ EXPECT_EQ(5u, bytes_to_write.size()); |
+ |
+ // Close it. |
+ error = ERROR_INTERNAL; |
+ file->Close(ErrorCallback(&error)); |
+ ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
+ EXPECT_EQ(ERROR_OK, error); |
+ } |
+ |
+ // Rename it. |
+ error = ERROR_INTERNAL; |
+ directory->Rename("my_file", "your_file", ErrorCallback(&error)); |
+ ASSERT_TRUE(directory.WaitForIncomingMethodCall()); |
+ EXPECT_EQ(ERROR_OK, error); |
+ |
+ { |
+ // Open my_file again. |
+ FilePtr file; |
+ error = ERROR_INTERNAL; |
+ directory->OpenFile("your_file", GetProxy(&file), kAccessFlagRead, 0, |
+ ErrorCallback(&error)); |
+ ASSERT_TRUE(directory.WaitForIncomingMethodCall()); |
+ EXPECT_EQ(ERROR_OK, error); |
+ |
+ // Read from it. |
+ Array<uint8_t> bytes_read; |
+ error = ERROR_INTERNAL; |
+ file->Read(3, 1, WHENCE_FROM_START, |
+ ErrorAndValueCallback<Array<uint8_t>>(&error, &bytes_read)); |
+ ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
+ EXPECT_EQ(ERROR_OK, error); |
+ ASSERT_EQ(3u, bytes_read.size()); |
+ EXPECT_EQ(static_cast<uint8_t>('e'), bytes_read[0]); |
+ EXPECT_EQ(static_cast<uint8_t>('l'), bytes_read[1]); |
+ EXPECT_EQ(static_cast<uint8_t>('l'), bytes_read[2]); |
+ } |
+} |
+ |
+} // namespace files |
+} // namespace mojo |