// Copyright 2015 The Bazel Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.google.devtools.build.lib.actions; import static org.junit.Assert.assertEquals; import com.google.devtools.build.lib.util.StringUtilities; import com.google.devtools.build.lib.vfs.util.FsApparatus; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; /** * Test for LocalHostResourceManagerLinux. */ @RunWith(JUnit4.class) public class LocalHostResourceManagerLinuxTest { private final FsApparatus scratch = FsApparatus.newNative(); @Test public void testNonHyperthreadedMachine() throws Exception { String cpuinfoContent = StringUtilities.joinLines( "processor\t: 0", "vendor_id\t: GenuineIntel", "cpu family\t: 15", "model\t\t: 4", "model name\t: Intel(R) Pentium(R) 4 CPU 3.40GHz", "stepping\t: 10", "cpu MHz\t\t: 3400.000", "cache size\t: 2048 KB", "fpu\t\t: yes", "fpu_exception\t: yes", "cpuid level\t: 5", "wp\t\t: yes", "flags\t\t: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca " + "cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm " + "syscall nx lm constant_tsc up pni monitor ds_cpl est cid cx16 " + "xtpr lahf_lm", "bogomips\t: 6803.83", "clflush size\t: 64", "cache_alignment\t: 128", "address sizes\t: 36 bits physical, 48 bits virtual", "power management:"); String meminfoContent = StringUtilities.joinLines( "MemTotal: 3091732 kB", "MemFree: 2167344 kB", "Buffers: 60644 kB", "Cached: 509940 kB", "SwapCached: 0 kB", "Active: 636892 kB", "Inactive: 212760 kB", "HighTotal: 0 kB", "HighFree: 0 kB", "LowTotal: 3091732 kB", "LowFree: 2167344 kB", "SwapTotal: 9124880 kB", "SwapFree: 9124880 kB", "Dirty: 0 kB", "Writeback: 0 kB", "AnonPages: 279028 kB", "Mapped: 54404 kB", "Slab: 42820 kB", "PageTables: 5184 kB", "NFS_Unstable: 0 kB", "Bounce: 0 kB", "CommitLimit: 10670744 kB", "Committed_AS: 665840 kB", "VmallocTotal: 34359738367 kB", "VmallocUsed: 300484 kB", "VmallocChunk: 34359437307 kB", "HugePages_Total: 0", "HugePages_Free: 0", "HugePages_Rsvd: 0", "Hugepagesize: 2048 kB"); String meminfoFile = scratch.file("test_meminfo_nonht", meminfoContent).getPathString(); assertEquals(1, LocalHostResourceManagerLinux.getLogicalCpuCountHelper(cpuinfoContent)); assertEquals(1, LocalHostResourceManagerLinux.getPhysicalCpuCountHelper(1, cpuinfoContent)); // +/- 0.1MB assertEquals(3091.732, LocalHostResourceManagerLinux.getMemoryInMbHelper(meminfoFile), 0.1); } @Test public void testHyperthreadedMachine() throws Exception { String cpuinfoContent = StringUtilities.joinLines( "processor\t: 0", "vendor_id\t: GenuineIntel", "cpu family\t: 15", "model\t\t: 4", "model name\t: Intel(R) Pentium(R) 4 CPU 3.40GHz", "stepping\t: 1", "cpu MHz\t\t: 3400.245", "cache size\t: 1024 KB", "physical id\t: 0", "siblings\t: 2", "core id\t\t: 0", "cpu cores\t: 1", "fpu\t\t: yes", "fpu_exception\t: yes", "cpuid level\t: 5", "wp\t\t: yes", "flags\t\t: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge " + "mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm " + "syscall lm constant_tsc pni monitor ds_cpl cid cx16 xtpr", "bogomips\t: 6806.31", "clflush size\t: 64", "cache_alignment\t: 128", "address sizes\t: 36 bits physical, 48 bits virtual", "power management:", "", "processor\t: 1", "vendor_id\t: GenuineIntel", "cpu family\t: 15", "model\t\t: 4", "model name\t: Intel(R) Pentium(R) 4 CPU 3.40GHz", "stepping\t: 1", "cpu MHz\t\t: 3400.245", "cache size\t: 1024 KB", "physical id\t: 0", "siblings\t: 2", "core id\t\t: 0", "cpu cores\t: 1", "fpu\t\t: yes", "fpu_exception\t: yes", "cpuid level\t: 5", "wp\t\t: yes", "flags\t\t: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge " + "mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm " + "syscall lm constant_tsc pni monitor ds_cpl cid cx16 xtpr", "bogomips\t: 6800.76", "clflush size\t: 64", "cache_alignment\t: 128", "address sizes\t: 36 bits physical, 48 bits virtual", "power management:", ""); String meminfoContent = StringUtilities.joinLines( "MemTotal: 3092004 kB", "MemFree: 26124 kB", "Buffers: 3836 kB", "Cached: 52400 kB", "SwapCached: 68204 kB", "Active: 2281464 kB", "Inactive: 260908 kB", "HighTotal: 0 kB", "HighFree: 0 kB", "LowTotal: 3092004 kB", "LowFree: 26124 kB", "SwapTotal: 9124880 kB", "SwapFree: 8264920 kB", "Dirty: 616 kB", "Writeback: 0 kB", "AnonPages: 2466336 kB", "Mapped: 37576 kB", "Slab: 483004 kB", "PageTables: 11912 kB", "NFS_Unstable: 0 kB", "Bounce: 0 kB", "CommitLimit: 10670880 kB", "Committed_AS: 3627984 kB", "VmallocTotal: 34359738367 kB", "VmallocUsed: 300460 kB", "VmallocChunk: 34359437307 kB", "HugePages_Total: 0", "HugePages_Free: 0", "HugePages_Rsvd: 0", "Hugepagesize: 2048 kB"); String meminfoFile = scratch.file("test_meminfo_ht", meminfoContent).getPathString(); assertEquals(2, LocalHostResourceManagerLinux.getLogicalCpuCountHelper(cpuinfoContent)); assertEquals(1, LocalHostResourceManagerLinux.getPhysicalCpuCountHelper(2, cpuinfoContent)); // +/- 0.1MB assertEquals(3092.004, LocalHostResourceManagerLinux.getMemoryInMbHelper(meminfoFile), 0.1); } @Test public void testAMDMachine() throws Exception { String cpuinfoContent = StringUtilities.joinLines( "processor\t: 0", "vendor_id\t: AuthenticAMD", "cpu family\t: 15", "model\t\t: 65", "model name\t: Dual-Core AMD Opteron(tm) Processor 8214 HE", "stepping\t: 2", "cpu MHz\t\t: 2200.000", "cache size\t: 1024 KB", "physical id\t: 0", "siblings\t: 2", "core id\t\t: 0", "cpu cores\t: 2", "fpu\t\t: yes", "fpu_exception\t: yes", "cpuid level\t: 1", "wp\t\t: yes", "flags\t\t: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr " + "pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall " + "nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow pni cx16 lahf_lm " + "cmp_legacy svm cr8_legacy", "bogomips\t: 4425.84", "TLB size\t: 1024 4K pages", "clflush size\t: 64", "cache_alignment\t: 64", "address sizes\t: 40 bits physical, 48 bits virtual", "power management: ts fid vid ttp tm stc", "", "processor\t: 1", "vendor_id\t: AuthenticAMD", "cpu family\t: 15", "model\t\t: 65", "model name\t: Dual-Core AMD Opteron(tm) Processor 8214 HE", "stepping\t: 2", "cpu MHz\t\t: 2200.000", "cache size\t: 1024 KB", "physical id\t: 0", "siblings\t: 2", "core id\t\t: 1", "cpu cores\t: 2", "fpu\t\t: yes", "fpu_exception\t: yes", "cpuid level\t: 1", "wp\t\t: yes", "flags\t\t: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr " + "pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall " + "nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow pni cx16 lahf_lm " + "cmp_legacy svm cr8_legacy", "bogomips\t: 4460.61", "TLB size\t: 1024 4K pages", "clflush size\t: 64", "cache_alignment\t: 64", "address sizes\t: 40 bits physical, 48 bits virtual", "power management: ts fid vid ttp tm stc", "", "processor\t: 2", "vendor_id\t: AuthenticAMD", "cpu family\t: 15", "model\t\t: 65", "model name\t: Dual-Core AMD Opteron(tm) Processor 8214 HE", "stepping\t: 2", "cpu MHz\t\t: 2200.000", "cache size\t: 1024 KB", "physical id\t: 1", "siblings\t: 2", "core id\t\t: 0", "cpu cores\t: 2", "fpu\t\t: yes", "fpu_exception\t: yes", "cpuid level\t: 1", "wp\t\t: yes", "flags\t\t: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr " + "pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall " + "nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow pni cx16 lahf_lm " + "cmp_legacy svm cr8_legacy", "bogomips\t: 4420.45", "TLB size\t: 1024 4K pages", "clflush size\t: 64", "cache_alignment\t: 64", "address sizes\t: 40 bits physical, 48 bits virtual", "power management: ts fid vid ttp tm stc", "", "processor\t: 3", "vendor_id\t: AuthenticAMD", "cpu family\t: 15", "model\t\t: 65", "model name\t: Dual-Core AMD Opteron(tm) Processor 8214 HE", "stepping\t: 2", "cpu MHz\t\t: 2200.000", "cache size\t: 1024 KB", "physical id\t: 1", "siblings\t: 2", "core id\t\t: 1", "cpu cores\t: 2", "fpu\t\t: yes", "fpu_exception\t: yes", "cpuid level\t: 1", "wp\t\t: yes", "flags\t\t: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr " + "pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall " + "nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow pni cx16 lahf_lm " + "cmp_legacy svm cr8_legacy", "bogomips\t: 4460.39", "TLB size\t: 1024 4K pages", "clflush size\t: 64", "cache_alignment\t: 64", "address sizes\t: 40 bits physical, 48 bits virtual", "power management: ts fid vid ttp tm stc", ""); String meminfoContent = StringUtilities.joinLines( "MemTotal: 8223956 kB", "MemFree: 3670396 kB", "Buffers: 374068 kB", "Cached: 3366980 kB", "SwapCached: 0 kB", "Active: 3275860 kB", "Inactive: 737816 kB", "HighTotal: 0 kB", "HighFree: 0 kB", "LowTotal: 8223956 kB", "LowFree: 3670396 kB", "SwapTotal: 6024332 kB", "SwapFree: 6024332 kB", "Dirty: 84 kB", "Writeback: 0 kB", "AnonPages: 272308 kB", "Mapped: 62604 kB", "Slab: 506140 kB", "PageTables: 4608 kB", "NFS_Unstable: 0 kB", "Bounce: 0 kB", "CommitLimit: 10136308 kB", "Committed_AS: 600672 kB", "VmallocTotal: 34359738367 kB", "VmallocUsed: 299068 kB", "VmallocChunk: 34359438843 kB", "HugePages_Total: 0", "HugePages_Free: 0", "HugePages_Rsvd: 0", "Hugepagesize: 2048 kB"); String meminfoFile = scratch.file("test_meminfo_amd", meminfoContent).getPathString(); assertEquals(4, LocalHostResourceManagerLinux.getLogicalCpuCountHelper(cpuinfoContent)); assertEquals(4, LocalHostResourceManagerLinux.getPhysicalCpuCountHelper(4, cpuinfoContent)); // +/- 0.1MB assertEquals(8223.956, LocalHostResourceManagerLinux.getMemoryInMbHelper(meminfoFile), 0.1); } }