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 @@ ...@@ -16,6 +16,7 @@
using ::testing::_; using ::testing::_;
using ::testing::AllOf; using ::testing::AllOf;
using ::testing::AtLeast; using ::testing::AtLeast;
using ::testing::DoAll;
using ::testing::Invoke; using ::testing::Invoke;
using ::testing::Ne; using ::testing::Ne;
using ::testing::Pointee; using ::testing::Pointee;
...@@ -84,38 +85,41 @@ class D3D11CdmProxyTest : public ::testing::Test { ...@@ -84,38 +85,41 @@ class D3D11CdmProxyTest : public ::testing::Test {
void Initialize(CdmProxy::InitializeCB callback) { void Initialize(CdmProxy::InitializeCB callback) {
EXPECT_CALL(create_device_mock_, EXPECT_CALL(create_device_mock_,
Create(_, D3D_DRIVER_TYPE_HARDWARE, _, _, _, _, _, _, _, _)) Create(_, D3D_DRIVER_TYPE_HARDWARE, _, _, _, _, _, _, _, _))
.WillOnce(DoAll(SetArgPointee<7>(device_mock_.Get()), .WillOnce(DoAll(AddRefAndSetArgPointee<7>(device_mock_.Get()),
SetArgPointee<9>(device_context_mock_.Get()), AddRefAndSetArgPointee<9>(device_context_mock_.Get()),
Return(S_OK))); Return(S_OK)));
EXPECT_CALL(*device_mock_.Get(), QueryInterface(IID_ID3D11VideoDevice, _)) EXPECT_CALL(*device_mock_.Get(), QueryInterface(IID_ID3D11VideoDevice, _))
.Times(AtLeast(1)) .Times(AtLeast(1))
.WillRepeatedly( .WillRepeatedly(DoAll(
DoAll(SetArgPointee<1>(video_device_mock_.Get()), Return(S_OK))); AddRefAndSetArgPointee<1>(video_device_mock_.Get()), Return(S_OK)));
EXPECT_CALL(*device_mock_.Get(), QueryInterface(IID_ID3D11VideoDevice1, _)) EXPECT_CALL(*device_mock_.Get(), QueryInterface(IID_ID3D11VideoDevice1, _))
.Times(AtLeast(1)) .Times(AtLeast(1))
.WillRepeatedly( .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(), EXPECT_CALL(*device_context_mock_.Get(),
QueryInterface(IID_ID3D11VideoContext, _)) QueryInterface(IID_ID3D11VideoContext, _))
.Times(AtLeast(1)) .Times(AtLeast(1))
.WillRepeatedly( .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(), EXPECT_CALL(*device_context_mock_.Get(),
QueryInterface(IID_ID3D11VideoContext1, _)) QueryInterface(IID_ID3D11VideoContext1, _))
.Times(AtLeast(1)) .Times(AtLeast(1))
.WillRepeatedly( .WillRepeatedly(
DoAll(SetArgPointee<1>(video_context1_mock_.Get()), Return(S_OK))); DoAll(AddRefAndSetArgPointee<1>(video_context1_mock_.Get()),
Return(S_OK)));
EXPECT_CALL( EXPECT_CALL(
*video_device_mock_.Get(), *video_device_mock_.Get(),
CreateCryptoSession(Pointee(CRYPTO_TYPE_GUID), _, CreateCryptoSession(Pointee(CRYPTO_TYPE_GUID), _,
Pointee(D3D11_KEY_EXCHANGE_HW_PROTECTION), _)) Pointee(D3D11_KEY_EXCHANGE_HW_PROTECTION), _))
.WillOnce( .WillOnce(DoAll(AddRefAndSetArgPointee<3>(crypto_session_mock_.Get()),
DoAll(SetArgPointee<3>(crypto_session_mock_.Get()), Return(S_OK))); Return(S_OK)));
EXPECT_CALL( EXPECT_CALL(
*video_device1_mock_.Get(), *video_device1_mock_.Get(),
...@@ -370,8 +374,9 @@ TEST_F(D3D11CdmProxyTest, CreateMediaCryptoSessionNoExtraData) { ...@@ -370,8 +374,9 @@ TEST_F(D3D11CdmProxyTest, CreateMediaCryptoSessionNoExtraData) {
EXPECT_CALL(*video_device_mock_.Get(), EXPECT_CALL(*video_device_mock_.Get(),
CreateCryptoSession(Pointee(CRYPTO_TYPE_GUID), _, CreateCryptoSession(Pointee(CRYPTO_TYPE_GUID), _,
Pointee(CRYPTO_TYPE_GUID), _)) Pointee(CRYPTO_TYPE_GUID), _))
.WillOnce(DoAll(SetArgPointee<3>(media_crypto_session_mock.Get()), .WillOnce(
Return(S_OK))); DoAll(AddRefAndSetArgPointee<3>(media_crypto_session_mock.Get()),
Return(S_OK)));
EXPECT_CALL(*video_context1_mock_.Get(), GetDataForNewHardwareKey(_, _, _, _)) EXPECT_CALL(*video_context1_mock_.Get(), GetDataForNewHardwareKey(_, _, _, _))
.Times(0); .Times(0);
...@@ -418,8 +423,9 @@ TEST_F(D3D11CdmProxyTest, CreateMediaCryptoSessionWithExtraData) { ...@@ -418,8 +423,9 @@ TEST_F(D3D11CdmProxyTest, CreateMediaCryptoSessionWithExtraData) {
EXPECT_CALL(*video_device_mock_.Get(), EXPECT_CALL(*video_device_mock_.Get(),
CreateCryptoSession(Pointee(CRYPTO_TYPE_GUID), _, CreateCryptoSession(Pointee(CRYPTO_TYPE_GUID), _,
Pointee(CRYPTO_TYPE_GUID), _)) Pointee(CRYPTO_TYPE_GUID), _))
.WillOnce(DoAll(SetArgPointee<3>(media_crypto_session_mock.Get()), .WillOnce(
Return(S_OK))); DoAll(AddRefAndSetArgPointee<3>(media_crypto_session_mock.Get()),
Return(S_OK)));
// The size nor value here matter, so making non empty non zero vector. // The size nor value here matter, so making non empty non zero vector.
const std::vector<uint8_t> kAnyInput(16, 0xFF); const std::vector<uint8_t> kAnyInput(16, 0xFF);
const uint64_t kAnyOutputData = 23298u; const uint64_t kAnyOutputData = 23298u;
......
...@@ -131,9 +131,10 @@ class D3D11DecryptorTest : public ::testing::Test { ...@@ -131,9 +131,10 @@ class D3D11DecryptorTest : public ::testing::Test {
ON_CALL(create_device_mock_, ON_CALL(create_device_mock_,
Create(_, D3D_DRIVER_TYPE_HARDWARE, _, _, _, _, _, _, _, _)) Create(_, D3D_DRIVER_TYPE_HARDWARE, _, _, _, _, _, _, _, _))
.WillByDefault(DoAll(SetArgPointee<7>(device_mock_.Get()), .WillByDefault(
SetArgPointee<9>(device_context_mock_.Get()), DoAll(AddRefAndSetArgPointee<7>(device_mock_.Get()),
Return(S_OK))); AddRefAndSetArgPointee<9>(device_context_mock_.Get()),
Return(S_OK)));
decryptor_->SetCreateDeviceCallbackForTesting( decryptor_->SetCreateDeviceCallbackForTesting(
base::BindRepeating(&D3D11CreateDeviceMock::Create, base::BindRepeating(&D3D11CreateDeviceMock::Create,
...@@ -179,14 +180,14 @@ TEST_F(D3D11DecryptorTest, FullSampleCtrDecrypt) { ...@@ -179,14 +180,14 @@ TEST_F(D3D11DecryptorTest, FullSampleCtrDecrypt) {
EXPECT_CALL(create_device_mock_, EXPECT_CALL(create_device_mock_,
Create(_, D3D_DRIVER_TYPE_HARDWARE, _, _, _, _, _, _, _, _)) Create(_, D3D_DRIVER_TYPE_HARDWARE, _, _, _, _, _, _, _, _))
.WillOnce(DoAll(SetArgPointee<7>(device_mock_.Get()), .WillOnce(DoAll(AddRefAndSetArgPointee<7>(device_mock_.Get()),
SetArgPointee<9>(device_context_mock_.Get()), AddRefAndSetArgPointee<9>(device_context_mock_.Get()),
Return(S_OK))); Return(S_OK)));
EXPECT_CALL(*device_context_mock_.Get(), EXPECT_CALL(*device_context_mock_.Get(),
QueryInterface(IID_ID3D11VideoContext, _)) QueryInterface(IID_ID3D11VideoContext, _))
.Times(AtLeast(1)) .Times(AtLeast(1))
.WillRepeatedly( .WillRepeatedly(DoAll(
DoAll(SetArgPointee<1>(video_context_mock_.Get()), Return(S_OK))); AddRefAndSetArgPointee<1>(video_context_mock_.Get()), Return(S_OK)));
ComPtr<D3D11BufferMock> staging_buffer1 = CreateD3D11Mock<D3D11BufferMock>(); ComPtr<D3D11BufferMock> staging_buffer1 = CreateD3D11Mock<D3D11BufferMock>();
ComPtr<D3D11BufferMock> staging_buffer2 = CreateD3D11Mock<D3D11BufferMock>(); ComPtr<D3D11BufferMock> staging_buffer2 = CreateD3D11Mock<D3D11BufferMock>();
...@@ -204,13 +205,16 @@ TEST_F(D3D11DecryptorTest, FullSampleCtrDecrypt) { ...@@ -204,13 +205,16 @@ TEST_F(D3D11DecryptorTest, FullSampleCtrDecrypt) {
BufferDescHas(D3D11_USAGE_STAGING, 0u, BufferDescHas(D3D11_USAGE_STAGING, 0u,
D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE), D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE),
nullptr, _)) nullptr, _))
.WillOnce(DoAll(SetArgPointee<2>(staging_buffer1.Get()), Return(S_OK))) .WillOnce(
.WillOnce(DoAll(SetArgPointee<2>(staging_buffer2.Get()), Return(S_OK))); DoAll(AddRefAndSetArgPointee<2>(staging_buffer1.Get()), Return(S_OK)))
.WillOnce(DoAll(AddRefAndSetArgPointee<2>(staging_buffer2.Get()),
Return(S_OK)));
EXPECT_CALL(*device_mock_.Get(), EXPECT_CALL(*device_mock_.Get(),
CreateBuffer(BufferDescHas(D3D11_USAGE_DEFAULT, CreateBuffer(BufferDescHas(D3D11_USAGE_DEFAULT,
D3D11_BIND_RENDER_TARGET, 0u), D3D11_BIND_RENDER_TARGET, 0u),
nullptr, _)) 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 = {}; D3D11_MAPPED_SUBRESOURCE staging_buffer1_subresource = {};
auto staging_buffer1_subresource_buffer = std::make_unique<uint8_t[]>(20000); auto staging_buffer1_subresource_buffer = std::make_unique<uint8_t[]>(20000);
...@@ -315,14 +319,14 @@ TEST_F(D3D11DecryptorTest, SubsampleCtrDecrypt) { ...@@ -315,14 +319,14 @@ TEST_F(D3D11DecryptorTest, SubsampleCtrDecrypt) {
EXPECT_CALL(create_device_mock_, EXPECT_CALL(create_device_mock_,
Create(_, D3D_DRIVER_TYPE_HARDWARE, _, _, _, _, _, _, _, _)) Create(_, D3D_DRIVER_TYPE_HARDWARE, _, _, _, _, _, _, _, _))
.WillOnce(DoAll(SetArgPointee<7>(device_mock_.Get()), .WillOnce(DoAll(AddRefAndSetArgPointee<7>(device_mock_.Get()),
SetArgPointee<9>(device_context_mock_.Get()), AddRefAndSetArgPointee<9>(device_context_mock_.Get()),
Return(S_OK))); Return(S_OK)));
EXPECT_CALL(*device_context_mock_.Get(), EXPECT_CALL(*device_context_mock_.Get(),
QueryInterface(IID_ID3D11VideoContext, _)) QueryInterface(IID_ID3D11VideoContext, _))
.Times(AtLeast(1)) .Times(AtLeast(1))
.WillRepeatedly( .WillRepeatedly(DoAll(
DoAll(SetArgPointee<1>(video_context_mock_.Get()), Return(S_OK))); AddRefAndSetArgPointee<1>(video_context_mock_.Get()), Return(S_OK)));
ComPtr<D3D11BufferMock> staging_buffer1 = CreateD3D11Mock<D3D11BufferMock>(); ComPtr<D3D11BufferMock> staging_buffer1 = CreateD3D11Mock<D3D11BufferMock>();
ComPtr<D3D11BufferMock> staging_buffer2 = CreateD3D11Mock<D3D11BufferMock>(); ComPtr<D3D11BufferMock> staging_buffer2 = CreateD3D11Mock<D3D11BufferMock>();
...@@ -340,13 +344,16 @@ TEST_F(D3D11DecryptorTest, SubsampleCtrDecrypt) { ...@@ -340,13 +344,16 @@ TEST_F(D3D11DecryptorTest, SubsampleCtrDecrypt) {
BufferDescHas(D3D11_USAGE_STAGING, 0u, BufferDescHas(D3D11_USAGE_STAGING, 0u,
D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE), D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE),
nullptr, _)) nullptr, _))
.WillOnce(DoAll(SetArgPointee<2>(staging_buffer1.Get()), Return(S_OK))) .WillOnce(
.WillOnce(DoAll(SetArgPointee<2>(staging_buffer2.Get()), Return(S_OK))); DoAll(AddRefAndSetArgPointee<2>(staging_buffer1.Get()), Return(S_OK)))
.WillOnce(DoAll(AddRefAndSetArgPointee<2>(staging_buffer2.Get()),
Return(S_OK)));
EXPECT_CALL(*device_mock_.Get(), EXPECT_CALL(*device_mock_.Get(),
CreateBuffer(BufferDescHas(D3D11_USAGE_DEFAULT, CreateBuffer(BufferDescHas(D3D11_USAGE_DEFAULT,
D3D11_BIND_RENDER_TARGET, 0u), D3D11_BIND_RENDER_TARGET, 0u),
nullptr, _)) 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 = {}; D3D11_MAPPED_SUBRESOURCE staging_buffer1_subresource = {};
auto staging_buffer1_subresource_buffer = std::make_unique<uint8_t[]>(20000); auto staging_buffer1_subresource_buffer = std::make_unique<uint8_t[]>(20000);
...@@ -438,13 +445,16 @@ TEST_F(D3D11DecryptorTest, DecryptInputTooBig) { ...@@ -438,13 +445,16 @@ TEST_F(D3D11DecryptorTest, DecryptInputTooBig) {
BufferDescHas(D3D11_USAGE_STAGING, 0u, BufferDescHas(D3D11_USAGE_STAGING, 0u,
D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE), D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE),
nullptr, _)) nullptr, _))
.WillOnce(DoAll(SetArgPointee<2>(staging_buffer1.Get()), Return(S_OK))) .WillOnce(
.WillOnce(DoAll(SetArgPointee<2>(staging_buffer2.Get()), Return(S_OK))); DoAll(AddRefAndSetArgPointee<2>(staging_buffer1.Get()), Return(S_OK)))
.WillOnce(DoAll(AddRefAndSetArgPointee<2>(staging_buffer2.Get()),
Return(S_OK)));
EXPECT_CALL(*device_mock_.Get(), EXPECT_CALL(*device_mock_.Get(),
CreateBuffer(BufferDescHas(D3D11_USAGE_DEFAULT, CreateBuffer(BufferDescHas(D3D11_USAGE_DEFAULT,
D3D11_BIND_RENDER_TARGET, 0u), D3D11_BIND_RENDER_TARGET, 0u),
nullptr, _)) nullptr, _))
.WillOnce(DoAll(SetArgPointee<2>(gpu_buffer.Get()), Return(S_OK))); .WillOnce(
DoAll(AddRefAndSetArgPointee<2>(gpu_buffer.Get()), Return(S_OK)));
CallbackMock callbacks; CallbackMock callbacks;
EXPECT_CALL(callbacks, DecryptCallback(Decryptor::kError, IsNull())); EXPECT_CALL(callbacks, DecryptCallback(Decryptor::kError, IsNull()));
......
...@@ -44,12 +44,22 @@ ...@@ -44,12 +44,22 @@
namespace media { 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. // Use this function to create a mock so that they are ref-counted correctly.
template <typename Interface> template <typename Interface>
Microsoft::WRL::ComPtr<Interface> CreateD3D11Mock() { Microsoft::WRL::ComPtr<Interface> CreateD3D11Mock() {
Interface* mock = new Interface(); return new Interface();
mock->AddRef();
return mock;
} }
template <class 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