| /* |
| * Copyright (C) 2018 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 "src/profiling/memory/proc_utils.h" |
| |
| #include <gmock/gmock.h> |
| #include <gtest/gtest.h> |
| |
| #include "perfetto/ext/base/utils.h" |
| |
| namespace perfetto { |
| namespace profiling { |
| namespace { |
| |
| using ::testing::Contains; |
| using ::testing::Not; |
| |
| TEST(ProcUtilsTest, NormalizeNoop) { |
| char kCmdline[] = "surfaceflinger\0"; |
| std::string name; |
| ASSERT_TRUE(NormalizeCmdLine(kCmdline, sizeof(kCmdline), &name)); |
| EXPECT_EQ(name, "surfaceflinger"); |
| } |
| |
| TEST(ProcUtilsTest, NormalizePath) { |
| char kCmdline[] = "/system/bin/surfaceflinger\0"; |
| std::string name; |
| ASSERT_TRUE(NormalizeCmdLine(kCmdline, sizeof(kCmdline), &name)); |
| EXPECT_EQ(name, "surfaceflinger"); |
| } |
| |
| TEST(ProcUtilsTest, NormalizeAt) { |
| char kCmdline[] = "some.app@2.0\0"; |
| std::string name; |
| ASSERT_TRUE(NormalizeCmdLine(kCmdline, sizeof(kCmdline), &name)); |
| EXPECT_EQ(name, "some.app"); |
| } |
| |
| TEST(ProcUtilsTest, FindProfilablePids) { |
| std::set<pid_t> pids; |
| int pipefds[2]; |
| PERFETTO_CHECK(pipe(pipefds) == 0); |
| pid_t pid = fork(); |
| PERFETTO_CHECK(pid >= 0); |
| switch (pid) { |
| case 0: { |
| close(pipefds[1]); |
| char buf[1]; |
| // Block until the other end shuts down the pipe. |
| read(pipefds[0], buf, sizeof(buf)); |
| exit(0); |
| } |
| default: |
| close(pipefds[0]); |
| break; |
| } |
| FindAllProfilablePids(&pids); |
| close(pipefds[1]); |
| EXPECT_THAT(pids, Contains(pid)); |
| EXPECT_THAT(pids, Not(Contains(getpid()))); |
| PERFETTO_CHECK(PERFETTO_EINTR(waitpid(pid, nullptr, 0)) == pid); |
| } |
| |
| } // namespace |
| } // namespace profiling |
| } // namespace perfetto |