0

Support gmock matchers in mojo StructPtr

gmock's Pointee matcher dereferences raw or smart pointers. It depends
on smart pointers defining element_type to recognize what type they
hold. This patch adds element_type to StructPtr and InlineStructPtr so
gmock will recognize them as smart pointers.

R=rockot

Change-Id: I06333a31c0a958fd24784e1ee2244d0232267bba
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2403583
Reviewed-by: Ken Rockot <rockot@google.com>
Commit-Queue: Joe Mason <joenotcharles@chromium.org>
Cr-Commit-Position: refs/heads/master@{#805915}
This commit is contained in:
Joe Mason
2020-09-10 21:55:23 +00:00
committed by Commit Bot
parent b3a62810a6
commit cdb0a10d8f
2 changed files with 28 additions and 0 deletions
mojo/public/cpp/bindings

@ -35,6 +35,10 @@ class StructPtr {
public:
using Struct = S;
// Exposing StructPtr<S>::element_type allows gmock's Pointee matcher to
// dereference StructPtr's.
using element_type = S;
StructPtr() = default;
StructPtr(std::nullptr_t) {}
@ -122,6 +126,10 @@ class InlinedStructPtr {
public:
using Struct = S;
// Exposing InlinedStructPtr<S>::element_type allows gmock's Pointee matcher
// to dereference InlinedStructPtr's.
using element_type = S;
InlinedStructPtr() = default;
InlinedStructPtr(std::nullptr_t) {}

@ -11,6 +11,7 @@
#include "mojo/public/cpp/system/message_pipe.h"
#include "mojo/public/interfaces/bindings/tests/test_export2.mojom.h"
#include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace mojo {
@ -542,5 +543,24 @@ TEST_F(StructTest, EnumNestedStructTest) {
EXPECT_EQ(EnumNestedStruct::StructEnum::SECOND, output->local_enum_state_);
}
TEST_F(StructTest, Matcher) {
// Pointee will dereference StructPtr<S> or InlinedStructPtr<S> to get S.
// This test ensures that the matcher compiles and works.
using ::testing::Pointee;
using ::testing::AllOf;
using ::testing::Field;
mojo::InlinedStructPtr<Rect> rect = MakeRect();
EXPECT_THAT(
rect, Pointee(AllOf(Field(&Rect::x, 1), Field(&Rect::y, 2),
Field(&Rect::width, 10), Field(&Rect::height, 20))));
mojo::StructPtr<MultiVersionStruct> multi = MakeMultiVersionStruct();
EXPECT_THAT(multi, Pointee(AllOf(Field(&MultiVersionStruct::f_int32, 123),
Field(&MultiVersionStruct::f_rect,
Pointee(Field(&Rect::x, 5))))));
}
} // namespace test
} // namespace mojo