Make Wire tests more strict w.r.t. expectations

This changes Wire tests to produces errors on "uninteresting calls" and
flushes mock expectations on client/server flushes so that we control
100% of the order of calls.

BUG=941543

Change-Id: I6eabc79dde2abb564e54df90c5c0e615fd4496c6
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/6040
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
This commit is contained in:
Corentin Wallez 2019-03-28 10:44:41 +00:00 committed by Commit Bot service account
parent 1ba2cb8589
commit d754fb2034
10 changed files with 68 additions and 55 deletions

View File

@ -14,6 +14,8 @@
#include "mock_dawn.h" #include "mock_dawn.h"
using namespace testing;
namespace { namespace {
{% for type in by_category["object"] %} {% for type in by_category["object"] %}
{% for method in native_methods(type) if len(method.arguments) < 10 %} {% for method in native_methods(type) if len(method.arguments) < 10 %}
@ -128,3 +130,9 @@ void ProcTableAsClass::CallFenceOnCompletionCallback(DawnFence fence,
MockProcTable::MockProcTable() { MockProcTable::MockProcTable() {
} }
void MockProcTable::IgnoreAllReleaseCalls() {
{% for type in by_category["object"] %}
EXPECT_CALL(*this, {{as_MethodSuffix(type.name, Name("release"))}}(_)).Times(AnyNumber());
{% endfor %}
}

View File

@ -101,6 +101,8 @@ class MockProcTable : public ProcTableAsClass {
public: public:
MockProcTable(); MockProcTable();
void IgnoreAllReleaseCalls();
{% for type in by_category["object"] %} {% for type in by_category["object"] %}
{% for method in type.methods if len(method.arguments) < 10 %} {% for method in type.methods if len(method.arguments) < 10 %}
MOCK_METHOD{{len(method.arguments) + 1}}( MOCK_METHOD{{len(method.arguments) + 1}}(

View File

@ -40,8 +40,6 @@ TEST_F(WireArgumentTests, ValueArgument) {
EXPECT_CALL(api, ComputePassEncoderDispatch(apiPass, 1, 2, 3)).Times(1); EXPECT_CALL(api, ComputePassEncoderDispatch(apiPass, 1, 2, 3)).Times(1);
EXPECT_CALL(api, CommandEncoderRelease(apiEncoder));
EXPECT_CALL(api, ComputePassEncoderRelease(apiPass));
FlushClient(); FlushClient();
} }
@ -72,8 +70,6 @@ TEST_F(WireArgumentTests, ValueArrayArgument) {
EXPECT_CALL(api, EXPECT_CALL(api,
ComputePassEncoderSetPushConstants(apiPass, DAWN_SHADER_STAGE_BIT_VERTEX, 0, 4, ComputePassEncoderSetPushConstants(apiPass, DAWN_SHADER_STAGE_BIT_VERTEX, 0, 4,
ResultOf(CheckPushConstantValues, Eq(true)))); ResultOf(CheckPushConstantValues, Eq(true))));
EXPECT_CALL(api, CommandEncoderRelease(apiEncoder));
EXPECT_CALL(api, ComputePassEncoderRelease(apiPass));
FlushClient(); FlushClient();
} }
@ -168,8 +164,6 @@ TEST_F(WireArgumentTests, CStringArgument) {
return desc->vertexStage->entryPoint == std::string("main"); return desc->vertexStage->entryPoint == std::string("main");
}))) })))
.WillOnce(Return(nullptr)); .WillOnce(Return(nullptr));
EXPECT_CALL(api, ShaderModuleRelease(apiVsModule));
EXPECT_CALL(api, PipelineLayoutRelease(apiLayout));
FlushClient(); FlushClient();
} }
@ -196,9 +190,6 @@ TEST_F(WireArgumentTests, ObjectAsValueArgument) {
dawnCommandEncoderCopyBufferToBuffer(cmdBufEncoder, buffer, 0, buffer, 4, 4); dawnCommandEncoderCopyBufferToBuffer(cmdBufEncoder, buffer, 0, buffer, 4, 4);
EXPECT_CALL(api, CommandEncoderCopyBufferToBuffer(apiEncoder, apiBuffer, 0, apiBuffer, 4, 4)); EXPECT_CALL(api, CommandEncoderCopyBufferToBuffer(apiEncoder, apiBuffer, 0, apiBuffer, 4, 4));
EXPECT_CALL(api, CommandEncoderRelease(apiEncoder));
EXPECT_CALL(api, BufferRelease(apiBuffer));
FlushClient(); FlushClient();
} }
@ -222,8 +213,6 @@ TEST_F(WireArgumentTests, ObjectsAsPointerArgument) {
apiCmdBufs[i] = api.GetNewCommandBuffer(); apiCmdBufs[i] = api.GetNewCommandBuffer();
EXPECT_CALL(api, CommandEncoderFinish(apiCmdBufEncoder)) EXPECT_CALL(api, CommandEncoderFinish(apiCmdBufEncoder))
.WillOnce(Return(apiCmdBufs[i])); .WillOnce(Return(apiCmdBufs[i]));
EXPECT_CALL(api, CommandEncoderRelease(apiCmdBufEncoder));
EXPECT_CALL(api, CommandBufferRelease(apiCmdBufs[i]));
} }
// Create queue // Create queue
@ -239,7 +228,6 @@ TEST_F(WireArgumentTests, ObjectsAsPointerArgument) {
return cmdBufs[0] == apiCmdBufs[0] && cmdBufs[1] == apiCmdBufs[1]; return cmdBufs[0] == apiCmdBufs[0] && cmdBufs[1] == apiCmdBufs[1];
}))); })));
EXPECT_CALL(api, QueueRelease(apiQueue));
FlushClient(); FlushClient();
} }
@ -302,7 +290,6 @@ TEST_F(WireArgumentTests, StructureOfObjectArrayArgument) {
}))) })))
.WillOnce(Return(nullptr)); .WillOnce(Return(nullptr));
EXPECT_CALL(api, BindGroupLayoutRelease(apiBgl));
FlushClient(); FlushClient();
} }
@ -339,7 +326,6 @@ TEST_F(WireArgumentTests, StructureOfStructureArrayArgument) {
}))) })))
.WillOnce(Return(apiBgl)); .WillOnce(Return(apiBgl));
EXPECT_CALL(api, BindGroupLayoutRelease(apiBgl));
FlushClient(); FlushClient();
} }

