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;