Index: device/gamepad/gamepad_provider_unittest.cc |
diff --git a/device/gamepad/gamepad_provider_unittest.cc b/device/gamepad/gamepad_provider_unittest.cc |
index 180a804cd5ed77f21e4c23f5802e37f7f6447168..03b12638e93231e4ace8cd3fd6c2714511f04f5a 100644 |
--- a/device/gamepad/gamepad_provider_unittest.cc |
+++ b/device/gamepad/gamepad_provider_unittest.cc |
@@ -45,11 +45,20 @@ class GamepadProviderTest : public testing::Test, public GamepadTestHelper { |
GamepadProvider* CreateProvider(const WebGamepads& test_data) { |
mock_data_fetcher_ = new MockGamepadDataFetcher(test_data); |
provider_.reset(new GamepadProvider( |
- std::unique_ptr<GamepadSharedBuffer>(new MockGamepadSharedBuffer()), |
nullptr, std::unique_ptr<GamepadDataFetcher>(mock_data_fetcher_))); |
return provider_.get(); |
} |
+ void ReadGamepadHardwareBuffer(GamepadHardwareBuffer* buffer, |
+ WebGamepads* output) { |
+ memset(output, 0, sizeof(WebGamepads)); |
+ base::subtle::Atomic32 version; |
+ do { |
+ version = buffer->seqlock.ReadBegin(); |
+ memcpy(output, &buffer->data, sizeof(WebGamepads)); |
+ } while (buffer->seqlock.ReadRetry(version)); |
+ } |
+ |
protected: |
GamepadProviderTest() {} |
@@ -70,6 +79,7 @@ class GamepadProviderTest : public testing::Test, public GamepadTestHelper { |
#endif |
TEST_F(GamepadProviderTest, MAYBE_PollingAccess) { |
WebGamepads test_data; |
+ memset(&test_data, 0, sizeof(WebGamepads)); |
test_data.length = 1; |
test_data.items[0].connected = true; |
test_data.items[0].timestamp = 0; |
@@ -93,18 +103,20 @@ TEST_F(GamepadProviderTest, MAYBE_PollingAccess) { |
base::GetCurrentProcessHandle()); |
std::unique_ptr<base::SharedMemory> shared_memory( |
new base::SharedMemory(handle, true)); |
- EXPECT_TRUE(shared_memory->Map(sizeof(WebGamepads))); |
- void* mem = shared_memory->memory(); |
- |
- WebGamepads* output = static_cast<WebGamepads*>(mem); |
- |
- EXPECT_EQ(1u, output->length); |
- EXPECT_EQ(1u, output->items[0].buttonsLength); |
- EXPECT_EQ(1.f, output->items[0].buttons[0].value); |
- EXPECT_EQ(true, output->items[0].buttons[0].pressed); |
- 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]); |
+ EXPECT_TRUE(shared_memory->Map(sizeof(GamepadHardwareBuffer))); |
+ |
+ GamepadHardwareBuffer* buffer = |
+ static_cast<GamepadHardwareBuffer*>(shared_memory->memory()); |
+ WebGamepads output; |
+ ReadGamepadHardwareBuffer(buffer, &output); |
+ |
+ EXPECT_EQ(1u, output.length); |
+ EXPECT_EQ(1u, output.items[0].buttonsLength); |
+ EXPECT_EQ(1.f, output.items[0].buttons[0].value); |
+ EXPECT_EQ(true, output.items[0].buttons[0].pressed); |
+ 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]); |
} |
// Tests that waiting for a user gesture works properly. |
@@ -191,43 +203,51 @@ TEST_F(GamepadProviderTest, MAYBE_Sanitization) { |
base::GetCurrentProcessHandle()); |
std::unique_ptr<base::SharedMemory> shared_memory( |
new base::SharedMemory(handle, true)); |
- EXPECT_TRUE(shared_memory->Map(sizeof(WebGamepads))); |
- void* mem = shared_memory->memory(); |
+ EXPECT_TRUE(shared_memory->Map(sizeof(GamepadHardwareBuffer))); |
- WebGamepads* output = static_cast<WebGamepads*>(mem); |
+ GamepadHardwareBuffer* buffer = |
+ static_cast<GamepadHardwareBuffer*>(shared_memory->memory()); |
+ WebGamepads output; |
+ ReadGamepadHardwareBuffer(buffer, &output); |
// Initial data should all be zeroed out due to sanitization, even though the |
// gamepad reported input |
- EXPECT_EQ(1u, output->length); |
- EXPECT_EQ(1u, output->items[0].buttonsLength); |
- EXPECT_EQ(0.f, output->items[0].buttons[0].value); |
- EXPECT_FALSE(output->items[0].buttons[0].pressed); |
- EXPECT_EQ(1u, output->items[0].axesLength); |
- EXPECT_EQ(0.f, output->items[0].axes[0]); |
+ EXPECT_EQ(1u, output.length); |
+ EXPECT_EQ(1u, output.items[0].buttonsLength); |
+ EXPECT_EQ(0.f, output.items[0].buttons[0].value); |
+ EXPECT_FALSE(output.items[0].buttons[0].pressed); |
+ EXPECT_EQ(1u, output.items[0].axesLength); |
+ EXPECT_EQ(0.f, output.items[0].axes[0]); |
// Zero out the inputs |
mock_data_fetcher_->SetTestData(zero_data); |
mock_data_fetcher_->WaitForDataReadAndCallbacksIssued(); |
+ // Read updated data from shared memory |
+ ReadGamepadHardwareBuffer(buffer, &output); |
+ |
// Should still read zero, which is now an accurate reflection of the data |
- EXPECT_EQ(1u, output->length); |
- EXPECT_EQ(1u, output->items[0].buttonsLength); |
- EXPECT_EQ(0.f, output->items[0].buttons[0].value); |
- EXPECT_FALSE(output->items[0].buttons[0].pressed); |
- EXPECT_EQ(1u, output->items[0].axesLength); |
- EXPECT_EQ(0.f, output->items[0].axes[0]); |
+ EXPECT_EQ(1u, output.length); |
+ EXPECT_EQ(1u, output.items[0].buttonsLength); |
+ EXPECT_EQ(0.f, output.items[0].buttons[0].value); |
+ EXPECT_FALSE(output.items[0].buttons[0].pressed); |
+ EXPECT_EQ(1u, output.items[0].axesLength); |
+ EXPECT_EQ(0.f, output.items[0].axes[0]); |
// Re-set the active inputs |
mock_data_fetcher_->SetTestData(active_data); |
mock_data_fetcher_->WaitForDataReadAndCallbacksIssued(); |
+ // Read updated data from shared memory |
+ ReadGamepadHardwareBuffer(buffer, &output); |
+ |
// Should now accurately reflect the reported data. |
- EXPECT_EQ(1u, output->length); |
- EXPECT_EQ(1u, output->items[0].buttonsLength); |
- EXPECT_EQ(1.f, output->items[0].buttons[0].value); |
- EXPECT_TRUE(output->items[0].buttons[0].pressed); |
- EXPECT_EQ(1u, output->items[0].axesLength); |
- EXPECT_EQ(-1.f, output->items[0].axes[0]); |
+ EXPECT_EQ(1u, output.length); |
+ EXPECT_EQ(1u, output.items[0].buttonsLength); |
+ EXPECT_EQ(1.f, output.items[0].buttons[0].value); |
+ EXPECT_TRUE(output.items[0].buttons[0].pressed); |
+ EXPECT_EQ(1u, output.items[0].axesLength); |
+ EXPECT_EQ(-1.f, output.items[0].axes[0]); |
} |
} // namespace |