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