View File

@ -32,7 +32,6 @@ TEST_F(WireBasicTests, CallForwarded) {
EXPECT_CALL(api, DeviceCreateCommandEncoder(apiDevice)) EXPECT_CALL(api, DeviceCreateCommandEncoder(apiDevice))
.WillOnce(Return(apiCmdBufEncoder)); .WillOnce(Return(apiCmdBufEncoder));
EXPECT_CALL(api, CommandEncoderRelease(apiCmdBufEncoder));
FlushClient(); FlushClient();
} }
@ -48,8 +47,6 @@ TEST_F(WireBasicTests, CreateThenCall) {
DawnCommandBuffer apiCmdBuf = api.GetNewCommandBuffer(); DawnCommandBuffer apiCmdBuf = api.GetNewCommandBuffer();
EXPECT_CALL(api, CommandEncoderFinish(apiCmdBufEncoder)).WillOnce(Return(apiCmdBuf)); EXPECT_CALL(api, CommandEncoderFinish(apiCmdBufEncoder)).WillOnce(Return(apiCmdBuf));
EXPECT_CALL(api, CommandEncoderRelease(apiCmdBufEncoder));
EXPECT_CALL(api, CommandBufferRelease(apiCmdBuf));
FlushClient(); FlushClient();
} }
@ -63,7 +60,6 @@ TEST_F(WireBasicTests, RefCountKeptInClient) {
DawnCommandEncoder apiCmdBufEncoder = api.GetNewCommandEncoder(); DawnCommandEncoder apiCmdBufEncoder = api.GetNewCommandEncoder();
EXPECT_CALL(api, DeviceCreateCommandEncoder(apiDevice)) EXPECT_CALL(api, DeviceCreateCommandEncoder(apiDevice))
.WillOnce(Return(apiCmdBufEncoder)); .WillOnce(Return(apiCmdBufEncoder));
EXPECT_CALL(api, CommandEncoderRelease(apiCmdBufEncoder));
FlushClient(); FlushClient();
} }

