1 /* 2 * Copyright (C) 2017 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 <fstream> 18 #include <set> 19 #include <sstream> 20 #include <string> 21 22 #include "gmock/gmock.h" 23 #include "gtest/gtest.h" 24 #include "perfetto/base/file_utils.h" 25 #include "src/traced/probes/ftrace/ftrace_controller.h" 26 #include "src/traced/probes/ftrace/ftrace_procfs.h" 27 28 using testing::HasSubstr; 29 using testing::Not; 30 using testing::Contains; 31 32 namespace perfetto { 33 namespace { 34 35 std::string GetFtracePath() { 36 size_t i = 0; 37 while (!FtraceProcfs::Create(FtraceController::kTracingPaths[i])) { 38 i++; 39 } 40 return std::string(FtraceController::kTracingPaths[i]); 41 } 42 43 void ResetFtrace(FtraceProcfs* ftrace) { 44 ftrace->DisableAllEvents(); 45 ftrace->ClearTrace(); 46 ftrace->EnableTracing(); 47 } 48 49 std::string ReadFile(const std::string& name) { 50 std::string result; 51 PERFETTO_CHECK(base::ReadFile(GetFtracePath() + name, &result)); 52 return result; 53 } 54 55 std::string GetTraceOutput() { 56 std::string output = ReadFile("trace"); 57 if (output.empty()) { 58 ADD_FAILURE() << "Could not read trace output"; 59 } 60 return output; 61 } 62 63 } // namespace 64 65 // TODO(lalitm): reenable these tests (see b/72306171). 66 #if PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) 67 #define MAYBE_CreateWithGoodPath CreateWithGoodPath 68 #else 69 #define MAYBE_CreateWithGoodPath DISABLED_CreateWithGoodPath 70 #endif 71 TEST(FtraceProcfsIntegrationTest, MAYBE_CreateWithGoodPath) { 72 EXPECT_TRUE(FtraceProcfs::Create(GetFtracePath())); 73 } 74 75 #if PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) 76 #define MAYBE_CreateWithBadPath CreateWithBadPath 77 #else 78 #define MAYBE_CreateWithBadPath DISABLED_CreateWithBadath 79 #endif 80 TEST(FtraceProcfsIntegrationTest, MAYBE_CreateWithBadPath) { 81 EXPECT_FALSE(FtraceProcfs::Create(GetFtracePath() + std::string("bad_path"))); 82 } 83 84 #if PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) 85 #define MAYBE_ClearTrace ClearTrace 86 #else 87 #define MAYBE_ClearTrace DISABLED_ClearTrace 88 #endif 89 TEST(FtraceProcfsIntegrationTest, MAYBE_ClearTrace) { 90 FtraceProcfs ftrace(GetFtracePath()); 91 ResetFtrace(&ftrace); 92 ftrace.WriteTraceMarker("Hello, World!"); 93 ftrace.ClearTrace(); 94 EXPECT_THAT(GetTraceOutput(), Not(HasSubstr("Hello, World!"))); 95 } 96 97 #if PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) 98 #define MAYBE_TraceMarker TraceMarker 99 #else 100 #define MAYBE_TraceMarker DISABLED_TraceMarker 101 #endif 102 TEST(FtraceProcfsIntegrationTest, MAYBE_TraceMarker) { 103 FtraceProcfs ftrace(GetFtracePath()); 104 ResetFtrace(&ftrace); 105 ftrace.WriteTraceMarker("Hello, World!"); 106 EXPECT_THAT(GetTraceOutput(), HasSubstr("Hello, World!")); 107 } 108 109 #if PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) 110 #define MAYBE_EnableDisableEvent EnableDisableEvent 111 #else 112 #define MAYBE_EnableDisableEvent DISABLED_EnableDisableEvent 113 #endif 114 TEST(FtraceProcfsIntegrationTest, MAYBE_EnableDisableEvent) { 115 FtraceProcfs ftrace(GetFtracePath()); 116 ResetFtrace(&ftrace); 117 ftrace.EnableEvent("sched", "sched_switch"); 118 sleep(1); 119 EXPECT_THAT(GetTraceOutput(), HasSubstr("sched_switch")); 120 121 ftrace.DisableEvent("sched", "sched_switch"); 122 ftrace.ClearTrace(); 123 sleep(1); 124 EXPECT_THAT(GetTraceOutput(), Not(HasSubstr("sched_switch"))); 125 } 126 127 #if PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) 128 #define MAYBE_EnableDisableTracing EnableDisableTracing 129 #else 130 #define MAYBE_EnableDisableTracing DISABLED_EnableDisableTracing 131 #endif 132 TEST(FtraceProcfsIntegrationTest, MAYBE_EnableDisableTracing) { 133 FtraceProcfs ftrace(GetFtracePath()); 134 ResetFtrace(&ftrace); 135 EXPECT_TRUE(ftrace.IsTracingEnabled()); 136 ftrace.WriteTraceMarker("Before"); 137 ftrace.DisableTracing(); 138 EXPECT_FALSE(ftrace.IsTracingEnabled()); 139 ftrace.WriteTraceMarker("During"); 140 ftrace.EnableTracing(); 141 EXPECT_TRUE(ftrace.IsTracingEnabled()); 142 ftrace.WriteTraceMarker("After"); 143 EXPECT_THAT(GetTraceOutput(), HasSubstr("Before")); 144 EXPECT_THAT(GetTraceOutput(), Not(HasSubstr("During"))); 145 EXPECT_THAT(GetTraceOutput(), HasSubstr("After")); 146 } 147 148 #if PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) 149 #define MAYBE_ReadFormatFile ReadFormatFile 150 #else 151 #define MAYBE_ReadFormatFile DISABLED_ReadFormatFile 152 #endif 153 TEST(FtraceProcfsIntegrationTest, MAYBE_ReadFormatFile) { 154 FtraceProcfs ftrace(GetFtracePath()); 155 std::string format = ftrace.ReadEventFormat("ftrace", "print"); 156 EXPECT_THAT(format, HasSubstr("name: print")); 157 EXPECT_THAT(format, HasSubstr("field:char buf")); 158 } 159 160 #if PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) 161 #define MAYBE_CanOpenTracePipeRaw CanOpenTracePipeRaw 162 #else 163 #define MAYBE_CanOpenTracePipeRaw DISABLED_CanOpenTracePipeRaw 164 #endif 165 TEST(FtraceProcfsIntegrationTest, MAYBE_CanOpenTracePipeRaw) { 166 FtraceProcfs ftrace(GetFtracePath()); 167 EXPECT_TRUE(ftrace.OpenPipeForCpu(0)); 168 } 169 170 #if PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) 171 #define MAYBE_Clock Clock 172 #else 173 #define MAYBE_Clock DISABLED_Clock 174 #endif 175 TEST(FtraceProcfsIntegrationTest, MAYBE_Clock) { 176 FtraceProcfs ftrace(GetFtracePath()); 177 std::set<std::string> clocks = ftrace.AvailableClocks(); 178 EXPECT_THAT(clocks, Contains("local")); 179 EXPECT_THAT(clocks, Contains("global")); 180 181 EXPECT_TRUE(ftrace.SetClock("global")); 182 EXPECT_EQ(ftrace.GetClock(), "global"); 183 EXPECT_TRUE(ftrace.SetClock("local")); 184 EXPECT_EQ(ftrace.GetClock(), "local"); 185 } 186 187 #if PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) 188 #define MAYBE_CanSetBufferSize CanSetBufferSize 189 #else 190 #define MAYBE_CanSetBufferSize DISABLED_CanSetBufferSize 191 #endif 192 TEST(FtraceProcfsIntegrationTest, MAYBE_CanSetBufferSize) { 193 FtraceProcfs ftrace(GetFtracePath()); 194 EXPECT_TRUE(ftrace.SetCpuBufferSizeInPages(4ul)); 195 EXPECT_EQ(ReadFile("buffer_size_kb"), "16\n"); // (4096 * 4) / 1024 196 EXPECT_TRUE(ftrace.SetCpuBufferSizeInPages(5ul)); 197 EXPECT_EQ(ReadFile("buffer_size_kb"), "20\n"); // (4096 * 5) / 1024 198 } 199 200 #if PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) 201 #define MAYBE_FtraceControllerHardReset FtraceControllerHardReset 202 #else 203 #define MAYBE_FtraceControllerHardReset DISABLED_FtraceControllerHardReset 204 #endif 205 TEST(FtraceProcfsIntegrationTest, MAYBE_FtraceControllerHardReset) { 206 FtraceProcfs ftrace(GetFtracePath()); 207 ResetFtrace(&ftrace); 208 209 ftrace.SetCpuBufferSizeInPages(4ul); 210 ftrace.EnableTracing(); 211 ftrace.EnableEvent("sched", "sched_switch"); 212 ftrace.WriteTraceMarker("Hello, World!"); 213 214 EXPECT_EQ(ReadFile("buffer_size_kb"), "16\n"); 215 EXPECT_EQ(ReadFile("tracing_on"), "1\n"); 216 EXPECT_EQ(ReadFile("events/enable"), "X\n"); 217 EXPECT_THAT(GetTraceOutput(), HasSubstr("Hello")); 218 219 HardResetFtraceState(); 220 221 EXPECT_EQ(ReadFile("buffer_size_kb"), "4\n"); 222 EXPECT_EQ(ReadFile("tracing_on"), "0\n"); 223 EXPECT_EQ(ReadFile("events/enable"), "0\n"); 224 EXPECT_THAT(GetTraceOutput(), Not(HasSubstr("Hello"))); 225 } 226 227 } // namespace perfetto 228