// Copyright 2019 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. #include "platform/api/trace_logging_platform.h" #ifndef PLATFORM_TEST_TRACE_LOGGING_HELPERS_H_ #define PLATFORM_TEST_TRACE_LOGGING_HELPERS_H_ #include #include "gmock/gmock.h" #include "platform/base/trace_logging_activation.h" #include "util/chrono_helpers.h" #include "util/osp_logging.h" namespace openscreen { enum TraceHierarchyParts { kRoot = 0x1, kParent = 0x2, kCurrent = 0x4 }; enum ArgumentId { kFirst, kSecond }; class MockLoggingPlatform : public TraceLoggingPlatform { public: MockLoggingPlatform() { StartTracing(this); ON_CALL(*this, IsTraceLoggingEnabled(::testing::_)) .WillByDefault(::testing::Return(true)); } ~MockLoggingPlatform() override { StopTracing(); } MOCK_METHOD1(IsTraceLoggingEnabled, bool(TraceCategory::Value category)); MOCK_METHOD7(LogTrace, void(const char*, const uint32_t, const char* file, Clock::time_point, Clock::time_point, TraceIdHierarchy ids, Error::Code)); MOCK_METHOD5(LogAsyncStart, void(const char*, const uint32_t, const char* file, Clock::time_point, TraceIdHierarchy)); MOCK_METHOD5(LogAsyncEnd, void(const uint32_t, const char* file, Clock::time_point, TraceId, Error::Code)); }; // Methods to validate the results of platform-layer calls. template void ValidateTraceTimestampDiff(const char* name, const uint32_t line, const char* file, Clock::time_point start_time, Clock::time_point end_time, TraceIdHierarchy ids, Error error) { const auto elapsed = to_milliseconds(end_time - start_time); ASSERT_GE(static_cast(elapsed.count()), milliseconds); } template void ValidateTraceErrorCode(const char* name, const uint32_t line, const char* file, Clock::time_point start_time, Clock::time_point end_time, TraceIdHierarchy ids, Error error) { ASSERT_EQ(error.code(), result); } template void ValidateTraceIdHierarchyOnSyncTrace(const char* name, const uint32_t line, const char* file, Clock::time_point start_time, Clock::time_point end_time, TraceIdHierarchy ids, Error error) { if (parts & TraceHierarchyParts::kCurrent) { ASSERT_EQ(ids.current, Current); } if (parts & TraceHierarchyParts::kParent) { ASSERT_EQ(ids.parent, Parent); } if (parts & TraceHierarchyParts::kRoot) { ASSERT_EQ(ids.root, Root); } } template void ValidateTraceIdHierarchyOnAsyncTrace(const char* name, const uint32_t line, const char* file, Clock::time_point timestamp, TraceIdHierarchy ids) { if (parts & TraceHierarchyParts::kCurrent) { EXPECT_EQ(ids.current, Current); } if (parts & TraceHierarchyParts::kParent) { EXPECT_EQ(ids.parent, Parent); } if (parts & TraceHierarchyParts::kRoot) { EXPECT_EQ(ids.root, Root); } } } // namespace openscreen #endif // PLATFORM_TEST_TRACE_LOGGING_HELPERS_H_