diff options
Diffstat (limited to 'o3d/core/cross/message_queue_test.cc')
-rw-r--r-- | o3d/core/cross/message_queue_test.cc | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/o3d/core/cross/message_queue_test.cc b/o3d/core/cross/message_queue_test.cc index 3bc3941..1e2cf60 100644 --- a/o3d/core/cross/message_queue_test.cc +++ b/o3d/core/cross/message_queue_test.cc @@ -39,6 +39,7 @@ #include "core/cross/service_dependency.h" #include "core/cross/texture.h" #include "core/cross/types.h" +#include "core/cross/renderer.h" #include "tests/common/win/testing_common.h" #include "base/condition_variable.h" #include "base/lock.h" @@ -251,6 +252,9 @@ class TextureUpdateHelper { // memory segment. bool UnregisterSharedMemory(int shared_memory_id); + // Tells the renderer to render. + bool Render(); + private: // Handle of the socket that's connected to o3d. nacl::Handle o3d_handle_; @@ -564,7 +568,25 @@ bool TextureUpdateHelper::UnregisterSharedMemory(int shared_memory_id) { return reply; } +// Tells the renderer to render.. +bool TextureUpdateHelper::Render() { + MessageRender msg; + nacl::MessageHeader header; + nacl::IOVec vec; + + vec.base = &msg.msg; + vec.length = sizeof(msg.msg); + header.iov = &vec; + header.iov_length = 1; + header.handles = NULL; + header.handle_count = 0; + // Send message. + int result = nacl::SendDatagram(o3d_handle_, &header, 0); + EXPECT_EQ(static_cast<int>(vec.length), result); + // Read back the boolean reply from the O3D plugin + return true; +} //---------------------------------------------------------------------- // This is the main class containing all of the other ones. It knows @@ -1121,4 +1143,75 @@ TEST_F(MessageQueueTest, ConcurrentSharedMemoryOperations) { EXPECT_FALSE(CheckErrorExists()); } +namespace { + +// This helper class for Render test. +class RenderTest : public PerThreadConnectedTest { + private: + int num_iterations_; + + public: + explicit RenderTest(int num_iterations) { + num_iterations_ = num_iterations; + } + + void Run(MessageQueue* queue, + nacl::Handle socket_handle) { + String socket_addr = queue->GetSocketAddress(); + TextureUpdateHelper helper; + if (!helper.ConnectToO3D(socket_addr.c_str(), + socket_handle)) { + FAIL_TEST("Failed to connect to O3D"); + } + + // Allocate a shared memory segment + size_t mem_size = nacl::kMapPageSize; + nacl::Handle shared_memory = nacl::CreateMemoryObject(mem_size); + if (shared_memory == nacl::kInvalidHandle) { + FAIL_TEST("Failed to allocate shared memory object"); + } + + for (int i = 0; i < num_iterations_; i++) { + bool result = helper.Render(); + if (!result) { + FAIL_TEST("Failed to request a render"); + } + // Because Render has no result we run a few more messages the do + // to make sure Render was processed. + int shared_mem_id = + helper.RegisterSharedMemory(shared_memory, mem_size); + if (shared_mem_id < 0) { + FAIL_TEST("Failed to register shared memory with server"); + } + result = helper.UnregisterSharedMemory(shared_mem_id); + if (!result) { + FAIL_TEST("Failed to unregister shared memory from server"); + } + } + + Pass(); + } +}; + +} // anonymous namespace. + +// Tests requesting a render. +TEST_F(MessageQueueTest, Render) { + class Provider : public TestProvider { + public: + virtual PerThreadConnectedTest* CreateTest() { + return new RenderTest(1); + } + }; + + Renderer* renderer(g_service_locator->GetService<Renderer>()); + ASSERT_TRUE(renderer != NULL); + renderer->set_need_to_render(false); + + Provider provider; + RunTests(1, TimeDelta::FromSeconds(1), &provider); + EXPECT_FALSE(CheckErrorExists()); + EXPECT_TRUE(renderer->need_to_render()); +} + } // namespace o3d |