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