WireTests for buffer read mapping
This commit is contained in:
parent
9388b23212
commit
eca89c2989
|
@ -43,6 +43,17 @@ static void ToMockBuilderErrorCallback(nxtBuilderErrorStatus status, const char*
|
||||||
mockBuilderErrorCallback->Call(status, message, userdata1, userdata2);
|
mockBuilderErrorCallback->Call(status, message, userdata1, userdata2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class MockBufferMapReadCallback {
|
||||||
|
public:
|
||||||
|
MOCK_METHOD3(Call, void(nxtBufferMapReadStatus status, const uint32_t* ptr, nxtCallbackUserdata userdata));
|
||||||
|
};
|
||||||
|
|
||||||
|
static MockBufferMapReadCallback* mockBufferMapReadCallback = nullptr;
|
||||||
|
static void ToMockBufferMapReadCallback(nxtBufferMapReadStatus status, const void* ptr, nxtCallbackUserdata userdata) {
|
||||||
|
// Assume the data is uint32_t to make writing matchers easier
|
||||||
|
mockBufferMapReadCallback->Call(status, reinterpret_cast<const uint32_t*>(ptr), userdata);
|
||||||
|
}
|
||||||
|
|
||||||
class WireTestsBase : public Test {
|
class WireTestsBase : public Test {
|
||||||
protected:
|
protected:
|
||||||
WireTestsBase(bool ignoreSetCallbackCalls)
|
WireTestsBase(bool ignoreSetCallbackCalls)
|
||||||
|
@ -52,6 +63,7 @@ class WireTestsBase : public Test {
|
||||||
void SetUp() override {
|
void SetUp() override {
|
||||||
mockDeviceErrorCallback = new MockDeviceErrorCallback;
|
mockDeviceErrorCallback = new MockDeviceErrorCallback;
|
||||||
mockBuilderErrorCallback = new MockBuilderErrorCallback;
|
mockBuilderErrorCallback = new MockBuilderErrorCallback;
|
||||||
|
mockBufferMapReadCallback = new MockBufferMapReadCallback;
|
||||||
|
|
||||||
nxtProcTable mockProcs;
|
nxtProcTable mockProcs;
|
||||||
nxtDevice mockDevice;
|
nxtDevice mockDevice;
|
||||||
|
@ -85,6 +97,7 @@ class WireTestsBase : public Test {
|
||||||
delete s2cBuf;
|
delete s2cBuf;
|
||||||
delete mockDeviceErrorCallback;
|
delete mockDeviceErrorCallback;
|
||||||
delete mockBuilderErrorCallback;
|
delete mockBuilderErrorCallback;
|
||||||
|
delete mockBufferMapReadCallback;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FlushClient() {
|
void FlushClient() {
|
||||||
|
@ -490,3 +503,142 @@ TEST_F(WireSetCallbackTests, BuilderErrorCallback) {
|
||||||
|
|
||||||
FlushServer();
|
FlushServer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class WireBufferMappingTests : public WireTestsBase {
|
||||||
|
public:
|
||||||
|
WireBufferMappingTests() : WireTestsBase(true) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetUp() override {
|
||||||
|
WireTestsBase::SetUp();
|
||||||
|
|
||||||
|
{
|
||||||
|
nxtBufferBuilder apiBufferBuilder = api.GetNewBufferBuilder();
|
||||||
|
nxtBufferBuilder bufferBuilder = nxtDeviceCreateBufferBuilder(device);
|
||||||
|
EXPECT_CALL(api, DeviceCreateBufferBuilder(apiDevice))
|
||||||
|
.WillOnce(Return(apiBufferBuilder))
|
||||||
|
.RetiresOnSaturation();
|
||||||
|
|
||||||
|
apiBuffer = api.GetNewBuffer();
|
||||||
|
buffer = nxtBufferBuilderGetResult(bufferBuilder);
|
||||||
|
EXPECT_CALL(api, BufferBuilderGetResult(apiBufferBuilder))
|
||||||
|
.WillOnce(Return(apiBuffer))
|
||||||
|
.RetiresOnSaturation();
|
||||||
|
FlushClient();
|
||||||
|
}
|
||||||
|
{
|
||||||
|
nxtBufferBuilder apiBufferBuilder = api.GetNewBufferBuilder();
|
||||||
|
nxtBufferBuilder bufferBuilder = nxtDeviceCreateBufferBuilder(device);
|
||||||
|
EXPECT_CALL(api, DeviceCreateBufferBuilder(apiDevice))
|
||||||
|
.WillOnce(Return(apiBufferBuilder))
|
||||||
|
.RetiresOnSaturation();
|
||||||
|
|
||||||
|
errorBuffer = nxtBufferBuilderGetResult(bufferBuilder);
|
||||||
|
EXPECT_CALL(api, BufferBuilderGetResult(apiBufferBuilder))
|
||||||
|
.WillOnce(Return(nullptr))
|
||||||
|
.RetiresOnSaturation();
|
||||||
|
FlushClient();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// A successfully created buffer
|
||||||
|
nxtBuffer buffer;
|
||||||
|
nxtBuffer apiBuffer;
|
||||||
|
|
||||||
|
// An buffer that wasn't created on the server side
|
||||||
|
nxtBuffer errorBuffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Check mapping a succesfully created buffer
|
||||||
|
TEST_F(WireBufferMappingTests, MappingSuccessBuffer) {
|
||||||
|
nxtCallbackUserdata userdata = 8653;
|
||||||
|
nxtBufferMapReadAsync(buffer, 40, sizeof(uint32_t), ToMockBufferMapReadCallback, userdata);
|
||||||
|
|
||||||
|
uint32_t bufferContent = 31337;
|
||||||
|
EXPECT_CALL(api, OnBufferMapReadAsyncCallback(apiBuffer, 40, sizeof(uint32_t), _, _))
|
||||||
|
.WillOnce(InvokeWithoutArgs([&]() {
|
||||||
|
api.CallMapReadCallback(apiBuffer, NXT_BUFFER_MAP_READ_STATUS_SUCCESS, &bufferContent);
|
||||||
|
}));
|
||||||
|
|
||||||
|
FlushClient();
|
||||||
|
|
||||||
|
EXPECT_CALL(*mockBufferMapReadCallback, Call(NXT_BUFFER_MAP_READ_STATUS_SUCCESS, Pointee(Eq(bufferContent)), userdata))
|
||||||
|
.Times(1);
|
||||||
|
|
||||||
|
FlushServer();
|
||||||
|
|
||||||
|
nxtBufferUnmap(buffer);
|
||||||
|
EXPECT_CALL(api, BufferUnmap(apiBuffer))
|
||||||
|
.Times(1);
|
||||||
|
|
||||||
|
FlushClient();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check that things work correctly when a validation error happens when mapping the buffer
|
||||||
|
TEST_F(WireBufferMappingTests, ErrorWhileMapping) {
|
||||||
|
nxtCallbackUserdata userdata = 8654;
|
||||||
|
nxtBufferMapReadAsync(buffer, 40, sizeof(uint32_t), ToMockBufferMapReadCallback, userdata);
|
||||||
|
|
||||||
|
EXPECT_CALL(api, OnBufferMapReadAsyncCallback(apiBuffer, 40, sizeof(uint32_t), _, _))
|
||||||
|
.WillOnce(InvokeWithoutArgs([&]() {
|
||||||
|
api.CallMapReadCallback(apiBuffer, NXT_BUFFER_MAP_READ_STATUS_ERROR, nullptr);
|
||||||
|
}));
|
||||||
|
|
||||||
|
FlushClient();
|
||||||
|
|
||||||
|
EXPECT_CALL(*mockBufferMapReadCallback, Call(NXT_BUFFER_MAP_READ_STATUS_ERROR, nullptr, userdata))
|
||||||
|
.Times(1);
|
||||||
|
|
||||||
|
FlushServer();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check mapping a buffer that didn't get created on the server side
|
||||||
|
TEST_F(WireBufferMappingTests, MappingErrorBuffer) {
|
||||||
|
nxtCallbackUserdata userdata = 8655;
|
||||||
|
nxtBufferMapReadAsync(errorBuffer, 40, sizeof(uint32_t), ToMockBufferMapReadCallback, userdata);
|
||||||
|
|
||||||
|
FlushClient();
|
||||||
|
|
||||||
|
EXPECT_CALL(*mockBufferMapReadCallback, Call(NXT_BUFFER_MAP_READ_STATUS_ERROR, nullptr, userdata))
|
||||||
|
.Times(1);
|
||||||
|
|
||||||
|
FlushServer();
|
||||||
|
|
||||||
|
nxtBufferUnmap(errorBuffer);
|
||||||
|
|
||||||
|
FlushClient();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check that the callback is called with UNKNOWN when the buffer is destroyed before the request is finished
|
||||||
|
TEST_F(WireBufferMappingTests, DestroyBeforeRequestEnd) {
|
||||||
|
nxtCallbackUserdata userdata = 8656;
|
||||||
|
nxtBufferMapReadAsync(errorBuffer, 40, sizeof(uint32_t), ToMockBufferMapReadCallback, userdata);
|
||||||
|
|
||||||
|
EXPECT_CALL(*mockBufferMapReadCallback, Call(NXT_BUFFER_MAP_READ_STATUS_UNKNOWN, nullptr, userdata))
|
||||||
|
.Times(1);
|
||||||
|
|
||||||
|
nxtBufferRelease(errorBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check the callback is called with UNKNOWN when the map request would have worked, but Unmap was called
|
||||||
|
TEST_F(WireBufferMappingTests, UnmapCalledTooEarly) {
|
||||||
|
nxtCallbackUserdata userdata = 8657;
|
||||||
|
nxtBufferMapReadAsync(buffer, 40, sizeof(uint32_t), ToMockBufferMapReadCallback, userdata);
|
||||||
|
|
||||||
|
uint32_t bufferContent = 31337;
|
||||||
|
EXPECT_CALL(api, OnBufferMapReadAsyncCallback(apiBuffer, 40, sizeof(uint32_t), _, _))
|
||||||
|
.WillOnce(InvokeWithoutArgs([&]() {
|
||||||
|
api.CallMapReadCallback(apiBuffer, NXT_BUFFER_MAP_READ_STATUS_SUCCESS, &bufferContent);
|
||||||
|
}));
|
||||||
|
|
||||||
|
FlushClient();
|
||||||
|
|
||||||
|
// Oh no! We are calling Unmap too early!
|
||||||
|
EXPECT_CALL(*mockBufferMapReadCallback, Call(NXT_BUFFER_MAP_READ_STATUS_UNKNOWN, nullptr, userdata))
|
||||||
|
.Times(1);
|
||||||
|
nxtBufferUnmap(buffer);
|
||||||
|
|
||||||
|
// The callback shouldn't get called, even when the request succeeded on the server side
|
||||||
|
FlushServer();
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue