104625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin/* 204625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin * Copyright (C) 2017 The Android Open Source Project 304625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin * 404625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin * Licensed under the Apache License, Version 2.0 (the "License"); 504625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin * you may not use this file except in compliance with the License. 604625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin * You may obtain a copy of the License at 704625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin * 804625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin * http://www.apache.org/licenses/LICENSE-2.0 904625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin * 1004625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin * Unless required by applicable law or agreed to in writing, software 1104625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin * distributed under the License is distributed on an "AS IS" BASIS, 1204625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1304625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin * See the License for the specific language governing permissions and 1404625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin * limitations under the License. 1504625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin */ 1604625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin 1704625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin#include "ProcrankParser.h" 1804625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin 1904625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin#include "frameworks/base/core/proto/android/os/procrank.pb.h" 2004625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin 2104625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin#include <android-base/file.h> 2204625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin#include <android-base/test_utils.h> 2304625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin#include <gmock/gmock.h> 2462c220b20b3fc431c27feac29a71d040fc8e2626Joe Onorato#include <google/protobuf/message_lite.h> 2504625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin#include <gtest/gtest.h> 2604625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin#include <string.h> 2704625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin#include <fcntl.h> 2804625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin 2904625ad4886a478bf74bbfc13937c10fa63eb272Yi Jinusing namespace android::base; 3004625ad4886a478bf74bbfc13937c10fa63eb272Yi Jinusing namespace android::os; 3104625ad4886a478bf74bbfc13937c10fa63eb272Yi Jinusing namespace std; 3204625ad4886a478bf74bbfc13937c10fa63eb272Yi Jinusing ::testing::StrEq; 3304625ad4886a478bf74bbfc13937c10fa63eb272Yi Jinusing ::testing::Test; 3404625ad4886a478bf74bbfc13937c10fa63eb272Yi Jinusing ::testing::internal::CaptureStderr; 3504625ad4886a478bf74bbfc13937c10fa63eb272Yi Jinusing ::testing::internal::CaptureStdout; 3604625ad4886a478bf74bbfc13937c10fa63eb272Yi Jinusing ::testing::internal::GetCapturedStderr; 3704625ad4886a478bf74bbfc13937c10fa63eb272Yi Jinusing ::testing::internal::GetCapturedStdout; 3804625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin 3904625ad4886a478bf74bbfc13937c10fa63eb272Yi Jinclass ProcrankParserTest : public Test { 4004625ad4886a478bf74bbfc13937c10fa63eb272Yi Jinpublic: 4104625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin virtual void SetUp() override { 4204625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin ASSERT_TRUE(tf.fd != -1); 4304625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin } 4404625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin 4504625ad4886a478bf74bbfc13937c10fa63eb272Yi Jinprotected: 4604625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin TemporaryFile tf; 4704625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin 4804625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin const string kTestPath = GetExecutableDirectory(); 4904625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin const string kTestDataPath = kTestPath + "/testdata/"; 5004625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin}; 5104625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin 5204625ad4886a478bf74bbfc13937c10fa63eb272Yi JinTEST_F(ProcrankParserTest, HasSwapInfo) { 5304625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin const string testFile = kTestDataPath + "procrank.txt"; 5404625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin ProcrankParser parser; 5551d4c54eba8dd613dd0550c6633a747b53e0ce0aYi Jin ProcrankProto expected; 5604625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin 5751d4c54eba8dd613dd0550c6633a747b53e0ce0aYi Jin ProcrankProto::Process* process1 = expected.add_processes(); 5804625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process1->set_pid(1119); 5904625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process1->set_vss(2607640); 6004625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process1->set_rss(339564); 6104625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process1->set_pss(180278); 6204625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process1->set_uss(114216); 6304625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process1->set_swap(1584); 6404625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process1->set_pswap(46); 6504625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process1->set_uswap(0); 6604625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process1->set_zswap(10); 6704625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process1->set_cmdline("system_server"); 6804625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin 6951d4c54eba8dd613dd0550c6633a747b53e0ce0aYi Jin ProcrankProto::Process* process2 = expected.add_processes(); 7004625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process2->set_pid(649); 7104625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process2->set_vss(11016); 7204625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process2->set_rss(1448); 7304625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process2->set_pss(98); 7404625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process2->set_uss(48); 7504625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process2->set_swap(472); 7604625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process2->set_pswap(342); 7704625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process2->set_uswap(212); 7804625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process2->set_zswap(75); 7904625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process2->set_cmdline("/vendor/bin/qseecomd"); 8004625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin 8151d4c54eba8dd613dd0550c6633a747b53e0ce0aYi Jin ProcrankProto::Process* total = expected.mutable_summary()->mutable_total(); 8204625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin total->set_pss(1201993); 8304625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin total->set_uss(935300); 8404625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin total->set_swap(88164); 8504625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin total->set_pswap(31069); 8604625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin total->set_uswap(27612); 8704625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin total->set_zswap(6826); 8804625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin total->set_cmdline("TOTAL"); 8904625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin 9004625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin expected.mutable_summary()->mutable_zram() 9104625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin ->set_raw_text("6828K physical used for 31076K in swap (524284K total swap)"); 9204625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin expected.mutable_summary()->mutable_ram() 9304625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin ->set_raw_text("3843972K total, 281424K free, 116764K buffers, 1777452K cached, 1136K shmem, 217916K slab"); 9404625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin 9504625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin int fd = open(testFile.c_str(), O_RDONLY); 9604625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin ASSERT_TRUE(fd != -1); 9704625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin 9804625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin CaptureStdout(); 9904625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin ASSERT_EQ(NO_ERROR, parser.Parse(fd, STDOUT_FILENO)); 10062c220b20b3fc431c27feac29a71d040fc8e2626Joe Onorato EXPECT_EQ(GetCapturedStdout(), expected.SerializeAsString()); 10104625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin close(fd); 10204625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin} 10304625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin 10404625ad4886a478bf74bbfc13937c10fa63eb272Yi JinTEST_F(ProcrankParserTest, NoSwapInfo) { 10504625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin const string testFile = kTestDataPath + "procrank_short.txt"; 10604625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin ProcrankParser parser; 10751d4c54eba8dd613dd0550c6633a747b53e0ce0aYi Jin ProcrankProto expected; 10804625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin 10951d4c54eba8dd613dd0550c6633a747b53e0ce0aYi Jin ProcrankProto::Process* process1 = expected.add_processes(); 11004625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process1->set_pid(1119); 11104625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process1->set_vss(2607640); 11204625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process1->set_rss(339564); 11304625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process1->set_pss(180278); 11404625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process1->set_uss(114216); 11504625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process1->set_cmdline("system_server"); 11604625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin 11751d4c54eba8dd613dd0550c6633a747b53e0ce0aYi Jin ProcrankProto::Process* process2 = expected.add_processes(); 11804625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process2->set_pid(649); 11904625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process2->set_vss(11016); 12004625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process2->set_rss(1448); 12104625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process2->set_pss(98); 12204625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process2->set_uss(48); 12304625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin process2->set_cmdline("/vendor/bin/qseecomd"); 12404625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin 12551d4c54eba8dd613dd0550c6633a747b53e0ce0aYi Jin ProcrankProto::Process* total = expected.mutable_summary()->mutable_total(); 12604625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin total->set_pss(1201993); 12704625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin total->set_uss(935300); 12804625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin total->set_cmdline("TOTAL"); 12904625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin 13004625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin expected.mutable_summary()->mutable_ram() 13104625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin ->set_raw_text("3843972K total, 281424K free, 116764K buffers, 1777452K cached, 1136K shmem, 217916K slab"); 13204625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin 13304625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin int fd = open(testFile.c_str(), O_RDONLY); 13404625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin ASSERT_TRUE(fd != -1); 13504625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin 13604625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin CaptureStdout(); 13704625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin ASSERT_EQ(NO_ERROR, parser.Parse(fd, STDOUT_FILENO)); 13862c220b20b3fc431c27feac29a71d040fc8e2626Joe Onorato EXPECT_EQ(GetCapturedStdout(), expected.SerializeAsString()); 13904625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin close(fd); 14004625ad4886a478bf74bbfc13937c10fa63eb272Yi Jin} 141