1c55a96383497a772a307b346368133960b02ad03Eric Laurent/* 2a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3c55a96383497a772a307b346368133960b02ad03Eric Laurent * 4c55a96383497a772a307b346368133960b02ad03Eric Laurent * Use of this source code is governed by a BSD-style license 5c55a96383497a772a307b346368133960b02ad03Eric Laurent * that can be found in the LICENSE file in the root of the source 6c55a96383497a772a307b346368133960b02ad03Eric Laurent * tree. An additional intellectual property rights grant can be found 7c55a96383497a772a307b346368133960b02ad03Eric Laurent * in the file PATENTS. All contributing project authors may 8c55a96383497a772a307b346368133960b02ad03Eric Laurent * be found in the AUTHORS file in the root of the source tree. 9c55a96383497a772a307b346368133960b02ad03Eric Laurent */ 10c55a96383497a772a307b346368133960b02ad03Eric Laurent 11c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "system_wrappers/interface/cpu_wrapper.h" 12c55a96383497a772a307b346368133960b02ad03Eric Laurent 13c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "gtest/gtest.h" 14c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "system_wrappers/interface/cpu_info.h" 15c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "system_wrappers/interface/event_wrapper.h" 16c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "system_wrappers/interface/scoped_ptr.h" 17c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "system_wrappers/interface/trace.h" 18c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "testsupport/fileutils.h" 19c55a96383497a772a307b346368133960b02ad03Eric Laurent 20c55a96383497a772a307b346368133960b02ad03Eric Laurentusing webrtc::CpuInfo; 21c55a96383497a772a307b346368133960b02ad03Eric Laurentusing webrtc::CpuWrapper; 22c55a96383497a772a307b346368133960b02ad03Eric Laurentusing webrtc::EventWrapper; 23c55a96383497a772a307b346368133960b02ad03Eric Laurentusing webrtc::scoped_ptr; 24c55a96383497a772a307b346368133960b02ad03Eric Laurentusing webrtc::Trace; 25c55a96383497a772a307b346368133960b02ad03Eric Laurent 26a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin// This test is flaky on Windows/Release. 27a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin// http://code.google.com/p/webrtc/issues/detail?id=290 28a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#ifdef _WIN32 29a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#define MAYBE_Usage DISABLED_Usage 30a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#else 31a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#define MAYBE_Usage Usage 32a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#endif 33a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinTEST(CpuWrapperTest, MAYBE_Usage) { 34c55a96383497a772a307b346368133960b02ad03Eric Laurent Trace::CreateTrace(); 35c55a96383497a772a307b346368133960b02ad03Eric Laurent std::string trace_file = webrtc::test::OutputPath() + 36c55a96383497a772a307b346368133960b02ad03Eric Laurent "cpu_wrapper_unittest.txt"; 37c55a96383497a772a307b346368133960b02ad03Eric Laurent Trace::SetTraceFile(trace_file.c_str()); 38c55a96383497a772a307b346368133960b02ad03Eric Laurent Trace::SetLevelFilter(webrtc::kTraceAll); 39c55a96383497a772a307b346368133960b02ad03Eric Laurent printf("Number of cores detected:%u\n", CpuInfo::DetectNumberOfCores()); 40c55a96383497a772a307b346368133960b02ad03Eric Laurent scoped_ptr<CpuWrapper> cpu(CpuWrapper::CreateCpu()); 41c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_TRUE(cpu.get() != NULL); 42c55a96383497a772a307b346368133960b02ad03Eric Laurent scoped_ptr<EventWrapper> sleep_event(EventWrapper::Create()); 43c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_TRUE(sleep_event.get() != NULL); 44c55a96383497a772a307b346368133960b02ad03Eric Laurent 45c55a96383497a772a307b346368133960b02ad03Eric Laurent int num_iterations = 0; 46c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_UWord32 num_cores = 0; 47c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_UWord32* cores = NULL; 48c55a96383497a772a307b346368133960b02ad03Eric Laurent bool cpu_usage_available = cpu->CpuUsageMultiCore(num_cores, cores) != -1; 49c55a96383497a772a307b346368133960b02ad03Eric Laurent // Initializing the CPU measurements may take a couple of seconds on Windows. 50c55a96383497a772a307b346368133960b02ad03Eric Laurent // Since the initialization is lazy we need to wait until it is completed. 51c55a96383497a772a307b346368133960b02ad03Eric Laurent // Should not take more than 10000 ms. 52a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin while (!cpu_usage_available && (++num_iterations < 10000)) { 53c55a96383497a772a307b346368133960b02ad03Eric Laurent if (cores != NULL) { 54c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_GT(num_cores, 0u); 55c55a96383497a772a307b346368133960b02ad03Eric Laurent break; 56c55a96383497a772a307b346368133960b02ad03Eric Laurent } 57c55a96383497a772a307b346368133960b02ad03Eric Laurent sleep_event->Wait(1); 58c55a96383497a772a307b346368133960b02ad03Eric Laurent cpu_usage_available = cpu->CpuUsageMultiCore(num_cores, cores) != -1; 59c55a96383497a772a307b346368133960b02ad03Eric Laurent } 60c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_TRUE(cpu_usage_available); 61c55a96383497a772a307b346368133960b02ad03Eric Laurent 62c55a96383497a772a307b346368133960b02ad03Eric Laurent const WebRtc_Word32 average = cpu->CpuUsageMultiCore(num_cores, cores); 63c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_TRUE(cores != NULL); 64c55a96383497a772a307b346368133960b02ad03Eric Laurent EXPECT_GT(num_cores, 0u); 65c55a96383497a772a307b346368133960b02ad03Eric Laurent EXPECT_GE(average, 0); 66c55a96383497a772a307b346368133960b02ad03Eric Laurent EXPECT_LE(average, 100); 67c55a96383497a772a307b346368133960b02ad03Eric Laurent 68c55a96383497a772a307b346368133960b02ad03Eric Laurent printf("\nNumber of cores:%d\n", num_cores); 69c55a96383497a772a307b346368133960b02ad03Eric Laurent printf("Average cpu:%d\n", average); 70c55a96383497a772a307b346368133960b02ad03Eric Laurent for (WebRtc_UWord32 i = 0; i < num_cores; i++) { 71c55a96383497a772a307b346368133960b02ad03Eric Laurent printf("Core:%u CPU:%u \n", i, cores[i]); 72c55a96383497a772a307b346368133960b02ad03Eric Laurent EXPECT_GE(cores[i], 0u); 73c55a96383497a772a307b346368133960b02ad03Eric Laurent EXPECT_LE(cores[i], 100u); 74c55a96383497a772a307b346368133960b02ad03Eric Laurent } 75c55a96383497a772a307b346368133960b02ad03Eric Laurent 76c55a96383497a772a307b346368133960b02ad03Eric Laurent Trace::ReturnTrace(); 77c55a96383497a772a307b346368133960b02ad03Eric Laurent}; 78