View File

@ -29,7 +29,7 @@ namespace {
DawnCallbackUserdata userdata)); DawnCallbackUserdata userdata));
}; };
std::unique_ptr<MockBufferMapReadCallback> mockBufferMapReadCallback; std::unique_ptr<StrictMock<MockBufferMapReadCallback>> mockBufferMapReadCallback;
void ToMockBufferMapReadCallback(DawnBufferMapAsyncStatus status, void ToMockBufferMapReadCallback(DawnBufferMapAsyncStatus status,
const void* ptr, const void* ptr,
uint32_t dataLength, uint32_t dataLength,
@ -48,7 +48,7 @@ namespace {
DawnCallbackUserdata userdata)); DawnCallbackUserdata userdata));
}; };
std::unique_ptr<MockBufferMapWriteCallback> mockBufferMapWriteCallback; std::unique_ptr<StrictMock<MockBufferMapWriteCallback>> mockBufferMapWriteCallback;
uint32_t* lastMapWritePointer = nullptr; uint32_t* lastMapWritePointer = nullptr;
void ToMockBufferMapWriteCallback(DawnBufferMapAsyncStatus status, void ToMockBufferMapWriteCallback(DawnBufferMapAsyncStatus status,
void* ptr, void* ptr,
@ -70,8 +70,8 @@ class WireBufferMappingTests : public WireTest {
void SetUp() override { void SetUp() override {
WireTest::SetUp(); WireTest::SetUp();
mockBufferMapReadCallback = std::make_unique<MockBufferMapReadCallback>(); mockBufferMapReadCallback = std::make_unique<StrictMock<MockBufferMapReadCallback>>();
mockBufferMapWriteCallback = std::make_unique<MockBufferMapWriteCallback>(); mockBufferMapWriteCallback = std::make_unique<StrictMock<MockBufferMapWriteCallback>>();
{ {
DawnBufferDescriptor descriptor; DawnBufferDescriptor descriptor;
@ -83,7 +83,6 @@ class WireBufferMappingTests : public WireTest {
EXPECT_CALL(api, DeviceCreateBuffer(apiDevice, _)) EXPECT_CALL(api, DeviceCreateBuffer(apiDevice, _))
.WillOnce(Return(apiBuffer)) .WillOnce(Return(apiBuffer))
.RetiresOnSaturation(); .RetiresOnSaturation();
EXPECT_CALL(api, BufferRelease(apiBuffer));
FlushClient(); FlushClient();
} }
{ {
@ -107,6 +106,13 @@ class WireBufferMappingTests : public WireTest {
mockBufferMapWriteCallback = nullptr; mockBufferMapWriteCallback = nullptr;
} }
void FlushServer() {
WireTest::FlushServer();
Mock::VerifyAndClearExpectations(&mockBufferMapReadCallback);
Mock::VerifyAndClearExpectations(&mockBufferMapWriteCallback);
}
protected: protected:
// A successfully created buffer // A successfully created buffer
DawnBuffer buffer; DawnBuffer buffer;
@ -194,6 +200,9 @@ TEST_F(WireBufferMappingTests, DestroyBeforeReadRequestEnd) {
.Times(1); .Times(1);
dawnBufferRelease(errorBuffer); dawnBufferRelease(errorBuffer);
FlushClient();
FlushServer();
} }
// Check the map read callback is called with UNKNOWN when the map request would have worked, but // Check the map read callback is called with UNKNOWN when the map request would have worked, but
@ -309,6 +318,8 @@ TEST_F(WireBufferMappingTests, DestroyInsideMapReadCallback) {
FlushServer(); FlushServer();
EXPECT_CALL(api, BufferRelease(apiBuffer));
FlushClient(); FlushClient();
} }
@ -514,5 +525,7 @@ TEST_F(WireBufferMappingTests, DestroyInsideMapWriteCallback) {
FlushServer(); FlushServer();
EXPECT_CALL(api, BufferRelease(apiBuffer));
FlushClient(); FlushClient();
} }

View File

@ -25,7 +25,7 @@ namespace {
MOCK_METHOD2(Call, void(const char* message, DawnCallbackUserdata userdata)); MOCK_METHOD2(Call, void(const char* message, DawnCallbackUserdata userdata));
}; };
std::unique_ptr<MockDeviceErrorCallback> mockDeviceErrorCallback; std::unique_ptr<StrictMock<MockDeviceErrorCallback>> mockDeviceErrorCallback;
void ToMockDeviceErrorCallback(const char* message, DawnCallbackUserdata userdata) { void ToMockDeviceErrorCallback(const char* message, DawnCallbackUserdata userdata) {
mockDeviceErrorCallback->Call(message, userdata); mockDeviceErrorCallback->Call(message, userdata);
} }
@ -39,7 +39,7 @@ namespace {
DawnCallbackUserdata userdata2)); DawnCallbackUserdata userdata2));
}; };
std::unique_ptr<MockBuilderErrorCallback> mockBuilderErrorCallback; std::unique_ptr<StrictMock<MockBuilderErrorCallback>> mockBuilderErrorCallback;
void ToMockBuilderErrorCallback(DawnBuilderErrorStatus status, void ToMockBuilderErrorCallback(DawnBuilderErrorStatus status,
const char* message, const char* message,
DawnCallbackUserdata userdata1, DawnCallbackUserdata userdata1,
@ -58,17 +58,23 @@ class WireCallbackTests : public WireTest {
void SetUp() override { void SetUp() override {
WireTest::SetUp(); WireTest::SetUp();
mockDeviceErrorCallback = std::make_unique<MockDeviceErrorCallback>(); mockDeviceErrorCallback = std::make_unique<StrictMock<MockDeviceErrorCallback>>();
mockBuilderErrorCallback = std::make_unique<MockBuilderErrorCallback>(); mockBuilderErrorCallback = std::make_unique<StrictMock<MockBuilderErrorCallback>>();
} }
void TearDown() override { void TearDown() override {
WireTest::TearDown(); WireTest::TearDown();
// Delete mocks so that expectations are checked
mockDeviceErrorCallback = nullptr; mockDeviceErrorCallback = nullptr;
mockBuilderErrorCallback = nullptr; mockBuilderErrorCallback = nullptr;
} }
void FlushServer() {
WireTest::FlushServer();
Mock::VerifyAndClearExpectations(&mockDeviceErrorCallback);
Mock::VerifyAndClearExpectations(&mockBuilderErrorCallback);
}
}; };
// Test that we get a success builder error status when no error happens // Test that we get a success builder error status when no error happens
@ -89,8 +95,6 @@ TEST_F(WireCallbackTests, SuccessCallbackOnBuilderSuccess) {
return apiBuffer; return apiBuffer;
})); }));
EXPECT_CALL(api, BufferBuilderRelease(apiBufferBuilder));
EXPECT_CALL(api, BufferRelease(apiBuffer));
FlushClient(); FlushClient();
EXPECT_CALL(*mockBuilderErrorCallback, Call(DAWN_BUILDER_ERROR_STATUS_SUCCESS, _, 1, 2)); EXPECT_CALL(*mockBuilderErrorCallback, Call(DAWN_BUILDER_ERROR_STATUS_SUCCESS, _, 1, 2));
@ -157,8 +161,6 @@ TEST_F(WireCallbackTests, SuccessCallbackNotForwardedToDevice) {
return apiBuffer; return apiBuffer;
})); }));
EXPECT_CALL(api, BufferBuilderRelease(apiBufferBuilder));
EXPECT_CALL(api, BufferRelease(apiBuffer));
FlushClient(); FlushClient();
FlushServer(); FlushServer();
} }
@ -182,7 +184,6 @@ TEST_F(WireCallbackTests, ErrorCallbackForwardedToDevice) {
return nullptr; return nullptr;
})); }));
EXPECT_CALL(api, BufferBuilderRelease(apiBufferBuilder));
FlushClient(); FlushClient();
EXPECT_CALL(*mockDeviceErrorCallback, Call(_, userdata)).Times(1); EXPECT_CALL(*mockDeviceErrorCallback, Call(_, userdata)).Times(1);
@ -239,8 +240,6 @@ TEST_F(WireCallbackTests, BuilderErrorCallback) {
return apiBuffer; return apiBuffer;
})); }));
EXPECT_CALL(api, BufferBuilderRelease(apiBufferBuilder));
EXPECT_CALL(api, BufferRelease(apiBuffer));
FlushClient(); FlushClient();
// The error callback gets called on the client side // The error callback gets called on the client side

