blob: c8496891666b635a5fbdc61ff885a40683cea556 [file] [log] [blame]
kjellander@webrtc.org177bb522011-10-31 17:10:01 +00001/*
henrike@webrtc.org26604602012-02-06 23:33:54 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
kjellander@webrtc.org177bb522011-10-31 17:10:01 +00003 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
kjellander@webrtc.org177bb522011-10-31 17:10:01 +000011#include "gtest/gtest.h"
henrikg@webrtc.orgc58ef082011-11-08 08:44:17 +000012#include "system_wrappers/interface/cpu_info.h"
phoglund@webrtc.orgb15d2852012-11-21 08:02:57 +000013#include "system_wrappers/interface/cpu_wrapper.h"
henrike@webrtc.orgad98a3e2011-11-18 23:55:12 +000014#include "system_wrappers/interface/event_wrapper.h"
henrike@webrtc.org0bf2ca22011-11-29 18:21:46 +000015#include "system_wrappers/interface/scoped_ptr.h"
kjellander@webrtc.org177bb522011-10-31 17:10:01 +000016#include "system_wrappers/interface/trace.h"
kjellander@webrtc.orgc625c102011-11-29 12:11:06 +000017#include "testsupport/fileutils.h"
kjellander@webrtc.org177bb522011-10-31 17:10:01 +000018
henrikg@webrtc.orgc58ef082011-11-08 08:44:17 +000019using webrtc::CpuInfo;
kjellander@webrtc.org177bb522011-10-31 17:10:01 +000020using webrtc::CpuWrapper;
henrike@webrtc.org0bf2ca22011-11-29 18:21:46 +000021using webrtc::EventWrapper;
22using webrtc::scoped_ptr;
kjellander@webrtc.org177bb522011-10-31 17:10:01 +000023using webrtc::Trace;
24
andrew@webrtc.org8bd6f192012-02-15 01:47:51 +000025// This test is flaky on Windows/Release.
26// http://code.google.com/p/webrtc/issues/detail?id=290
27#ifdef _WIN32
28#define MAYBE_Usage DISABLED_Usage
29#else
30#define MAYBE_Usage Usage
31#endif
32TEST(CpuWrapperTest, MAYBE_Usage) {
kjellander@webrtc.org177bb522011-10-31 17:10:01 +000033 Trace::CreateTrace();
kjellander@webrtc.orgc625c102011-11-29 12:11:06 +000034 std::string trace_file = webrtc::test::OutputPath() +
phoglund@webrtc.orgb15d2852012-11-21 08:02:57 +000035 "cpu_wrapper_unittest.txt";
kjellander@webrtc.orgc625c102011-11-29 12:11:06 +000036 Trace::SetTraceFile(trace_file.c_str());
kjellander@webrtc.org177bb522011-10-31 17:10:01 +000037 Trace::SetLevelFilter(webrtc::kTraceAll);
henrikg@webrtc.orgc58ef082011-11-08 08:44:17 +000038 printf("Number of cores detected:%u\n", CpuInfo::DetectNumberOfCores());
henrike@webrtc.org0bf2ca22011-11-29 18:21:46 +000039 scoped_ptr<CpuWrapper> cpu(CpuWrapper::CreateCpu());
40 ASSERT_TRUE(cpu.get() != NULL);
41 scoped_ptr<EventWrapper> sleep_event(EventWrapper::Create());
42 ASSERT_TRUE(sleep_event.get() != NULL);
kjellander@webrtc.org177bb522011-10-31 17:10:01 +000043
henrike@webrtc.orgad98a3e2011-11-18 23:55:12 +000044 int num_iterations = 0;
45 WebRtc_UWord32 num_cores = 0;
46 WebRtc_UWord32* cores = NULL;
47 bool cpu_usage_available = cpu->CpuUsageMultiCore(num_cores, cores) != -1;
48 // Initializing the CPU measurements may take a couple of seconds on Windows.
49 // Since the initialization is lazy we need to wait until it is completed.
50 // Should not take more than 10000 ms.
henrike@webrtc.org26604602012-02-06 23:33:54 +000051 while (!cpu_usage_available && (++num_iterations < 10000)) {
henrike@webrtc.orgad98a3e2011-11-18 23:55:12 +000052 if (cores != NULL) {
henrike@webrtc.orgce9d89d2011-11-19 00:14:37 +000053 ASSERT_GT(num_cores, 0u);
henrike@webrtc.orgad98a3e2011-11-18 23:55:12 +000054 break;
kjellander@webrtc.org177bb522011-10-31 17:10:01 +000055 }
henrike@webrtc.orgad98a3e2011-11-18 23:55:12 +000056 sleep_event->Wait(1);
57 cpu_usage_available = cpu->CpuUsageMultiCore(num_cores, cores) != -1;
kjellander@webrtc.org177bb522011-10-31 17:10:01 +000058 }
henrike@webrtc.orgad98a3e2011-11-18 23:55:12 +000059 ASSERT_TRUE(cpu_usage_available);
60
henrike@webrtc.org0bf2ca22011-11-29 18:21:46 +000061 const WebRtc_Word32 average = cpu->CpuUsageMultiCore(num_cores, cores);
henrike@webrtc.orgad98a3e2011-11-18 23:55:12 +000062 ASSERT_TRUE(cores != NULL);
henrike@webrtc.orgce9d89d2011-11-19 00:14:37 +000063 EXPECT_GT(num_cores, 0u);
henrike@webrtc.org0bf2ca22011-11-29 18:21:46 +000064 EXPECT_GE(average, 0);
65 EXPECT_LE(average, 100);
henrike@webrtc.orgad98a3e2011-11-18 23:55:12 +000066
henrike@webrtc.org0bf2ca22011-11-29 18:21:46 +000067 printf("\nNumber of cores:%d\n", num_cores);
68 printf("Average cpu:%d\n", average);
henrike@webrtc.orgad98a3e2011-11-18 23:55:12 +000069 for (WebRtc_UWord32 i = 0; i < num_cores; i++) {
70 printf("Core:%u CPU:%u \n", i, cores[i]);
henrike@webrtc.org0bf2ca22011-11-29 18:21:46 +000071 EXPECT_GE(cores[i], 0u);
72 EXPECT_LE(cores[i], 100u);
henrike@webrtc.orgad98a3e2011-11-18 23:55:12 +000073 }
74
kjellander@webrtc.org177bb522011-10-31 17:10:01 +000075 Trace::ReturnTrace();
76};