147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/* 247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Copyright 2009 The WebRTC Project Authors. All rights reserved. 347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * 447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Use of this source code is governed by a BSD-style license 547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * in the file PATENTS. All contributing project authors may 847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */ 1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/gunit.h" 1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/stringutils.h" 1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/systeminfo.h" 1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(CPU_X86) || defined(CPU_ARM) 1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SystemInfoTest, CpuVendorNonEmpty) { 1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::SystemInfo info; 1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_INFO) << "CpuVendor: " << info.GetCpuVendor(); 1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_FALSE(info.GetCpuVendor().empty()); 2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Tests Vendor identification is Intel or AMD. 2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// See Also http://en.wikipedia.org/wiki/CPUID 2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SystemInfoTest, CpuVendorIntelAMDARM) { 2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::SystemInfo info; 2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(CPU_X86) 2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(rtc::string_match(info.GetCpuVendor().c_str(), 2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org "GenuineIntel") || 2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::string_match(info.GetCpuVendor().c_str(), 3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org "AuthenticAMD")); 3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#elif defined(CPU_ARM) 3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(rtc::string_match(info.GetCpuVendor().c_str(), "ARM")); 3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // defined(CPU_X86) || defined(CPU_ARM) 3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Tests CpuArchitecture matches expectations. 3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SystemInfoTest, GetCpuArchitecture) { 3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::SystemInfo info; 4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_INFO) << "CpuArchitecture: " << info.GetCpuArchitecture(); 4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::SystemInfo::Architecture architecture = info.GetCpuArchitecture(); 4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(CPU_X86) || defined(CPU_ARM) 4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (sizeof(intptr_t) == 8) { 4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_EQ(rtc::SystemInfo::SI_ARCH_X64, architecture); 4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } else if (sizeof(intptr_t) == 4) { 4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(CPU_ARM) 4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_EQ(rtc::SystemInfo::SI_ARCH_ARM, architecture); 4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#else 4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_EQ(rtc::SystemInfo::SI_ARCH_X86, architecture); 5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Tests Cpu Cache Size 5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SystemInfoTest, CpuCacheSize) { 5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::SystemInfo info; 5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_INFO) << "CpuCacheSize: " << info.GetCpuCacheSize(); 5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_GE(info.GetCpuCacheSize(), 8192); // 8 KB min cache 6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_LE(info.GetCpuCacheSize(), 1024 * 1024 * 1024); // 1 GB max cache 6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Tests MachineModel is set. On Mac test machine model is known. 6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SystemInfoTest, MachineModelKnown) { 6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::SystemInfo info; 6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_FALSE(info.GetMachineModel().empty()); 6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const char *machine_model = info.GetMachineModel().c_str(); 6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_INFO) << "MachineModel: " << machine_model; 6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool known = true; 7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS) 7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Full list as of May 2012. Update when new OSX based models are added. 7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org known = rtc::string_match(machine_model, "MacBookPro*") || 7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::string_match(machine_model, "MacBookAir*") || 7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::string_match(machine_model, "MacBook*") || 7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::string_match(machine_model, "MacPro*") || 7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::string_match(machine_model, "Macmini*") || 7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::string_match(machine_model, "iMac*") || 7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::string_match(machine_model, "Xserve*"); 7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#elif !defined(WEBRTC_IOS) 8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // All other machines return Not available. 8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org known = rtc::string_match(info.GetMachineModel().c_str(), 8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org "Not available"); 8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (!known) { 8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_WARNING) << "Machine Model Unknown: " << machine_model; 8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Tests maximum cpu clockrate. 9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SystemInfoTest, CpuMaxCpuSpeed) { 9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::SystemInfo info; 9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_INFO) << "MaxCpuSpeed: " << info.GetMaxCpuSpeed(); 9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_GT(info.GetMaxCpuSpeed(), 0); 9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_LT(info.GetMaxCpuSpeed(), 100000); // 100 Ghz 9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Tests current cpu clockrate. 9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SystemInfoTest, CpuCurCpuSpeed) { 9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::SystemInfo info; 10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_INFO) << "MaxCurSpeed: " << info.GetCurCpuSpeed(); 10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_GT(info.GetCurCpuSpeed(), 0); 10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_LT(info.GetMaxCpuSpeed(), 100000); 10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Tests physical memory size. 10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SystemInfoTest, MemorySize) { 10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::SystemInfo info; 10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_INFO) << "MemorySize: " << info.GetMemorySize(); 10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_GT(info.GetMemorySize(), -1); 11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Tests number of logical cpus available to the system. 11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SystemInfoTest, MaxCpus) { 11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::SystemInfo info; 11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_INFO) << "MaxCpus: " << info.GetMaxCpus(); 11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_GT(info.GetMaxCpus(), 0); 11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Tests number of physical cpus available to the system. 12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SystemInfoTest, MaxPhysicalCpus) { 12147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::SystemInfo info; 12247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_INFO) << "MaxPhysicalCpus: " << info.GetMaxPhysicalCpus(); 12347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_GT(info.GetMaxPhysicalCpus(), 0); 12447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_LE(info.GetMaxPhysicalCpus(), info.GetMaxCpus()); 12547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 12647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Tests number of logical cpus available to the process. 12847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SystemInfoTest, CurCpus) { 12947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::SystemInfo info; 13047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_INFO) << "CurCpus: " << info.GetCurCpus(); 13147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_GT(info.GetCurCpus(), 0); 13247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_LE(info.GetCurCpus(), info.GetMaxCpus()); 13347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 13447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 13547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifdef CPU_X86 13647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// CPU family/model/stepping is only available on X86. The following tests 13747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// that they are set when running on x86 CPUs. Valid Family/Model/Stepping 13847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// values are non-zero on known CPUs. 13947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 14047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Tests Intel CPU Family identification. 14147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SystemInfoTest, CpuFamily) { 14247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::SystemInfo info; 14347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_INFO) << "CpuFamily: " << info.GetCpuFamily(); 14447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_GT(info.GetCpuFamily(), 0); 14547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 14647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 14747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Tests Intel CPU Model identification. 14847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SystemInfoTest, CpuModel) { 14947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::SystemInfo info; 15047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_INFO) << "CpuModel: " << info.GetCpuModel(); 15147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_GT(info.GetCpuModel(), 0); 15247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 15347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 15447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Tests Intel CPU Stepping identification. 15547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SystemInfoTest, CpuStepping) { 15647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::SystemInfo info; 15747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_INFO) << "CpuStepping: " << info.GetCpuStepping(); 15847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_GT(info.GetCpuStepping(), 0); 15947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 16047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#else // CPU_X86 16147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// If not running on x86 CPU the following tests expect the functions to 16247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// return 0. 16347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SystemInfoTest, CpuFamily) { 16447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::SystemInfo info; 16547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_INFO) << "CpuFamily: " << info.GetCpuFamily(); 16647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_EQ(0, info.GetCpuFamily()); 16747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 16847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 16947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Tests Intel CPU Model identification. 17047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SystemInfoTest, CpuModel) { 17147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::SystemInfo info; 17247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_INFO) << "CpuModel: " << info.GetCpuModel(); 17347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_EQ(0, info.GetCpuModel()); 17447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 17547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 17647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Tests Intel CPU Stepping identification. 17747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SystemInfoTest, CpuStepping) { 17847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::SystemInfo info; 17947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_INFO) << "CpuStepping: " << info.GetCpuStepping(); 18047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_EQ(0, info.GetCpuStepping()); 18147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 18247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // CPU_X86 18347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 18447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if WEBRTC_WIN && !defined(EXCLUDE_D3D9) 18547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SystemInfoTest, GpuInfo) { 18647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::SystemInfo info; 18747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::SystemInfo::GpuInfo gi; 18847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(info.GetGpuInfo(&gi)); 18947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_INFO) << "GpuDriver: " << gi.driver; 19047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_FALSE(gi.driver.empty()); 19147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_INFO) << "GpuDriverVersion: " << gi.driver_version; 19247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_FALSE(gi.driver_version.empty()); 19347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 19447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 195