1 /*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "CpuFreqParser.h"
18
19 #include "frameworks/base/core/proto/android/os/cpufreq.pb.h"
20
21 #include <android-base/file.h>
22 #include <android-base/test_utils.h>
23 #include <gmock/gmock.h>
24 #include <google/protobuf/message_lite.h>
25 #include <gtest/gtest.h>
26 #include <string.h>
27 #include <fcntl.h>
28
29 using namespace android::base;
30 using namespace android::os;
31 using namespace std;
32 using ::testing::StrEq;
33 using ::testing::Test;
34 using ::testing::internal::CaptureStderr;
35 using ::testing::internal::CaptureStdout;
36 using ::testing::internal::GetCapturedStderr;
37 using ::testing::internal::GetCapturedStdout;
38
39 class CpuFreqParserTest : public Test {
40 public:
SetUp()41 virtual void SetUp() override {
42 ASSERT_TRUE(tf.fd != -1);
43 }
44
45 protected:
46 TemporaryFile tf;
47
48 const string kTestPath = GetExecutableDirectory();
49 const string kTestDataPath = kTestPath + "/testdata/";
50 };
51
TEST_F(CpuFreqParserTest,Success)52 TEST_F(CpuFreqParserTest, Success) {
53 const string testFile = kTestDataPath + "cpufreq.txt";
54 CpuFreqParser parser;
55 CpuFreqProto expected;
56
57 long jiffyHz = sysconf(_SC_CLK_TCK);
58 expected.set_jiffy_hz(jiffyHz);
59
60 CpuFreqProto::Stats::TimeInState* state;
61
62 CpuFreqProto::Stats* cpu0 = expected.add_cpu_freqs();
63 cpu0->set_cpu_name("cpu0");
64 state = cpu0->add_times();
65 state->set_state_khz(307200);
66 state->set_time_jiffy(23860761);
67 state = cpu0->add_times();
68 state->set_state_khz(384000);
69 state->set_time_jiffy(83124);
70 state = cpu0->add_times();
71 state->set_state_khz(768000);
72 state->set_time_jiffy(22652);
73
74 CpuFreqProto::Stats* cpu1 = expected.add_cpu_freqs();
75 cpu1->set_cpu_name("cpu1");
76 state = cpu1->add_times();
77 state->set_state_khz(307200);
78 state->set_time_jiffy(23860761);
79 state = cpu1->add_times();
80 state->set_state_khz(384000);
81 state->set_time_jiffy(83124);
82 state = cpu1->add_times();
83 state->set_state_khz(768000);
84 state->set_time_jiffy(22652);
85
86 CpuFreqProto::Stats* cpu2 = expected.add_cpu_freqs();
87 cpu2->set_cpu_name("cpu2");
88 state = cpu2->add_times();
89 state->set_state_khz(307200);
90 state->set_time_jiffy(23890935);
91 state = cpu2->add_times();
92 state->set_state_khz(384000);
93 state->set_time_jiffy(29383);
94 state = cpu2->add_times();
95 state->set_state_khz(748800);
96 state->set_time_jiffy(10547);
97 state = cpu2->add_times();
98 state->set_state_khz(825600);
99 state->set_time_jiffy(13173);
100
101 CpuFreqProto::Stats* cpu3 = expected.add_cpu_freqs();
102 cpu3->set_cpu_name("cpu3");
103 state = cpu3->add_times();
104 state->set_state_khz(307200);
105 state->set_time_jiffy(23890935);
106 state = cpu3->add_times();
107 state->set_state_khz(384000);
108 state->set_time_jiffy(29383);
109 state = cpu3->add_times();
110 state->set_state_khz(748800);
111 state->set_time_jiffy(10547);
112 state = cpu3->add_times();
113 state->set_state_khz(825600);
114 state->set_time_jiffy(13173);
115
116 int fd = open(testFile.c_str(), O_RDONLY);
117 ASSERT_TRUE(fd != -1);
118
119 CaptureStdout();
120 ASSERT_EQ(NO_ERROR, parser.Parse(fd, STDOUT_FILENO));
121 EXPECT_EQ(GetCapturedStdout(), expected.SerializeAsString());
122 close(fd);
123 }
124