xref: /aosp_15_r20/external/perfetto/src/profiling/common/proc_cmdline_unittest.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
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