// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef MEDIA_BASE_MOCK_MEDIA_LOG_H_ #define MEDIA_BASE_MOCK_MEDIA_LOG_H_ #include #include #include "base/macros.h" #include "media/base/media_log.h" #include "testing/gmock/include/gmock/gmock.h" namespace { struct TypeAndCodec { TypeAndCodec(std::string t, std::string c) : type(t), codec(c) {} std::string type; std::string codec; }; } // namespace // Helper macros to reduce boilerplate when verifying media log entries. // |outer| is the std::string searched for substring |sub|. #define CONTAINS_STRING(outer, sub) (std::string::npos != (outer).find(sub)) // Assumes |media_log_| is available which is a MockMediaLog, optionally a // NiceMock or StrictMock, in scope of the usage of this macro. #define EXPECT_MEDIA_LOG(x) EXPECT_MEDIA_LOG_ON(media_log_, x) // Same as EXPECT_MEDIA_LOG, but for LIMITED_MEDIA_LOG. #define EXPECT_LIMITED_MEDIA_LOG(x, count, max) \ if (count < max) { \ EXPECT_MEDIA_LOG_ON(media_log_, x); \ count++; \ } // |log| is expected to evaluate to a MockMediaLog, optionally a NiceMock or // StrictMock, in scope of the usage of this macro. #define EXPECT_MEDIA_LOG_ON(log, x) \ EXPECT_CALL((log), DoAddLogRecordLogString((x))) // Requires |media_log_| to be available. #define EXPECT_MEDIA_LOG_PROPERTY(property, value) \ EXPECT_CALL( \ media_log_, \ DoAddLogRecordLogString( \ MatchesPropertyExactValue(MockMediaLog::MediaEventToLogString( \ *media_log_.CreatePropertyTestEvent( \ value))))) #define EXPECT_MEDIA_LOG_PROPERTY_ANY_VALUE(property) \ EXPECT_CALL( \ media_log_, \ DoAddLogRecordLogString(MatchesPropertyAnyValue( \ "{\"" + MediaLogPropertyKeyToString(MediaLogProperty::property) + \ "\""))) #define EXPECT_FOUND_CODEC_NAME(stream_type, codec_name) \ EXPECT_CALL(media_log_, \ DoAddLogRecordLogString(TracksHasCodecName( \ TypeAndCodec(MediaLogPropertyKeyToString( \ MediaLogProperty::k##stream_type##Tracks), \ codec_name)))) namespace media { MATCHER_P(TracksHasCodecName, tandc, "") { return (arg.substr(0, 15) == "{\"" + tandc.type + "\"") && (arg[16] != ']') && CONTAINS_STRING(arg, tandc.codec); } MATCHER_P(MatchesPropertyExactValue, message, "") { return arg == message; } MATCHER_P(MatchesPropertyAnyValue, message, "") { return CONTAINS_STRING(arg, message); } class MockMediaLog : public MediaLog { public: MockMediaLog(); ~MockMediaLog() override; MOCK_METHOD1(DoAddLogRecordLogString, void(const std::string& event)); // Trampoline method to workaround GMOCK problems with std::unique_ptr<>. // Also simplifies tests to be able to string match on the log string // representation on the added event. void AddLogRecordLocked(std::unique_ptr event) override; template std::unique_ptr CreatePropertyTestEvent(const T& value) { return CreatePropertyRecord(value); } static std::string MediaEventToLogString(const MediaLogRecord& event); // Return whatever the last AddLogRecordLocked() was given. // TODO(tmathmeyer): Remove this in favor of a mock, to allow EXPECT_CALL. std::unique_ptr take_most_recent_event() { return std::move(most_recent_event_); } private: std::unique_ptr most_recent_event_; DISALLOW_COPY_AND_ASSIGN(MockMediaLog); }; } // namespace media #endif // MEDIA_BASE_MOCK_MEDIA_LOG_H_