| /* |
| * Copyright (C) 2019 The Android Open Source Project |
| * |
| * 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 "src/trace_processor/clock_tracker.h" |
| #include "perfetto/ext/base/optional.h" |
| #include "src/trace_processor/trace_processor_context.h" |
| #include "src/trace_processor/trace_storage.h" |
| |
| #include <gmock/gmock.h> |
| #include <gtest/gtest.h> |
| |
| namespace perfetto { |
| namespace trace_processor { |
| namespace { |
| |
| using ::testing::NiceMock; |
| class MockTraceStorage : public TraceStorage { |
| public: |
| MockTraceStorage() : TraceStorage() {} |
| }; |
| |
| TEST(ClockTrackerTest, ClockDomainConversions) { |
| TraceProcessorContext context; |
| context.storage.reset(new NiceMock<MockTraceStorage>()); |
| ClockTracker ct(&context); |
| |
| EXPECT_EQ(ct.ToTraceTime(ClockDomain::kRealTime, 0), base::nullopt); |
| |
| ct.SyncClocks(ClockDomain::kRealTime, 10, 10010); |
| ct.SyncClocks(ClockDomain::kRealTime, 20, 20220); |
| ct.SyncClocks(ClockDomain::kRealTime, 30, 30030); |
| ct.SyncClocks(ClockDomain::kMonotonic, 1000, 100000); |
| |
| EXPECT_EQ(ct.ToTraceTime(ClockDomain::kRealTime, 0), 10000); |
| EXPECT_EQ(ct.ToTraceTime(ClockDomain::kRealTime, 1), 10001); |
| EXPECT_EQ(ct.ToTraceTime(ClockDomain::kRealTime, 9), 10009); |
| EXPECT_EQ(ct.ToTraceTime(ClockDomain::kRealTime, 10), 10010); |
| EXPECT_EQ(ct.ToTraceTime(ClockDomain::kRealTime, 11), 10011); |
| EXPECT_EQ(ct.ToTraceTime(ClockDomain::kRealTime, 19), 10019); |
| EXPECT_EQ(ct.ToTraceTime(ClockDomain::kRealTime, 20), 20220); |
| EXPECT_EQ(ct.ToTraceTime(ClockDomain::kRealTime, 21), 20221); |
| EXPECT_EQ(ct.ToTraceTime(ClockDomain::kRealTime, 29), 20229); |
| EXPECT_EQ(ct.ToTraceTime(ClockDomain::kRealTime, 30), 30030); |
| EXPECT_EQ(ct.ToTraceTime(ClockDomain::kRealTime, 40), 30040); |
| |
| EXPECT_EQ(ct.ToTraceTime(ClockDomain::kMonotonic, 0), 100000 - 1000); |
| EXPECT_EQ(ct.ToTraceTime(ClockDomain::kMonotonic, 999), 100000 - 1); |
| EXPECT_EQ(ct.ToTraceTime(ClockDomain::kMonotonic, 1000), 100000); |
| EXPECT_EQ(ct.ToTraceTime(ClockDomain::kMonotonic, 1e6), |
| static_cast<int64_t>(100000 - 1000 + 1e6)); |
| } |
| |
| TEST(ClockTrackerTest, RealTimeClockMovingBackwards) { |
| TraceProcessorContext context; |
| ClockTracker ct(&context); |
| |
| ct.SyncClocks(ClockDomain::kRealTime, 10, 10010); |
| ct.SyncClocks(ClockDomain::kRealTime, 20, 10020); |
| ct.SyncClocks(ClockDomain::kRealTime, 40, 30040); |
| ct.SyncClocks(ClockDomain::kRealTime, 30, 40030); |
| |
| EXPECT_EQ(ct.ToTraceTime(ClockDomain::kRealTime, 11), 10011); |
| EXPECT_EQ(ct.ToTraceTime(ClockDomain::kRealTime, 29), 10029); |
| EXPECT_EQ(ct.ToTraceTime(ClockDomain::kRealTime, 30), 40030); |
| EXPECT_EQ(ct.ToTraceTime(ClockDomain::kRealTime, 40), 40040); |
| |
| ct.SyncClocks(ClockDomain::kRealTime, 50, 50000); |
| EXPECT_EQ(ct.ToTraceTime(ClockDomain::kRealTime, 55), 50005); |
| |
| ct.SyncClocks(ClockDomain::kRealTime, 11, 60011); |
| EXPECT_EQ(ct.ToTraceTime(ClockDomain::kRealTime, 20), 60020); |
| } |
| |
| } // namespace |
| } // namespace trace_processor |
| } // namespace perfetto |