cpu_wrapper_unittest.cc revision a6451827d543eb00824bc95097e47d0aac51ae93
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Use of this source code is governed by a BSD-style license 5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * that can be found in the LICENSE file in the root of the source 6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * tree. An additional intellectual property rights grant can be found 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * in the file PATENTS. All contributing project authors may 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * be found in the AUTHORS file in the root of the source tree. 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "system_wrappers/interface/cpu_wrapper.h" 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "gtest/gtest.h" 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "system_wrappers/interface/cpu_info.h" 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "system_wrappers/interface/event_wrapper.h" 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "system_wrappers/interface/scoped_ptr.h" 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "system_wrappers/interface/trace.h" 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "testsupport/fileutils.h" 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtusing webrtc::CpuInfo; 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtusing webrtc::CpuWrapper; 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtusing webrtc::EventWrapper; 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtusing webrtc::scoped_ptr; 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtusing webrtc::Trace; 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// This test is flaky on Windows/Release. 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// http://code.google.com/p/webrtc/issues/detail?id=290 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef _WIN32 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define MAYBE_Usage DISABLED_Usage 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define MAYBE_Usage Usage 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTEST(CpuWrapperTest, MAYBE_Usage) { 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Trace::CreateTrace(); 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt std::string trace_file = webrtc::test::OutputPath() + 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "cpu_wrapper_unittest.txt"; 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Trace::SetTraceFile(trace_file.c_str()); 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Trace::SetLevelFilter(webrtc::kTraceAll); 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Number of cores detected:%u\n", CpuInfo::DetectNumberOfCores()); 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt scoped_ptr<CpuWrapper> cpu(CpuWrapper::CreateCpu()); 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_TRUE(cpu.get() != NULL); 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt scoped_ptr<EventWrapper> sleep_event(EventWrapper::Create()); 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_TRUE(sleep_event.get() != NULL); 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int num_iterations = 0; 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WebRtc_UWord32 num_cores = 0; 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WebRtc_UWord32* cores = NULL; 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool cpu_usage_available = cpu->CpuUsageMultiCore(num_cores, cores) != -1; 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Initializing the CPU measurements may take a couple of seconds on Windows. 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Since the initialization is lazy we need to wait until it is completed. 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Should not take more than 10000 ms. 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (!cpu_usage_available && (++num_iterations < 10000)) { 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (cores != NULL) { 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_GT(num_cores, 0u); 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sleep_event->Wait(1); 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cpu_usage_available = cpu->CpuUsageMultiCore(num_cores, cores) != -1; 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_TRUE(cpu_usage_available); 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const WebRtc_Word32 average = cpu->CpuUsageMultiCore(num_cores, cores); 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_TRUE(cores != NULL); 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt EXPECT_GT(num_cores, 0u); 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt EXPECT_GE(average, 0); 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt EXPECT_LE(average, 100); 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("\nNumber of cores:%d\n", num_cores); 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Average cpu:%d\n", average); 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (WebRtc_UWord32 i = 0; i < num_cores; i++) { 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Core:%u CPU:%u \n", i, cores[i]); 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt EXPECT_GE(cores[i], 0u); 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt EXPECT_LE(cores[i], 100u); 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Trace::ReturnTrace(); 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt