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 "cli_params_assert.h" 13 #include "../../src/cli.h" 14 15 #define PARSE_ARGS(...) char *argv[] = { __VA_ARGS__, NULL };\ 16 int argc = sizeof(argv) / sizeof(char *) - 1;\ 17 struct common_params *params =\ 18 osnoise_hist_parse_args(argc, argv);\ 19 struct osnoise_params *osn_params __maybe_unused =\ 20 to_osnoise_params(params) 21 22 /* Tracing Options */ 23 24 START_TEST(test_period_short) 25 { 26 PARSE_ARGS("osnoise", "hist", "-p", "100000"); 27 28 ck_assert_int_eq(osn_params->period, 100000); 29 } 30 END_TEST 31 32 START_TEST(test_period_long) 33 { 34 PARSE_ARGS("osnoise", "hist", "--period", "100000"); 35 36 ck_assert_int_eq(osn_params->period, 100000); 37 } 38 END_TEST 39 40 START_TEST(test_period_unset_short) 41 { 42 PARSE_ARGS("osnoise", "hist", "-p", "100000", "--no-period"); 43 44 ck_assert_int_eq(osn_params->period, 0); 45 } 46 END_TEST 47 48 START_TEST(test_period_unset_long) 49 { 50 PARSE_ARGS("osnoise", "hist", "--period", "100000", "--no-period"); 51 52 ck_assert_int_eq(osn_params->period, 0); 53 } 54 END_TEST 55 56 START_TEST(test_runtime_short) 57 { 58 PARSE_ARGS("osnoise", "hist", "-r", "95000"); 59 60 ck_assert_int_eq(osn_params->runtime, 95000); 61 } 62 END_TEST 63 64 START_TEST(test_runtime_long) 65 { 66 PARSE_ARGS("osnoise", "hist", "--runtime", "95000"); 67 68 ck_assert_int_eq(osn_params->runtime, 95000); 69 } 70 END_TEST 71 72 START_TEST(test_stop_short) 73 { 74 PARSE_ARGS("osnoise", "hist", "-s", "20"); 75 76 ck_assert_int_eq(params->stop_us, 20); 77 } 78 END_TEST 79 80 START_TEST(test_stop_long) 81 { 82 PARSE_ARGS("osnoise", "hist", "--stop", "20"); 83 84 ck_assert_int_eq(params->stop_us, 20); 85 } 86 END_TEST 87 88 START_TEST(test_stop_total_short) 89 { 90 PARSE_ARGS("osnoise", "hist", "-S", "20"); 91 92 ck_assert_int_eq(params->stop_total_us, 20); 93 } 94 END_TEST 95 96 START_TEST(test_stop_total_long) 97 { 98 PARSE_ARGS("osnoise", "hist", "--stop-total", "20"); 99 100 ck_assert_int_eq(params->stop_total_us, 20); 101 } 102 END_TEST 103 104 START_TEST(test_threshold_short) 105 { 106 PARSE_ARGS("osnoise", "hist", "-T", "5"); 107 108 ck_assert_int_eq(osn_params->threshold, 5); 109 } 110 END_TEST 111 112 START_TEST(test_threshold_long) 113 { 114 PARSE_ARGS("osnoise", "hist", "--threshold", "5"); 115 116 ck_assert_int_eq(osn_params->threshold, 5); 117 } 118 END_TEST 119 120 START_TEST(test_trace_short_noarg) 121 { 122 PARSE_ARGS("osnoise", "hist", "-t"); 123 124 CLI_ASSERT_SINGLE_ACTION(threshold_actions, ACTION_TRACE_OUTPUT, trace_output, str, 125 "osnoise_trace.txt"); 126 } 127 END_TEST 128 129 START_TEST(test_trace_short_followarg) 130 { 131 PARSE_ARGS("osnoise", "hist", "-t", "-d", "20"); 132 133 CLI_ASSERT_SINGLE_ACTION(threshold_actions, ACTION_TRACE_OUTPUT, trace_output, str, 134 "osnoise_trace.txt"); 135 ck_assert_int_eq(params->duration, 20); /* check if next argument is read correctly */ 136 } 137 END_TEST 138 139 START_TEST(test_trace_short_space) 140 { 141 PARSE_ARGS("osnoise", "hist", "-t", "tracefile"); 142 143 CLI_ASSERT_SINGLE_ACTION(threshold_actions, ACTION_TRACE_OUTPUT, trace_output, str, 144 "tracefile"); 145 } 146 END_TEST 147 148 START_TEST(test_trace_short_equals) 149 { 150 PARSE_ARGS("osnoise", "hist", "-t=tracefile"); 151 152 CLI_ASSERT_SINGLE_ACTION(threshold_actions, ACTION_TRACE_OUTPUT, trace_output, str, 153 "tracefile"); 154 } 155 END_TEST 156 157 START_TEST(test_trace_long_noarg) 158 { 159 PARSE_ARGS("osnoise", "hist", "--trace"); 160 161 CLI_ASSERT_SINGLE_ACTION(threshold_actions, ACTION_TRACE_OUTPUT, trace_output, str, 162 "osnoise_trace.txt"); 163 } 164 END_TEST 165 166 START_TEST(test_trace_long_followarg) 167 { 168 PARSE_ARGS("osnoise", "hist", "--trace", "-d", "20"); 169 170 CLI_ASSERT_SINGLE_ACTION(threshold_actions, ACTION_TRACE_OUTPUT, trace_output, str, 171 "osnoise_trace.txt"); 172 ck_assert_int_eq(params->duration, 20); /* check if next argument is read correctly */ 173 } 174 END_TEST 175 176 START_TEST(test_trace_long_space) 177 { 178 PARSE_ARGS("osnoise", "hist", "--trace", "tracefile"); 179 180 CLI_ASSERT_SINGLE_ACTION(threshold_actions, ACTION_TRACE_OUTPUT, trace_output, str, 181 "tracefile"); 182 } 183 END_TEST 184 185 START_TEST(test_trace_long_equals) 186 { 187 PARSE_ARGS("osnoise", "hist", "--trace=tracefile"); 188 189 CLI_ASSERT_SINGLE_ACTION(threshold_actions, ACTION_TRACE_OUTPUT, trace_output, str, 190 "tracefile"); 191 } 192 END_TEST 193 194 /* Event Configuration */ 195 196 START_TEST(test_event_short) 197 { 198 PARSE_ARGS("osnoise", "hist", "-e", "system:event"); 199 200 CLI_ASSERT_SINGLE_EVENT("system", "event"); 201 } 202 END_TEST 203 204 START_TEST(test_event_long) 205 { 206 PARSE_ARGS("osnoise", "hist", "--event", "system:event"); 207 208 CLI_ASSERT_SINGLE_EVENT("system", "event"); 209 } 210 END_TEST 211 212 START_TEST(test_filter) 213 { 214 PARSE_ARGS("osnoise", "hist", "-e", "system:event", "--filter", "filter"); 215 216 CLI_ASSERT_SINGLE_FILTER("filter"); 217 } 218 END_TEST 219 220 START_TEST(test_trigger) 221 { 222 PARSE_ARGS("osnoise", "hist", "-e", "system:event", "--trigger", "trigger"); 223 224 CLI_ASSERT_SINGLE_TRIGGER("trigger"); 225 } 226 END_TEST 227 228 /* CPU Configuration */ 229 230 START_TEST(test_cpus_short) 231 { 232 nr_cpus = 4; 233 234 PARSE_ARGS("osnoise", "hist", "-c", "0-1,3"); 235 236 ck_assert_str_eq(params->cpus, "0-1,3"); 237 CLI_ASSERT_CPUSET(monitored_cpus, 0, 1, 3); 238 } 239 END_TEST 240 241 START_TEST(test_cpus_long) 242 { 243 nr_cpus = 4; 244 245 PARSE_ARGS("osnoise", "hist", "--cpus", "0-1,3"); 246 247 ck_assert_str_eq(params->cpus, "0-1,3"); 248 CLI_ASSERT_CPUSET(monitored_cpus, 0, 1, 3); 249 } 250 END_TEST 251 252 START_TEST(test_housekeeping_short) 253 { 254 nr_cpus = 4; 255 256 PARSE_ARGS("osnoise", "hist", "-H", "0-1,3"); 257 258 CLI_ASSERT_CPUSET(hk_cpu_set, 0, 1, 3); 259 } 260 END_TEST 261 262 START_TEST(test_housekeeping_long) 263 { 264 nr_cpus = 4; 265 266 PARSE_ARGS("osnoise", "hist", "--house-keeping", "0-1,3"); 267 268 CLI_ASSERT_CPUSET(hk_cpu_set, 0, 1, 3); 269 } 270 END_TEST 271 272 /* Thread Configuration */ 273 274 START_TEST(test_cgroup_short_noarg) 275 { 276 PARSE_ARGS("osnoise", "hist", "-C"); 277 278 ck_assert(params->cgroup); 279 ck_assert_ptr_null(params->cgroup_name); 280 } 281 END_TEST 282 283 START_TEST(test_cgroup_short_space) 284 { 285 PARSE_ARGS("osnoise", "hist", "-C", "cgroup"); 286 287 ck_assert(params->cgroup); 288 ck_assert_str_eq(params->cgroup_name, "cgroup"); 289 } 290 END_TEST 291 292 START_TEST(test_cgroup_short_equals) 293 { 294 PARSE_ARGS("osnoise", "hist", "-C=cgroup"); 295 296 ck_assert(params->cgroup); 297 ck_assert_str_eq(params->cgroup_name, "cgroup"); 298 } 299 END_TEST 300 301 START_TEST(test_cgroup_long_noarg) 302 { 303 PARSE_ARGS("osnoise", "hist", "--cgroup"); 304 305 ck_assert(params->cgroup); 306 ck_assert_ptr_null(params->cgroup_name); 307 } 308 END_TEST 309 310 START_TEST(test_cgroup_long_space) 311 { 312 PARSE_ARGS("osnoise", "hist", "--cgroup", "cgroup"); 313 314 ck_assert(params->cgroup); 315 ck_assert_str_eq(params->cgroup_name, "cgroup"); 316 } 317 END_TEST 318 319 START_TEST(test_cgroup_long_equals) 320 { 321 PARSE_ARGS("osnoise", "hist", "--cgroup=cgroup"); 322 323 ck_assert(params->cgroup); 324 ck_assert_str_eq(params->cgroup_name, "cgroup"); 325 } 326 END_TEST 327 328 START_TEST(test_priority_short) 329 { 330 PARSE_ARGS("osnoise", "hist", "-P", "f:95"); 331 332 ck_assert_int_eq(params->sched_param.sched_policy, SCHED_FIFO); 333 ck_assert_int_eq(params->sched_param.sched_priority, 95); 334 } 335 END_TEST 336 337 START_TEST(test_priority_long) 338 { 339 PARSE_ARGS("osnoise", "hist", "--priority", "f:95"); 340 341 ck_assert_int_eq(params->sched_param.sched_policy, SCHED_FIFO); 342 ck_assert_int_eq(params->sched_param.sched_priority, 95); 343 } 344 END_TEST 345 346 /* Histogram Options */ 347 348 START_TEST(test_bucket_size_short) 349 { 350 PARSE_ARGS("osnoise", "hist", "-b", "2"); 351 352 ck_assert_int_eq(params->hist.bucket_size, 2); 353 } 354 END_TEST 355 356 START_TEST(test_bucket_size_long) 357 { 358 PARSE_ARGS("osnoise", "hist", "--bucket-size", "2"); 359 360 ck_assert_int_eq(params->hist.bucket_size, 2); 361 } 362 END_TEST 363 364 START_TEST(test_entries_short) 365 { 366 PARSE_ARGS("osnoise", "hist", "-E", "512"); 367 368 ck_assert_int_eq(params->hist.entries, 512); 369 } 370 END_TEST 371 372 START_TEST(test_entries_long) 373 { 374 PARSE_ARGS("osnoise", "hist", "--entries", "512"); 375 376 ck_assert_int_eq(params->hist.entries, 512); 377 } 378 END_TEST 379 380 START_TEST(test_no_header) 381 { 382 PARSE_ARGS("osnoise", "hist", "--no-header"); 383 384 ck_assert(params->hist.no_header); 385 } 386 END_TEST 387 388 START_TEST(test_no_index) 389 { 390 PARSE_ARGS("osnoise", "hist", "--with-zeros", "--no-index"); 391 392 ck_assert(params->hist.no_index); 393 } 394 END_TEST 395 396 START_TEST(test_no_summary) 397 { 398 PARSE_ARGS("osnoise", "hist", "--no-summary"); 399 400 ck_assert(params->hist.no_summary); 401 } 402 END_TEST 403 404 START_TEST(test_with_zeros) 405 { 406 PARSE_ARGS("osnoise", "hist", "--with-zeros"); 407 408 ck_assert(params->hist.with_zeros); 409 } 410 END_TEST 411 412 /* System Tuning */ 413 414 START_TEST(test_trace_buffer_size) 415 { 416 PARSE_ARGS("osnoise", "hist", "--trace-buffer-size", "200"); 417 418 ck_assert_int_eq(params->buffer_size, 200); 419 } 420 END_TEST 421 422 START_TEST(test_warm_up) 423 { 424 PARSE_ARGS("osnoise", "hist", "--warm-up", "5"); 425 426 ck_assert_int_eq(params->warmup, 5); 427 } 428 END_TEST 429 430 /* Auto Analysis and Actions */ 431 432 START_TEST(test_auto) 433 { 434 PARSE_ARGS("osnoise", "hist", "-a", "20"); 435 436 CLI_OSNOISE_ASSERT_AUTO(20); 437 } 438 END_TEST 439 440 START_TEST(test_on_end) 441 { 442 PARSE_ARGS("osnoise", "hist", "--on-end", "trace"); 443 444 CLI_ASSERT_SINGLE_ACTION(end_actions, ACTION_TRACE_OUTPUT, trace_output, str, 445 "osnoise_trace.txt"); 446 } 447 END_TEST 448 449 START_TEST(test_on_threshold) 450 { 451 PARSE_ARGS("osnoise", "hist", "--on-threshold", "trace"); 452 453 CLI_ASSERT_SINGLE_ACTION(threshold_actions, ACTION_TRACE_OUTPUT, trace_output, str, 454 "osnoise_trace.txt"); 455 } 456 END_TEST 457 458 /* General */ 459 460 START_TEST(test_debug_short) 461 { 462 PARSE_ARGS("osnoise", "hist", "-D"); 463 464 ck_assert(config_debug); 465 } 466 END_TEST 467 468 START_TEST(test_debug_long) 469 { 470 PARSE_ARGS("osnoise", "hist", "--debug"); 471 472 ck_assert(config_debug); 473 } 474 END_TEST 475 476 START_TEST(test_duration_short) 477 { 478 PARSE_ARGS("osnoise", "hist", "-d", "1m"); 479 480 ck_assert_int_eq(params->duration, 60); 481 } 482 END_TEST 483 484 START_TEST(test_duration_long) 485 { 486 PARSE_ARGS("osnoise", "hist", "--duration", "1m"); 487 488 ck_assert_int_eq(params->duration, 60); 489 } 490 END_TEST 491 492 Suite *osnoise_hist_cli_suite(void) 493 { 494 Suite *s = suite_create("osnoise_hist_cli"); 495 TCase *tc; 496 497 tc = tcase_create("tracing_options"); 498 tcase_add_test(tc, test_period_short); 499 tcase_add_test(tc, test_period_long); 500 tcase_add_test(tc, test_period_unset_short); 501 tcase_add_test(tc, test_period_unset_long); 502 tcase_add_test(tc, test_runtime_short); 503 tcase_add_test(tc, test_runtime_long); 504 tcase_add_test(tc, test_stop_short); 505 tcase_add_test(tc, test_stop_long); 506 tcase_add_test(tc, test_stop_total_short); 507 tcase_add_test(tc, test_stop_total_long); 508 tcase_add_test(tc, test_threshold_short); 509 tcase_add_test(tc, test_threshold_long); 510 tcase_add_test(tc, test_trace_short_noarg); 511 tcase_add_test(tc, test_trace_short_followarg); 512 tcase_add_test(tc, test_trace_short_space); 513 tcase_add_test(tc, test_trace_short_equals); 514 tcase_add_test(tc, test_trace_long_noarg); 515 tcase_add_test(tc, test_trace_long_followarg); 516 tcase_add_test(tc, test_trace_long_space); 517 tcase_add_test(tc, test_trace_long_equals); 518 suite_add_tcase(s, tc); 519 520 tc = tcase_create("event_configuration"); 521 tcase_add_test(tc, test_event_short); 522 tcase_add_test(tc, test_event_long); 523 tcase_add_test(tc, test_filter); 524 tcase_add_test(tc, test_trigger); 525 suite_add_tcase(s, tc); 526 527 tc = tcase_create("cpu_configuration"); 528 tcase_add_test(tc, test_cpus_short); 529 tcase_add_test(tc, test_cpus_long); 530 tcase_add_test(tc, test_housekeeping_short); 531 tcase_add_test(tc, test_housekeeping_long); 532 suite_add_tcase(s, tc); 533 534 tc = tcase_create("thread_configuration"); 535 tcase_add_test(tc, test_cgroup_short_noarg); 536 tcase_add_test(tc, test_cgroup_short_space); 537 tcase_add_test(tc, test_cgroup_short_equals); 538 tcase_add_test(tc, test_cgroup_long_noarg); 539 tcase_add_test(tc, test_cgroup_long_space); 540 tcase_add_test(tc, test_cgroup_long_equals); 541 tcase_add_test(tc, test_priority_short); 542 tcase_add_test(tc, test_priority_long); 543 suite_add_tcase(s, tc); 544 545 tc = tcase_create("histogram_options"); 546 tcase_add_test(tc, test_bucket_size_short); 547 tcase_add_test(tc, test_bucket_size_long); 548 tcase_add_test(tc, test_entries_short); 549 tcase_add_test(tc, test_entries_long); 550 tcase_add_test(tc, test_no_header); 551 tcase_add_test(tc, test_no_index); 552 tcase_add_test(tc, test_no_summary); 553 tcase_add_test(tc, test_with_zeros); 554 suite_add_tcase(s, tc); 555 556 tc = tcase_create("system_tuning"); 557 tcase_add_test(tc, test_trace_buffer_size); 558 tcase_add_test(tc, test_warm_up); 559 suite_add_tcase(s, tc); 560 561 tc = tcase_create("aa_actions"); 562 tcase_add_test(tc, test_auto); 563 tcase_add_test(tc, test_on_end); 564 tcase_add_test(tc, test_on_threshold); 565 suite_add_tcase(s, tc); 566 567 tc = tcase_create("general"); 568 tcase_add_test(tc, test_debug_short); 569 tcase_add_test(tc, test_debug_long); 570 tcase_add_test(tc, test_duration_short); 571 tcase_add_test(tc, test_duration_long); 572 suite_add_tcase(s, tc); 573 574 return s; 575 } 576