| 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
|
|
|