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