1b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Use of this source code is governed by a BSD-style license that can be 3b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// found in the LICENSE file. 4b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 5b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Test of classes in tracked_time.cc 6b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 7cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include <stdint.h> 8cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko 9b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/profiler/tracked_time.h" 10b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/time/time.h" 11b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/tracked_objects.h" 12b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "testing/gtest/include/gtest/gtest.h" 13b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 14b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace tracked_objects { 15b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 16b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(TrackedTimeTest, TrackedTimerMilliseconds) { 17b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // First make sure we basicallly transfer simple milliseconds values as 18b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // expected. Most critically, things should not become null. 19cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko int32_t kSomeMilliseconds = 243; // Some example times. 20cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko int64_t kReallyBigMilliseconds = (1LL << 35) + kSomeMilliseconds; 21b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 22b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TrackedTime some = TrackedTime() + 23b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Duration::FromMilliseconds(kSomeMilliseconds); 24b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kSomeMilliseconds, (some - TrackedTime()).InMilliseconds()); 25b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(some.is_null()); 26b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 27b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Now create a big time, to check that it is wrapped modulo 2^32. 28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TimeTicks big = base::TimeTicks() + 29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TimeDelta::FromMilliseconds(kReallyBigMilliseconds); 30b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kReallyBigMilliseconds, (big - base::TimeTicks()).InMilliseconds()); 31b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 32b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TrackedTime wrapped_big(big); 33b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Expect wrapping at 32 bits. 34b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kSomeMilliseconds, (wrapped_big - TrackedTime()).InMilliseconds()); 35b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 37b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(TrackedTimeTest, TrackedTimerDuration) { 38b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int kFirstMilliseconds = 793; 39b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int kSecondMilliseconds = 14889; 40b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 41b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Duration first = Duration::FromMilliseconds(kFirstMilliseconds); 42b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Duration second = Duration::FromMilliseconds(kSecondMilliseconds); 43b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 44b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFirstMilliseconds, first.InMilliseconds()); 45b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kSecondMilliseconds, second.InMilliseconds()); 46b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 47b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Duration sum = first + second; 48b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFirstMilliseconds + kSecondMilliseconds, sum.InMilliseconds()); 49b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 50b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 51b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(TrackedTimeTest, TrackedTimerVsTimeTicks) { 52b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Make sure that our 32 bit timer is aligned with the TimeTicks() timer. 53b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 54b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // First get a 64 bit timer (which should not be null). 55b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TimeTicks ticks_before = base::TimeTicks::Now(); 56b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(ticks_before.is_null()); 57b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 58b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Then get a 32 bit timer that can be be null when it wraps. 59b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TrackedTime now = TrackedTime::Now(); 60b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 61b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Then get a bracketing time. 62b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TimeTicks ticks_after = base::TimeTicks::Now(); 63b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(ticks_after.is_null()); 64b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 65b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Now make sure that we bracketed our tracked time nicely. 66b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Duration before = now - TrackedTime(ticks_before); 67b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_LE(0, before.InMilliseconds()); 68b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Duration after = now - TrackedTime(ticks_after); 69b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_GE(0, after.InMilliseconds()); 70b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 71b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 72b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(TrackedTimeTest, TrackedTimerDisabled) { 73b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Check to be sure disabling the collection of data induces a null time 74b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // (which we know will return much faster). 75b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED); 76b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Since we disabled tracking, we should get a null response. 77b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TrackedTime track_now = ThreadData::Now(); 78b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(track_now.is_null()); 79b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 80b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 81b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(TrackedTimeTest, TrackedTimerEnabled) { 82b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeAndSetTrackingStatus(ThreadData::PROFILING_ACTIVE); 83b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Make sure that when we enable tracking, we get a real timer result. 84b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 85b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // First get a 64 bit timer (which should not be null). 86b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TimeTicks ticks_before = base::TimeTicks::Now(); 87b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(ticks_before.is_null()); 88b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 89b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Then get a 32 bit timer that can be null when it wraps. 90b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Crtical difference from the TrackedTimerVsTimeTicks test, is that we use 91b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // ThreadData::Now(). It can sometimes return the null time. 92b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TrackedTime now = ThreadData::Now(); 93b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 94b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Then get a bracketing time. 95b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TimeTicks ticks_after = base::TimeTicks::Now(); 96b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(ticks_after.is_null()); 97b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 98b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Now make sure that we bracketed our tracked time nicely. 99b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Duration before = now - TrackedTime(ticks_before); 100b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_LE(0, before.InMilliseconds()); 101b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Duration after = now - TrackedTime(ticks_after); 102b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_GE(0, after.InMilliseconds()); 103b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 104b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 105b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace tracked_objects 106