1package App::Yath::Command::start; 2use strict; 3use warnings; 4 5our $VERSION = '1.000082'; 6 7use App::Yath::Util qw/find_pfile/; 8use App::Yath::Options; 9 10use Test2::Harness::Run; 11use Test2::Harness::Util::Queue; 12use Test2::Harness::Util::File::JSON; 13use Test2::Harness::IPC; 14 15use Test2::Harness::Util::JSON qw/encode_json decode_json/; 16use Test2::Harness::Util qw/mod2file open_file parse_exit clean_path/; 17use Test2::Util::Table qw/table/; 18 19use Test2::Harness::Util::IPC qw/run_cmd USE_P_GROUPS/; 20 21use POSIX; 22use File::Spec; 23 24use Time::HiRes qw/sleep/; 25 26use Carp qw/croak/; 27use File::Path qw/remove_tree/; 28 29use parent 'App::Yath::Command'; 30use Test2::Harness::Util::HashBase; 31 32include_options( 33 'App::Yath::Options::Debug', 34 'App::Yath::Options::PreCommand', 35 'App::Yath::Options::Runner', 36 'App::Yath::Options::Workspace', 37 'App::Yath::Options::Persist', 38 'App::Yath::Options::Collector', 39); 40 41option_group {prefix => 'runner', category => "Persistent Runner Options"} => sub { 42 option reload => ( 43 short => 'r', 44 type => 'b', 45 description => "Attempt to reload modified modules in-place, restarting entire stages only when necessary.", 46 default => 0, 47 ); 48 49 option restrict_reload => ( 50 type => 'D', 51 long_examples => ['', '=path'], 52 short_examples => ['', '=path'], 53 description => "Only reload modules under the specified path, if no path is specified look at anything under the .yath.rc path, or the current working directory.", 54 55 normalize => sub { $_[0] eq '1' ? $_[0] : clean_path($_[0]) }, 56 action => \&restrict_action, 57 ); 58 59 option quiet => ( 60 short => 'q', 61 type => 'c', 62 description => "Be very quiet.", 63 default => 0, 64 ); 65}; 66 67sub restrict_action { 68 my ($prefix, $field, $raw, $norm, $slot, $settings) = @_; 69 70 if ($norm eq '1') { 71 my $hset = $settings->harness; 72 my $path = $hset->config_file || $hset->cwd; 73 $path //= do { require Cwd; Cwd::getcwd() }; 74 $path =~ s{\.yath\.rc$}{}g; 75 push @{$$slot} => $path; 76 } 77 else { 78 push @{$$slot} => $norm; 79 } 80} 81 82sub MAX_ATTACH() { 1_048_576 } 83 84sub group { 'persist' } 85 86sub always_keep_dir { 1 } 87 88sub summary { "Start the persistent test runner" } 89sub cli_args { "" } 90 91sub description { 92 return <<" EOT"; 93This command is used to start a persistant instance of yath. A persistant 94instance is useful because it allows you to preload modules in advance, 95reducing start time for any tests you decide to run as you work. 96 97A running instance will watch for changes to any preloaded files, and restart 98itself if anything changes. Changed files are blacklisted for subsequent 99reloads so that reloading is not a frequent occurence when editing the same 100file over and over again. 101 EOT 102} 103 104sub run { 105 my $self = shift; 106 107 my $settings = $self->settings; 108 my $dir = $settings->workspace->workdir; 109 110 my $pfile = find_pfile($settings, vivify => 1); 111 112 if (-f $pfile) { 113 remove_tree($dir, {safe => 1, keep_root => 0}); 114 die "Persistent harness appears to be running, found $pfile\n"; 115 } 116 117 $self->write_settings_to($dir, 'settings.json'); 118 119 my $run_queue = Test2::Harness::Util::Queue->new(file => File::Spec->catfile($dir, 'run_queue.jsonl')); 120 $run_queue->start(); 121 122 $_->setup($self->settings) for @{$self->settings->harness->plugins}; 123 124 my $stderr = File::Spec->catfile($dir, 'error.log'); 125 my $stdout = File::Spec->catfile($dir, 'output.log'); 126 127 my @prof; 128 if ($settings->runner->nytprof) { 129 push @prof => '-d:NYTProf'; 130 } 131 132 my $pid = run_cmd( 133 stderr => $stderr, 134 stdout => $stdout, 135 136 no_set_pgrp => !$settings->runner->daemon, 137 138 command => [ 139 $^X, @prof, $settings->harness->script, 140 (map { "-D$_" } @{$settings->harness->dev_libs}), 141 '--no-scan-plugins', # Do not preload any plugin modules 142 runner => $dir, 143 monitor_preloads => 1, 144 persist => $pfile, 145 jobs_todo => 0, 146 ], 147 ); 148 149 unless ($settings->runner->quiet) { 150 print "\nPersistent runner started!\n"; 151 152 print "Runner PID: $pid\n"; 153 print "Runner dir: $dir\n"; 154 print "\nUse `yath watch` to monitor the persistent runner\n\n" if $settings->runner->daemon; 155 } 156 157 Test2::Harness::Util::File::JSON->new(name => $pfile)->write({pid => $pid, dir => $dir, version => $VERSION}); 158 159 return 0 if $settings->runner->daemon; 160 161 $SIG{TERM} = sub { kill(TERM => $pid) }; 162 $SIG{INT} = sub { kill(INT => $pid) }; 163 164 my $err_fh = open_file($stderr, '<'); 165 my $out_fh = open_file($stdout, '<'); 166 167 while (1) { 168 my $out = waitpid($pid, WNOHANG); 169 my $wstat = $?; 170 171 my $count = 0; 172 while (my $line = <$out_fh>) { 173 $count++; 174 print STDOUT $line; 175 } 176 while (my $line = <$err_fh>) { 177 $count++; 178 print STDERR $line; 179 } 180 181 sleep(0.02) unless $out || $count; 182 183 next if $out == 0; 184 return 255 if $out < 0; 185 186 my $exit = parse_exit($?); 187 return $exit->{err} || $exit->{sig} || 0; 188 } 189} 190 1911; 192 193__END__ 194 195=pod 196 197=encoding UTF-8 198 199=head1 NAME 200 201App::Yath::Command::start - Start the persistent test runner 202 203=head1 DESCRIPTION 204 205This command is used to start a persistant instance of yath. A persistant 206instance is useful because it allows you to preload modules in advance, 207reducing start time for any tests you decide to run as you work. 208 209A running instance will watch for changes to any preloaded files, and restart 210itself if anything changes. Changed files are blacklisted for subsequent 211reloads so that reloading is not a frequent occurence when editing the same 212file over and over again. 213 214 215=head1 USAGE 216 217 $ yath [YATH OPTIONS] start [COMMAND OPTIONS] 218 219=head2 YATH OPTIONS 220 221=head3 Developer 222 223=over 4 224 225=item --dev-lib 226 227=item --dev-lib=lib 228 229=item -D 230 231=item -D=lib 232 233=item -Dlib 234 235=item --no-dev-lib 236 237Add paths to @INC before loading ANYTHING. This is what you use if you are developing yath or yath plugins to make sure the yath script finds the local code instead of the installed versions of the same code. You can provide an argument (-Dfoo) to provide a custom path, or you can just use -D without and arg to add lib, blib/lib and blib/arch. 238 239Can be specified multiple times 240 241 242=back 243 244=head3 Environment 245 246=over 4 247 248=item --persist-dir ARG 249 250=item --persist-dir=ARG 251 252=item --no-persist-dir 253 254Where to find persistence files. 255 256 257=item --persist-file ARG 258 259=item --persist-file=ARG 260 261=item --pfile ARG 262 263=item --pfile=ARG 264 265=item --no-persist-file 266 267Where to find the persistence file. The default is /{system-tempdir}/project-yath-persist.json. If no project is specified then it will fall back to the current directory. If the current directory is not writable it will default to /tmp/yath-persist.json which limits you to one persistent runner on your system. 268 269 270=item --project ARG 271 272=item --project=ARG 273 274=item --project-name ARG 275 276=item --project-name=ARG 277 278=item --no-project 279 280This lets you provide a label for your current project/codebase. This is best used in a .yath.rc file. This is necessary for a persistent runner. 281 282 283=back 284 285=head3 Help and Debugging 286 287=over 4 288 289=item --show-opts 290 291=item --no-show-opts 292 293Exit after showing what yath thinks your options mean 294 295 296=item --version 297 298=item -V 299 300=item --no-version 301 302Exit after showing a helpful usage message 303 304 305=back 306 307=head3 Plugins 308 309=over 4 310 311=item --no-scan-plugins 312 313=item --no-no-scan-plugins 314 315Normally yath scans for and loads all App::Yath::Plugin::* modules in order to bring in command-line options they may provide. This flag will disable that. This is useful if you have a naughty plugin that it loading other modules when it should not. 316 317 318=item --plugins PLUGIN 319 320=item --plugins +App::Yath::Plugin::PLUGIN 321 322=item --plugins PLUGIN=arg1,arg2,... 323 324=item --plugin PLUGIN 325 326=item --plugin +App::Yath::Plugin::PLUGIN 327 328=item --plugin PLUGIN=arg1,arg2,... 329 330=item -pPLUGIN 331 332=item --no-plugins 333 334Load a yath plugin. 335 336Can be specified multiple times 337 338 339=back 340 341=head2 COMMAND OPTIONS 342 343=head3 Collector Options 344 345=over 4 346 347=item --max-open-jobs 18 348 349=item --no-max-open-jobs 350 351Maximum number of jobs a collector can process at a time, if more jobs are pending their output will be delayed until the earlier jobs have been processed. (Default: double the -j value) 352 353 354=item --max-poll-events 1000 355 356=item --no-max-poll-events 357 358Maximum number of events to poll from a job before jumping to the next job. (Default: 1000) 359 360 361=back 362 363=head3 Cover Options 364 365=over 4 366 367=item --cover-aggregator ByTest 368 369=item --cover-aggregator ByRun 370 371=item --cover-aggregator +Custom::Aggregator 372 373=item --cover-agg ByTest 374 375=item --cover-agg ByRun 376 377=item --cover-agg +Custom::Aggregator 378 379=item --no-cover-aggregator 380 381Choose a custom aggregator subclass 382 383 384=item --cover-class ARG 385 386=item --cover-class=ARG 387 388=item --no-cover-class 389 390Choose a Test2::Plugin::Cover subclass 391 392 393=item --cover-dirs ARG 394 395=item --cover-dirs=ARG 396 397=item --cover-dir ARG 398 399=item --cover-dir=ARG 400 401=item --no-cover-dirs 402 403NO DESCRIPTION - FIX ME 404 405Can be specified multiple times 406 407 408=item --cover-exclude-private 409 410=item --no-cover-exclude-private 411 412 413 414 415=item --cover-files 416 417=item --no-cover-files 418 419Use Test2::Plugin::Cover to collect coverage data for what files are touched by what tests. Unlike Devel::Cover this has very little performance impact (About 4% difference) 420 421 422=item --cover-from path/to/log.jsonl 423 424=item --cover-from http://example.com/coverage 425 426=item --cover-from path/to/coverage.jsonl 427 428=item --no-cover-from 429 430This can be a test log, a coverage dump (old style json or new jsonl format), or a url to any of the previous. Tests will not be run if the file/url is invalid. 431 432 433=item --cover-from-type json 434 435=item --cover-from-type jsonl 436 437=item --cover-from-type log 438 439=item --no-cover-from-type 440 441File type for coverage source. Usually it can be detected, but when it cannot be you should specify. "json" is old style single-blob coverage data, "jsonl" is the new by-test style, "log" is a logfile from a previous run. 442 443 444=item --cover-manager My::Coverage::Manager 445 446=item --no-cover-manager 447 448Coverage 'from' manager to use when coverage data does not provide one 449 450 451=item --cover-maybe-from path/to/log.jsonl 452 453=item --cover-maybe-from http://example.com/coverage 454 455=item --cover-maybe-from path/to/coverage.jsonl 456 457=item --no-cover-maybe-from 458 459This can be a test log, a coverage dump (old style json or new jsonl format), or a url to any of the previous. Tests will coninue if even if the coverage file/url is invalid. 460 461 462=item --cover-maybe-from-type json 463 464=item --cover-maybe-from-type jsonl 465 466=item --cover-maybe-from-type log 467 468=item --no-cover-maybe-from-type 469 470Same as "from_type" but for "maybe_from". Defaults to "from_type" if that is specified, otherwise auto-detect 471 472 473=item --cover-metrics 474 475=item --no-cover-metrics 476 477 478 479 480=item --cover-types ARG 481 482=item --cover-types=ARG 483 484=item --cover-type ARG 485 486=item --cover-type=ARG 487 488=item --no-cover-types 489 490NO DESCRIPTION - FIX ME 491 492Can be specified multiple times 493 494 495=item --cover-write 496 497=item --cover-write=coverage.jsonl 498 499=item --cover-write=coverage.json 500 501=item --no-cover-write 502 503Create a json or jsonl file of all coverage data seen during the run (This implies --cover-files). 504 505 506=back 507 508=head3 Git Options 509 510=over 4 511 512=item --git-change-base master 513 514=item --git-change-base HEAD^ 515 516=item --git-change-base df22abe4 517 518=item --no-git-change-base 519 520Find files changed by all commits in the current branch from most recent stopping when a commit is found that is also present in the history of the branch/commit specified as the change base. 521 522 523=back 524 525=head3 Help and Debugging 526 527=over 4 528 529=item --dummy 530 531=item -d 532 533=item --no-dummy 534 535Dummy run, do not actually execute anything 536 537Can also be set with the following environment variables: C<T2_HARNESS_DUMMY> 538 539 540=item --help 541 542=item -h 543 544=item --no-help 545 546exit after showing help information 547 548 549=item --interactive 550 551=item -i 552 553=item --no-interactive 554 555Use interactive mode, 1 test at a time, stdin forwarded to it 556 557 558=item --keep-dirs 559 560=item --keep_dir 561 562=item -k 563 564=item --no-keep-dirs 565 566Do not delete directories when done. This is useful if you want to inspect the directories used for various commands. 567 568 569=back 570 571=head3 Persistent Runner Options 572 573=over 4 574 575=item --quiet 576 577=item -q 578 579=item --no-quiet 580 581Be very quiet. 582 583Can be specified multiple times 584 585 586=item --reload 587 588=item -r 589 590=item --no-reload 591 592Attempt to reload modified modules in-place, restarting entire stages only when necessary. 593 594 595=item --restrict-reload 596 597=item --restrict-reload=path 598 599=item --no-restrict-reload 600 601Only reload modules under the specified path, if no path is specified look at anything under the .yath.rc path, or the current working directory. 602 603Can be specified multiple times 604 605 606=back 607 608=head3 Runner Options 609 610=over 4 611 612=item --abort-on-bail 613 614=item --no-abort-on-bail 615 616Abort all testing if a bail-out is encountered (default: on) 617 618 619=item --blib 620 621=item -b 622 623=item --no-blib 624 625(Default: include if it exists) Include 'blib/lib' and 'blib/arch' in your module path 626 627 628=item --cover 629 630=item --cover=-silent,1,+ignore,^t/,+ignore,^t2/,+ignore,^xt,+ignore,^test.pl 631 632=item --no-cover 633 634Use Devel::Cover to calculate test coverage. This disables forking. If no args are specified the following are used: -silent,1,+ignore,^t/,+ignore,^t2/,+ignore,^xt,+ignore,^test.pl 635 636 637=item --daemon 638 639=item --no-daemon 640 641Start the runner as a daemon (Default: True) 642 643 644=item --dump-depmap 645 646=item --no-dump-depmap 647 648When using staged preload, dump the depmap for each stage as json files 649 650 651=item --event-timeout SECONDS 652 653=item --et SECONDS 654 655=item --no-event-timeout 656 657Kill test if no output is received within timeout period. (Default: 60 seconds). Add the "# HARNESS-NO-TIMEOUT" comment to the top of a test file to disable timeouts on a per-test basis. This prevents a hung test from running forever. 658 659 660=item --include ARG 661 662=item --include=ARG 663 664=item -I ARG 665 666=item -I=ARG 667 668=item --no-include 669 670Add a directory to your include paths 671 672Can be specified multiple times 673 674 675=item --job-count ARG 676 677=item --job-count=ARG 678 679=item --jobs ARG 680 681=item --jobs=ARG 682 683=item -j ARG 684 685=item -j=ARG 686 687=item --no-job-count 688 689Set the number of concurrent jobs to run (Default: 1) 690 691Can also be set with the following environment variables: C<YATH_JOB_COUNT>, C<T2_HARNESS_JOB_COUNT>, C<HARNESS_JOB_COUNT> 692 693 694=item --lib 695 696=item -l 697 698=item --no-lib 699 700(Default: include if it exists) Include 'lib' in your module path 701 702 703=item --nytprof 704 705=item --no-nytprof 706 707Use Devel::NYTProf on tests. This will set addpid=1 for you. This works with or without fork. 708 709 710=item --post-exit-timeout SECONDS 711 712=item --pet SECONDS 713 714=item --no-post-exit-timeout 715 716Stop waiting post-exit after the timeout period. (Default: 15 seconds) Some tests fork and allow the parent to exit before writing all their output. If Test2::Harness detects an incomplete plan after the test exits it will monitor for more events until the timeout period. Add the "# HARNESS-NO-TIMEOUT" comment to the top of a test file to disable timeouts on a per-test basis. 717 718 719=item --preload-threshold ARG 720 721=item --preload-threshold=ARG 722 723=item --Pt ARG 724 725=item --Pt=ARG 726 727=item -W ARG 728 729=item -W=ARG 730 731=item --no-preload-threshold 732 733Only do preload if at least N tests are going to be run. In some cases a full preload takes longer than simply running the tests, this lets you specify a minimum number of test jobs that will be run for preload to happen. This has no effect for a persistent runner. The default is 0, and it means always preload. 734 735 736=item --preloads ARG 737 738=item --preloads=ARG 739 740=item --preload ARG 741 742=item --preload=ARG 743 744=item -P ARG 745 746=item -P=ARG 747 748=item --no-preloads 749 750Preload a module before running tests 751 752Can be specified multiple times 753 754 755=item --resource Port 756 757=item --resource +Test2::Harness::Runner::Resource::Port 758 759=item -R Port 760 761=item --no-resource 762 763Use a resource module to assign resource assignments to individual tests 764 765Can be specified multiple times 766 767 768=item --switch ARG 769 770=item --switch=ARG 771 772=item -S ARG 773 774=item -S=ARG 775 776=item --no-switch 777 778Pass the specified switch to perl for each test. This is not compatible with preload. 779 780Can be specified multiple times 781 782 783=item --tlib 784 785=item --no-tlib 786 787(Default: off) Include 't/lib' in your module path 788 789 790=item --unsafe-inc 791 792=item --no-unsafe-inc 793 794perl is removing '.' from @INC as a security concern. This option keeps things from breaking for now. 795 796Can also be set with the following environment variables: C<PERL_USE_UNSAFE_INC> 797 798 799=item --use-fork 800 801=item --fork 802 803=item --no-use-fork 804 805(default: on, except on windows) Normally tests are run by forking, which allows for features like preloading. This will turn off the behavior globally (which is not compatible with preloading). This is slower, it is better to tag misbehaving tests with the '# HARNESS-NO-PRELOAD' comment in their header to disable forking only for those tests. 806 807Can also be set with the following environment variables: C<!T2_NO_FORK>, C<T2_HARNESS_FORK>, C<!T2_HARNESS_NO_FORK>, C<YATH_FORK>, C<!YATH_NO_FORK> 808 809 810=item --use-timeout 811 812=item --timeout 813 814=item --no-use-timeout 815 816(default: on) Enable/disable timeouts 817 818 819=back 820 821=head3 Workspace Options 822 823=over 4 824 825=item --clear 826 827=item -C 828 829=item --no-clear 830 831Clear the work directory if it is not already empty 832 833 834=item --tmp-dir ARG 835 836=item --tmp-dir=ARG 837 838=item --tmpdir ARG 839 840=item --tmpdir=ARG 841 842=item -t ARG 843 844=item -t=ARG 845 846=item --no-tmp-dir 847 848Use a specific temp directory (Default: use system temp dir) 849 850Can also be set with the following environment variables: C<T2_HARNESS_TEMP_DIR>, C<YATH_TEMP_DIR>, C<TMPDIR>, C<TEMPDIR>, C<TMP_DIR>, C<TEMP_DIR> 851 852 853=item --workdir ARG 854 855=item --workdir=ARG 856 857=item -w ARG 858 859=item -w=ARG 860 861=item --no-workdir 862 863Set the work directory (Default: new temp directory) 864 865Can also be set with the following environment variables: C<T2_WORKDIR>, C<YATH_WORKDIR> 866 867 868=back 869 870=head3 YathUI Options 871 872=over 4 873 874=item --yathui-api-key ARG 875 876=item --yathui-api-key=ARG 877 878=item --no-yathui-api-key 879 880Yath-UI API key. This is not necessary if your Yath-UI instance is set to single-user 881 882 883=item --yathui-db 884 885=item --no-yathui-db 886 887Add the YathUI DB renderer in addition to other renderers 888 889 890=item --yathui-grace 891 892=item --no-yathui-grace 893 894If yath cannot connect to yath-ui it normally throws an error, use this to make it fail gracefully. You get a warning, but things keep going. 895 896 897=item --yathui-long-duration 10 898 899=item --no-yathui-long-duration 900 901Minimum duration length (seconds) before a test goes from MEDIUM to LONG 902 903 904=item --yathui-medium-duration 5 905 906=item --no-yathui-medium-duration 907 908Minimum duration length (seconds) before a test goes from SHORT to MEDIUM 909 910 911=item --yathui-mode summary 912 913=item --yathui-mode qvf 914 915=item --yathui-mode qvfd 916 917=item --yathui-mode complete 918 919=item --no-yathui-mode 920 921Set the upload mode (default 'qvfd') 922 923 924=item --yathui-only 925 926=item --no-yathui-only 927 928Only use the YathUI renderer 929 930 931=item --yathui-only-db 932 933=item --no-yathui-only-db 934 935Only use the YathUI DB renderer 936 937 938=item --yathui-port 8080 939 940=item --no-yathui-port 941 942Port to use when running a local server 943 944 945=item --yathui-port-command get_port.sh 946 947=item --yathui-port-command get_port.sh --pid $$ 948 949=item --no-yathui-port-command 950 951Use a command to get a port number. "$$" will be replaced with the PID of the yath process 952 953 954=item --yathui-project ARG 955 956=item --yathui-project=ARG 957 958=item --no-yathui-project 959 960The Yath-UI project for your test results 961 962 963=item --yathui-render 964 965=item --no-yathui-render 966 967Add the YathUI renderer in addition to other renderers 968 969 970=item --yathui-retry 971 972=item --no-yathui-retry 973 974How many times to try an operation before giving up 975 976Can be specified multiple times 977 978 979=item --yathui-schema PostgreSQL 980 981=item --yathui-schema MySQL 982 983=item --yathui-schema MySQL56 984 985=item --no-yathui-schema 986 987What type of DB/schema to use when using a temporary database 988 989 990=item --yathui-url http://my-yath-ui.com/... 991 992=item --uri http://my-yath-ui.com/... 993 994=item --no-yathui-url 995 996Yath-UI url 997 998 999=item --yathui-user ARG 1000 1001=item --yathui-user=ARG 1002 1003=item --no-yathui-user 1004 1005Username to attach to the data sent to the db 1006 1007 1008=item --yathui-db-buffering none 1009 1010=item --yathui-db-buffering job 1011 1012=item --yathui-db-buffering diag 1013 1014=item --yathui-db-buffering run 1015 1016=item --no-yathui-db-buffering 1017 1018Type of buffering to use, if "none" then events are written to the db one at a time, which is SLOW 1019 1020 1021=item --yathui-db-config ARG 1022 1023=item --yathui-db-config=ARG 1024 1025=item --no-yathui-db-config 1026 1027Module that implements 'MODULE->yath_ui_config(%params)' which should return a Test2::Harness::UI::Config instance. 1028 1029 1030=item --yathui-db-coverage 1031 1032=item --no-yathui-db-coverage 1033 1034Pull coverage data directly from the database (default: off) 1035 1036 1037=item --yathui-db-driver Pg 1038 1039=item --yathui-db-drivermysql 1040 1041=item --yathui-db-driverMariaDB 1042 1043=item --no-yathui-db-driver 1044 1045DBI Driver to use 1046 1047 1048=item --yathui-db-dsn ARG 1049 1050=item --yathui-db-dsn=ARG 1051 1052=item --no-yathui-db-dsn 1053 1054DSN to use when connecting to the db 1055 1056 1057=item --yathui-db-durations 1058 1059=item --no-yathui-db-durations 1060 1061Pull duration data directly from the database (default: off) 1062 1063 1064=item --yathui-db-flush-interval 2 1065 1066=item --yathui-db-flush-interval 1.5 1067 1068=item --no-yathui-db-flush-interval 1069 1070When buffering DB writes, force a flush when an event is recieved at least N seconds after the last flush. 1071 1072 1073=item --yathui-db-host ARG 1074 1075=item --yathui-db-host=ARG 1076 1077=item --no-yathui-db-host 1078 1079hostname to use when connecting to the db 1080 1081 1082=item --yathui-db-name ARG 1083 1084=item --yathui-db-name=ARG 1085 1086=item --no-yathui-db-name 1087 1088Name of the database to use for yathui 1089 1090 1091=item --yathui-db-pass ARG 1092 1093=item --yathui-db-pass=ARG 1094 1095=item --no-yathui-db-pass 1096 1097Password to use when connecting to the db 1098 1099 1100=item --yathui-db-port ARG 1101 1102=item --yathui-db-port=ARG 1103 1104=item --no-yathui-db-port 1105 1106port to use when connecting to the db 1107 1108 1109=item --yathui-db-publisher ARG 1110 1111=item --yathui-db-publisher=ARG 1112 1113=item --no-yathui-db-publisher 1114 1115When using coverage or duration data, only use data uploaded by this user 1116 1117 1118=item --yathui-db-socket ARG 1119 1120=item --yathui-db-socket=ARG 1121 1122=item --no-yathui-db-socket 1123 1124socket to use when connecting to the db 1125 1126 1127=item --yathui-db-user ARG 1128 1129=item --yathui-db-user=ARG 1130 1131=item --no-yathui-db-user 1132 1133Username to use when connecting to the db 1134 1135 1136=back 1137 1138=head1 SOURCE 1139 1140The source code repository for Test2-Harness can be found at 1141F<http://github.com/Test-More/Test2-Harness/>. 1142 1143=head1 MAINTAINERS 1144 1145=over 4 1146 1147=item Chad Granum E<lt>exodist@cpan.orgE<gt> 1148 1149=back 1150 1151=head1 AUTHORS 1152 1153=over 4 1154 1155=item Chad Granum E<lt>exodist@cpan.orgE<gt> 1156 1157=back 1158 1159=head1 COPYRIGHT 1160 1161Copyright 2021 Chad Granum E<lt>exodist7@gmail.comE<gt>. 1162 1163This program is free software; you can redistribute it and/or 1164modify it under the same terms as Perl itself. 1165 1166See F<http://dev.perl.org/licenses/> 1167 1168=cut 1169 1170