| Index: mojo/system/embedder_unittest.cc
|
| diff --git a/mojo/system/embedder_unittest.cc b/mojo/system/embedder_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ddd889fce4f87820e8010fc35b9e664f20b04cff
|
| --- /dev/null
|
| +++ b/mojo/system/embedder_unittest.cc
|
| @@ -0,0 +1,102 @@
|
| +// 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/system/embedder.h"
|
| +
|
| +#include <string.h>
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/location.h"
|
| +#include "base/logging.h"
|
| +// TODO(vtl): Remove build_config.h include when fully implemented on Windows.
|
| +#include "build/build_config.h"
|
| +#include "mojo/public/system/core.h"
|
| +#include "mojo/system/platform_channel_pair.h"
|
| +#include "mojo/system/test_embedder.h"
|
| +#include "mojo/system/test_utils.h"
|
| +
|
| +namespace mojo {
|
| +namespace embedder {
|
| +namespace {
|
| +
|
| +typedef system::test::TestWithIOThreadBase EmbedderTest;
|
| +
|
| +void StoreChannelInfo(ChannelInfo** store_channel_info_here,
|
| + ChannelInfo* channel_info) {
|
| + CHECK(store_channel_info_here);
|
| + CHECK(channel_info);
|
| + *store_channel_info_here = channel_info;
|
| +}
|
| +
|
| +TEST_F(EmbedderTest, ChannelsBasic) {
|
| + Init();
|
| +
|
| +// TODO(vtl): |PlatformChannelPair| not implemented on Windows yet.
|
| +#if !defined(OS_WIN)
|
| + system::PlatformChannelPair channel_pair;
|
| + system::ScopedPlatformHandle server_handle = channel_pair.PassServerHandle();
|
| + system::ScopedPlatformHandle client_handle = channel_pair.PassClientHandle();
|
| +
|
| + ChannelInfo* server_channel_info = NULL;
|
| + MojoHandle server_mp = CreateChannel(server_handle.Pass(),
|
| + io_thread_task_runner(),
|
| + base::Bind(&StoreChannelInfo,
|
| + &server_channel_info));
|
| + EXPECT_NE(server_mp, MOJO_HANDLE_INVALID);
|
| +
|
| + ChannelInfo* client_channel_info = NULL;
|
| + MojoHandle client_mp = CreateChannel(client_handle.Pass(),
|
| + io_thread_task_runner(),
|
| + base::Bind(&StoreChannelInfo,
|
| + &client_channel_info));
|
| + EXPECT_NE(client_mp, MOJO_HANDLE_INVALID);
|
| +
|
| + // We can write to a message pipe handle immediately.
|
| + const char kHello[] = "hello";
|
| + EXPECT_EQ(MOJO_RESULT_OK,
|
| + MojoWriteMessage(server_mp, kHello,
|
| + static_cast<uint32_t>(sizeof(kHello)), NULL, 0u,
|
| + MOJO_WRITE_MESSAGE_FLAG_NONE));
|
| +
|
| + // Now wait for the other side to become readable.
|
| + EXPECT_EQ(MOJO_RESULT_OK,
|
| + MojoWait(client_mp, MOJO_WAIT_FLAG_READABLE,
|
| + MOJO_DEADLINE_INDEFINITE));
|
| +
|
| + char buffer[1000] = {};
|
| + uint32_t num_bytes = static_cast<uint32_t>(sizeof(kHello));
|
| + EXPECT_EQ(MOJO_RESULT_OK,
|
| + MojoReadMessage(client_mp, buffer, &num_bytes, NULL, NULL,
|
| + MOJO_READ_MESSAGE_FLAG_NONE));
|
| + EXPECT_EQ(sizeof(kHello), num_bytes);
|
| + EXPECT_EQ(0, memcmp(buffer, kHello, num_bytes));
|
| +
|
| + // TODO(vtl): FIXME -- This rapid-fire closing leads to a warning: "Received a
|
| + // message for nonexistent local destination ID 1". This is due to a race
|
| + // condition (in channel.cc/message_pipe.cc).
|
| + EXPECT_EQ(MOJO_RESULT_OK, MojoClose(server_mp));
|
| + EXPECT_EQ(MOJO_RESULT_OK, MojoClose(client_mp));
|
| +
|
| + EXPECT_TRUE(server_channel_info != NULL);
|
| + system::test::PostTaskAndWait(io_thread_task_runner(),
|
| + FROM_HERE,
|
| + base::Bind(&DestroyChannelOnIOThread,
|
| + server_channel_info));
|
| +
|
| + EXPECT_TRUE(client_channel_info != NULL);
|
| + system::test::PostTaskAndWait(io_thread_task_runner(),
|
| + FROM_HERE,
|
| + base::Bind(&DestroyChannelOnIOThread,
|
| + client_channel_info));
|
| +#endif // !defined(OS_WIN)
|
| +
|
| + test::Shutdown();
|
| +}
|
| +
|
| +// TODO(vtl): Test immediate write & close.
|
| +// TODO(vtl): Test broken-connection cases.
|
| +
|
| +} // namespace
|
| +} // namespace embedder
|
| +} // namespace mojo
|
|
|