Commit 5e89999c authored by Rintaro Kuroiwa's avatar Rintaro Kuroiwa Committed by Commit Bot

Define AddRefAndSetArgPointee action for COM

- The new action is for correctly ref counting the COM object.
- The AddRef is required for Rules 1c and 1d defined in
  "Reference-Counting Rules"
  https://msdn.microsoft.com/en-us/library/ms810016.aspx?f=255&MSPPError=-2147217396

Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel;luci.chromium.try:linux_optional_gpu_tests_rel;luci.chromium.try:mac_optional_gpu_tests_rel;luci.chromium.try:win_optional_gpu_tests_rel
Change-Id: Ieb0e38f077b3786a77a0c415be3a703dc7f9ecca
Reviewed-on: https://chromium-review.googlesource.com/1103236
Commit-Queue: Rintaro Kuroiwa <rkuroiwa@chromium.org>
Reviewed-by: default avatarXiaohan Wang <xhwang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#568167}
parent d5010c9c
......@@ -16,6 +16,7 @@
using ::testing::_;
using ::testing::AllOf;
using ::testing::AtLeast;
using ::testing::DoAll;
using ::testing::Invoke;
using ::testing::Ne;
using ::testing::Pointee;
......@@ -84,38 +85,41 @@ class D3D11CdmProxyTest : public ::testing::Test {
void Initialize(CdmProxy::InitializeCB callback) {
EXPECT_CALL(create_device_mock_,
Create(_, D3D_DRIVER_TYPE_HARDWARE, _, _, _, _, _, _, _, _))
.WillOnce(DoAll(SetArgPointee<7>(device_mock_.Get()),
SetArgPointee<9>(device_context_mock_.Get()),
.WillOnce(DoAll(AddRefAndSetArgPointee<7>(device_mock_.Get()),
AddRefAndSetArgPointee<9>(device_context_mock_.Get()),
Return(S_OK)));
EXPECT_CALL(*device_mock_.Get(), QueryInterface(IID_ID3D11VideoDevice, _))
.Times(AtLeast(1))
.WillRepeatedly(
DoAll(SetArgPointee<1>(video_device_mock_.Get()), Return(S_OK)));
.WillRepeatedly(DoAll(
AddRefAndSetArgPointee<1>(video_device_mock_.Get()), Return(S_OK)));
EXPECT_CALL(*device_mock_.Get(), QueryInterface(IID_ID3D11VideoDevice1, _))
.Times(AtLeast(1))
.WillRepeatedly(
DoAll(SetArgPointee<1>(video_device1_mock_.Get()), Return(S_OK)));
DoAll(AddRefAndSetArgPointee<1>(video_device1_mock_.Get()),
Return(S_OK)));
EXPECT_CALL(*device_context_mock_.Get(),
QueryInterface(IID_ID3D11VideoContext, _))
.Times(AtLeast(1))
.WillRepeatedly(
DoAll(SetArgPointee<1>(video_context_mock_.Get()), Return(S_OK)));
DoAll(AddRefAndSetArgPointee<1>(video_context_mock_.Get()),
Return(S_OK)));
EXPECT_CALL(*device_context_mock_.Get(),
QueryInterface(IID_ID3D11VideoContext1, _))
.Times(AtLeast(1))
.WillRepeatedly(
DoAll(SetArgPointee<1>(video_context1_mock_.Get()), Return(S_OK)));
DoAll(AddRefAndSetArgPointee<1>(video_context1_mock_.Get()),
Return(S_OK)));
EXPECT_CALL(
*video_device_mock_.Get(),
CreateCryptoSession(Pointee(CRYPTO_TYPE_GUID), _,
Pointee(D3D11_KEY_EXCHANGE_HW_PROTECTION), _))
.WillOnce(
DoAll(SetArgPointee<3>(crypto_session_mock_.Get()), Return(S_OK)));
.WillOnce(DoAll(AddRefAndSetArgPointee<3>(crypto_session_mock_.Get()),
Return(S_OK)));
EXPECT_CALL(
*video_device1_mock_.Get(),
......@@ -370,8 +374,9 @@ TEST_F(D3D11CdmProxyTest, CreateMediaCryptoSessionNoExtraData) {
EXPECT_CALL(*video_device_mock_.Get(),
CreateCryptoSession(Pointee(CRYPTO_TYPE_GUID), _,
Pointee(CRYPTO_TYPE_GUID), _))
.WillOnce(DoAll(SetArgPointee<3>(media_crypto_session_mock.Get()),
Return(S_OK)));
.WillOnce(
DoAll(AddRefAndSetArgPointee<3>(media_crypto_session_mock.Get()),
Return(S_OK)));
EXPECT_CALL(*video_context1_mock_.Get(), GetDataForNewHardwareKey(_, _, _, _))
.Times(0);
......@@ -418,8 +423,9 @@ TEST_F(D3D11CdmProxyTest, CreateMediaCryptoSessionWithExtraData) {
EXPECT_CALL(*video_device_mock_.Get(),
CreateCryptoSession(Pointee(CRYPTO_TYPE_GUID), _,
Pointee(CRYPTO_TYPE_GUID), _))
.WillOnce(DoAll(SetArgPointee<3>(media_crypto_session_mock.Get()),
Return(S_OK)));
.WillOnce(
DoAll(AddRefAndSetArgPointee<3>(media_crypto_session_mock.Get()),
Return(S_OK)));
// The size nor value here matter, so making non empty non zero vector.
const std::vector<uint8_t> kAnyInput(16, 0xFF);
const uint64_t kAnyOutputData = 23298u;
......
......@@ -131,9 +131,10 @@ class D3D11DecryptorTest : public ::testing::Test {
ON_CALL(create_device_mock_,
Create(_, D3D_DRIVER_TYPE_HARDWARE, _, _, _, _, _, _, _, _))
.WillByDefault(DoAll(SetArgPointee<7>(device_mock_.Get()),
SetArgPointee<9>(device_context_mock_.Get()),
Return(S_OK)));
.WillByDefault(
DoAll(AddRefAndSetArgPointee<7>(device_mock_.Get()),
AddRefAndSetArgPointee<9>(device_context_mock_.Get()),
Return(S_OK)));
decryptor_->SetCreateDeviceCallbackForTesting(
base::BindRepeating(&D3D11CreateDeviceMock::Create,
......@@ -179,14 +180,14 @@ TEST_F(D3D11DecryptorTest, FullSampleCtrDecrypt) {
EXPECT_CALL(create_device_mock_,
Create(_, D3D_DRIVER_TYPE_HARDWARE, _, _, _, _, _, _, _, _))
.WillOnce(DoAll(SetArgPointee<7>(device_mock_.Get()),
SetArgPointee<9>(device_context_mock_.Get()),
.WillOnce(DoAll(AddRefAndSetArgPointee<7>(device_mock_.Get()),
AddRefAndSetArgPointee<9>(device_context_mock_.Get()),
Return(S_OK)));
EXPECT_CALL(*device_context_mock_.Get(),
QueryInterface(IID_ID3D11VideoContext, _))
.Times(AtLeast(1))
.WillRepeatedly(
DoAll(SetArgPointee<1>(video_context_mock_.Get()), Return(S_OK)));
.WillRepeatedly(DoAll(
AddRefAndSetArgPointee<1>(video_context_mock_.Get()), Return(S_OK)));
ComPtr<D3D11BufferMock> staging_buffer1 = CreateD3D11Mock<D3D11BufferMock>();
ComPtr<D3D11BufferMock> staging_buffer2 = CreateD3D11Mock<D3D11BufferMock>();
......@@ -204,13 +205,16 @@ TEST_F(D3D11DecryptorTest, FullSampleCtrDecrypt) {
BufferDescHas(D3D11_USAGE_STAGING, 0u,
D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE),
nullptr, _))
.WillOnce(DoAll(SetArgPointee<2>(staging_buffer1.Get()), Return(S_OK)))
.WillOnce(DoAll(SetArgPointee<2>(staging_buffer2.Get()), Return(S_OK)));
.WillOnce(
DoAll(AddRefAndSetArgPointee<2>(staging_buffer1.Get()), Return(S_OK)))
.WillOnce(DoAll(AddRefAndSetArgPointee<2>(staging_buffer2.Get()),
Return(S_OK)));
EXPECT_CALL(*device_mock_.Get(),
CreateBuffer(BufferDescHas(D3D11_USAGE_DEFAULT,
D3D11_BIND_RENDER_TARGET, 0u),
nullptr, _))
.WillOnce(DoAll(SetArgPointee<2>(gpu_buffer.Get()), Return(S_OK)));
.WillOnce(
DoAll(AddRefAndSetArgPointee<2>(gpu_buffer.Get()), Return(S_OK)));
D3D11_MAPPED_SUBRESOURCE staging_buffer1_subresource = {};
auto staging_buffer1_subresource_buffer = std::make_unique<uint8_t[]>(20000);
......@@ -315,14 +319,14 @@ TEST_F(D3D11DecryptorTest, SubsampleCtrDecrypt) {
EXPECT_CALL(create_device_mock_,
Create(_, D3D_DRIVER_TYPE_HARDWARE, _, _, _, _, _, _, _, _))
.WillOnce(DoAll(SetArgPointee<7>(device_mock_.Get()),
SetArgPointee<9>(device_context_mock_.Get()),
.WillOnce(DoAll(AddRefAndSetArgPointee<7>(device_mock_.Get()),
AddRefAndSetArgPointee<9>(device_context_mock_.Get()),
Return(S_OK)));
EXPECT_CALL(*device_context_mock_.Get(),
QueryInterface(IID_ID3D11VideoContext, _))
.Times(AtLeast(1))
.WillRepeatedly(
DoAll(SetArgPointee<1>(video_context_mock_.Get()), Return(S_OK)));
.WillRepeatedly(DoAll(
AddRefAndSetArgPointee<1>(video_context_mock_.Get()), Return(S_OK)));
ComPtr<D3D11BufferMock> staging_buffer1 = CreateD3D11Mock<D3D11BufferMock>();
ComPtr<D3D11BufferMock> staging_buffer2 = CreateD3D11Mock<D3D11BufferMock>();
......@@ -340,13 +344,16 @@ TEST_F(D3D11DecryptorTest, SubsampleCtrDecrypt) {
BufferDescHas(D3D11_USAGE_STAGING, 0u,
D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE),
nullptr, _))
.WillOnce(DoAll(SetArgPointee<2>(staging_buffer1.Get()), Return(S_OK)))
.WillOnce(DoAll(SetArgPointee<2>(staging_buffer2.Get()), Return(S_OK)));
.WillOnce(
DoAll(AddRefAndSetArgPointee<2>(staging_buffer1.Get()), Return(S_OK)))
.WillOnce(DoAll(AddRefAndSetArgPointee<2>(staging_buffer2.Get()),
Return(S_OK)));
EXPECT_CALL(*device_mock_.Get(),
CreateBuffer(BufferDescHas(D3D11_USAGE_DEFAULT,
D3D11_BIND_RENDER_TARGET, 0u),
nullptr, _))
.WillOnce(DoAll(SetArgPointee<2>(gpu_buffer.Get()), Return(S_OK)));
.WillOnce(
DoAll(AddRefAndSetArgPointee<2>(gpu_buffer.Get()), Return(S_OK)));
D3D11_MAPPED_SUBRESOURCE staging_buffer1_subresource = {};
auto staging_buffer1_subresource_buffer = std::make_unique<uint8_t[]>(20000);
......@@ -438,13 +445,16 @@ TEST_F(D3D11DecryptorTest, DecryptInputTooBig) {
BufferDescHas(D3D11_USAGE_STAGING, 0u,
D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE),
nullptr, _))
.WillOnce(DoAll(SetArgPointee<2>(staging_buffer1.Get()), Return(S_OK)))
.WillOnce(DoAll(SetArgPointee<2>(staging_buffer2.Get()), Return(S_OK)));
.WillOnce(
DoAll(AddRefAndSetArgPointee<2>(staging_buffer1.Get()), Return(S_OK)))
.WillOnce(DoAll(AddRefAndSetArgPointee<2>(staging_buffer2.Get()),
Return(S_OK)));
EXPECT_CALL(*device_mock_.Get(),
CreateBuffer(BufferDescHas(D3D11_USAGE_DEFAULT,
D3D11_BIND_RENDER_TARGET, 0u),
nullptr, _))
.WillOnce(DoAll(SetArgPointee<2>(gpu_buffer.Get()), Return(S_OK)));
.WillOnce(
DoAll(AddRefAndSetArgPointee<2>(gpu_buffer.Get()), Return(S_OK)));
CallbackMock callbacks;
EXPECT_CALL(callbacks, DecryptCallback(Decryptor::kError, IsNull()));
......
......@@ -44,12 +44,22 @@
namespace media {
// Use this action when using SetArgPointee with COM pointers.
// e.g.
// EXPECT_CALL(*device_mock_.Get(), QueryInterface(IID_ID3D11VideoDevice, _))
// .WillRepeatedly(DoAll(
// AddRefAndSetArgPointee<1>(video_device_mock_.Get()), Return(S_OK)));
ACTION_TEMPLATE(AddRefAndSetArgPointee,
HAS_1_TEMPLATE_PARAMS(int, k),
AND_1_VALUE_PARAMS(p)) {
p->AddRef();
*std::get<k>(args) = p;
}
// Use this function to create a mock so that they are ref-counted correctly.
template <typename Interface>
Microsoft::WRL::ComPtr<Interface> CreateD3D11Mock() {
Interface* mock = new Interface();
mock->AddRef();
return mock;
return new Interface();
}
template <class Interface>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment