Chromium Code Reviews| Index: content/browser/gamepad/gamepad_provider_unittest.cc |
| diff --git a/content/browser/gamepad/gamepad_provider_unittest.cc b/content/browser/gamepad/gamepad_provider_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..1ac6e02e1801147b5df86131c4e10fe2963d79cf |
| --- /dev/null |
| +++ b/content/browser/gamepad/gamepad_provider_unittest.cc |
| @@ -0,0 +1,121 @@ |
| +// Copyright (c) 2011 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 "base/memory/scoped_ptr.h" |
| +#include "base/process_util.h" |
| +#include "base/system_monitor/system_monitor.h" |
| +#include "content/browser/gamepad/gamepad_provider.h" |
| +#include "content/common/gamepad_messages.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| + |
| +namespace { |
| + |
| +class MockDataFetcher : public gamepad::DataFetcher { |
| + public: |
| + MockDataFetcher() : read_data_(false) { |
| + memset(&test_data, 0, sizeof(test_data)); |
| + } |
| + virtual void GetGamepadData(WebKit::WebGamepads* pads, |
| + bool devices_changed_hint) OVERRIDE { |
| + *pads = test_data; |
| + read_data_ = true; |
| + } |
| + |
| + void SetData(WebKit::WebGamepads& data) { |
| + test_data = data; |
| + read_data_ = false; |
| + } |
| + |
| + bool ReadData() const { return read_data_; } |
| + |
| + WebKit::WebGamepads test_data; |
| + bool read_data_; |
| +}; |
| + |
| +// Main test fixture |
| +class GamepadProviderTest : public testing::Test { |
| + public: |
| + gamepad::Provider* CreateProvider() { |
| +#if defined(OS_MACOSX) |
| + base::SystemMonitor::AllocateSystemIOPorts(); |
| +#endif |
| + system_monitor_.reset(new base::SystemMonitor); |
| + mock_data_fetcher_ = new MockDataFetcher; |
| + provider_ = new gamepad::Provider(mock_data_fetcher_); |
| + return provider_.get(); |
| + } |
| + |
| + protected: |
| + GamepadProviderTest() { |
| + } |
| + |
| + MessageLoop main_message_loop_; |
| + scoped_ptr<base::SystemMonitor> system_monitor_; |
| + MockDataFetcher* mock_data_fetcher_; |
| + scoped_refptr<gamepad::Provider> provider_; |
| +}; |
| + |
| +TEST_F(GamepadProviderTest, BasicStartStop) { |
| + gamepad::Provider* provider = CreateProvider(); |
| + provider->Start(); |
| + provider->Stop(); |
| + // Just ensure that there's no asserts on startup, shutdown, or destroy. |
| +} |
| + |
| +TEST_F(GamepadProviderTest, PollingAccess) { |
| + using namespace gamepad; |
| + |
| + Provider* provider = CreateProvider(); |
| + provider->Start(); |
| + |
| + WebKit::WebGamepads test_data; |
| + test_data.length = 1; |
| + test_data.items[0].connected = true; |
| + test_data.items[0].timestamp = 0; |
| + test_data.items[0].buttonsLength = 1; |
| + test_data.items[0].axesLength = 2; |
| + test_data.items[0].buttons[0] = 1.f; |
| + test_data.items[0].axes[0] = -1.f; |
| + test_data.items[0].axes[1] = .5f; |
| + mock_data_fetcher_->SetData(test_data); |
| + |
| + main_message_loop_.RunAllPending(); |
| + |
| + while (!mock_data_fetcher_->ReadData()) { |
| + base::PlatformThread::Sleep(10); |
|
Paweł Hajdan Jr.
2011/11/18 11:59:07
Sorry, this is still bad. Please wait for en _even
|
| + } |
| + |
| + // Renderer-side, pull data out of poll buffer. |
| + base::SharedMemoryHandle handle = |
| + provider->GetRendererSharedMemoryHandle(base::GetCurrentProcessHandle()); |
| + base::SharedMemory* shared_memory = new base::SharedMemory(handle, true); |
| + EXPECT_TRUE(shared_memory->Map(sizeof(GamepadHardwareBuffer))); |
| + void* mem = shared_memory->memory(); |
| + |
| + GamepadHardwareBuffer* hwbuf = static_cast<GamepadHardwareBuffer*>(mem); |
| + // See gamepad_hardware_buffer.h for details on the read discipline. |
| + base::subtle::Atomic32 start, end; |
| + int contention_count = 0; |
| + WebKit::WebGamepads output; |
| + for (;;) { |
| + end = base::subtle::Acquire_Load(&hwbuf->end_marker); |
| + memcpy(&output, &hwbuf->buffer, sizeof(output)); |
| + start = base::subtle::Acquire_Load(&hwbuf->start_marker); |
| + if (start == end) break; |
| + ++contention_count; |
| + base::PlatformThread::YieldCurrentThread(); |
| + EXPECT_LT(10, contention_count); |
|
Paweł Hajdan Jr.
2011/11/18 11:59:07
This will still make the test hang if you're unluc
|
| + } |
| + |
| + EXPECT_EQ(1u, output.length); |
| + EXPECT_EQ(1u, output.items[0].buttonsLength); |
| + EXPECT_EQ(1.f, output.items[0].buttons[0]); |
| + EXPECT_EQ(2u, output.items[0].axesLength); |
| + EXPECT_EQ(-1.f, output.items[0].axes[0]); |
| + EXPECT_EQ(0.5f, output.items[0].axes[1]); |
| + |
| + provider->Stop(); |
| +} |
| + |
| +} // namespace |