projects/linux·blob master · refs

740 lines · 15.4 KiB

1// SPDX-License-Identifier: GPL-2.0
2
3#define _GNU_SOURCE
4#include <check.h>
5#include <stdio.h>
6#include <stdlib.h>
7#include <sched.h>
8#include <limits.h>
9#include <unistd.h>
10#include <sys/sysinfo.h>
11
12#include <linux/container_of.h>
13
14#include "cli_params_assert.h"
15#include "../../src/cli.h"
16
17#define PARSE_ARGS(...) char *argv[] = { __VA_ARGS__, NULL };\
18 int argc = sizeof(argv) / sizeof(char *) - 1;\
19 struct common_params *params =\
20 timerlat_hist_parse_args(argc, argv);\
21 struct timerlat_params *tlat_params __maybe_unused =\
22 to_timerlat_params(params)
23
24/* Tracing Options */
25
26START_TEST(test_irq_short)
27{
28 PARSE_ARGS("timerlat", "hist", "-i", "20");
29
30 ck_assert_int_eq(params->stop_us, 20);
31}
32END_TEST
33
34START_TEST(test_irq_long)
35{
36 PARSE_ARGS("timerlat", "hist", "--irq", "20");
37
38 ck_assert_int_eq(params->stop_us, 20);
39}
40END_TEST
41
42START_TEST(test_period_short)
43{
44 PARSE_ARGS("timerlat", "hist", "-p", "200");
45
46 ck_assert_int_eq(tlat_params->timerlat_period_us, 200);
47}
48END_TEST
49
50START_TEST(test_period_long)
51{
52 PARSE_ARGS("timerlat", "hist", "--period", "200");
53
54 ck_assert_int_eq(tlat_params->timerlat_period_us, 200);
55}
56END_TEST
57
58START_TEST(test_period_unset_short)
59{
60 PARSE_ARGS("timerlat", "hist", "-p", "200", "--no-period");
61
62 ck_assert_int_eq(tlat_params->timerlat_period_us, 0);
63}
64END_TEST
65
66START_TEST(test_period_unset_long)
67{
68 PARSE_ARGS("timerlat", "hist", "--period", "200", "--no-period");
69
70 ck_assert_int_eq(tlat_params->timerlat_period_us, 0);
71}
72END_TEST
73
74START_TEST(test_stack_short)
75{
76 PARSE_ARGS("timerlat", "hist", "-s", "20");
77
78 ck_assert_int_eq(tlat_params->print_stack, 20);
79}
80END_TEST
81
82START_TEST(test_stack_long)
83{
84 PARSE_ARGS("timerlat", "hist", "--stack", "20");
85
86 ck_assert_int_eq(tlat_params->print_stack, 20);
87}
88END_TEST
89
90START_TEST(test_thread_short)
91{
92 PARSE_ARGS("timerlat", "hist", "-T", "20");
93
94 ck_assert_int_eq(params->stop_total_us, 20);
95}
96END_TEST
97
98START_TEST(test_thread_long)
99{
100 PARSE_ARGS("timerlat", "hist", "--thread", "20");
101
102 ck_assert_int_eq(params->stop_total_us, 20);
103}
104END_TEST
105
106START_TEST(test_trace_short_noarg)
107{
108 PARSE_ARGS("timerlat", "hist", "-t");
109
110 CLI_ASSERT_SINGLE_ACTION(threshold_actions, ACTION_TRACE_OUTPUT, trace_output, str,
111 "timerlat_trace.txt");
112}
113END_TEST
114
115START_TEST(test_trace_short_followarg)
116{
117 PARSE_ARGS("timerlat", "hist", "-t", "-d", "20");
118
119 CLI_ASSERT_SINGLE_ACTION(threshold_actions, ACTION_TRACE_OUTPUT, trace_output, str,
120 "timerlat_trace.txt");
121 ck_assert_int_eq(params->duration, 20); /* check if next argument is read correctly */
122}
123END_TEST
124
125START_TEST(test_trace_short_space)
126{
127 PARSE_ARGS("timerlat", "hist", "-t", "tracefile");
128
129 CLI_ASSERT_SINGLE_ACTION(threshold_actions, ACTION_TRACE_OUTPUT, trace_output, str,
130 "tracefile");
131}
132END_TEST
133
134START_TEST(test_trace_short_equals)
135{
136 PARSE_ARGS("timerlat", "hist", "-t=tracefile");
137
138 CLI_ASSERT_SINGLE_ACTION(threshold_actions, ACTION_TRACE_OUTPUT, trace_output, str,
139 "tracefile");
140}
141END_TEST
142
143START_TEST(test_trace_long_noarg)
144{
145 PARSE_ARGS("timerlat", "hist", "--trace");
146
147 CLI_ASSERT_SINGLE_ACTION(threshold_actions, ACTION_TRACE_OUTPUT, trace_output, str,
148 "timerlat_trace.txt");
149}
150END_TEST
151
152START_TEST(test_trace_long_followarg)
153{
154 PARSE_ARGS("timerlat", "hist", "--trace", "-d", "20");
155
156 CLI_ASSERT_SINGLE_ACTION(threshold_actions, ACTION_TRACE_OUTPUT, trace_output, str,
157 "timerlat_trace.txt");
158 ck_assert_int_eq(params->duration, 20); /* check if next argument is read correctly */
159}
160END_TEST
161
162START_TEST(test_trace_long_space)
163{
164 PARSE_ARGS("timerlat", "hist", "--trace", "tracefile");
165
166 CLI_ASSERT_SINGLE_ACTION(threshold_actions, ACTION_TRACE_OUTPUT, trace_output, str,
167 "tracefile");
168}
169END_TEST
170
171START_TEST(test_trace_long_equals)
172{
173 PARSE_ARGS("timerlat", "hist", "--trace=tracefile");
174
175 CLI_ASSERT_SINGLE_ACTION(threshold_actions, ACTION_TRACE_OUTPUT, trace_output, str,
176 "tracefile");
177}
178END_TEST
179
180/* Event Configuration */
181
182START_TEST(test_event_short)
183{
184 PARSE_ARGS("timerlat", "hist", "-e", "system:event");
185
186 CLI_ASSERT_SINGLE_EVENT("system", "event");
187}
188END_TEST
189
190START_TEST(test_event_long)
191{
192 PARSE_ARGS("timerlat", "hist", "--event", "system:event");
193
194 CLI_ASSERT_SINGLE_EVENT("system", "event");
195}
196END_TEST
197
198START_TEST(test_filter)
199{
200 PARSE_ARGS("timerlat", "hist", "-e", "system:event", "--filter", "filter");
201
202 CLI_ASSERT_SINGLE_FILTER("filter");
203}
204END_TEST
205
206START_TEST(test_trigger)
207{
208 PARSE_ARGS("timerlat", "hist", "-e", "system:event", "--trigger", "trigger");
209
210 CLI_ASSERT_SINGLE_TRIGGER("trigger");
211}
212END_TEST
213
214/* CPU Configuration */
215
216START_TEST(test_cpus_short)
217{
218 nr_cpus = 4;
219
220 PARSE_ARGS("timerlat", "hist", "-c", "0-1,3");
221
222 ck_assert_str_eq(params->cpus, "0-1,3");
223 CLI_ASSERT_CPUSET(monitored_cpus, 0, 1, 3);
224}
225END_TEST
226
227START_TEST(test_cpus_long)
228{
229 nr_cpus = 4;
230
231 PARSE_ARGS("timerlat", "hist", "--cpus", "0-1,3");
232
233 ck_assert_str_eq(params->cpus, "0-1,3");
234 CLI_ASSERT_CPUSET(monitored_cpus, 0, 1, 3);
235}
236END_TEST
237
238START_TEST(test_housekeeping_short)
239{
240 nr_cpus = 4;
241
242 PARSE_ARGS("timerlat", "hist", "-H", "0-1,3");
243
244 CLI_ASSERT_CPUSET(hk_cpu_set, 0, 1, 3);
245}
246END_TEST
247
248START_TEST(test_housekeeping_long)
249{
250 nr_cpus = 4;
251
252 PARSE_ARGS("timerlat", "hist", "--house-keeping", "0-1,3");
253
254 CLI_ASSERT_CPUSET(hk_cpu_set, 0, 1, 3);
255}
256END_TEST
257
258/* Thread Configuration */
259
260START_TEST(test_cgroup_short_noarg)
261{
262 PARSE_ARGS("timerlat", "hist", "-C");
263
264 ck_assert(params->cgroup);
265 ck_assert_ptr_null(params->cgroup_name);
266}
267END_TEST
268
269START_TEST(test_cgroup_short_space)
270{
271 PARSE_ARGS("timerlat", "hist", "-C", "cgroup");
272
273 ck_assert(params->cgroup);
274 ck_assert_str_eq(params->cgroup_name, "cgroup");
275}
276END_TEST
277
278START_TEST(test_cgroup_short_equals)
279{
280 PARSE_ARGS("timerlat", "hist", "-C=cgroup");
281
282 ck_assert(params->cgroup);
283 ck_assert_str_eq(params->cgroup_name, "cgroup");
284}
285END_TEST
286
287START_TEST(test_cgroup_long_noarg)
288{
289 PARSE_ARGS("timerlat", "hist", "--cgroup");
290
291 ck_assert(params->cgroup);
292 ck_assert_ptr_null(params->cgroup_name);
293}
294END_TEST
295
296START_TEST(test_cgroup_long_space)
297{
298 PARSE_ARGS("timerlat", "hist", "--cgroup", "cgroup");
299
300 ck_assert(params->cgroup);
301 ck_assert_str_eq(params->cgroup_name, "cgroup");
302}
303END_TEST
304
305START_TEST(test_cgroup_long_equals)
306{
307 PARSE_ARGS("timerlat", "hist", "--cgroup=cgroup");
308
309 ck_assert(params->cgroup);
310 ck_assert_str_eq(params->cgroup_name, "cgroup");
311}
312END_TEST
313
314START_TEST(test_kernel_threads_short)
315{
316 PARSE_ARGS("timerlat", "hist", "-k");
317
318 ck_assert(params->kernel_workload);
319 ck_assert(!params->user_workload);
320 ck_assert(!params->user_data);
321}
322END_TEST
323
324START_TEST(test_kernel_threads_long)
325{
326 PARSE_ARGS("timerlat", "hist", "--kernel-threads");
327
328 ck_assert(params->kernel_workload);
329 ck_assert(!params->user_workload);
330 ck_assert(!params->user_data);
331}
332END_TEST
333
334START_TEST(test_priority_short)
335{
336 PARSE_ARGS("timerlat", "hist", "-P", "f:95");
337
338 ck_assert_int_eq(params->sched_param.sched_policy, SCHED_FIFO);
339 ck_assert_int_eq(params->sched_param.sched_priority, 95);
340}
341END_TEST
342
343START_TEST(test_priority_long)
344{
345 PARSE_ARGS("timerlat", "hist", "--priority", "f:95");
346
347 ck_assert_int_eq(params->sched_param.sched_policy, SCHED_FIFO);
348 ck_assert_int_eq(params->sched_param.sched_priority, 95);
349}
350END_TEST
351
352START_TEST(test_user_load_short)
353{
354 PARSE_ARGS("timerlat", "hist", "-U");
355
356 ck_assert(!params->kernel_workload);
357 ck_assert(!params->user_workload);
358 ck_assert(params->user_data);
359}
360END_TEST
361
362START_TEST(test_user_load_long)
363{
364 PARSE_ARGS("timerlat", "hist", "--user-load");
365
366 ck_assert(!params->kernel_workload);
367 ck_assert(!params->user_workload);
368 ck_assert(params->user_data);
369}
370END_TEST
371
372START_TEST(test_user_threads_short)
373{
374 PARSE_ARGS("timerlat", "hist", "-u");
375
376 ck_assert(!params->kernel_workload);
377 ck_assert(params->user_workload);
378 ck_assert(params->user_data);
379}
380END_TEST
381
382START_TEST(test_user_threads_long)
383{
384 PARSE_ARGS("timerlat", "hist", "--user-threads");
385
386 ck_assert(!params->kernel_workload);
387 ck_assert(params->user_workload);
388 ck_assert(params->user_data);
389}
390END_TEST
391
392START_TEST(test_aligned_short)
393{
394 PARSE_ARGS("timerlat", "hist", "-A", "500");
395
396 ck_assert(tlat_params->timerlat_align);
397 ck_assert_int_eq(tlat_params->timerlat_align_us, 500);
398}
399END_TEST
400
401START_TEST(test_aligned_long)
402{
403 PARSE_ARGS("timerlat", "hist", "--aligned", "500");
404
405 ck_assert(tlat_params->timerlat_align);
406 ck_assert_int_eq(tlat_params->timerlat_align_us, 500);
407}
408END_TEST
409
410/* Histogram Options */
411
412START_TEST(test_bucket_size_short)
413{
414 PARSE_ARGS("timerlat", "hist", "-b", "2");
415
416 ck_assert_int_eq(params->hist.bucket_size, 2);
417}
418END_TEST
419
420START_TEST(test_bucket_size_long)
421{
422 PARSE_ARGS("timerlat", "hist", "--bucket-size", "2");
423
424 ck_assert_int_eq(params->hist.bucket_size, 2);
425}
426END_TEST
427
428START_TEST(test_entries_short)
429{
430 PARSE_ARGS("timerlat", "hist", "-E", "512");
431
432 ck_assert_int_eq(params->hist.entries, 512);
433}
434END_TEST
435
436START_TEST(test_entries_long)
437{
438 PARSE_ARGS("timerlat", "hist", "--entries", "512");
439
440 ck_assert_int_eq(params->hist.entries, 512);
441}
442END_TEST
443
444START_TEST(test_no_header)
445{
446 PARSE_ARGS("timerlat", "hist", "--no-header");
447
448 ck_assert(params->hist.no_header);
449}
450END_TEST
451
452START_TEST(test_no_index)
453{
454 PARSE_ARGS("timerlat", "hist", "--with-zeros", "--no-index");
455
456 ck_assert(params->hist.no_index);
457}
458END_TEST
459
460START_TEST(test_no_irq)
461{
462 PARSE_ARGS("timerlat", "hist", "--no-irq");
463
464 ck_assert(params->hist.no_irq);
465}
466END_TEST
467
468START_TEST(test_no_summary)
469{
470 PARSE_ARGS("timerlat", "hist", "--no-summary");
471
472 ck_assert(params->hist.no_summary);
473}
474END_TEST
475
476START_TEST(test_no_thread)
477{
478 PARSE_ARGS("timerlat", "hist", "--no-thread");
479
480 ck_assert(params->hist.no_thread);
481}
482END_TEST
483
484START_TEST(test_with_zeros)
485{
486 PARSE_ARGS("timerlat", "hist", "--with-zeros");
487
488 ck_assert(params->hist.with_zeros);
489}
490END_TEST
491
492/* Output */
493
494START_TEST(test_nano_short)
495{
496 PARSE_ARGS("timerlat", "hist", "-n");
497
498 ck_assert_int_eq(params->output_divisor, 1);
499}
500END_TEST
501
502START_TEST(test_nano_long)
503{
504 PARSE_ARGS("timerlat", "hist", "--nano");
505
506 ck_assert_int_eq(params->output_divisor, 1);
507}
508END_TEST
509
510/* System Tuning */
511
512START_TEST(test_deepest_idle_state)
513{
514 PARSE_ARGS("timerlat", "hist", "--deepest-idle-state", "1");
515
516 ck_assert_int_eq(tlat_params->deepest_idle_state, 1);
517}
518END_TEST
519
520START_TEST(test_dma_latency)
521{
522 PARSE_ARGS("timerlat", "hist", "--dma-latency", "10");
523
524 ck_assert_int_eq(tlat_params->dma_latency, 10);
525}
526END_TEST
527
528START_TEST(test_trace_buffer_size)
529{
530 PARSE_ARGS("timerlat", "hist", "--trace-buffer-size", "200");
531
532 ck_assert_int_eq(params->buffer_size, 200);
533}
534END_TEST
535
536START_TEST(test_warm_up)
537{
538 PARSE_ARGS("timerlat", "hist", "--warm-up", "5");
539
540 ck_assert_int_eq(params->warmup, 5);
541}
542END_TEST
543
544/* Auto Analysis and Actions */
545
546START_TEST(test_auto)
547{
548 PARSE_ARGS("timerlat", "hist", "-a", "20");
549
550 CLI_TIMERLAT_ASSERT_AUTO(20);
551}
552END_TEST
553
554START_TEST(test_bpf_action)
555{
556 PARSE_ARGS("timerlat", "hist", "--bpf-action", "program");
557
558 ck_assert_str_eq(tlat_params->bpf_action_program, "program");
559}
560END_TEST
561
562START_TEST(test_dump_tasks)
563{
564 PARSE_ARGS("timerlat", "hist", "--dump-tasks");
565
566 ck_assert(tlat_params->dump_tasks);
567}
568END_TEST
569
570START_TEST(test_no_aa)
571{
572 PARSE_ARGS("timerlat", "hist", "--no-aa");
573
574 ck_assert(tlat_params->no_aa);
575}
576END_TEST
577
578START_TEST(test_on_end)
579{
580 PARSE_ARGS("timerlat", "hist", "--on-end", "trace");
581
582 CLI_ASSERT_SINGLE_ACTION(end_actions, ACTION_TRACE_OUTPUT, trace_output, str,
583 "timerlat_trace.txt");
584}
585END_TEST
586
587START_TEST(test_on_threshold)
588{
589 PARSE_ARGS("timerlat", "hist", "--on-threshold", "trace");
590
591 CLI_ASSERT_SINGLE_ACTION(threshold_actions, ACTION_TRACE_OUTPUT, trace_output, str,
592 "timerlat_trace.txt");
593}
594END_TEST
595
596START_TEST(test_stack_format)
597{
598 PARSE_ARGS("timerlat", "hist", "--stack-format", "truncate");
599
600 ck_assert_int_eq(tlat_params->stack_format, STACK_FORMAT_TRUNCATE);
601}
602END_TEST
603
604/* General */
605
606START_TEST(test_debug_short)
607{
608 PARSE_ARGS("timerlat", "hist", "-D");
609
610 ck_assert(config_debug);
611}
612END_TEST
613
614START_TEST(test_debug_long)
615{
616 PARSE_ARGS("timerlat", "hist", "--debug");
617
618 ck_assert(config_debug);
619}
620END_TEST
621
622START_TEST(test_duration_short)
623{
624 PARSE_ARGS("timerlat", "hist", "-d", "1m");
625
626 ck_assert_int_eq(params->duration, 60);
627}
628END_TEST
629
630START_TEST(test_duration_long)
631{
632 PARSE_ARGS("timerlat", "hist", "--duration", "1m");
633
634 ck_assert_int_eq(params->duration, 60);
635}
636END_TEST
637
638Suite *timerlat_hist_cli_suite(void)
639{
640 Suite *s = suite_create("timerlat_hist_cli");
641 TCase *tc;
642
643 tc = tcase_create("tracing_options");
644 tcase_add_test(tc, test_irq_short);
645 tcase_add_test(tc, test_irq_long);
646 tcase_add_test(tc, test_period_short);
647 tcase_add_test(tc, test_period_long);
648 tcase_add_test(tc, test_period_unset_short);
649 tcase_add_test(tc, test_period_unset_long);
650 tcase_add_test(tc, test_stack_short);
651 tcase_add_test(tc, test_stack_long);
652 tcase_add_test(tc, test_thread_short);
653 tcase_add_test(tc, test_thread_long);
654 tcase_add_test(tc, test_trace_short_noarg);
655 tcase_add_test(tc, test_trace_short_followarg);
656 tcase_add_test(tc, test_trace_short_space);
657 tcase_add_test(tc, test_trace_short_equals);
658 tcase_add_test(tc, test_trace_long_noarg);
659 tcase_add_test(tc, test_trace_long_followarg);
660 tcase_add_test(tc, test_trace_long_space);
661 tcase_add_test(tc, test_trace_long_equals);
662 suite_add_tcase(s, tc);
663
664 tc = tcase_create("event_configuration");
665 tcase_add_test(tc, test_event_short);
666 tcase_add_test(tc, test_event_long);
667 tcase_add_test(tc, test_filter);
668 tcase_add_test(tc, test_trigger);
669 suite_add_tcase(s, tc);
670
671 tc = tcase_create("cpu_configuration");
672 tcase_add_test(tc, test_cpus_short);
673 tcase_add_test(tc, test_cpus_long);
674 tcase_add_test(tc, test_housekeeping_short);
675 tcase_add_test(tc, test_housekeeping_long);
676 suite_add_tcase(s, tc);
677
678 tc = tcase_create("thread_configuration");
679 tcase_add_test(tc, test_cgroup_short_noarg);
680 tcase_add_test(tc, test_cgroup_short_space);
681 tcase_add_test(tc, test_cgroup_short_equals);
682 tcase_add_test(tc, test_cgroup_long_noarg);
683 tcase_add_test(tc, test_cgroup_long_space);
684 tcase_add_test(tc, test_cgroup_long_equals);
685 tcase_add_test(tc, test_kernel_threads_short);
686 tcase_add_test(tc, test_kernel_threads_long);
687 tcase_add_test(tc, test_priority_short);
688 tcase_add_test(tc, test_priority_long);
689 tcase_add_test(tc, test_user_load_short);
690 tcase_add_test(tc, test_user_load_long);
691 tcase_add_test(tc, test_user_threads_short);
692 tcase_add_test(tc, test_user_threads_long);
693 tcase_add_test(tc, test_aligned_short);
694 tcase_add_test(tc, test_aligned_long);
695 suite_add_tcase(s, tc);
696
697 tc = tcase_create("histogram_options");
698 tcase_add_test(tc, test_bucket_size_short);
699 tcase_add_test(tc, test_bucket_size_long);
700 tcase_add_test(tc, test_entries_short);
701 tcase_add_test(tc, test_entries_long);
702 tcase_add_test(tc, test_no_header);
703 tcase_add_test(tc, test_no_index);
704 tcase_add_test(tc, test_no_irq);
705 tcase_add_test(tc, test_no_summary);
706 tcase_add_test(tc, test_no_thread);
707 tcase_add_test(tc, test_with_zeros);
708 suite_add_tcase(s, tc);
709
710 tc = tcase_create("output");
711 tcase_add_test(tc, test_nano_short);
712 tcase_add_test(tc, test_nano_long);
713 suite_add_tcase(s, tc);
714
715 tc = tcase_create("system_tuning");
716 tcase_add_test(tc, test_deepest_idle_state);
717 tcase_add_test(tc, test_dma_latency);
718 tcase_add_test(tc, test_trace_buffer_size);
719 tcase_add_test(tc, test_warm_up);
720 suite_add_tcase(s, tc);
721
722 tc = tcase_create("aa_actions");
723 tcase_add_test(tc, test_auto);
724 tcase_add_test(tc, test_bpf_action);
725 tcase_add_test(tc, test_dump_tasks);
726 tcase_add_test(tc, test_no_aa);
727 tcase_add_test(tc, test_on_end);
728 tcase_add_test(tc, test_on_threshold);
729 tcase_add_test(tc, test_stack_format);
730 suite_add_tcase(s, tc);
731
732 tc = tcase_create("general");
733 tcase_add_test(tc, test_debug_short);
734 tcase_add_test(tc, test_debug_long);
735 tcase_add_test(tc, test_duration_short);
736 tcase_add_test(tc, test_duration_long);
737 suite_add_tcase(s, tc);
738
739 return s;
740}