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 "ProcrankParser.h" 18 19 #include "frameworks/base/core/proto/android/os/procrank.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 ProcrankParserTest : public Test { 40 public: 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 52 TEST_F(ProcrankParserTest, HasSwapInfo) { 53 const string testFile = kTestDataPath + "procrank.txt"; 54 ProcrankParser parser; 55 ProcrankProto expected; 56 57 ProcrankProto::Process* process1 = expected.add_processes(); 58 process1->set_pid(1119); 59 process1->set_vss(2607640); 60 process1->set_rss(339564); 61 process1->set_pss(180278); 62 process1->set_uss(114216); 63 process1->set_swap(1584); 64 process1->set_pswap(46); 65 process1->set_uswap(0); 66 process1->set_zswap(10); 67 process1->set_cmdline("system_server"); 68 69 ProcrankProto::Process* process2 = expected.add_processes(); 70 process2->set_pid(649); 71 process2->set_vss(11016); 72 process2->set_rss(1448); 73 process2->set_pss(98); 74 process2->set_uss(48); 75 process2->set_swap(472); 76 process2->set_pswap(342); 77 process2->set_uswap(212); 78 process2->set_zswap(75); 79 process2->set_cmdline("/vendor/bin/qseecomd"); 80 81 ProcrankProto::Process* total = expected.mutable_summary()->mutable_total(); 82 total->set_pss(1201993); 83 total->set_uss(935300); 84 total->set_swap(88164); 85 total->set_pswap(31069); 86 total->set_uswap(27612); 87 total->set_zswap(6826); 88 total->set_cmdline("TOTAL"); 89 90 expected.mutable_summary()->mutable_zram() 91 ->set_raw_text("6828K physical used for 31076K in swap (524284K total swap)"); 92 expected.mutable_summary()->mutable_ram() 93 ->set_raw_text("3843972K total, 281424K free, 116764K buffers, 1777452K cached, 1136K shmem, 217916K slab"); 94 95 int fd = open(testFile.c_str(), O_RDONLY); 96 ASSERT_TRUE(fd != -1); 97 98 CaptureStdout(); 99 ASSERT_EQ(NO_ERROR, parser.Parse(fd, STDOUT_FILENO)); 100 EXPECT_EQ(GetCapturedStdout(), expected.SerializeAsString()); 101 close(fd); 102 } 103 104 TEST_F(ProcrankParserTest, NoSwapInfo) { 105 const string testFile = kTestDataPath + "procrank_short.txt"; 106 ProcrankParser parser; 107 ProcrankProto expected; 108 109 ProcrankProto::Process* process1 = expected.add_processes(); 110 process1->set_pid(1119); 111 process1->set_vss(2607640); 112 process1->set_rss(339564); 113 process1->set_pss(180278); 114 process1->set_uss(114216); 115 process1->set_cmdline("system_server"); 116 117 ProcrankProto::Process* process2 = expected.add_processes(); 118 process2->set_pid(649); 119 process2->set_vss(11016); 120 process2->set_rss(1448); 121 process2->set_pss(98); 122 process2->set_uss(48); 123 process2->set_cmdline("/vendor/bin/qseecomd"); 124 125 ProcrankProto::Process* total = expected.mutable_summary()->mutable_total(); 126 total->set_pss(1201993); 127 total->set_uss(935300); 128 total->set_cmdline("TOTAL"); 129 130 expected.mutable_summary()->mutable_ram() 131 ->set_raw_text("3843972K total, 281424K free, 116764K buffers, 1777452K cached, 1136K shmem, 217916K slab"); 132 133 int fd = open(testFile.c_str(), O_RDONLY); 134 ASSERT_TRUE(fd != -1); 135 136 CaptureStdout(); 137 ASSERT_EQ(NO_ERROR, parser.Parse(fd, STDOUT_FILENO)); 138 EXPECT_EQ(GetCapturedStdout(), expected.SerializeAsString()); 139 close(fd); 140 } 141