Index: device/vr/vr_service_impl_unittest.cc |
diff --git a/device/vr/vr_service_impl_unittest.cc b/device/vr/vr_service_impl_unittest.cc |
index 499e2beb2135f1a2c432d816a30c9e67ea65bdb6..cefe287a661f1805245efc6e7dec30ab39aca2dc 100644 |
--- a/device/vr/vr_service_impl_unittest.cc |
+++ b/device/vr/vr_service_impl_unittest.cc |
@@ -25,6 +25,8 @@ class MockVRServiceClient : public VRServiceClient { |
last_display_ = std::move(display); |
} |
+ MOCK_METHOD1(OnExitPresent, void(uint32_t index)); |
+ |
const VRDisplayPtr& LastDisplay() { return last_display_; } |
private: |
@@ -50,6 +52,7 @@ class VRServiceTestBinding { |
} |
MockVRServiceClient& client() { return mock_client_; } |
+ VRServiceImpl* service() { return service_impl_.get(); } |
private: |
std::unique_ptr<VRServiceImpl> service_impl_; |
@@ -81,6 +84,8 @@ class VRServiceImplTest : public testing::Test { |
size_t ServiceCount() { return device_manager_->services_.size(); } |
+ bool presenting() { return !!device_manager_->presenting_service_; } |
+ |
base::MessageLoop message_loop_; |
FakeVRDeviceProvider* provider_; |
std::unique_ptr<VRDeviceManager> device_manager_; |
@@ -126,4 +131,53 @@ TEST_F(VRServiceImplTest, DeviceChangedDispatched) { |
EXPECT_EQ(device->id(), service_1->client().LastDisplay()->index); |
EXPECT_EQ(device->id(), service_2->client().LastDisplay()->index); |
} |
+ |
+// Ensure that presenting devices cannot be accessed by other services |
+TEST_F(VRServiceImplTest, DevicePresentationIsolation) { |
+ std::unique_ptr<VRServiceTestBinding> service_1 = BindService(); |
+ std::unique_ptr<VRServiceTestBinding> service_2 = BindService(); |
+ |
+ std::unique_ptr<FakeVRDevice> device(new FakeVRDevice(provider_)); |
+ provider_->AddDevice(device.get()); |
+ |
+ // Ensure the device manager has seen the fake device |
+ device_manager_->GetVRDevices(); |
+ |
+ // When not presenting either service should be able to access the device |
+ EXPECT_EQ(device.get(), VRDeviceManager::GetAllowedDevice( |
+ service_1->service(), device->id())); |
+ EXPECT_EQ(device.get(), VRDeviceManager::GetAllowedDevice( |
+ service_2->service(), device->id())); |
+ |
+ // Begin presenting to the fake device with service 1 |
+ EXPECT_TRUE( |
+ device_manager_->RequestPresent(service_1->service(), device->id())); |
+ |
+ EXPECT_TRUE(presenting()); |
+ |
+ // Service 2 should not be able to present to the device while service 1 |
+ // is still presenting. |
+ EXPECT_FALSE( |
+ device_manager_->RequestPresent(service_2->service(), device->id())); |
+ |
+ // Only the presenting service should be able to access the device |
+ EXPECT_EQ(device.get(), VRDeviceManager::GetAllowedDevice( |
+ service_1->service(), device->id())); |
+ EXPECT_EQ(nullptr, VRDeviceManager::GetAllowedDevice(service_2->service(), |
+ device->id())); |
+ |
+ // Service 2 should not be able to exit presentation to the device |
+ device_manager_->ExitPresent(service_2->service(), device->id()); |
+ EXPECT_TRUE(presenting()); |
+ |
+ // Service 1 should be able to exit the presentation it initiated. |
+ device_manager_->ExitPresent(service_1->service(), device->id()); |
+ EXPECT_FALSE(presenting()); |
+ |
+ // Once presention had ended both services should be able to access the device |
+ EXPECT_EQ(device.get(), VRDeviceManager::GetAllowedDevice( |
+ service_1->service(), device->id())); |
+ EXPECT_EQ(device.get(), VRDeviceManager::GetAllowedDevice( |
+ service_2->service(), device->id())); |
+} |
} |