// Copyright 2019 The Dawn Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "gtest/gtest.h" #include "mock/mock_dawn.h" #include // Definition of a "Lambda predicate matcher" for GMock to allow checking deep structures // are passed correctly by the wire. // Helper templates to extract the argument type of a lambda. template struct MatcherMethodArgument; template struct MatcherMethodArgument { using Type = Arg; }; template using MatcherLambdaArgument = typename MatcherMethodArgument::Type; // The matcher itself, unfortunately it isn't able to return detailed information like other // matchers do. template class LambdaMatcherImpl : public testing::MatcherInterface { public: explicit LambdaMatcherImpl(Lambda lambda) : mLambda(lambda) { } void DescribeTo(std::ostream* os) const override { *os << "with a custom matcher"; } bool MatchAndExplain(Arg value, testing::MatchResultListener* listener) const override { if (!mLambda(value)) { *listener << "which doesn't satisfy the custom predicate"; return false; } return true; } private: Lambda mLambda; }; // Use the MatchesLambda as follows: // // EXPECT_CALL(foo, Bar(MatchesLambda([](ArgType arg) -> bool { // return CheckPredicateOnArg(arg); // }))); template inline testing::Matcher> MatchesLambda(Lambda lambda) { return MakeMatcher(new LambdaMatcherImpl>(lambda)); } namespace dawn_wire { class WireClient; class WireServer; } // namespace dawn_wire namespace utils { class TerribleCommandBuffer; } class WireTest : public testing::Test { protected: WireTest(bool ignoreSetCallbackCalls); ~WireTest() override; void SetUp() override; void TearDown() override; void FlushClient(); void FlushServer(); testing::StrictMock api; DawnDevice apiDevice; DawnDevice device; private: void SetupIgnoredCallExpectations(); bool mIgnoreSetCallbackCalls = false; std::unique_ptr mWireServer; std::unique_ptr mWireClient; std::unique_ptr mS2cBuf; std::unique_ptr mC2sBuf; };