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