10eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin/* 20eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin * Copyright (C) 2017 The Android Open Source Project 30eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin * 40eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin * Licensed under the Apache License, Version 2.0 (the "License"); 50eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin * you may not use this file except in compliance with the License. 60eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin * You may obtain a copy of the License at 70eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin * 80eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin * http://www.apache.org/licenses/LICENSE-2.0 90eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin * 100eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin * Unless required by applicable law or agreed to in writing, software 110eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin * distributed under the License is distributed on an "AS IS" BASIS, 120eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin * See the License for the specific language governing permissions and 140eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin * limitations under the License. 150eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin */ 160eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin 170eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin#include "CpuFreqParser.h" 180eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin 190eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin#include "frameworks/base/core/proto/android/os/cpufreq.pb.h" 200eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin 210eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin#include <android-base/file.h> 220eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin#include <android-base/test_utils.h> 230eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin#include <gmock/gmock.h> 2462c220b20b3fc431c27feac29a71d040fc8e2626Joe Onorato#include <google/protobuf/message_lite.h> 250eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin#include <gtest/gtest.h> 260eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin#include <string.h> 270eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin#include <fcntl.h> 280eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin 290eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jinusing namespace android::base; 300eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jinusing namespace android::os; 310eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jinusing namespace std; 320eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jinusing ::testing::StrEq; 330eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jinusing ::testing::Test; 340eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jinusing ::testing::internal::CaptureStderr; 350eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jinusing ::testing::internal::CaptureStdout; 360eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jinusing ::testing::internal::GetCapturedStderr; 370eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jinusing ::testing::internal::GetCapturedStdout; 380eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin 390eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jinclass CpuFreqParserTest : public Test { 400eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jinpublic: 410eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin virtual void SetUp() override { 420eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin ASSERT_TRUE(tf.fd != -1); 430eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin } 440eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin 450eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jinprotected: 460eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin TemporaryFile tf; 470eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin 480eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin const string kTestPath = GetExecutableDirectory(); 490eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin const string kTestDataPath = kTestPath + "/testdata/"; 500eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin}; 510eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin 520eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi JinTEST_F(CpuFreqParserTest, Success) { 530eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin const string testFile = kTestDataPath + "cpufreq.txt"; 540eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin CpuFreqParser parser; 5551d4c54eba8dd613dd0550c6633a747b53e0ce0aYi Jin CpuFreqProto expected; 560eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin 570eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin long jiffyHz = sysconf(_SC_CLK_TCK); 580eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin expected.set_jiffy_hz(jiffyHz); 590eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin 6051d4c54eba8dd613dd0550c6633a747b53e0ce0aYi Jin CpuFreqProto::Stats::TimeInState* state; 610eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin 6251d4c54eba8dd613dd0550c6633a747b53e0ce0aYi Jin CpuFreqProto::Stats* cpu0 = expected.add_cpu_freqs(); 630eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin cpu0->set_cpu_name("cpu0"); 640eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state = cpu0->add_times(); 650eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_state_khz(307200); 660eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_time_jiffy(23860761); 670eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state = cpu0->add_times(); 680eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_state_khz(384000); 690eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_time_jiffy(83124); 700eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state = cpu0->add_times(); 710eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_state_khz(768000); 720eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_time_jiffy(22652); 730eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin 7451d4c54eba8dd613dd0550c6633a747b53e0ce0aYi Jin CpuFreqProto::Stats* cpu1 = expected.add_cpu_freqs(); 750eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin cpu1->set_cpu_name("cpu1"); 760eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state = cpu1->add_times(); 770eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_state_khz(307200); 780eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_time_jiffy(23860761); 790eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state = cpu1->add_times(); 800eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_state_khz(384000); 810eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_time_jiffy(83124); 820eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state = cpu1->add_times(); 830eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_state_khz(768000); 840eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_time_jiffy(22652); 850eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin 8651d4c54eba8dd613dd0550c6633a747b53e0ce0aYi Jin CpuFreqProto::Stats* cpu2 = expected.add_cpu_freqs(); 870eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin cpu2->set_cpu_name("cpu2"); 880eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state = cpu2->add_times(); 890eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_state_khz(307200); 900eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_time_jiffy(23890935); 910eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state = cpu2->add_times(); 920eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_state_khz(384000); 930eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_time_jiffy(29383); 940eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state = cpu2->add_times(); 950eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_state_khz(748800); 960eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_time_jiffy(10547); 970eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state = cpu2->add_times(); 980eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_state_khz(825600); 990eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_time_jiffy(13173); 1000eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin 10151d4c54eba8dd613dd0550c6633a747b53e0ce0aYi Jin CpuFreqProto::Stats* cpu3 = expected.add_cpu_freqs(); 1020eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin cpu3->set_cpu_name("cpu3"); 1030eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state = cpu3->add_times(); 1040eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_state_khz(307200); 1050eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_time_jiffy(23890935); 1060eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state = cpu3->add_times(); 1070eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_state_khz(384000); 1080eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_time_jiffy(29383); 1090eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state = cpu3->add_times(); 1100eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_state_khz(748800); 1110eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_time_jiffy(10547); 1120eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state = cpu3->add_times(); 1130eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_state_khz(825600); 1140eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin state->set_time_jiffy(13173); 1150eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin 1160eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin int fd = open(testFile.c_str(), O_RDONLY); 1170eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin ASSERT_TRUE(fd != -1); 1180eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin 1190eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin CaptureStdout(); 1200eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin ASSERT_EQ(NO_ERROR, parser.Parse(fd, STDOUT_FILENO)); 12162c220b20b3fc431c27feac29a71d040fc8e2626Joe Onorato EXPECT_EQ(GetCapturedStdout(), expected.SerializeAsString()); 1220eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin close(fd); 1230eb223496c3dee6bd0a33ea4fa664fb92ef557ccYi Jin} 124