View File

@ -25,7 +25,7 @@ namespace {
MOCK_METHOD2(Call, void(const char* message, DawnCallbackUserdata userdata)); MOCK_METHOD2(Call, void(const char* message, DawnCallbackUserdata userdata));
}; };
std::unique_ptr<MockDeviceErrorCallback> mockDeviceErrorCallback; std::unique_ptr<StrictMock<MockDeviceErrorCallback>> mockDeviceErrorCallback;
void ToMockDeviceErrorCallback(const char* message, DawnCallbackUserdata userdata) { void ToMockDeviceErrorCallback(const char* message, DawnCallbackUserdata userdata) {
mockDeviceErrorCallback->Call(message, userdata); mockDeviceErrorCallback->Call(message, userdata);
} }
@ -35,7 +35,7 @@ namespace {
MOCK_METHOD2(Call, void(DawnFenceCompletionStatus status, DawnCallbackUserdata userdata)); MOCK_METHOD2(Call, void(DawnFenceCompletionStatus status, DawnCallbackUserdata userdata));
}; };
std::unique_ptr<MockFenceOnCompletionCallback> mockFenceOnCompletionCallback; std::unique_ptr<StrictMock<MockFenceOnCompletionCallback>> mockFenceOnCompletionCallback;
void ToMockFenceOnCompletionCallback(DawnFenceCompletionStatus status, void ToMockFenceOnCompletionCallback(DawnFenceCompletionStatus status,
DawnCallbackUserdata userdata) { DawnCallbackUserdata userdata) {
mockFenceOnCompletionCallback->Call(status, userdata); mockFenceOnCompletionCallback->Call(status, userdata);
@ -52,14 +52,14 @@ class WireFenceTests : public WireTest {
void SetUp() override { void SetUp() override {
WireTest::SetUp(); WireTest::SetUp();
mockDeviceErrorCallback = std::make_unique<MockDeviceErrorCallback>(); mockDeviceErrorCallback = std::make_unique<StrictMock<MockDeviceErrorCallback>>();
mockFenceOnCompletionCallback = std::make_unique<MockFenceOnCompletionCallback>(); mockFenceOnCompletionCallback =
std::make_unique<StrictMock<MockFenceOnCompletionCallback>>();
{ {
queue = dawnDeviceCreateQueue(device); queue = dawnDeviceCreateQueue(device);
apiQueue = api.GetNewQueue(); apiQueue = api.GetNewQueue();
EXPECT_CALL(api, DeviceCreateQueue(apiDevice)).WillOnce(Return(apiQueue)); EXPECT_CALL(api, DeviceCreateQueue(apiDevice)).WillOnce(Return(apiQueue));
EXPECT_CALL(api, QueueRelease(apiQueue));
FlushClient(); FlushClient();
} }
{ {
@ -71,7 +71,6 @@ class WireFenceTests : public WireTest {
fence = dawnQueueCreateFence(queue, &descriptor); fence = dawnQueueCreateFence(queue, &descriptor);
EXPECT_CALL(api, QueueCreateFence(apiQueue, _)).WillOnce(Return(apiFence)); EXPECT_CALL(api, QueueCreateFence(apiQueue, _)).WillOnce(Return(apiFence));
EXPECT_CALL(api, FenceRelease(apiFence));
FlushClient(); FlushClient();
} }
} }
@ -79,11 +78,17 @@ class WireFenceTests : public WireTest {
void TearDown() override { void TearDown() override {
WireTest::TearDown(); WireTest::TearDown();
// Delete mocks so that expectations are checked
mockDeviceErrorCallback = nullptr; mockDeviceErrorCallback = nullptr;
mockFenceOnCompletionCallback = nullptr; mockFenceOnCompletionCallback = nullptr;
} }
void FlushServer() {
WireTest::FlushServer();
Mock::VerifyAndClearExpectations(&mockDeviceErrorCallback);
Mock::VerifyAndClearExpectations(&mockFenceOnCompletionCallback);
}
protected: protected:
void DoQueueSignal(uint64_t signalValue) { void DoQueueSignal(uint64_t signalValue) {
dawnQueueSignal(queue, fence, signalValue); dawnQueueSignal(queue, fence, signalValue);
@ -216,6 +221,9 @@ TEST_F(WireFenceTests, OnCompletionSynchronousValidationSuccess) {
dawnFenceOnCompletion(fence, 2u, ToMockFenceOnCompletionCallback, 0); dawnFenceOnCompletion(fence, 2u, ToMockFenceOnCompletionCallback, 0);
dawnFenceOnCompletion(fence, 3u, ToMockFenceOnCompletionCallback, 0); dawnFenceOnCompletion(fence, 3u, ToMockFenceOnCompletionCallback, 0);
dawnFenceOnCompletion(fence, 4u, ToMockFenceOnCompletionCallback, 0); dawnFenceOnCompletion(fence, 4u, ToMockFenceOnCompletionCallback, 0);
EXPECT_CALL(*mockFenceOnCompletionCallback, Call(DAWN_FENCE_COMPLETION_STATUS_UNKNOWN, _))
.Times(3);
} }
// Without any flushes, errors should be generated when waiting on a value greater // Without any flushes, errors should be generated when waiting on a value greater
@ -261,8 +269,6 @@ TEST_F(WireFenceTests, DestroyBeforeOnCompletionEnd) {
EXPECT_CALL(*mockFenceOnCompletionCallback, EXPECT_CALL(*mockFenceOnCompletionCallback,
Call(DAWN_FENCE_COMPLETION_STATUS_UNKNOWN, userdata)) Call(DAWN_FENCE_COMPLETION_STATUS_UNKNOWN, userdata))
.Times(1); .Times(1);
dawnFenceRelease(fence);
} }
// Test that signaling a fence on a wrong queue is invalid // Test that signaling a fence on a wrong queue is invalid
@ -270,7 +276,6 @@ TEST_F(WireFenceTests, SignalWrongQueue) {
DawnQueue queue2 = dawnDeviceCreateQueue(device); DawnQueue queue2 = dawnDeviceCreateQueue(device);
DawnQueue apiQueue2 = api.GetNewQueue(); DawnQueue apiQueue2 = api.GetNewQueue();
EXPECT_CALL(api, DeviceCreateQueue(apiDevice)).WillOnce(Return(apiQueue2)); EXPECT_CALL(api, DeviceCreateQueue(apiDevice)).WillOnce(Return(apiQueue2));
EXPECT_CALL(api, QueueRelease(apiQueue2));
FlushClient(); FlushClient();
DawnCallbackUserdata userdata = 1520; DawnCallbackUserdata userdata = 1520;
@ -285,7 +290,6 @@ TEST_F(WireFenceTests, SignalWrongQueueDoesNotUpdateValue) {
DawnQueue queue2 = dawnDeviceCreateQueue(device); DawnQueue queue2 = dawnDeviceCreateQueue(device);
DawnQueue apiQueue2 = api.GetNewQueue(); DawnQueue apiQueue2 = api.GetNewQueue();
EXPECT_CALL(api, DeviceCreateQueue(apiDevice)).WillOnce(Return(apiQueue2)); EXPECT_CALL(api, DeviceCreateQueue(apiDevice)).WillOnce(Return(apiQueue2));
EXPECT_CALL(api, QueueRelease(apiQueue2));
FlushClient(); FlushClient();
DawnCallbackUserdata userdata = 1024; DawnCallbackUserdata userdata = 1024;

View File

@ -59,7 +59,6 @@ TEST_F(WireOptionalTests, OptionalObjectValue) {
}))) })))
.WillOnce(Return(nullptr)); .WillOnce(Return(nullptr));
EXPECT_CALL(api, BindGroupLayoutRelease(apiBindGroupLayout));
FlushClient(); FlushClient();
} }
@ -187,8 +186,5 @@ TEST_F(WireOptionalTests, OptionalStructPointer) {
}))) })))
.WillOnce(Return(nullptr)); .WillOnce(Return(nullptr));
EXPECT_CALL(api, ShaderModuleRelease(apiVsModule));
EXPECT_CALL(api, PipelineLayoutRelease(apiLayout));
FlushClient(); FlushClient();
} }

