linux/tools/perf/tests/hists_output.c
<<
>>
Prefs
   1#include "perf.h"
   2#include "util/debug.h"
   3#include "util/symbol.h"
   4#include "util/sort.h"
   5#include "util/evsel.h"
   6#include "util/evlist.h"
   7#include "util/machine.h"
   8#include "util/thread.h"
   9#include "util/parse-events.h"
  10#include "tests/tests.h"
  11#include "tests/hists_common.h"
  12
  13struct sample {
  14        u32 cpu;
  15        u32 pid;
  16        u64 ip;
  17        struct thread *thread;
  18        struct map *map;
  19        struct symbol *sym;
  20};
  21
  22/* For the numbers, see hists_common.c */
  23static struct sample fake_samples[] = {
  24        /* perf [kernel] schedule() */
  25        { .cpu = 0, .pid = FAKE_PID_PERF1, .ip = FAKE_IP_KERNEL_SCHEDULE, },
  26        /* perf [perf]   main() */
  27        { .cpu = 1, .pid = FAKE_PID_PERF1, .ip = FAKE_IP_PERF_MAIN, },
  28        /* perf [perf]   cmd_record() */
  29        { .cpu = 1, .pid = FAKE_PID_PERF1, .ip = FAKE_IP_PERF_CMD_RECORD, },
  30        /* perf [libc]   malloc() */
  31        { .cpu = 1, .pid = FAKE_PID_PERF1, .ip = FAKE_IP_LIBC_MALLOC, },
  32        /* perf [libc]   free() */
  33        { .cpu = 2, .pid = FAKE_PID_PERF1, .ip = FAKE_IP_LIBC_FREE, },
  34        /* perf [perf]   main() */
  35        { .cpu = 2, .pid = FAKE_PID_PERF2, .ip = FAKE_IP_PERF_MAIN, },
  36        /* perf [kernel] page_fault() */
  37        { .cpu = 2, .pid = FAKE_PID_PERF2, .ip = FAKE_IP_KERNEL_PAGE_FAULT, },
  38        /* bash [bash]   main() */
  39        { .cpu = 3, .pid = FAKE_PID_BASH,  .ip = FAKE_IP_BASH_MAIN, },
  40        /* bash [bash]   xmalloc() */
  41        { .cpu = 0, .pid = FAKE_PID_BASH,  .ip = FAKE_IP_BASH_XMALLOC, },
  42        /* bash [kernel] page_fault() */
  43        { .cpu = 1, .pid = FAKE_PID_BASH,  .ip = FAKE_IP_KERNEL_PAGE_FAULT, },
  44};
  45
  46static int add_hist_entries(struct hists *hists, struct machine *machine)
  47{
  48        struct addr_location al;
  49        struct perf_evsel *evsel = hists_to_evsel(hists);
  50        struct perf_sample sample = { .period = 100, };
  51        size_t i;
  52
  53        for (i = 0; i < ARRAY_SIZE(fake_samples); i++) {
  54                struct hist_entry_iter iter = {
  55                        .evsel = evsel,
  56                        .sample = &sample,
  57                        .ops = &hist_iter_normal,
  58                        .hide_unresolved = false,
  59                };
  60
  61                sample.cpumode = PERF_RECORD_MISC_USER;
  62                sample.cpu = fake_samples[i].cpu;
  63                sample.pid = fake_samples[i].pid;
  64                sample.tid = fake_samples[i].pid;
  65                sample.ip = fake_samples[i].ip;
  66
  67                if (machine__resolve(machine, &al, &sample) < 0)
  68                        goto out;
  69
  70                if (hist_entry_iter__add(&iter, &al, sysctl_perf_event_max_stack,
  71                                         NULL) < 0) {
  72                        addr_location__put(&al);
  73                        goto out;
  74                }
  75
  76                fake_samples[i].thread = al.thread;
  77                fake_samples[i].map = al.map;
  78                fake_samples[i].sym = al.sym;
  79        }
  80
  81        return TEST_OK;
  82
  83out:
  84        pr_debug("Not enough memory for adding a hist entry\n");
  85        return TEST_FAIL;
  86}
  87
  88static void del_hist_entries(struct hists *hists)
  89{
  90        struct hist_entry *he;
  91        struct rb_root *root_in;
  92        struct rb_root *root_out;
  93        struct rb_node *node;
  94
  95        if (hists__has(hists, need_collapse))
  96                root_in = &hists->entries_collapsed;
  97        else
  98                root_in = hists->entries_in;
  99
 100        root_out = &hists->entries;
 101
 102        while (!RB_EMPTY_ROOT(root_out)) {
 103                node = rb_first(root_out);
 104
 105                he = rb_entry(node, struct hist_entry, rb_node);
 106                rb_erase(node, root_out);
 107                rb_erase(&he->rb_node_in, root_in);
 108                hist_entry__delete(he);
 109        }
 110}
 111
 112typedef int (*test_fn_t)(struct perf_evsel *, struct machine *);
 113
 114#define COMM(he)  (thread__comm_str(he->thread))
 115#define DSO(he)   (he->ms.map->dso->short_name)
 116#define SYM(he)   (he->ms.sym->name)
 117#define CPU(he)   (he->cpu)
 118#define PID(he)   (he->thread->tid)
 119
 120/* default sort keys (no field) */
 121static int test1(struct perf_evsel *evsel, struct machine *machine)
 122{
 123        int err;
 124        struct hists *hists = evsel__hists(evsel);
 125        struct hist_entry *he;
 126        struct rb_root *root;
 127        struct rb_node *node;
 128
 129        field_order = NULL;
 130        sort_order = NULL; /* equivalent to sort_order = "comm,dso,sym" */
 131
 132        setup_sorting(NULL);
 133
 134        /*
 135         * expected output:
 136         *
 137         * Overhead  Command  Shared Object          Symbol
 138         * ========  =======  =============  ==============
 139         *   20.00%     perf  perf           [.] main
 140         *   10.00%     bash  [kernel]       [k] page_fault
 141         *   10.00%     bash  bash           [.] main
 142         *   10.00%     bash  bash           [.] xmalloc
 143         *   10.00%     perf  [kernel]       [k] page_fault
 144         *   10.00%     perf  [kernel]       [k] schedule
 145         *   10.00%     perf  libc           [.] free
 146         *   10.00%     perf  libc           [.] malloc
 147         *   10.00%     perf  perf           [.] cmd_record
 148         */
 149        err = add_hist_entries(hists, machine);
 150        if (err < 0)
 151                goto out;
 152
 153        hists__collapse_resort(hists, NULL);
 154        perf_evsel__output_resort(evsel, NULL);
 155
 156        if (verbose > 2) {
 157                pr_info("[fields = %s, sort = %s]\n", field_order, sort_order);
 158                print_hists_out(hists);
 159        }
 160
 161        root = &hists->entries;
 162        node = rb_first(root);
 163        he = rb_entry(node, struct hist_entry, rb_node);
 164        TEST_ASSERT_VAL("Invalid hist entry",
 165                        !strcmp(COMM(he), "perf") && !strcmp(DSO(he), "perf") &&
 166                        !strcmp(SYM(he), "main") && he->stat.period == 200);
 167
 168        node = rb_next(node);
 169        he = rb_entry(node, struct hist_entry, rb_node);
 170        TEST_ASSERT_VAL("Invalid hist entry",
 171                        !strcmp(COMM(he), "bash") && !strcmp(DSO(he), "[kernel]") &&
 172                        !strcmp(SYM(he), "page_fault") && he->stat.period == 100);
 173
 174        node = rb_next(node);
 175        he = rb_entry(node, struct hist_entry, rb_node);
 176        TEST_ASSERT_VAL("Invalid hist entry",
 177                        !strcmp(COMM(he), "bash") && !strcmp(DSO(he), "bash") &&
 178                        !strcmp(SYM(he), "main") && he->stat.period == 100);
 179
 180        node = rb_next(node);
 181        he = rb_entry(node, struct hist_entry, rb_node);
 182        TEST_ASSERT_VAL("Invalid hist entry",
 183                        !strcmp(COMM(he), "bash") && !strcmp(DSO(he), "bash") &&
 184                        !strcmp(SYM(he), "xmalloc") && he->stat.period == 100);
 185
 186        node = rb_next(node);
 187        he = rb_entry(node, struct hist_entry, rb_node);
 188        TEST_ASSERT_VAL("Invalid hist entry",
 189                        !strcmp(COMM(he), "perf") && !strcmp(DSO(he), "[kernel]") &&
 190                        !strcmp(SYM(he), "page_fault") && he->stat.period == 100);
 191
 192        node = rb_next(node);
 193        he = rb_entry(node, struct hist_entry, rb_node);
 194        TEST_ASSERT_VAL("Invalid hist entry",
 195                        !strcmp(COMM(he), "perf") && !strcmp(DSO(he), "[kernel]") &&
 196                        !strcmp(SYM(he), "schedule") && he->stat.period == 100);
 197
 198        node = rb_next(node);
 199        he = rb_entry(node, struct hist_entry, rb_node);
 200        TEST_ASSERT_VAL("Invalid hist entry",
 201                        !strcmp(COMM(he), "perf") && !strcmp(DSO(he), "libc") &&
 202                        !strcmp(SYM(he), "free") && he->stat.period == 100);
 203
 204        node = rb_next(node);
 205        he = rb_entry(node, struct hist_entry, rb_node);
 206        TEST_ASSERT_VAL("Invalid hist entry",
 207                        !strcmp(COMM(he), "perf") && !strcmp(DSO(he), "libc") &&
 208                        !strcmp(SYM(he), "malloc") && he->stat.period == 100);
 209
 210        node = rb_next(node);
 211        he = rb_entry(node, struct hist_entry, rb_node);
 212        TEST_ASSERT_VAL("Invalid hist entry",
 213                        !strcmp(COMM(he), "perf") && !strcmp(DSO(he), "perf") &&
 214                        !strcmp(SYM(he), "cmd_record") && he->stat.period == 100);
 215
 216out:
 217        del_hist_entries(hists);
 218        reset_output_field();
 219        return err;
 220}
 221
 222/* mixed fields and sort keys */
 223static int test2(struct perf_evsel *evsel, struct machine *machine)
 224{
 225        int err;
 226        struct hists *hists = evsel__hists(evsel);
 227        struct hist_entry *he;
 228        struct rb_root *root;
 229        struct rb_node *node;
 230
 231        field_order = "overhead,cpu";
 232        sort_order = "pid";
 233
 234        setup_sorting(NULL);
 235
 236        /*
 237         * expected output:
 238         *
 239         * Overhead  CPU  Command:  Pid
 240         * ========  ===  =============
 241         *   30.00%    1  perf   :  100
 242         *   10.00%    0  perf   :  100
 243         *   10.00%    2  perf   :  100
 244         *   20.00%    2  perf   :  200
 245         *   10.00%    0  bash   :  300
 246         *   10.00%    1  bash   :  300
 247         *   10.00%    3  bash   :  300
 248         */
 249        err = add_hist_entries(hists, machine);
 250        if (err < 0)
 251                goto out;
 252
 253        hists__collapse_resort(hists, NULL);
 254        perf_evsel__output_resort(evsel, NULL);
 255
 256        if (verbose > 2) {
 257                pr_info("[fields = %s, sort = %s]\n", field_order, sort_order);
 258                print_hists_out(hists);
 259        }
 260
 261        root = &hists->entries;
 262        node = rb_first(root);
 263        he = rb_entry(node, struct hist_entry, rb_node);
 264        TEST_ASSERT_VAL("Invalid hist entry",
 265                        CPU(he) == 1 && PID(he) == 100 && he->stat.period == 300);
 266
 267        node = rb_next(node);
 268        he = rb_entry(node, struct hist_entry, rb_node);
 269        TEST_ASSERT_VAL("Invalid hist entry",
 270                        CPU(he) == 0 && PID(he) == 100 && he->stat.period == 100);
 271
 272out:
 273        del_hist_entries(hists);
 274        reset_output_field();
 275        return err;
 276}
 277
 278/* fields only (no sort key) */
 279static int test3(struct perf_evsel *evsel, struct machine *machine)
 280{
 281        int err;
 282        struct hists *hists = evsel__hists(evsel);
 283        struct hist_entry *he;
 284        struct rb_root *root;
 285        struct rb_node *node;
 286
 287        field_order = "comm,overhead,dso";
 288        sort_order = NULL;
 289
 290        setup_sorting(NULL);
 291
 292        /*
 293         * expected output:
 294         *
 295         * Command  Overhead  Shared Object
 296         * =======  ========  =============
 297         *    bash    20.00%  bash
 298         *    bash    10.00%  [kernel]
 299         *    perf    30.00%  perf
 300         *    perf    20.00%  [kernel]
 301         *    perf    20.00%  libc
 302         */
 303        err = add_hist_entries(hists, machine);
 304        if (err < 0)
 305                goto out;
 306
 307        hists__collapse_resort(hists, NULL);
 308        perf_evsel__output_resort(evsel, NULL);
 309
 310        if (verbose > 2) {
 311                pr_info("[fields = %s, sort = %s]\n", field_order, sort_order);
 312                print_hists_out(hists);
 313        }
 314
 315        root = &hists->entries;
 316        node = rb_first(root);
 317        he = rb_entry(node, struct hist_entry, rb_node);
 318        TEST_ASSERT_VAL("Invalid hist entry",
 319                        !strcmp(COMM(he), "bash") && !strcmp(DSO(he), "bash") &&
 320                        he->stat.period == 200);
 321
 322        node = rb_next(node);
 323        he = rb_entry(node, struct hist_entry, rb_node);
 324        TEST_ASSERT_VAL("Invalid hist entry",
 325                        !strcmp(COMM(he), "bash") && !strcmp(DSO(he), "[kernel]") &&
 326                        he->stat.period == 100);
 327
 328        node = rb_next(node);
 329        he = rb_entry(node, struct hist_entry, rb_node);
 330        TEST_ASSERT_VAL("Invalid hist entry",
 331                        !strcmp(COMM(he), "perf") && !strcmp(DSO(he), "perf") &&
 332                        he->stat.period == 300);
 333
 334        node = rb_next(node);
 335        he = rb_entry(node, struct hist_entry, rb_node);
 336        TEST_ASSERT_VAL("Invalid hist entry",
 337                        !strcmp(COMM(he), "perf") && !strcmp(DSO(he), "[kernel]") &&
 338                        he->stat.period == 200);
 339
 340        node = rb_next(node);
 341        he = rb_entry(node, struct hist_entry, rb_node);
 342        TEST_ASSERT_VAL("Invalid hist entry",
 343                        !strcmp(COMM(he), "perf") && !strcmp(DSO(he), "libc") &&
 344                        he->stat.period == 200);
 345
 346out:
 347        del_hist_entries(hists);
 348        reset_output_field();
 349        return err;
 350}
 351
 352/* handle duplicate 'dso' field */
 353static int test4(struct perf_evsel *evsel, struct machine *machine)
 354{
 355        int err;
 356        struct hists *hists = evsel__hists(evsel);
 357        struct hist_entry *he;
 358        struct rb_root *root;
 359        struct rb_node *node;
 360
 361        field_order = "dso,sym,comm,overhead,dso";
 362        sort_order = "sym";
 363
 364        setup_sorting(NULL);
 365
 366        /*
 367         * expected output:
 368         *
 369         * Shared Object          Symbol  Command  Overhead
 370         * =============  ==============  =======  ========
 371         *          perf  [.] cmd_record     perf    10.00%
 372         *          libc  [.] free           perf    10.00%
 373         *          bash  [.] main           bash    10.00%
 374         *          perf  [.] main           perf    20.00%
 375         *          libc  [.] malloc         perf    10.00%
 376         *      [kernel]  [k] page_fault     bash    10.00%
 377         *      [kernel]  [k] page_fault     perf    10.00%
 378         *      [kernel]  [k] schedule       perf    10.00%
 379         *          bash  [.] xmalloc        bash    10.00%
 380         */
 381        err = add_hist_entries(hists, machine);
 382        if (err < 0)
 383                goto out;
 384
 385        hists__collapse_resort(hists, NULL);
 386        perf_evsel__output_resort(evsel, NULL);
 387
 388        if (verbose > 2) {
 389                pr_info("[fields = %s, sort = %s]\n", field_order, sort_order);
 390                print_hists_out(hists);
 391        }
 392
 393        root = &hists->entries;
 394        node = rb_first(root);
 395        he = rb_entry(node, struct hist_entry, rb_node);
 396        TEST_ASSERT_VAL("Invalid hist entry",
 397                        !strcmp(DSO(he), "perf") && !strcmp(SYM(he), "cmd_record") &&
 398                        !strcmp(COMM(he), "perf") && he->stat.period == 100);
 399
 400        node = rb_next(node);
 401        he = rb_entry(node, struct hist_entry, rb_node);
 402        TEST_ASSERT_VAL("Invalid hist entry",
 403                        !strcmp(DSO(he), "libc") && !strcmp(SYM(he), "free") &&
 404                        !strcmp(COMM(he), "perf") && he->stat.period == 100);
 405
 406        node = rb_next(node);
 407        he = rb_entry(node, struct hist_entry, rb_node);
 408        TEST_ASSERT_VAL("Invalid hist entry",
 409                        !strcmp(DSO(he), "bash") && !strcmp(SYM(he), "main") &&
 410                        !strcmp(COMM(he), "bash") && he->stat.period == 100);
 411
 412        node = rb_next(node);
 413        he = rb_entry(node, struct hist_entry, rb_node);
 414        TEST_ASSERT_VAL("Invalid hist entry",
 415                        !strcmp(DSO(he), "perf") && !strcmp(SYM(he), "main") &&
 416                        !strcmp(COMM(he), "perf") && he->stat.period == 200);
 417
 418        node = rb_next(node);
 419        he = rb_entry(node, struct hist_entry, rb_node);
 420        TEST_ASSERT_VAL("Invalid hist entry",
 421                        !strcmp(DSO(he), "libc") && !strcmp(SYM(he), "malloc") &&
 422                        !strcmp(COMM(he), "perf") && he->stat.period == 100);
 423
 424        node = rb_next(node);
 425        he = rb_entry(node, struct hist_entry, rb_node);
 426        TEST_ASSERT_VAL("Invalid hist entry",
 427                        !strcmp(DSO(he), "[kernel]") && !strcmp(SYM(he), "page_fault") &&
 428                        !strcmp(COMM(he), "bash") && he->stat.period == 100);
 429
 430        node = rb_next(node);
 431        he = rb_entry(node, struct hist_entry, rb_node);
 432        TEST_ASSERT_VAL("Invalid hist entry",
 433                        !strcmp(DSO(he), "[kernel]") && !strcmp(SYM(he), "page_fault") &&
 434                        !strcmp(COMM(he), "perf") && he->stat.period == 100);
 435
 436        node = rb_next(node);
 437        he = rb_entry(node, struct hist_entry, rb_node);
 438        TEST_ASSERT_VAL("Invalid hist entry",
 439                        !strcmp(DSO(he), "[kernel]") && !strcmp(SYM(he), "schedule") &&
 440                        !strcmp(COMM(he), "perf") && he->stat.period == 100);
 441
 442        node = rb_next(node);
 443        he = rb_entry(node, struct hist_entry, rb_node);
 444        TEST_ASSERT_VAL("Invalid hist entry",
 445                        !strcmp(DSO(he), "bash") && !strcmp(SYM(he), "xmalloc") &&
 446                        !strcmp(COMM(he), "bash") && he->stat.period == 100);
 447
 448out:
 449        del_hist_entries(hists);
 450        reset_output_field();
 451        return err;
 452}
 453
 454/* full sort keys w/o overhead field */
 455static int test5(struct perf_evsel *evsel, struct machine *machine)
 456{
 457        int err;
 458        struct hists *hists = evsel__hists(evsel);
 459        struct hist_entry *he;
 460        struct rb_root *root;
 461        struct rb_node *node;
 462
 463        field_order = "cpu,pid,comm,dso,sym";
 464        sort_order = "dso,pid";
 465
 466        setup_sorting(NULL);
 467
 468        /*
 469         * expected output:
 470         *
 471         * CPU  Command:  Pid  Command  Shared Object          Symbol
 472         * ===  =============  =======  =============  ==============
 473         *   0     perf:  100     perf       [kernel]  [k] schedule
 474         *   2     perf:  200     perf       [kernel]  [k] page_fault
 475         *   1     bash:  300     bash       [kernel]  [k] page_fault
 476         *   0     bash:  300     bash           bash  [.] xmalloc
 477         *   3     bash:  300     bash           bash  [.] main
 478         *   1     perf:  100     perf           libc  [.] malloc
 479         *   2     perf:  100     perf           libc  [.] free
 480         *   1     perf:  100     perf           perf  [.] cmd_record
 481         *   1     perf:  100     perf           perf  [.] main
 482         *   2     perf:  200     perf           perf  [.] main
 483         */
 484        err = add_hist_entries(hists, machine);
 485        if (err < 0)
 486                goto out;
 487
 488        hists__collapse_resort(hists, NULL);
 489        perf_evsel__output_resort(evsel, NULL);
 490
 491        if (verbose > 2) {
 492                pr_info("[fields = %s, sort = %s]\n", field_order, sort_order);
 493                print_hists_out(hists);
 494        }
 495
 496        root = &hists->entries;
 497        node = rb_first(root);
 498        he = rb_entry(node, struct hist_entry, rb_node);
 499
 500        TEST_ASSERT_VAL("Invalid hist entry",
 501                        CPU(he) == 0 && PID(he) == 100 &&
 502                        !strcmp(COMM(he), "perf") && !strcmp(DSO(he), "[kernel]") &&
 503                        !strcmp(SYM(he), "schedule") && he->stat.period == 100);
 504
 505        node = rb_next(node);
 506        he = rb_entry(node, struct hist_entry, rb_node);
 507        TEST_ASSERT_VAL("Invalid hist entry",
 508                        CPU(he) == 2 && PID(he) == 200 &&
 509                        !strcmp(COMM(he), "perf") && !strcmp(DSO(he), "[kernel]") &&
 510                        !strcmp(SYM(he), "page_fault") && he->stat.period == 100);
 511
 512        node = rb_next(node);
 513        he = rb_entry(node, struct hist_entry, rb_node);
 514        TEST_ASSERT_VAL("Invalid hist entry",
 515                        CPU(he) == 1 && PID(he) == 300 &&
 516                        !strcmp(COMM(he), "bash") && !strcmp(DSO(he), "[kernel]") &&
 517                        !strcmp(SYM(he), "page_fault") && he->stat.period == 100);
 518
 519        node = rb_next(node);
 520        he = rb_entry(node, struct hist_entry, rb_node);
 521        TEST_ASSERT_VAL("Invalid hist entry",
 522                        CPU(he) == 0 && PID(he) == 300 &&
 523                        !strcmp(COMM(he), "bash") && !strcmp(DSO(he), "bash") &&
 524                        !strcmp(SYM(he), "xmalloc") && he->stat.period == 100);
 525
 526        node = rb_next(node);
 527        he = rb_entry(node, struct hist_entry, rb_node);
 528        TEST_ASSERT_VAL("Invalid hist entry",
 529                        CPU(he) == 3 && PID(he) == 300 &&
 530                        !strcmp(COMM(he), "bash") && !strcmp(DSO(he), "bash") &&
 531                        !strcmp(SYM(he), "main") && he->stat.period == 100);
 532
 533        node = rb_next(node);
 534        he = rb_entry(node, struct hist_entry, rb_node);
 535        TEST_ASSERT_VAL("Invalid hist entry",
 536                        CPU(he) == 1 && PID(he) == 100 &&
 537                        !strcmp(COMM(he), "perf") && !strcmp(DSO(he), "libc") &&
 538                        !strcmp(SYM(he), "malloc") && he->stat.period == 100);
 539
 540        node = rb_next(node);
 541        he = rb_entry(node, struct hist_entry, rb_node);
 542        TEST_ASSERT_VAL("Invalid hist entry",
 543                        CPU(he) == 2 && PID(he) == 100 &&
 544                        !strcmp(COMM(he), "perf") && !strcmp(DSO(he), "libc") &&
 545                        !strcmp(SYM(he), "free") && he->stat.period == 100);
 546
 547        node = rb_next(node);
 548        he = rb_entry(node, struct hist_entry, rb_node);
 549        TEST_ASSERT_VAL("Invalid hist entry",
 550                        CPU(he) == 1 && PID(he) == 100 &&
 551                        !strcmp(COMM(he), "perf") && !strcmp(DSO(he), "perf") &&
 552                        !strcmp(SYM(he), "cmd_record") && he->stat.period == 100);
 553
 554        node = rb_next(node);
 555        he = rb_entry(node, struct hist_entry, rb_node);
 556        TEST_ASSERT_VAL("Invalid hist entry",
 557                        CPU(he) == 1 && PID(he) == 100 &&
 558                        !strcmp(COMM(he), "perf") && !strcmp(DSO(he), "perf") &&
 559                        !strcmp(SYM(he), "main") && he->stat.period == 100);
 560
 561        node = rb_next(node);
 562        he = rb_entry(node, struct hist_entry, rb_node);
 563        TEST_ASSERT_VAL("Invalid hist entry",
 564                        CPU(he) == 2 && PID(he) == 200 &&
 565                        !strcmp(COMM(he), "perf") && !strcmp(DSO(he), "perf") &&
 566                        !strcmp(SYM(he), "main") && he->stat.period == 100);
 567
 568out:
 569        del_hist_entries(hists);
 570        reset_output_field();
 571        return err;
 572}
 573
 574int test__hists_output(int subtest __maybe_unused)
 575{
 576        int err = TEST_FAIL;
 577        struct machines machines;
 578        struct machine *machine;
 579        struct perf_evsel *evsel;
 580        struct perf_evlist *evlist = perf_evlist__new();
 581        size_t i;
 582        test_fn_t testcases[] = {
 583                test1,
 584                test2,
 585                test3,
 586                test4,
 587                test5,
 588        };
 589
 590        TEST_ASSERT_VAL("No memory", evlist);
 591
 592        err = parse_events(evlist, "cpu-clock", NULL);
 593        if (err)
 594                goto out;
 595        err = TEST_FAIL;
 596
 597        machines__init(&machines);
 598
 599        /* setup threads/dso/map/symbols also */
 600        machine = setup_fake_machine(&machines);
 601        if (!machine)
 602                goto out;
 603
 604        if (verbose > 1)
 605                machine__fprintf(machine, stderr);
 606
 607        evsel = perf_evlist__first(evlist);
 608
 609        for (i = 0; i < ARRAY_SIZE(testcases); i++) {
 610                err = testcases[i](evsel, machine);
 611                if (err < 0)
 612                        break;
 613        }
 614
 615out:
 616        /* tear down everything */
 617        perf_evlist__delete(evlist);
 618        machines__exit(&machines);
 619
 620        return err;
 621}
 622