summaryrefslogtreecommitdiff
path: root/simpleperf/cmd_record_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'simpleperf/cmd_record_test.cpp')
-rw-r--r--simpleperf/cmd_record_test.cpp37
1 files changed, 37 insertions, 0 deletions
diff --git a/simpleperf/cmd_record_test.cpp b/simpleperf/cmd_record_test.cpp
index 8780cfcc..21eb8846 100644
--- a/simpleperf/cmd_record_test.cpp
+++ b/simpleperf/cmd_record_test.cpp
@@ -16,10 +16,12 @@
#include <gtest/gtest.h>
+#include <android-base/file.h>
#include <android-base/stringprintf.h>
#include <android-base/test_utils.h>
#include <memory>
+#include <regex>
#include "command.h"
#include "environment.h"
@@ -49,16 +51,19 @@ static bool RunRecordCmd(std::vector<std::string> v, const char* output_file = n
}
TEST(record_cmd, no_options) {
+ TEST_REQUIRE_HW_COUNTER();
ASSERT_TRUE(RunRecordCmd({}));
}
TEST(record_cmd, system_wide_option) {
+ TEST_REQUIRE_HW_COUNTER();
if (IsRoot()) {
ASSERT_TRUE(RunRecordCmd({"-a"}));
}
}
TEST(record_cmd, sample_period_option) {
+ TEST_REQUIRE_HW_COUNTER();
ASSERT_TRUE(RunRecordCmd({"-c", "100000"}));
}
@@ -67,16 +72,19 @@ TEST(record_cmd, event_option) {
}
TEST(record_cmd, freq_option) {
+ TEST_REQUIRE_HW_COUNTER();
ASSERT_TRUE(RunRecordCmd({"-f", "99"}));
ASSERT_TRUE(RunRecordCmd({"-F", "99"}));
}
TEST(record_cmd, output_file_option) {
+ TEST_REQUIRE_HW_COUNTER();
TemporaryFile tmpfile;
ASSERT_TRUE(RecordCmd()->Run({"-o", tmpfile.path, "sleep", SLEEP_SEC}));
}
TEST(record_cmd, dump_kernel_mmap) {
+ TEST_REQUIRE_HW_COUNTER();
TemporaryFile tmpfile;
ASSERT_TRUE(RunRecordCmd({}, tmpfile.path));
std::unique_ptr<RecordFileReader> reader = RecordFileReader::CreateInstance(tmpfile.path);
@@ -97,6 +105,7 @@ TEST(record_cmd, dump_kernel_mmap) {
}
TEST(record_cmd, dump_build_id_feature) {
+ TEST_REQUIRE_HW_COUNTER();
TemporaryFile tmpfile;
ASSERT_TRUE(RunRecordCmd({}, tmpfile.path));
std::unique_ptr<RecordFileReader> reader = RecordFileReader::CreateInstance(tmpfile.path);
@@ -113,6 +122,7 @@ TEST(record_cmd, tracepoint_event) {
}
TEST(record_cmd, branch_sampling) {
+ TEST_REQUIRE_HW_COUNTER();
if (IsBranchSamplingSupported()) {
ASSERT_TRUE(RunRecordCmd({"-b"}));
ASSERT_TRUE(RunRecordCmd({"-j", "any,any_call,any_ret,ind_call"}));
@@ -126,14 +136,34 @@ TEST(record_cmd, branch_sampling) {
}
TEST(record_cmd, event_modifier) {
+ TEST_REQUIRE_HW_COUNTER();
ASSERT_TRUE(RunRecordCmd({"-e", "cpu-cycles:u"}));
}
TEST(record_cmd, fp_callchain_sampling) {
+ TEST_REQUIRE_HW_COUNTER();
ASSERT_TRUE(RunRecordCmd({"--call-graph", "fp"}));
}
+bool HasHardwareCounter() {
+ static int has_hw_counter = -1;
+ if (has_hw_counter == -1) {
+ has_hw_counter = 1;
+#if defined(__arm__)
+ std::string cpu_info;
+ if (android::base::ReadFileToString("/proc/cpuinfo", &cpu_info)) {
+ std::string hardware = GetHardwareFromCpuInfo(cpu_info);
+ if (std::regex_search(hardware, std::regex(R"(i\.MX6.*Quad)"))) {
+ has_hw_counter = 0;
+ }
+ }
+#endif
+ }
+ return has_hw_counter == 1;
+}
+
TEST(record_cmd, dwarf_callchain_sampling) {
+ TEST_REQUIRE_HW_COUNTER();
if (IsDwarfCallChainSamplingSupported()) {
ASSERT_TRUE(RunRecordCmd({"--call-graph", "dwarf"}));
ASSERT_TRUE(RunRecordCmd({"--call-graph", "dwarf,16384"}));
@@ -145,6 +175,7 @@ TEST(record_cmd, dwarf_callchain_sampling) {
}
TEST(record_cmd, no_unwind_option) {
+ TEST_REQUIRE_HW_COUNTER();
if (IsDwarfCallChainSamplingSupported()) {
ASSERT_TRUE(RunRecordCmd({"--call-graph", "dwarf", "--no-unwind"}));
} else {
@@ -155,6 +186,7 @@ TEST(record_cmd, no_unwind_option) {
}
TEST(record_cmd, post_unwind_option) {
+ TEST_REQUIRE_HW_COUNTER();
if (IsDwarfCallChainSamplingSupported()) {
ASSERT_TRUE(RunRecordCmd({"--call-graph", "dwarf", "--post-unwind"}));
} else {
@@ -167,6 +199,7 @@ TEST(record_cmd, post_unwind_option) {
}
TEST(record_cmd, existing_processes) {
+ TEST_REQUIRE_HW_COUNTER();
std::vector<std::unique_ptr<Workload>> workloads;
CreateProcesses(2, &workloads);
std::string pid_list =
@@ -175,6 +208,7 @@ TEST(record_cmd, existing_processes) {
}
TEST(record_cmd, existing_threads) {
+ TEST_REQUIRE_HW_COUNTER();
std::vector<std::unique_ptr<Workload>> workloads;
CreateProcesses(2, &workloads);
// Process id can also be used as thread id in linux.
@@ -185,15 +219,18 @@ TEST(record_cmd, existing_threads) {
}
TEST(record_cmd, no_monitored_threads) {
+ TEST_REQUIRE_HW_COUNTER();
ASSERT_FALSE(RecordCmd()->Run({""}));
}
TEST(record_cmd, more_than_one_event_types) {
+ TEST_REQUIRE_HW_COUNTER();
ASSERT_TRUE(RunRecordCmd({"-e", "cpu-cycles,cpu-clock"}));
ASSERT_TRUE(RunRecordCmd({"-e", "cpu-cycles", "-e", "cpu-clock"}));
}
TEST(record_cmd, mmap_page_option) {
+ TEST_REQUIRE_HW_COUNTER();
ASSERT_TRUE(RunRecordCmd({"-m", "1"}));
ASSERT_FALSE(RunRecordCmd({"-m", "0"}));
ASSERT_FALSE(RunRecordCmd({"-m", "7"}));