12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <map>
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h"
10ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch#include "base/memory/weak_ptr.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/pepper/pepper_device_enumeration_host_helper.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/pp_errors.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/host/host_message_context.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/host/ppapi_host.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/host/resource_host.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/ppapi_message_utils.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/resource_message_params.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/resource_message_test_sink.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/ppapi_permissions.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "url/gurl.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content {
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdochclass TestDelegate : public PepperDeviceEnumerationHostHelper::Delegate,
29ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch                     public base::SupportsWeakPtr<TestDelegate> {
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  TestDelegate() : last_used_id_(0) {}
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual ~TestDelegate() { CHECK(callbacks_.empty()); }
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual int EnumerateDevices(PP_DeviceType_Dev /* type */,
36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                               const GURL& /* document_url */,
37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                               const EnumerateDevicesCallback& callback)
38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      OVERRIDE {
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    last_used_id_++;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    callbacks_[last_used_id_] = callback;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return last_used_id_;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void StopEnumerateDevices(int request_id) OVERRIDE {
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::map<int, EnumerateDevicesCallback>::iterator iter =
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        callbacks_.find(request_id);
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHECK(iter != callbacks_.end());
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    callbacks_.erase(iter);
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns false if |request_id| is not found.
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool SimulateEnumerateResult(
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int request_id,
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::vector<ppapi::DeviceRefData>& devices) {
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::map<int, EnumerateDevicesCallback>::iterator iter =
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        callbacks_.find(request_id);
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (iter == callbacks_.end())
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    iter->second.Run(request_id, devices);
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t GetRegisteredCallbackCount() const { return callbacks_.size(); }
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int last_used_id() const { return last_used_id_; }
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::map<int, EnumerateDevicesCallback> callbacks_;
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int last_used_id_;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(TestDelegate);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PepperDeviceEnumerationHostHelperTest : public testing::Test {
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PepperDeviceEnumerationHostHelperTest()
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : ppapi_host_(&sink_, ppapi::PpapiPermissions()),
79558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        resource_host_(&ppapi_host_, 12345, 67890),
80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        device_enumeration_(&resource_host_,
81ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch                            delegate_.AsWeakPtr(),
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            PP_DEVICETYPE_DEV_AUDIOCAPTURE,
83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                            GURL("http://example.com")) {}
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~PepperDeviceEnumerationHostHelperTest() {}
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SimulateMonitorDeviceChangeReceived(uint32_t callback_id) {
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PpapiHostMsg_DeviceEnumeration_MonitorDeviceChange msg(callback_id);
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ppapi::proxy::ResourceMessageCallParams call_params(
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        resource_host_.pp_resource(), 123);
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ppapi::host::HostMessageContext context(call_params);
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int32_t result = PP_ERROR_FAILED;
93a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ASSERT_TRUE(
94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        device_enumeration_.HandleResourceMessage(msg, &context, &result));
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(PP_OK, result);
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CheckNotifyDeviceChangeMessage(
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      uint32_t callback_id,
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::vector<ppapi::DeviceRefData>& expected) {
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ppapi::proxy::ResourceMessageReplyParams reply_params;
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC::Message reply_msg;
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(sink_.GetFirstResourceReplyMatching(
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PpapiPluginMsg_DeviceEnumeration_NotifyDeviceChange::ID,
105a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        &reply_params,
106a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        &reply_msg));
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sink_.ClearMessages();
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(PP_OK, reply_params.result());
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    uint32_t reply_callback_id = 0;
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<ppapi::DeviceRefData> reply_data;
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(ppapi::UnpackMessage<
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PpapiPluginMsg_DeviceEnumeration_NotifyDeviceChange>(
115a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        reply_msg, &reply_callback_id, &reply_data));
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(callback_id, reply_callback_id);
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected, reply_data);
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
120558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  TestDelegate delegate_;
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ppapi::proxy::ResourceMessageTestSink sink_;
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ppapi::host::PpapiHost ppapi_host_;
123558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ppapi::host::ResourceHost resource_host_;
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PepperDeviceEnumerationHostHelper device_enumeration_;
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PepperDeviceEnumerationHostHelperTest);
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PepperDeviceEnumerationHostHelperTest, EnumerateDevices) {
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PpapiHostMsg_DeviceEnumeration_EnumerateDevices msg;
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ppapi::proxy::ResourceMessageCallParams call_params(
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      resource_host_.pp_resource(), 123);
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ppapi::host::HostMessageContext context(call_params);
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32_t result = PP_ERROR_FAILED;
138a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ASSERT_TRUE(
139a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      device_enumeration_.HandleResourceMessage(msg, &context, &result));
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(PP_OK_COMPLETIONPENDING, result);
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, delegate_.GetRegisteredCallbackCount());
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int request_id = delegate_.last_used_id();
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<ppapi::DeviceRefData> data;
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ppapi::DeviceRefData data_item;
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data_item.type = PP_DEVICETYPE_DEV_AUDIOCAPTURE;
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data_item.name = "name_1";
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data_item.id = "id_1";
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data.push_back(data_item);
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data_item.type = PP_DEVICETYPE_DEV_VIDEOCAPTURE;
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data_item.name = "name_2";
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data_item.id = "id_2";
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data.push_back(data_item);
155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(delegate_.SimulateEnumerateResult(request_id, data));
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // StopEnumerateDevices() should have been called since the EnumerateDevices
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // message is not a persistent request.
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, delegate_.GetRegisteredCallbackCount());
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A reply message should have been sent to the test sink.
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ppapi::proxy::ResourceMessageReplyParams reply_params;
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IPC::Message reply_msg;
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(sink_.GetFirstResourceReplyMatching(
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PpapiPluginMsg_DeviceEnumeration_EnumerateDevicesReply::ID,
166a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      &reply_params,
167a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      &reply_msg));
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(call_params.sequence(), reply_params.sequence());
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(PP_OK, reply_params.result());
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<ppapi::DeviceRefData> reply_data;
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(ppapi::UnpackMessage<
174a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      PpapiPluginMsg_DeviceEnumeration_EnumerateDevicesReply>(reply_msg,
175a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                                              &reply_data));
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(data, reply_data);
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PepperDeviceEnumerationHostHelperTest, MonitorDeviceChange) {
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint32_t callback_id = 456;
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateMonitorDeviceChangeReceived(callback_id);
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, delegate_.GetRegisteredCallbackCount());
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int request_id = delegate_.last_used_id();
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<ppapi::DeviceRefData> data;
187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(delegate_.SimulateEnumerateResult(request_id, data));
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // StopEnumerateDevices() shouldn't be called because the MonitorDeviceChange
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // message is a persistent request.
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, delegate_.GetRegisteredCallbackCount());
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckNotifyDeviceChangeMessage(callback_id, data);
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ppapi::DeviceRefData data_item;
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data_item.type = PP_DEVICETYPE_DEV_AUDIOCAPTURE;
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data_item.name = "name_1";
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data_item.id = "id_1";
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data.push_back(data_item);
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data_item.type = PP_DEVICETYPE_DEV_VIDEOCAPTURE;
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data_item.name = "name_2";
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data_item.id = "id_2";
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data.push_back(data_item);
204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(delegate_.SimulateEnumerateResult(request_id, data));
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, delegate_.GetRegisteredCallbackCount());
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckNotifyDeviceChangeMessage(callback_id, data);
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint32_t callback_id2 = 789;
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateMonitorDeviceChangeReceived(callback_id2);
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // StopEnumerateDevice() should have been called for the previous request.
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, delegate_.GetRegisteredCallbackCount());
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int request_id2 = delegate_.last_used_id();
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data_item.type = PP_DEVICETYPE_DEV_AUDIOCAPTURE;
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data_item.name = "name_3";
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data_item.id = "id_3";
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data.push_back(data_item);
220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(delegate_.SimulateEnumerateResult(request_id2, data));
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckNotifyDeviceChangeMessage(callback_id2, data);
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PpapiHostMsg_DeviceEnumeration_StopMonitoringDeviceChange msg;
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ppapi::proxy::ResourceMessageCallParams call_params(
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      resource_host_.pp_resource(), 123);
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ppapi::host::HostMessageContext context(call_params);
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32_t result = PP_ERROR_FAILED;
229a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ASSERT_TRUE(
230a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      device_enumeration_.HandleResourceMessage(msg, &context, &result));
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(PP_OK, result);
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, delegate_.GetRegisteredCallbackCount());
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace content
237