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