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