| 1 | |
| 2 | #include <linux/compiler.h>
|
| 3 | #include "event.h"
|
| 4 | #include "tests.h"
|
| 5 | #include "stat.h"
|
| 6 | #include "counts.h"
|
| 7 | #include "debug.h"
|
| 8 | #include "util/synthetic-events.h"
|
| 9 |
|
| 10 | static bool has_term(struct perf_record_stat_config *config,
|
| 11 | u64 tag, u64 val)
|
| 12 | {
|
| 13 | unsigned i;
|
| 14 |
|
| 15 | for (i = 0; i < config->nr; i++) {
|
| 16 | if ((config->data[i].tag == tag) &&
|
| 17 | (config->data[i].val == val))
|
| 18 | return true;
|
| 19 | }
|
| 20 |
|
| 21 | return false;
|
| 22 | }
|
| 23 |
|
| 24 | static int process_stat_config_event(const struct perf_tool *tool __maybe_unused,
|
| 25 | union perf_event *event,
|
| 26 | struct perf_sample *sample __maybe_unused,
|
| 27 | struct machine *machine __maybe_unused)
|
| 28 | {
|
| 29 | struct perf_record_stat_config *config = &event->stat_config;
|
| 30 | struct perf_stat_config test_stat_config = {};
|
| 31 |
|
| 32 | #define HAS(term, val) \
|
| 33 | has_term(config, PERF_STAT_CONFIG_TERM__##term, val)
|
| 34 |
|
| 35 | TEST_ASSERT_VAL("wrong nr", config->nr == PERF_STAT_CONFIG_TERM__MAX);
|
| 36 | TEST_ASSERT_VAL("wrong aggr_mode", HAS(AGGR_MODE, AGGR_CORE));
|
| 37 | TEST_ASSERT_VAL("wrong scale", HAS(SCALE, 1));
|
| 38 | TEST_ASSERT_VAL("wrong interval", HAS(INTERVAL, 1));
|
| 39 |
|
| 40 | #undef HAS
|
| 41 |
|
| 42 | perf_event__read_stat_config(&test_stat_config, config);
|
| 43 |
|
| 44 | TEST_ASSERT_VAL("wrong aggr_mode", test_stat_config.aggr_mode == AGGR_CORE);
|
| 45 | TEST_ASSERT_VAL("wrong scale", test_stat_config.scale == 1);
|
| 46 | TEST_ASSERT_VAL("wrong interval", test_stat_config.interval == 1);
|
| 47 | return 0;
|
| 48 | }
|
| 49 |
|
| 50 | static int test__synthesize_stat_config(struct test_suite *test __maybe_unused,
|
| 51 | int subtest __maybe_unused)
|
| 52 | {
|
| 53 | struct perf_stat_config test_stat_config = {
|
| 54 | .aggr_mode = AGGR_CORE,
|
| 55 | .scale = 1,
|
| 56 | .interval = 1,
|
| 57 | };
|
| 58 |
|
| 59 | TEST_ASSERT_VAL("failed to synthesize stat_config",
|
| 60 | !perf_event__synthesize_stat_config(NULL, &test_stat_config,
|
| 61 | process_stat_config_event,
|
| 62 | NULL));
|
| 63 |
|
| 64 | return 0;
|
| 65 | }
|
| 66 |
|
| 67 | static int process_stat_event(const struct perf_tool *tool __maybe_unused,
|
| 68 | union perf_event *event,
|
| 69 | struct perf_sample *sample __maybe_unused,
|
| 70 | struct machine *machine __maybe_unused)
|
| 71 | {
|
| 72 | struct perf_record_stat *st = &event->stat;
|
| 73 |
|
| 74 | TEST_ASSERT_VAL("wrong cpu", st->cpu == 1);
|
| 75 | TEST_ASSERT_VAL("wrong thread", st->thread == 2);
|
| 76 | TEST_ASSERT_VAL("wrong id", st->id == 3);
|
| 77 | TEST_ASSERT_VAL("wrong val", st->val == 100);
|
| 78 | TEST_ASSERT_VAL("wrong run", st->ena == 200);
|
| 79 | TEST_ASSERT_VAL("wrong ena", st->run == 300);
|
| 80 | return 0;
|
| 81 | }
|
| 82 |
|
| 83 | static int test__synthesize_stat(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
|
| 84 | {
|
| 85 | struct perf_counts_values count;
|
| 86 |
|
| 87 | count.val = 100;
|
| 88 | count.ena = 200;
|
| 89 | count.run = 300;
|
| 90 |
|
| 91 | TEST_ASSERT_VAL("failed to synthesize stat_config",
|
| 92 | !perf_event__synthesize_stat(NULL, (struct perf_cpu){.cpu = 1}, 2, 3,
|
| 93 | &count, process_stat_event, NULL));
|
| 94 |
|
| 95 | return 0;
|
| 96 | }
|
| 97 |
|
| 98 | static int process_stat_round_event(const struct perf_tool *tool __maybe_unused,
|
| 99 | union perf_event *event,
|
| 100 | struct perf_sample *sample __maybe_unused,
|
| 101 | struct machine *machine __maybe_unused)
|
| 102 | {
|
| 103 | struct perf_record_stat_round *stat_round = &event->stat_round;
|
| 104 |
|
| 105 | TEST_ASSERT_VAL("wrong time", stat_round->time == 0xdeadbeef);
|
| 106 | TEST_ASSERT_VAL("wrong type", stat_round->type == PERF_STAT_ROUND_TYPE__INTERVAL);
|
| 107 | return 0;
|
| 108 | }
|
| 109 |
|
| 110 | static int test__synthesize_stat_round(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
|
| 111 | {
|
| 112 | TEST_ASSERT_VAL("failed to synthesize stat_config",
|
| 113 | !perf_event__synthesize_stat_round(NULL, 0xdeadbeef, PERF_STAT_ROUND_TYPE__INTERVAL,
|
| 114 | process_stat_round_event, NULL));
|
| 115 |
|
| 116 | return 0;
|
| 117 | }
|
| 118 |
|
| 119 | DEFINE_SUITE("Synthesize stat config", synthesize_stat_config);
|
| 120 | DEFINE_SUITE("Synthesize stat", synthesize_stat);
|
| 121 | DEFINE_SUITE("Synthesize stat round", synthesize_stat_round);
|