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