View File

@ -34,10 +34,7 @@ void WireTest::SetUp() {
// This SetCallback call cannot be ignored because it is done as soon as we start the server // This SetCallback call cannot be ignored because it is done as soon as we start the server
EXPECT_CALL(api, OnDeviceSetErrorCallback(_, _, _)).Times(Exactly(1)); EXPECT_CALL(api, OnDeviceSetErrorCallback(_, _, _)).Times(Exactly(1));
if (mIgnoreSetCallbackCalls) { SetupIgnoredCallExpectations();
EXPECT_CALL(api, OnBuilderSetErrorCallback(_, _, _, _)).Times(AnyNumber());
}
EXPECT_CALL(api, DeviceTick(_)).Times(AnyNumber());
mS2cBuf = std::make_unique<utils::TerribleCommandBuffer>(); mS2cBuf = std::make_unique<utils::TerribleCommandBuffer>();
mC2sBuf = std::make_unique<utils::TerribleCommandBuffer>(mWireServer.get()); mC2sBuf = std::make_unique<utils::TerribleCommandBuffer>(mWireServer.get());
@ -62,13 +59,24 @@ void WireTest::TearDown() {
// be reset before any mocks are deleted. // be reset before any mocks are deleted.
// Incomplete client callbacks will be called on deletion, so the mocks // Incomplete client callbacks will be called on deletion, so the mocks
// cannot be null. // cannot be null.
api.IgnoreAllReleaseCalls();
mWireClient = nullptr; mWireClient = nullptr;
} }
void WireTest::FlushClient() { void WireTest::FlushClient() {
ASSERT_TRUE(mC2sBuf->Flush()); ASSERT_TRUE(mC2sBuf->Flush());
Mock::VerifyAndClearExpectations(&api);
SetupIgnoredCallExpectations();
} }
void WireTest::FlushServer() { void WireTest::FlushServer() {
ASSERT_TRUE(mS2cBuf->Flush()); ASSERT_TRUE(mS2cBuf->Flush());
} }
void WireTest::SetupIgnoredCallExpectations() {
if (mIgnoreSetCallbackCalls) {
EXPECT_CALL(api, OnBuilderSetErrorCallback(_, _, _, _)).Times(AnyNumber());
}
EXPECT_CALL(api, DeviceTick(_)).Times(AnyNumber());
}

View File

@ -85,11 +85,12 @@ class WireTest : public testing::Test {
void FlushClient(); void FlushClient();
void FlushServer(); void FlushServer();
MockProcTable api; testing::StrictMock<MockProcTable> api;
DawnDevice apiDevice; DawnDevice apiDevice;
DawnDevice device; DawnDevice device;
private: private:
void SetupIgnoredCallExpectations();
bool mIgnoreSetCallbackCalls = false; bool mIgnoreSetCallbackCalls = false;
std::unique_ptr<dawn_wire::WireServer> mWireServer; std::unique_ptr<dawn_wire::WireServer> mWireServer;