// Copyright 2014 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 "mojo/data_pipe_utils/data_pipe_utils.h" #include "base/bind.h" #include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" #include "base/message_loop/message_loop.h" #include "base/synchronization/condition_variable.h" #include "base/threading/sequenced_worker_pool.h" #include "base/time/time.h" #include "testing/gtest/include/gtest/gtest.h" namespace mojo { namespace common { namespace { void TransferBooleanValueAndExecute(const base::Closure& closure, bool* to_write, bool value) { *to_write = value; if (!closure.is_null()) { closure.Run(); } } TEST(DataPipeUtilsTest, AsyncFileTransfer) { const char kData[] = "Hello world."; base::ScopedTempDir temp_dir; ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); base::FilePath input; base::FilePath output; ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir.path(), &input)); ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir.path(), &output)); ASSERT_TRUE(base::WriteFile(input, kData, arraysize(kData))); base::MessageLoop loop; scoped_refptr blocking_pool = new base::SequencedWorkerPool(2, "blocking_pool"); bool write_succeded = false; bool read_succeded = false; DataPipe pipes; CopyFromFile(input, pipes.producer_handle.Pass(), 0, blocking_pool.get(), base::Bind(&TransferBooleanValueAndExecute, base::Closure(), base::Unretained(&write_succeded))); CopyToFile(pipes.consumer_handle.Pass(), output, blocking_pool.get(), base::Bind(&TransferBooleanValueAndExecute, base::MessageLoop::QuitClosure(), base::Unretained(&read_succeded))); loop.Run(); EXPECT_TRUE(write_succeded); EXPECT_TRUE(read_succeded); EXPECT_TRUE(base::ContentsEqual(input, output)); blocking_pool->Shutdown(); } } // namespace } // namespace common } // namespace mojo