15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_video_capture_dev.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_errors.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/proxy/locking_resource_releaser.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_proxy_test.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/thunk.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef PluginProxyTest FlashResourceTest;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* Unused(void* user_data, uint32_t element_count, uint32_t element_size) {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Does a test of EnumerateVideoCaptureDevices() and reply functionality in
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the plugin side using the public C interfaces.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FlashResourceTest, EnumerateVideoCaptureDevices) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(raymes): This doesn't actually check that the data is converted from
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |ppapi::DeviceRefData| to |PPB_DeviceRef| correctly, just that the right
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // messages are sent.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up a sync call handler that should return this message.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<ppapi::DeviceRefData> reply_device_ref_data;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t expected_result = PP_OK;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PpapiPluginMsg_DeviceEnumeration_EnumerateDevicesReply reply_msg(
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reply_device_ref_data);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceSyncCallHandler enumerate_video_devices_handler(
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &sink(),
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PpapiHostMsg_DeviceEnumeration_EnumerateDevices::ID,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expected_result,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reply_msg);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sink().AddFilter(&enumerate_video_devices_handler);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up the arguments to the call.
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LockingResourceReleaser video_capture(
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ::ppapi::thunk::GetPPB_VideoCapture_Dev_0_3_Thunk()->Create(
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pp_instance()));
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<PP_Resource> unused;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_ArrayOutput output;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output.GetDataBuffer = &Unused;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output.user_data = &unused;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make the call.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PPB_Flash_12_6* flash_iface = ::ppapi::thunk::GetPPB_Flash_12_6_Thunk();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t actual_result = flash_iface->EnumerateVideoCaptureDevices(
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pp_instance(), video_capture.get(), output);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the result is as expected.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_result, actual_result);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Should have sent an "DeviceEnumeration_EnumerateDevices" message.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(enumerate_video_devices_handler.last_handled_msg().type() ==
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PpapiHostMsg_DeviceEnumeration_EnumerateDevices::ID);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove the filter or it will be destroyed before the sink() is destroyed.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sink().RemoveFilter(&enumerate_video_devices_handler);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace proxy
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ppapi
72