Also changing from execv to execvp so that we don't have to specify the full command path. Bug: 65750831 Test: atest incident_helper_test Change-Id: I92191afff4e7f9a6d08ea22ecfc2de5623d3bde5
301 lines
11 KiB
C++
301 lines
11 KiB
C++
/*
|
|
* Copyright (C) 2017 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include "PsParser.h"
|
|
|
|
#include "frameworks/base/core/proto/android/os/ps.pb.h"
|
|
|
|
#include <android-base/file.h>
|
|
#include <android-base/test_utils.h>
|
|
#include <gmock/gmock.h>
|
|
#include <google/protobuf/message_lite.h>
|
|
#include <gtest/gtest.h>
|
|
#include <string.h>
|
|
#include <fcntl.h>
|
|
|
|
using namespace android::base;
|
|
using namespace android::os;
|
|
using namespace std;
|
|
using ::testing::StrEq;
|
|
using ::testing::Test;
|
|
using ::testing::internal::CaptureStderr;
|
|
using ::testing::internal::CaptureStdout;
|
|
using ::testing::internal::GetCapturedStderr;
|
|
using ::testing::internal::GetCapturedStdout;
|
|
|
|
class PsParserTest : public Test {
|
|
public:
|
|
virtual void SetUp() override {
|
|
ASSERT_TRUE(tf.fd != -1);
|
|
}
|
|
|
|
protected:
|
|
TemporaryFile tf;
|
|
|
|
const string kTestPath = GetExecutableDirectory();
|
|
const string kTestDataPath = kTestPath + "/testdata/";
|
|
};
|
|
|
|
TEST_F(PsParserTest, Normal) {
|
|
const string testFile = kTestDataPath + "ps.txt";
|
|
PsParser parser;
|
|
PsDumpProto expected;
|
|
PsDumpProto got;
|
|
|
|
PsDumpProto::Process* record1 = expected.add_processes();
|
|
record1->set_label("u:r:init:s0");
|
|
record1->set_user("root");
|
|
record1->set_pid(1);
|
|
record1->set_tid(1);
|
|
record1->set_ppid(0);
|
|
record1->set_vsz(15816);
|
|
record1->set_rss(2636);
|
|
record1->set_wchan("SyS_epoll_wait");
|
|
record1->set_addr("0");
|
|
record1->set_s(PsDumpProto_Process_ProcessStateCode_STATE_S);
|
|
record1->set_pri(19);
|
|
record1->set_ni(0);
|
|
record1->set_rtprio("-");
|
|
record1->set_sch(PsDumpProto_Process_SchedulingPolicy_SCH_NORMAL);
|
|
record1->set_pcy(PsDumpProto::Process::POLICY_FG);
|
|
record1->set_time("00:00:01");
|
|
record1->set_cmd("init");
|
|
|
|
PsDumpProto::Process* record2 = expected.add_processes();
|
|
record2->set_label("u:r:kernel:s0");
|
|
record2->set_user("root");
|
|
record2->set_pid(2);
|
|
record2->set_tid(2);
|
|
record2->set_ppid(0);
|
|
record2->set_vsz(0);
|
|
record2->set_rss(0);
|
|
record2->set_wchan("kthreadd");
|
|
record2->set_addr("0");
|
|
record2->set_s(PsDumpProto_Process_ProcessStateCode_STATE_S);
|
|
record2->set_pri(19);
|
|
record2->set_ni(0);
|
|
record2->set_rtprio("-");
|
|
record2->set_sch(PsDumpProto_Process_SchedulingPolicy_SCH_NORMAL);
|
|
record2->set_pcy(PsDumpProto::Process::POLICY_FG);
|
|
record2->set_time("00:00:00");
|
|
record2->set_cmd("kthreadd");
|
|
|
|
PsDumpProto::Process* record3 = expected.add_processes();
|
|
record3->set_label("u:r:surfaceflinger:s0");
|
|
record3->set_user("system");
|
|
record3->set_pid(499);
|
|
record3->set_tid(534);
|
|
record3->set_ppid(1);
|
|
record3->set_vsz(73940);
|
|
record3->set_rss(22024);
|
|
record3->set_wchan("futex_wait_queue_me");
|
|
record3->set_addr("0");
|
|
record3->set_s(PsDumpProto_Process_ProcessStateCode_STATE_S);
|
|
record3->set_pri(42);
|
|
record3->set_ni(-9);
|
|
record3->set_rtprio("2");
|
|
record3->set_sch(PsDumpProto_Process_SchedulingPolicy_SCH_FIFO);
|
|
record3->set_pcy(PsDumpProto::Process::POLICY_FG);
|
|
record3->set_time("00:00:00");
|
|
record3->set_cmd("EventThread");
|
|
|
|
PsDumpProto::Process* record4 = expected.add_processes();
|
|
record4->set_label("u:r:hal_gnss_default:s0");
|
|
record4->set_user("gps");
|
|
record4->set_pid(670);
|
|
record4->set_tid(2004);
|
|
record4->set_ppid(1);
|
|
record4->set_vsz(43064);
|
|
record4->set_rss(7272);
|
|
record4->set_wchan("poll_schedule_timeout");
|
|
record4->set_addr("0");
|
|
record4->set_s(PsDumpProto_Process_ProcessStateCode_STATE_S);
|
|
record4->set_pri(19);
|
|
record4->set_ni(0);
|
|
record4->set_rtprio("-");
|
|
record4->set_sch(PsDumpProto_Process_SchedulingPolicy_SCH_NORMAL);
|
|
record4->set_pcy(PsDumpProto::Process::POLICY_FG);
|
|
record4->set_time("00:00:00");
|
|
record4->set_cmd("Loc_hal_worker");
|
|
|
|
PsDumpProto::Process* record5 = expected.add_processes();
|
|
record5->set_label("u:r:platform_app:s0:c512,c768");
|
|
record5->set_user("u0_a48");
|
|
record5->set_pid(1660);
|
|
record5->set_tid(1976);
|
|
record5->set_ppid(806);
|
|
record5->set_vsz(4468612);
|
|
record5->set_rss(138328);
|
|
record5->set_wchan("binder_thread_read");
|
|
record5->set_addr("0");
|
|
record5->set_s(PsDumpProto_Process_ProcessStateCode_STATE_S);
|
|
record5->set_pri(35);
|
|
record5->set_ni(-16);
|
|
record5->set_rtprio("-");
|
|
record5->set_sch(PsDumpProto_Process_SchedulingPolicy_SCH_NORMAL);
|
|
record5->set_pcy(PsDumpProto::Process::POLICY_TA);
|
|
record5->set_time("00:00:00");
|
|
record5->set_cmd("HwBinder:1660_1");
|
|
|
|
PsDumpProto::Process* record6 = expected.add_processes();
|
|
record6->set_label("u:r:perfd:s0");
|
|
record6->set_user("root");
|
|
record6->set_pid(1939);
|
|
record6->set_tid(1946);
|
|
record6->set_ppid(1);
|
|
record6->set_vsz(18132);
|
|
record6->set_rss(2088);
|
|
record6->set_wchan("__skb_recv_datagram");
|
|
record6->set_addr("7b9782fd14");
|
|
record6->set_s(PsDumpProto_Process_ProcessStateCode_STATE_S);
|
|
record6->set_pri(19);
|
|
record6->set_ni(0);
|
|
record6->set_rtprio("-");
|
|
record6->set_sch(PsDumpProto_Process_SchedulingPolicy_SCH_NORMAL);
|
|
record6->set_pcy(PsDumpProto::Process::POLICY_UNKNOWN);
|
|
record6->set_time("00:00:00");
|
|
record6->set_cmd("perfd");
|
|
|
|
PsDumpProto::Process* record7 = expected.add_processes();
|
|
record7->set_label("u:r:perfd:s0");
|
|
record7->set_user("root");
|
|
record7->set_pid(1939);
|
|
record7->set_tid(1955);
|
|
record7->set_ppid(1);
|
|
record7->set_vsz(18132);
|
|
record7->set_rss(2088);
|
|
record7->set_wchan("do_sigtimedwait");
|
|
record7->set_addr("7b9782ff6c");
|
|
record7->set_s(PsDumpProto_Process_ProcessStateCode_STATE_S);
|
|
record7->set_pri(19);
|
|
record7->set_ni(0);
|
|
record7->set_rtprio("-");
|
|
record7->set_sch(PsDumpProto_Process_SchedulingPolicy_SCH_NORMAL);
|
|
record7->set_pcy(PsDumpProto::Process::POLICY_UNKNOWN);
|
|
record7->set_time("00:00:00");
|
|
record7->set_cmd("POSIX timer 0");
|
|
|
|
PsDumpProto::Process* record8 = expected.add_processes();
|
|
record8->set_label("u:r:shell:s0");
|
|
record8->set_user("shell");
|
|
record8->set_pid(2645);
|
|
record8->set_tid(2645);
|
|
record8->set_ppid(802);
|
|
record8->set_vsz(11664);
|
|
record8->set_rss(2972);
|
|
record8->set_wchan("0");
|
|
record8->set_addr("7f67a2f8b4");
|
|
record8->set_s(PsDumpProto_Process_ProcessStateCode_STATE_R);
|
|
record8->set_pri(19);
|
|
record8->set_ni(0);
|
|
record8->set_rtprio("-");
|
|
record8->set_sch(PsDumpProto_Process_SchedulingPolicy_SCH_NORMAL);
|
|
record8->set_pcy(PsDumpProto::Process::POLICY_FG);
|
|
record8->set_time("00:00:00");
|
|
record8->set_cmd("ps");
|
|
|
|
int fd = open(testFile.c_str(), O_RDONLY);
|
|
ASSERT_TRUE(fd != -1);
|
|
|
|
CaptureStdout();
|
|
ASSERT_EQ(NO_ERROR, parser.Parse(fd, STDOUT_FILENO));
|
|
got.ParseFromString(GetCapturedStdout());
|
|
bool matches = true;
|
|
|
|
if (got.processes_size() != expected.processes_size()) {
|
|
fprintf(stderr, "Got %d processes, want %d\n", got.processes_size(), expected.processes_size());
|
|
matches = false;
|
|
} else {
|
|
int n = got.processes_size();
|
|
for (int i = 0; i < n; i++) {
|
|
PsDumpProto::Process g = got.processes(i);
|
|
PsDumpProto::Process e = expected.processes(i);
|
|
|
|
if (g.label() != e.label()) {
|
|
fprintf(stderr, "prcs[%d]: Invalid label. Got %s, want %s\n", i, g.label().c_str(), e.label().c_str());
|
|
matches = false;
|
|
}
|
|
if (g.user() != e.user()) {
|
|
fprintf(stderr, "prcs[%d]: Invalid user. Got %s, want %s\n", i, g.user().c_str(), e.user().c_str());
|
|
matches = false;
|
|
}
|
|
if (g.pid() != e.pid()) {
|
|
fprintf(stderr, "prcs[%d]: Invalid pid. Got %d, want %d\n", i, g.pid(), e.pid());
|
|
matches = false;
|
|
}
|
|
if (g.tid() != e.tid()) {
|
|
fprintf(stderr, "prcs[%d]: Invalid tid. Got %d, want %d\n", i, g.tid(), e.tid());
|
|
matches = false;
|
|
}
|
|
if (g.ppid() != e.ppid()) {
|
|
fprintf(stderr, "prcs[%d]: Invalid ppid. Got %d, want %d\n", i, g.ppid(), e.ppid());
|
|
matches = false;
|
|
}
|
|
if (g.vsz() != e.vsz()) {
|
|
fprintf(stderr, "prcs[%d]: Invalid vsz. Got %d, want %d\n", i, g.vsz(), e.vsz());
|
|
matches = false;
|
|
}
|
|
if (g.rss() != e.rss()) {
|
|
fprintf(stderr, "prcs[%d]: Invalid rss. Got %d, want %d\n", i, g.rss(), e.rss());
|
|
matches = false;
|
|
}
|
|
if (g.wchan() != e.wchan()) {
|
|
fprintf(stderr, "prcs[%d]: Invalid wchan. Got %s, want %s\n", i, g.wchan().c_str(), e.wchan().c_str());
|
|
matches = false;
|
|
}
|
|
if (g.addr() != e.addr()) {
|
|
fprintf(stderr, "prcs[%d]: Invalid addr. Got %s, want %s\n", i, g.addr().c_str(), e.addr().c_str());
|
|
matches = false;
|
|
}
|
|
if (g.s() != e.s()) {
|
|
fprintf(stderr, "prcs[%d]: Invalid s. Got %u, want %u\n", i, g.s(), e.s());
|
|
matches = false;
|
|
}
|
|
if (g.pri() != e.pri()) {
|
|
fprintf(stderr, "prcs[%d]: Invalid pri. Got %d, want %d\n", i, g.pri(), e.pri());
|
|
matches = false;
|
|
}
|
|
if (g.ni() != e.ni()) {
|
|
fprintf(stderr, "prcs[%d]: Invalid ni. Got %d, want %d\n", i, g.ni(), e.ni());
|
|
matches = false;
|
|
}
|
|
if (g.rtprio() != e.rtprio()) {
|
|
fprintf(stderr, "prcs[%d]: Invalid rtprio. Got %s, want %s\n", i, g.rtprio().c_str(), e.rtprio().c_str());
|
|
matches = false;
|
|
}
|
|
if (g.sch() != e.sch()) {
|
|
fprintf(stderr, "prcs[%d]: Invalid sch. Got %u, want %u\n", i, g.sch(), e.sch());
|
|
matches = false;
|
|
}
|
|
if (g.pcy() != e.pcy()) {
|
|
fprintf(stderr, "prcs[%d]: Invalid pcy. Got %u, want %u\n", i, g.pcy(), e.pcy());
|
|
matches = false;
|
|
}
|
|
if (g.time() != e.time()) {
|
|
fprintf(stderr, "prcs[%d]: Invalid time. Got %s, want %s\n", i, g.time().c_str(), e.time().c_str());
|
|
matches = false;
|
|
}
|
|
if (g.cmd() != e.cmd()) {
|
|
fprintf(stderr, "prcs[%d]: Invalid cmd. Got %s, want %s\n", i, g.cmd().c_str(), e.cmd().c_str());
|
|
matches = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
EXPECT_TRUE(matches);
|
|
close(fd);
|
|
}
|