1*333d2b36SAndroid Build Coastguard Worker// Copyright 2024 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Workerpackage metrics 15*333d2b36SAndroid Build Coastguard Worker 16*333d2b36SAndroid Build Coastguard Worker// This file contain code to extract host information on linux from 17*333d2b36SAndroid Build Coastguard Worker// /proc/cpuinfo and /proc/meminfo relevant to machine performance 18*333d2b36SAndroid Build Coastguard Worker 19*333d2b36SAndroid Build Coastguard Workerimport ( 20*333d2b36SAndroid Build Coastguard Worker "reflect" 21*333d2b36SAndroid Build Coastguard Worker "testing" 22*333d2b36SAndroid Build Coastguard Worker 23*333d2b36SAndroid Build Coastguard Worker "android/soong/finder/fs" 24*333d2b36SAndroid Build Coastguard Worker) 25*333d2b36SAndroid Build Coastguard Worker 26*333d2b36SAndroid Build Coastguard Workerfunc TestNewCpuInfo(t *testing.T) { 27*333d2b36SAndroid Build Coastguard Worker fs := fs.NewMockFs(nil) 28*333d2b36SAndroid Build Coastguard Worker 29*333d2b36SAndroid Build Coastguard Worker if err := fs.MkDirs("/proc"); err != nil { 30*333d2b36SAndroid Build Coastguard Worker t.Fatalf("failed to create /proc dir: %v", err) 31*333d2b36SAndroid Build Coastguard Worker } 32*333d2b36SAndroid Build Coastguard Worker cpuFileName := "/proc/cpuinfo" 33*333d2b36SAndroid Build Coastguard Worker 34*333d2b36SAndroid Build Coastguard Worker if err := fs.WriteFile(cpuFileName, cpuData, 0644); err != nil { 35*333d2b36SAndroid Build Coastguard Worker t.Fatalf("failed to write file %s: %v", cpuFileName, err) 36*333d2b36SAndroid Build Coastguard Worker } 37*333d2b36SAndroid Build Coastguard Worker 38*333d2b36SAndroid Build Coastguard Worker cpuInfo, err := NewCpuInfo(fs) 39*333d2b36SAndroid Build Coastguard Worker if err != nil { 40*333d2b36SAndroid Build Coastguard Worker t.Fatalf("got %v, want nil for error", err) 41*333d2b36SAndroid Build Coastguard Worker } 42*333d2b36SAndroid Build Coastguard Worker 43*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(cpuInfo, expectedCpuInfo) { 44*333d2b36SAndroid Build Coastguard Worker t.Errorf("got %v, expecting %v for CpuInfo", cpuInfo, expectedCpuInfo) 45*333d2b36SAndroid Build Coastguard Worker } 46*333d2b36SAndroid Build Coastguard Worker 47*333d2b36SAndroid Build Coastguard Worker} 48*333d2b36SAndroid Build Coastguard Worker 49*333d2b36SAndroid Build Coastguard Workerfunc TestNewMemInfo(t *testing.T) { 50*333d2b36SAndroid Build Coastguard Worker fs := fs.NewMockFs(nil) 51*333d2b36SAndroid Build Coastguard Worker 52*333d2b36SAndroid Build Coastguard Worker if err := fs.MkDirs("/proc"); err != nil { 53*333d2b36SAndroid Build Coastguard Worker t.Fatalf("failed to create /proc dir: %v", err) 54*333d2b36SAndroid Build Coastguard Worker } 55*333d2b36SAndroid Build Coastguard Worker memFileName := "/proc/meminfo" 56*333d2b36SAndroid Build Coastguard Worker 57*333d2b36SAndroid Build Coastguard Worker if err := fs.WriteFile(memFileName, memData, 0644); err != nil { 58*333d2b36SAndroid Build Coastguard Worker t.Fatalf("failed to write file %s: %v", memFileName, err) 59*333d2b36SAndroid Build Coastguard Worker } 60*333d2b36SAndroid Build Coastguard Worker 61*333d2b36SAndroid Build Coastguard Worker memInfo, err := NewMemInfo(fs) 62*333d2b36SAndroid Build Coastguard Worker if err != nil { 63*333d2b36SAndroid Build Coastguard Worker t.Fatalf("got %v, want nil for error", err) 64*333d2b36SAndroid Build Coastguard Worker } 65*333d2b36SAndroid Build Coastguard Worker 66*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(memInfo, expectedMemInfo) { 67*333d2b36SAndroid Build Coastguard Worker t.Errorf("got %v, expecting %v for MemInfo", memInfo, expectedMemInfo) 68*333d2b36SAndroid Build Coastguard Worker } 69*333d2b36SAndroid Build Coastguard Worker 70*333d2b36SAndroid Build Coastguard Worker} 71*333d2b36SAndroid Build Coastguard Worker 72*333d2b36SAndroid Build Coastguard Workervar cpuData = []byte(`processor : 0 73*333d2b36SAndroid Build Coastguard Workervendor_id : %%VENDOR%% 74*333d2b36SAndroid Build Coastguard Workercpu family : 123 75*333d2b36SAndroid Build Coastguard Workermodel : 456 76*333d2b36SAndroid Build Coastguard Workermodel name : %%CPU MODEL NAME%% 77*333d2b36SAndroid Build Coastguard Workerstepping : 0 78*333d2b36SAndroid Build Coastguard Workercpu MHz : 5555.555 79*333d2b36SAndroid Build Coastguard Workercache size : 512 KB 80*333d2b36SAndroid Build Coastguard Workerphysical id : 0 81*333d2b36SAndroid Build Coastguard Workersiblings : 128 82*333d2b36SAndroid Build Coastguard Workercore id : 0 83*333d2b36SAndroid Build Coastguard Workercpu cores : 64 84*333d2b36SAndroid Build Coastguard Workerapicid : 0 85*333d2b36SAndroid Build Coastguard Workerinitial apicid : 0 86*333d2b36SAndroid Build Coastguard Workerfpu : yes 87*333d2b36SAndroid Build Coastguard Workerfpu_exception : yes 88*333d2b36SAndroid Build Coastguard Workercpuid level : 789 89*333d2b36SAndroid Build Coastguard Workerwp : yes 90*333d2b36SAndroid Build Coastguard Workerflags : %%cpu flags go here%% 91*333d2b36SAndroid Build Coastguard Workerbugs : %%bugs go here%% 92*333d2b36SAndroid Build Coastguard Worker 93*333d2b36SAndroid Build Coastguard Workerprocessor : 1 94*333d2b36SAndroid Build Coastguard Workervendor_id : %%BADVENDOR%% 95*333d2b36SAndroid Build Coastguard Workercpu family : 234 96*333d2b36SAndroid Build Coastguard Workermodel : 567 97*333d2b36SAndroid Build Coastguard Workermodel name : %%BAD MODEL NAME%% 98*333d2b36SAndroid Build Coastguard Workerflags : %%BAD cpu flags go here%% 99*333d2b36SAndroid Build Coastguard Worker`) 100*333d2b36SAndroid Build Coastguard Worker 101*333d2b36SAndroid Build Coastguard Workervar expectedCpuInfo = &CpuInfo{ 102*333d2b36SAndroid Build Coastguard Worker VendorId: "%%VENDOR%%", 103*333d2b36SAndroid Build Coastguard Worker ModelName: "%%CPU MODEL NAME%%", 104*333d2b36SAndroid Build Coastguard Worker CpuCores: 64, 105*333d2b36SAndroid Build Coastguard Worker Flags: "%%cpu flags go here%%", 106*333d2b36SAndroid Build Coastguard Worker} 107*333d2b36SAndroid Build Coastguard Worker 108*333d2b36SAndroid Build Coastguard Workervar memData = []byte(`MemTotal: 1000 mB 109*333d2b36SAndroid Build Coastguard WorkerMemFree: 10240000 110*333d2b36SAndroid Build Coastguard WorkerMemAvailable: 3000 kB 111*333d2b36SAndroid Build Coastguard WorkerBuffers: 7177844 kB 112*333d2b36SAndroid Build Coastguard Worker`) 113*333d2b36SAndroid Build Coastguard Worker 114*333d2b36SAndroid Build Coastguard Workervar expectedMemInfo = &MemInfo{ 115*333d2b36SAndroid Build Coastguard Worker MemTotal: 1048576000, 116*333d2b36SAndroid Build Coastguard Worker MemFree: 10240000, 117*333d2b36SAndroid Build Coastguard Worker MemAvailable: 3072000, 118*333d2b36SAndroid Build Coastguard Worker} 119