Switched flaky ProfilerTest to use fake clock
The test was heavily dependent on wall clock timing, so it ended up being disabled in some build configurations. This CL switches it to use a fake clock instead. BUG=webrtc:5947 Review-Url: https://codereview.webrtc.org/2392613003 Cr-Commit-Position: refs/heads/master@{#14507}
This commit is contained in:
parent
5adaf735dc
commit
cd97b2b943
@ -8,19 +8,20 @@
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#include "webrtc/base/fakeclock.h"
|
||||
#include "webrtc/base/gunit.h"
|
||||
#include "webrtc/base/profiler.h"
|
||||
#include "webrtc/base/timedelta.h"
|
||||
#include "webrtc/base/thread.h"
|
||||
|
||||
namespace {
|
||||
|
||||
const int kWaitMs = 250;
|
||||
const double kWaitSec = 0.250;
|
||||
const double kTolerance = 0.1;
|
||||
|
||||
const char* TestFunc() {
|
||||
const char* TestFunc(rtc::FakeClock* clock) {
|
||||
PROFILE_F();
|
||||
rtc::Thread::SleepMs(kWaitMs);
|
||||
clock->AdvanceTime(rtc::TimeDelta::FromMilliseconds(kWaitMs));
|
||||
return __FUNCTION__;
|
||||
}
|
||||
|
||||
@ -28,33 +29,29 @@ const char* TestFunc() {
|
||||
|
||||
namespace rtc {
|
||||
|
||||
// Disable this test due to flakiness; see bug 5947.
|
||||
#if defined(WEBRTC_LINUX)
|
||||
#define MAYBE_TestFunction DISABLED_TestFunction
|
||||
#else
|
||||
#define MAYBE_TestFunction TestFunction
|
||||
#endif
|
||||
TEST(ProfilerTest, MAYBE_TestFunction) {
|
||||
TEST(ProfilerTest, TestFunction) {
|
||||
rtc::ScopedFakeClock fake_clock;
|
||||
ASSERT_TRUE(Profiler::Instance()->Clear());
|
||||
|
||||
// Profile a long-running function.
|
||||
const char* function_name = TestFunc();
|
||||
const char* function_name = TestFunc(&fake_clock);
|
||||
const ProfilerEvent* event = Profiler::Instance()->GetEvent(function_name);
|
||||
ASSERT_TRUE(event != NULL);
|
||||
EXPECT_FALSE(event->is_started());
|
||||
EXPECT_EQ(1, event->event_count());
|
||||
EXPECT_NEAR(kWaitSec, event->mean(), kTolerance * 3);
|
||||
EXPECT_EQ(kWaitSec, event->mean());
|
||||
|
||||
// Run it a second time.
|
||||
TestFunc();
|
||||
TestFunc(&fake_clock);
|
||||
EXPECT_FALSE(event->is_started());
|
||||
EXPECT_EQ(2, event->event_count());
|
||||
EXPECT_NEAR(kWaitSec, event->mean(), kTolerance);
|
||||
EXPECT_NEAR(kWaitSec * 2, event->total_time(), kTolerance * 2);
|
||||
EXPECT_EQ(kWaitSec, event->mean());
|
||||
EXPECT_EQ(kWaitSec * 2, event->total_time());
|
||||
EXPECT_DOUBLE_EQ(event->mean(), event->total_time() / event->event_count());
|
||||
}
|
||||
|
||||
TEST(ProfilerTest, TestScopedEvents) {
|
||||
rtc::ScopedFakeClock fake_clock;
|
||||
const std::string kEvent1Name = "Event 1";
|
||||
const std::string kEvent2Name = "Event 2";
|
||||
const int kEvent2WaitMs = 150;
|
||||
@ -68,40 +65,39 @@ TEST(ProfilerTest, TestScopedEvents) {
|
||||
ASSERT_TRUE(event1 != NULL);
|
||||
EXPECT_TRUE(event1->is_started());
|
||||
EXPECT_EQ(0, event1->event_count());
|
||||
rtc::Thread::SleepMs(kWaitMs);
|
||||
fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kWaitMs));
|
||||
EXPECT_TRUE(event1->is_started());
|
||||
}
|
||||
// Check the result.
|
||||
EXPECT_FALSE(event1->is_started());
|
||||
EXPECT_EQ(1, event1->event_count());
|
||||
EXPECT_NEAR(kWaitSec, event1->mean(), kTolerance);
|
||||
EXPECT_EQ(kWaitSec, event1->mean());
|
||||
{ // Profile a second event.
|
||||
PROFILE(kEvent2Name);
|
||||
event2 = Profiler::Instance()->GetEvent(kEvent2Name);
|
||||
ASSERT_TRUE(event2 != NULL);
|
||||
EXPECT_FALSE(event1->is_started());
|
||||
EXPECT_TRUE(event2->is_started());
|
||||
rtc::Thread::SleepMs(kEvent2WaitMs);
|
||||
fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kEvent2WaitMs));
|
||||
}
|
||||
// Check the result.
|
||||
EXPECT_FALSE(event2->is_started());
|
||||
EXPECT_EQ(1, event2->event_count());
|
||||
|
||||
// The difference here can be as much as 0.33, so we need high tolerance.
|
||||
EXPECT_NEAR(kEvent2WaitSec, event2->mean(), kTolerance * 4);
|
||||
EXPECT_EQ(kEvent2WaitSec, event2->mean());
|
||||
// Make sure event1 is unchanged.
|
||||
EXPECT_FALSE(event1->is_started());
|
||||
EXPECT_EQ(1, event1->event_count());
|
||||
{ // Run another event 1.
|
||||
PROFILE(kEvent1Name);
|
||||
EXPECT_TRUE(event1->is_started());
|
||||
rtc::Thread::SleepMs(kWaitMs);
|
||||
fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kWaitMs));
|
||||
}
|
||||
// Check the result.
|
||||
EXPECT_FALSE(event1->is_started());
|
||||
EXPECT_EQ(2, event1->event_count());
|
||||
EXPECT_NEAR(kWaitSec, event1->mean(), kTolerance);
|
||||
EXPECT_NEAR(kWaitSec * 2, event1->total_time(), kTolerance * 2);
|
||||
EXPECT_EQ(kWaitSec, event1->mean());
|
||||
EXPECT_EQ(kWaitSec * 2, event1->total_time());
|
||||
EXPECT_DOUBLE_EQ(event1->mean(),
|
||||
event1->total_time() / event1->event_count());
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user