15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test of classes in tracked_time.cc
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/profiler/tracked_time.h"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/tracked_objects.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace tracked_objects {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TrackedTimeTest, TrackedTimerMilliseconds) {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First make sure we basicallly transfer simple milliseconds values as
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // expected.  Most critically, things should not become null.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 kSomeMilliseconds = 243;  // Some example times.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 kReallyBigMilliseconds = (1LL << 35) + kSomeMilliseconds;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrackedTime some = TrackedTime() +
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Duration::FromMilliseconds(kSomeMilliseconds);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSomeMilliseconds, (some - TrackedTime()).InMilliseconds());
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(some.is_null());
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now create a big time, to check that it is wrapped modulo 2^32.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeTicks big = base::TimeTicks() +
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(kReallyBigMilliseconds);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kReallyBigMilliseconds, (big - base::TimeTicks()).InMilliseconds());
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrackedTime wrapped_big(big);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect wrapping at 32 bits.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSomeMilliseconds, (wrapped_big - TrackedTime()).InMilliseconds());
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TrackedTimeTest, TrackedTimerDuration) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int kFirstMilliseconds = 793;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int kSecondMilliseconds = 14889;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Duration first = Duration::FromMilliseconds(kFirstMilliseconds);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Duration second = Duration::FromMilliseconds(kSecondMilliseconds);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kFirstMilliseconds, first.InMilliseconds());
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSecondMilliseconds, second.InMilliseconds());
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Duration sum = first + second;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kFirstMilliseconds + kSecondMilliseconds, sum.InMilliseconds());
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TrackedTimeTest, TrackedTimerVsTimeTicks) {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure that our 32 bit timer is aligned with the TimeTicks() timer.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First get a 64 bit timer (which should not be null).
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeTicks ticks_before = base::TimeTicks::Now();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ticks_before.is_null());
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Then get a 32 bit timer that can be be null when it wraps.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrackedTime now = TrackedTime::Now();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Then get a bracketing time.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeTicks ticks_after = base::TimeTicks::Now();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ticks_after.is_null());
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now make sure that we bracketed our tracked time nicely.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Duration before = now - TrackedTime(ticks_before);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LE(0, before.InMilliseconds());
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Duration after = now - TrackedTime(ticks_after);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GE(0, after.InMilliseconds());
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TrackedTimeTest, TrackedTimerDisabled) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check to be sure disabling the collection of data induces a null time
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (which we know will return much faster).
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED))
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Since we disabled tracking, we should get a null response.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrackedTime track_now = ThreadData::Now();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(track_now.is_null());
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TrackedTimeTest, TrackedTimerEnabled) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ThreadData::InitializeAndSetTrackingStatus(
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ThreadData::PROFILING_CHILDREN_ACTIVE))
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure that when we enable tracking, we get a real timer result.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First get a 64 bit timer (which should not be null).
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeTicks ticks_before = base::TimeTicks::Now();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ticks_before.is_null());
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Then get a 32 bit timer that can be null when it wraps.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Crtical difference from  the TrackedTimerVsTimeTicks test, is that we use
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ThreadData::Now().  It can sometimes return the null time.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrackedTime now = ThreadData::Now();
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Then get a bracketing time.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeTicks ticks_after = base::TimeTicks::Now();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ticks_after.is_null());
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now make sure that we bracketed our tracked time nicely.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Duration before = now - TrackedTime(ticks_before);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LE(0, before.InMilliseconds());
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Duration after = now - TrackedTime(ticks_after);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GE(0, after.InMilliseconds());
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace tracked_objects
107