1 /*
2 * Copyright (C) 2022 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 "src/profiling/common/proc_cmdline.h"
18
19 #include <string>
20
21 #include "test/gtest_and_gmock.h"
22
23 namespace perfetto {
24 namespace profiling {
25 namespace glob_aware {
26 namespace {
27
TEST(ProcCmdlineTest,FindBinaryNameBinNameOnly)28 TEST(ProcCmdlineTest, FindBinaryNameBinNameOnly) {
29 char cmdline[] = "surfaceflinger";
30 EXPECT_EQ(cmdline, FindBinaryName(cmdline, sizeof(cmdline) - 1));
31 }
32
TEST(ProcCmdlineTest,FindBinaryNameWithArg)33 TEST(ProcCmdlineTest, FindBinaryNameWithArg) {
34 char cmdline[] = "surfaceflinger\0--flag";
35 EXPECT_EQ(cmdline, FindBinaryName(cmdline, sizeof(cmdline) - 1));
36 }
37
TEST(ProcCmdlineTest,FindBinaryNameFullPathAndArgs)38 TEST(ProcCmdlineTest, FindBinaryNameFullPathAndArgs) {
39 char cmdline[] = "/system/bin/surfaceflinger\0--flag\0--flag2";
40 EXPECT_STREQ("surfaceflinger", FindBinaryName(cmdline, sizeof(cmdline) - 1));
41 }
42
TEST(ProcCmdlineTest,FindBinaryNameSpecialCharsInName)43 TEST(ProcCmdlineTest, FindBinaryNameSpecialCharsInName) {
44 {
45 char cmdline[] = "[email protected]";
46 EXPECT_EQ(cmdline, FindBinaryName(cmdline, sizeof(cmdline) - 1));
47 }
48 {
49 char cmdline[] = "com.google.android.googlequicksearchbox:search";
50 EXPECT_EQ(cmdline, FindBinaryName(cmdline, sizeof(cmdline) - 1));
51 }
52 {
53 // chrome rewrites cmdline with spaces instead of nul bytes, parsing will
54 // therefore treat everything as argv0.
55 char cmdline[] =
56 "/opt/google/chrome/chrome --type=renderer --enable-crashpad";
57 EXPECT_STREQ("chrome --type=renderer --enable-crashpad",
58 FindBinaryName(cmdline, sizeof(cmdline) - 1));
59 }
60 }
61
TEST(ProcCmdlineTest,FindBinaryNameEdgeCases)62 TEST(ProcCmdlineTest, FindBinaryNameEdgeCases) {
63 {
64 char cmdline[] = "";
65 EXPECT_STREQ("", FindBinaryName(cmdline, sizeof(cmdline) - 1));
66 }
67 {
68 char cmdline[] = "\0foo";
69 EXPECT_STREQ("", FindBinaryName(cmdline, sizeof(cmdline) - 1));
70 }
71 {
72 char cmdline[] = "/foo/";
73 EXPECT_STREQ("", FindBinaryName(cmdline, sizeof(cmdline) - 1));
74 }
75 {
76 char cmdline[] = "/";
77 EXPECT_STREQ("", FindBinaryName(cmdline, sizeof(cmdline) - 1));
78 }
79 {
80 char cmdline[] = "foo/\0";
81 EXPECT_STREQ("", FindBinaryName(cmdline, sizeof(cmdline) - 1));
82 }
83 }
84
TEST(ProcCmdlineTest,FindAndMatchAbsolutePath)85 TEST(ProcCmdlineTest, FindAndMatchAbsolutePath) {
86 char cmdline[] = "/system/bin/surfaceflinger\0--flag\0--flag2";
87 const char* binname = FindBinaryName(cmdline, sizeof(cmdline) - 1);
88 ASSERT_TRUE(binname != nullptr);
89
90 EXPECT_TRUE(MatchGlobPattern("/system/bin/surfaceflinger", cmdline, binname));
91 EXPECT_TRUE(MatchGlobPattern("/*/surfaceflinger", cmdline, binname));
92 EXPECT_TRUE(MatchGlobPattern("surfaceflinger", cmdline, binname));
93 EXPECT_TRUE(MatchGlobPattern("???faceflinger", cmdline, binname));
94 EXPECT_TRUE(MatchGlobPattern("*", cmdline, binname));
95
96 EXPECT_FALSE(MatchGlobPattern("/system", cmdline, binname));
97 EXPECT_FALSE(MatchGlobPattern("bin/surfaceflinger", cmdline, binname));
98 EXPECT_FALSE(
99 MatchGlobPattern("?system/bin/surfaceflinger", cmdline, binname));
100 EXPECT_FALSE(MatchGlobPattern("*/surfaceflinger", cmdline, binname));
101 }
102
TEST(ProcCmdlineTest,FindAndMatchRelativePath)103 TEST(ProcCmdlineTest, FindAndMatchRelativePath) {
104 char cmdline[] = "./top";
105 const char* binname = FindBinaryName(cmdline, sizeof(cmdline) - 1);
106 ASSERT_TRUE(binname != nullptr);
107
108 EXPECT_TRUE(MatchGlobPattern("top", cmdline, binname));
109 EXPECT_TRUE(MatchGlobPattern("*", cmdline, binname));
110
111 EXPECT_FALSE(MatchGlobPattern("./top", cmdline, binname));
112 }
113
114 } // namespace
115 } // namespace glob_aware
116 } // namespace profiling
117 } // namespace perfetto
118