blob: 901e8550b92e7b9afd174a29b18760cbc6576f6c [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ppapi/c/dev/ppb_video_capture_dev.h"
#include "ppapi/c/pp_errors.h"
#include "ppapi/c/private/ppb_flash.h"
#include "ppapi/proxy/ppapi_messages.h"
#include "ppapi/proxy/ppapi_proxy_test.h"
#include "ppapi/shared_impl/scoped_pp_resource.h"
#include "ppapi/thunk/thunk.h"
namespace ppapi {
namespace proxy {
namespace {
typedef PluginProxyTest FlashResourceTest;
// This simulates the creation reply message of a VideoCapture resource. This
// won't be necessary once VideoCapture is converted to the new-style proxy.
class VideoCaptureCreationHandler : public IPC::Listener {
public:
VideoCaptureCreationHandler(ResourceMessageTestSink* test_sink,
PP_Instance instance)
: test_sink_(test_sink),
instance_(instance) {
}
virtual ~VideoCaptureCreationHandler() {}
virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE {
if (msg.type() != ::PpapiHostMsg_PPBVideoCapture_Create::ID)
return false;
IPC::Message* reply_msg = IPC::SyncMessage::GenerateReply(&msg);
HostResource resource;
resource.SetHostResource(instance_, 12345);
PpapiHostMsg_PPBVideoCapture_Create::WriteReplyParams(reply_msg, resource);
test_sink_->SetSyncReplyMessage(reply_msg);
return true;
}
private:
ResourceMessageTestSink* test_sink_;
PP_Instance instance_;
};
void* Unused(void* user_data, uint32_t element_count, uint32_t element_size) {
return NULL;
}
} // namespace
// Does a test of EnumerateVideoCaptureDevices() and reply functionality in
// the plugin side using the public C interfaces.
TEST_F(FlashResourceTest, EnumerateVideoCaptureDevices) {
// TODO(raymes): This doesn't actually check that the data is converted from
// |ppapi::DeviceRefData| to |PPB_DeviceRef| correctly, just that the right
// messages are sent.
// Set up a sync call handler that should return this message.
std::vector<ppapi::DeviceRefData> reply_device_ref_data;
int32_t expected_result = PP_OK;
PpapiPluginMsg_Flash_EnumerateVideoCaptureDevicesReply reply_msg(
reply_device_ref_data);
ResourceSyncCallHandler enumerate_video_devices_handler(
&sink(),
PpapiHostMsg_Flash_EnumerateVideoCaptureDevices::ID,
expected_result,
reply_msg);
sink().AddFilter(&enumerate_video_devices_handler);
// Setup the handler to simulate creation of the video resource.
VideoCaptureCreationHandler video_creation_handler(&sink(), pp_instance());
sink().AddFilter(&video_creation_handler);
// Set up the arguments to the call.
ScopedPPResource video_capture(ScopedPPResource::PassRef(),
::ppapi::thunk::GetPPB_VideoCapture_Dev_0_2_Thunk()->Create(
pp_instance()));
std::vector<PP_Resource> unused;
PP_ArrayOutput output;
output.GetDataBuffer = &Unused;
output.user_data = &unused;
// Make the call.
const PPB_Flash_12_6* flash_iface = ::ppapi::thunk::GetPPB_Flash_12_6_Thunk();
int32_t actual_result = flash_iface->EnumerateVideoCaptureDevices(
pp_instance(), video_capture.get(), output);
// Check the result is as expected.
EXPECT_EQ(expected_result, actual_result);
// Should have sent an "EnumerateVideoCaptureDevices" message.
ASSERT_TRUE(enumerate_video_devices_handler.last_handled_msg().type() ==
PpapiHostMsg_Flash_EnumerateVideoCaptureDevices::ID);
// Remove the filter or it will be destroyed before the sink() is destroyed.
sink().RemoveFilter(&enumerate_video_devices_handler);
sink().RemoveFilter(&video_creation_handler);
}
} // namespace proxy
} // namespace ppapi