Add missing "strlen" parameter for Device InjectError command.
This CL adds a StringMessageMatcher to the wire unittests harness
to validate that messages are not degenerate.
Bug: chromium:1004368
Change-Id: I121a259e67938b06ccc5e9829abfa3e25fffc003
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/11740
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/dawn.json b/dawn.json
index 47bb485..bd5cb81 100644
--- a/dawn.json
+++ b/dawn.json
@@ -543,7 +543,7 @@
"name": "inject error",
"args": [
{"name": "type", "type": "error type"},
- {"name": "message", "type": "char", "annotation": "const*"}
+ {"name": "message", "type": "char", "annotation": "const*", "length": "strlen"}
],
"TODO": "enga@: Make this a Dawn extension"
},
diff --git a/src/tests/unittests/wire/WireErrorCallbackTests.cpp b/src/tests/unittests/wire/WireErrorCallbackTests.cpp
index f57ebf4..55e0912 100644
--- a/src/tests/unittests/wire/WireErrorCallbackTests.cpp
+++ b/src/tests/unittests/wire/WireErrorCallbackTests.cpp
@@ -193,7 +193,7 @@
FlushClient();
// Incomplete callback called in Device destructor.
- EXPECT_CALL(*mockDevicePopErrorScopeCallback, Call(DAWN_ERROR_TYPE_UNKNOWN, _, this)).Times(1);
+ EXPECT_CALL(*mockDevicePopErrorScopeCallback, Call(DAWN_ERROR_TYPE_UNKNOWN, ValidStringMessage(), this)).Times(1);
}
// Test that PopErrorScope returns false if there are no error scopes.
diff --git a/src/tests/unittests/wire/WireFenceTests.cpp b/src/tests/unittests/wire/WireFenceTests.cpp
index d7d2608..5329b5b 100644
--- a/src/tests/unittests/wire/WireFenceTests.cpp
+++ b/src/tests/unittests/wire/WireFenceTests.cpp
@@ -107,18 +107,18 @@
// than or equal to the current signaled value
TEST_F(WireFenceTests, QueueSignalValidationError) {
dawnQueueSignal(queue, fence, 0u); // Error
- EXPECT_CALL(api, DeviceInjectError(apiDevice, DAWN_ERROR_TYPE_VALIDATION, _)).Times(1);
+ EXPECT_CALL(api, DeviceInjectError(apiDevice, DAWN_ERROR_TYPE_VALIDATION, ValidStringMessage())).Times(1);
FlushClient();
dawnQueueSignal(queue, fence, 1u); // Error
- EXPECT_CALL(api, DeviceInjectError(apiDevice, DAWN_ERROR_TYPE_VALIDATION, _)).Times(1);
+ EXPECT_CALL(api, DeviceInjectError(apiDevice, DAWN_ERROR_TYPE_VALIDATION, ValidStringMessage())).Times(1);
FlushClient();
DoQueueSignal(4u); // Success
FlushClient();
dawnQueueSignal(queue, fence, 3u); // Error
- EXPECT_CALL(api, DeviceInjectError(apiDevice, DAWN_ERROR_TYPE_VALIDATION, _)).Times(1);
+ EXPECT_CALL(api, DeviceInjectError(apiDevice, DAWN_ERROR_TYPE_VALIDATION, ValidStringMessage())).Times(1);
FlushClient();
}
@@ -194,7 +194,7 @@
dawnFenceOnCompletion(fence, 2u, ToMockFenceOnCompletionCallback, this + 0);
- EXPECT_CALL(api, DeviceInjectError(apiDevice, DAWN_ERROR_TYPE_VALIDATION, _)).Times(1);
+ EXPECT_CALL(api, DeviceInjectError(apiDevice, DAWN_ERROR_TYPE_VALIDATION, ValidStringMessage())).Times(1);
FlushClient();
}
@@ -235,7 +235,7 @@
FlushClient();
dawnQueueSignal(queue2, fence, 2u); // error
- EXPECT_CALL(api, DeviceInjectError(apiDevice, DAWN_ERROR_TYPE_VALIDATION, _)).Times(1);
+ EXPECT_CALL(api, DeviceInjectError(apiDevice, DAWN_ERROR_TYPE_VALIDATION, ValidStringMessage())).Times(1);
FlushClient();
}
@@ -247,7 +247,7 @@
FlushClient();
dawnQueueSignal(queue2, fence, 2u); // error
- EXPECT_CALL(api, DeviceInjectError(apiDevice, DAWN_ERROR_TYPE_VALIDATION, _)).Times(1);
+ EXPECT_CALL(api, DeviceInjectError(apiDevice, DAWN_ERROR_TYPE_VALIDATION, ValidStringMessage())).Times(1);
FlushClient();
// Fence value should be unchanged.
diff --git a/src/tests/unittests/wire/WireTest.h b/src/tests/unittests/wire/WireTest.h
index bbd6f53..1beb36f 100644
--- a/src/tests/unittests/wire/WireTest.h
+++ b/src/tests/unittests/wire/WireTest.h
@@ -66,6 +66,35 @@
return MakeMatcher(new LambdaMatcherImpl<Lambda, MatcherLambdaArgument<Lambda>>(lambda));
}
+class StringMessageMatcher : public testing::MatcherInterface<const char*> {
+ public:
+ explicit StringMessageMatcher() {}
+
+ bool MatchAndExplain(const char* message, testing::MatchResultListener* listener) const override {
+ if (message == nullptr) {
+ *listener << "missing error message";
+ return false;
+ }
+ if (std::strlen(message) <= 1) {
+ *listener << "message is truncated";
+ return false;
+ }
+ return true;
+ }
+
+ void DescribeTo(std::ostream* os) const override {
+ *os << "valid error message";
+ }
+
+ void DescribeNegationTo(std::ostream* os) const override {
+ *os << "invalid error message";
+ }
+};
+
+inline testing::Matcher<const char*> ValidStringMessage() {
+ return MakeMatcher(new StringMessageMatcher());
+}
+
namespace dawn_wire {
class WireClient;
class WireServer;