1BEAKERLIB(1) User Contributed Perl Documentation BEAKERLIB(1)
2
3
4
6 BeakerLib - a shell-level integration testing library
7
9 BeakerLib is a shell-level integration testing library, providing
10 convenience functions which simplify writing, running and analysis of
11 integration and blackbox tests.
12
13 The essential features include:
14
15 • Journal - uniform logging mechanism (logs & results saved in
16 flexible XML format, easy to compare results & generate reports)
17
18 • Phases - logical grouping of test actions, clear separation of
19 setup / test / cleanup (preventing false fails)
20
21 • Asserts - common checks affecting the overall results of the
22 individual phases (checking for exit codes, file existence &
23 content...)
24
25 • Helpers - convenience functions for common operations such as
26 managing services, backup & restore
27
28 The main script sets the "BEAKERLIB" variable and sources other scripts
29 where the actual functions are defined. You should source it at the
30 beginning of your test with:
31
32 . /usr/share/beakerlib/beakerlib.sh
33
34 See the EXAMPLES section for quick start inspiration.
35
36 See the BKRDOC section for more information about Automated
37 documentation generator for BeakerLib tests.
38
40 Journalling
41 rlJournalStart
42
43 Initialize the journal file.
44
45 rlJournalStart
46
47 Run on the very beginning of your script to initialize journalling
48 functionality.
49
50 rlJournalEnd
51
52 Summarize the test run and upload the journal file.
53
54 rlJournalEnd
55
56 Run on the very end of your script to print summary of the whole test
57 run, generate OUTPUTFILE and include journal in Beaker logs.
58
59 rlJournalPrint
60
61 Print the content of the journal in pretty xml format.
62
63 rlJournalPrint [type]
64
65 type
66 Can be either 'raw' or 'pretty', with the latter as a default.
67 Raw: xml is in raw form, no indentation etc Pretty: xml is pretty
68 printed, indented, with one record per line
69
70 Example:
71
72 <?xml version="1.0"?>
73 <BEAKER_TEST>
74 <test_id>debugging</test_id>
75 <package>setup</package>
76 <pkgdetails>setup-2.8.9-1.fc12.noarch</pkgdetails>
77 <starttime>2010-02-08 15:17:47</starttime>
78 <endtime>2010-02-08 15:17:47</endtime>
79 <testname>/examples/beakerlib/Sanity/simple</testname>
80 <release>Fedora release 12 (Constantine)</release>
81 <hostname>localhost</hostname>
82 <arch>i686</arch>
83 <purpose>PURPOSE of /examples/beakerlib/Sanity/simple
84 Description: Minimal BeakerLib sanity test
85 Author: Petr Splichal <psplicha@redhat.com>
86
87 This is a minimal sanity test for BeakerLib. It contains a single
88 phase with a couple of asserts. We Just check that the "setup"
89 package is installed and that there is a sane /etc/passwd file.
90 </purpose>
91 <log>
92 <phase endtime="2010-02-08 15:17:47" name="Test" result="PASS"
93 score="0" starttime="2010-02-08 15:17:47" type="FAIL">
94 <test message="Checking for the presence of setup rpm">PASS</test>
95 <test message="File /etc/passwd should exist">PASS</test>
96 <test message="File '/etc/passwd' should contain 'root'">PASS</test>
97 </phase>
98 </log>
99 </BEAKER_TEST>
100
101 rlJournalPrintText
102
103 Print the content of the journal in pretty text format.
104
105 rlJournalPrintText [--full-journal]
106
107 --full-journal
108 The option is now deprecated, has no effect and will be removed in
109 a future version.
110
111 Example:
112
113 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
114 :: [ LOG ] :: TEST PROTOCOL
115 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
116
117 :: [ LOG ] :: Test run ID : debugging
118 :: [ LOG ] :: Package : debugging
119 :: [ LOG ] :: Test started : 2010-02-08 14:45:57
120 :: [ LOG ] :: Test finished : 2010-02-08 14:45:58
121 :: [ LOG ] :: Test name :
122 :: [ LOG ] :: Distro: : Fedora release 12 (Constantine)
123 :: [ LOG ] :: Hostname : localhost
124 :: [ LOG ] :: Architecture : i686
125
126 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
127 :: [ LOG ] :: Test description
128 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
129
130 PURPOSE of /examples/beakerlib/Sanity/simple
131 Description: Minimal BeakerLib sanity test
132 Author: Petr Splichal <psplicha@redhat.com>
133
134 This is a minimal sanity test for BeakerLib. It contains a single
135 phase with a couple of asserts. We Just check that the "setup"
136 package is installed and that there is a sane /etc/passwd file.
137
138
139 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
140 :: [ LOG ] :: Test
141 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
142
143 :: [ PASS ] :: Checking for the presence of setup rpm
144 :: [ PASS ] :: File /etc/passwd should exist
145 :: [ PASS ] :: File '/etc/passwd' should contain 'root'
146 :: [ LOG ] :: Duration: 1s
147 :: [ LOG ] :: Assertions: 3 good, 0 bad
148 :: [ PASS ] :: RESULT: Test
149
150 rlGetTestState
151
152 Returns number of failed asserts so far, or 255 if there are more than
153 255 failures. The variable ECODE is set to the precise number.
154
155 rlGetTestState
156
157 rlGetPhaseState
158
159 Returns number of failed asserts in the current phase so far, or 255 if
160 there are more than 255 failures. The variable ECODE is set to the
161 precise number.
162
163 rlGetPhaseState
164
165 Logging
166 rlLog
167
168 rlLogDebug
169
170 rlLogInfo
171
172 rlLogWarning
173
174 rlLogError
175
176 rlLogFatal
177
178 Create a time/priority-labelled message in the log. There is a bunch of
179 aliases which can create messages formated as DEBUG/INFO/WARNING/ERROR
180 or FATAL (but you would probably want to use rlDie instead of the last
181 one).
182
183 rlLog message [logfile] [priority] [label]
184
185 message
186 Message you want to show (use quotes when invoking).
187
188 logfile
189 Log file. If not supplied, OUTPUTFILE is assumed.
190
191 priority
192 Priority of the log.
193
194 label
195 Print this text instead of time in log label.
196
197 rlDie
198
199 Create a time-labelled message in the log, report test result, upload
200 logs, close unfinished phase and terminate the test.
201
202 rlDie message [file...]
203
204 message
205 Message you want to show (use quotes when invoking) - this option
206 is mandatory.
207
208 file
209 Files (logs) you want to upload as well. "rlBundleLogs" will be
210 used for it. Files which are not readable will be excluded before
211 calling "rlBundleLogs", so it is safe to call even with possibly
212 nonexistent logs and it will succeed.
213
214 rlBundleLogs
215
216 Create a tarball of files (e.g. logs) and attach them to the test
217 result.
218
219 rlBundleLogs package file [file...]
220
221 package
222 Name of the package. Will be used as part of the tarball name.
223
224 file
225 File(s) to be packed and submitted.
226
227 Returns result of submitting the tarball.
228
229 rlFileSubmit
230
231 Resolves absolute path to the file, replaces / with - and uploads this
232 renamed file using rhts-submit-log. It also allows you to specify your
233 custom name for the uploaded file.
234
235 rlFileSubmit [-s sep] path_to_file [required_name]
236
237 -s sep
238 Sets separator (i.e. the replacement of the /) to sep.
239
240 path_to_file
241 Either absolute or relative path to file. Relative path is
242 converted to absolute.
243
244 required_name
245 Default behavior renames file to full_path_to_file with / replaced
246 for -, if this does not suit your needs, you can specify the name
247 using this option.
248
249 Examples:
250
251 rlFileSubmit logfile.txt -> logfile.txt cd /etc; rlFileSubmit
252 ./passwd -> etc-passwd rlFileSubmit /etc/passwd -> etc-passwd
253 rlFileSubmit /etc/passwd my-top-secret_file -> my-top-secret-file
254 rlFileSubmit -s '_' /etc/passwd -> etc_passwd
255
256 Info
257 rlShowPackageVersion
258
259 Shows a message about version of packages.
260
261 rlShowPackageVersion package [package...]
262
263 package
264 Name of a package(s) you want to log.
265
266 rlGetArch
267
268 Sanitize architecture for simplier matching.
269
270 Return base arch for the current system (good when you need base arch
271 on a multilib system).
272
273 rlGetArch
274
275 On any 32-bit Intel (i386, i486, i586, ...) system you will get i386.
276
277 rlGetPrimaryArch
278
279 Return primary arch for the current system (good when you need base
280 arch on a multilib system).
281
282 rlGetPrimaryArch
283
284 On non-RHEL systems if the primary/secondary sedicision fails a
285 fallback to rlGetArch is done.
286
287 rlGetSecondaryArch
288
289 Return base arch for the current system (good when you need base arch
290 on a multilib system).
291
292 rlGetSecondaryArch
293
294 rlGetDistroRelease
295
296 rlGetDistroVariant
297
298 Return release or variant of the distribution on the system.
299
300 rlGetDistroRelease
301 rlGetDistroVariant
302
303 For example on the RHEL-4-AS you will get release 4 and variant AS, on
304 the RHEL-5-Client you will get release 5 and variant Client.
305
306 rlShowRunningKernel
307
308 Log a message with version of the currently running kernel.
309
310 rlShowRunningKernel
311
312 Phases
313 rlPhaseStart
314
315 Starts a phase of a specific type. The final phase result is based on
316 all asserts included in the phase. Do not forget to end phase with
317 "rlPhaseEnd" when you are done.
318
319 rlPhaseStart type [name]
320
321 type
322 Type of the phase, one of the following:
323
324 FAIL
325 When assert fails here, phase will report a FAIL.
326
327 WARN
328 When assert fails here, phase will report a WARN.
329
330 name
331 Optional name of the phase (if not provided, one will be
332 generated).
333
334 If all asserts included in the phase pass, phase reports PASS.
335
336 rlPhaseEnd
337
338 End current phase, summarize asserts included and report phase result.
339
340 rlPhaseEnd
341
342 Final phase result is based on included asserts and phase type.
343
344 rlPhaseStartSetup
345
346 rlPhaseStartTest
347
348 rlPhaseStartCleanup
349
350 Start a phase of the specified type: Setup -> WARN, Test -> FAIL,
351 Cleanup -> WARN.
352
353 rlPhaseStartSetup [name]
354 rlPhaseStartTest [name]
355 rlPhaseStartCleanup [name]
356
357 name
358 Optional name of the phase. If not specified, default
359 Setup/Test/Cleanup are used.
360
361 If you do not want these shortcuts, use plain "rlPhaseStart" function.
362
363 Reboot
364 Controlled reboot must not be executed inside of an open phase.
365 Otherwise it is possible the Overall result of the test will be
366 reported incorrectly.
367
368 Metric
369 rlLogMetricLow
370
371 Log a metric, which should be as low as possible to the journal.
372 (Example: memory consumption, run time)
373
374 rlLogMetricLow name value [tolerance]
375
376 name
377 Name of the metric. It has to be unique in a phase.
378
379 value
380 Value of the metric.
381
382 tolerance
383 It is used when comparing via rcw. It means how larger can the
384 second value be to not trigger a FAIL. Default is 0.2
385
386 When comparing FIRST, SECOND, then:
387
388 FIRST >= SECOND means PASS
389 FIRST+FIRST*tolerance >= SECOND means WARN
390 FIRST+FIRST*tolerance < SECOND means FAIL
391
392 Example: Simple benchmark is compared via this metric type in rcw. It
393 has a tolerance of 0.2. First run had 1 second. So:
394
395 For PASS, second run has to be better or equal to first.
396 So any value of second or less is a PASS.
397 For WARN, second run can be a little worse than first.
398 Tolerance is 0.2, so anything lower than 1.2 means WARN.
399 For FAIL, anything worse than 1.2 means FAIL.
400
401 rlLogMetricHigh
402
403 Log a metric, which should be as high as possible to the journal.
404 (Example: number of executions per second)
405
406 rlLogMetricHigh name value [tolerance]
407
408 name
409 Name of the metric. It has to be unique in a phase.
410
411 value
412 Value of the metric.
413
414 tolerance
415 It is used when comparing via rcw. It means how lower can the
416 second value be to not trigger a FAIL. Default is 0.2
417
418 When comparing FIRST, SECOND, then:
419
420 FIRST <= SECOND means PASS
421 FIRST+FIRST*tolerance <= SECOND means WARN
422 FIRST+FIRST*tolerance > SECOND means FAIL
423
424 Manual Asserts
425 rlPass
426
427 Manual assertion, asserts and logs PASS.
428
429 rlPass comment
430
431 comment
432 Short test summary.
433
434 Returns 0 and asserts PASS.
435
436 rlFail
437
438 Manual assertion, asserts and logs FAIL.
439
440 rlFail comment
441
442 comment
443 Short test summary.
444
445 Returns 1 and asserts FAIL.
446
447 Arithmetic Asserts
448 rlAssert0
449
450 Assertion checking for the equality of parameter to zero.
451
452 rlAssert0 comment value
453
454 comment
455 Short test summary, e.g. "Test if compilation ended successfully".
456
457 value
458 Integer value (usually return code of a command).
459
460 Returns 0 and asserts PASS when "value == 0".
461
462 rlAssertEquals
463
464 Assertion checking for the equality of two parameters.
465
466 rlAssertEquals comment value1 value2
467
468 comment
469 Short test summary, e.g. "Test if all 3 packages have been
470 downloaded".
471
472 value1
473 First parameter to compare, can be a number or a string
474
475 value2
476 Second parameter to compare, can be a number or a string
477
478 Returns 0 and asserts PASS when "value1 == value2".
479
480 rlAssertNotEquals
481
482 Assertion checking for the non-equality of two parameters.
483
484 rlAssertNotEquals comment value1 value2
485
486 comment
487 Short test summary, e.g. "Test if return code is not 139".
488
489 value1
490 First parameter to compare, can be a number or a string
491
492 value2
493 Second parameter to compare, can be a number or a string
494
495 Returns 0 and asserts PASS when "value1 != value2".
496
497 rlAssertGreater
498
499 Assertion checking whether first parameter is greater than the second
500 one.
501
502 rlAssertGreater comment value1 value2
503
504 comment
505 Short test summary, e.g. "Test whether there are running more
506 instances of program."
507
508 value1
509 Integer value.
510
511 value2
512 Integer value.
513
514 Returns 0 and asserts PASS when "value1 > value2".
515
516 rlAssertGreaterOrEqual
517
518 Assertion checking whether first parameter is greater or equal to the
519 second one.
520
521 rlAssertGreaterOrEqual comment value1 value2
522
523 comment
524 Short test summary (e.g. "There should present at least one...")
525
526 value1
527 Integer value.
528
529 value2
530 Integer value.
531
532 Returns 0 and asserts PASS when "value1 X= value2".
533
534 rlAssertLesser
535
536 Assertion checking whether first parameter is lesser than the second
537 one.
538
539 rlAssertLesser comment value1 value2
540
541 comment
542 Short test summary, e.g. "Test whether there are running more
543 instances of program."
544
545 value1
546 Integer value.
547
548 value2
549 Integer value.
550
551 Returns 0 and asserts PASS when "value1 < value2".
552
553 rlAssertLesserOrEqual
554
555 Assertion checking whether first parameter is lesser or equal to the
556 second one.
557
558 rlAssertLesserOrEqual comment value1 value2
559
560 comment
561 Short test summary (e.g. "There should present at least one...")
562
563 value1
564 Integer value.
565
566 value2
567 Integer value.
568
569 Returns 0 and asserts PASS when "value1 X= value2".
570
571 File Asserts
572 rlAssertExists
573
574 Assertion checking for the existence of a file or a directory.
575
576 rlAssertExists file|directory
577
578 file|directory
579 Path to the file or directory.
580
581 Returns 0 and asserts PASS when "file" exists.
582
583 rlAssertNotExists
584
585 Assertion checking for the non-existence of a file or a directory.
586
587 rlAssertNotExists file|directory
588
589 file|directory
590 Path to the file or directory.
591
592 Returns 0 and asserts PASS when "file" does not exist.
593
594 rlAssertGrep
595
596 Assertion checking if the file contains a pattern.
597
598 rlAssertGrep pattern file [options]
599
600 pattern
601 Regular expression to be searched for.
602
603 file
604 Path to the file.
605
606 options
607 Optional parameters to be passed to grep, default is "-q". Can be
608 used to perform case insensitive matches (-i), or using extended
609 (-E) or perl (-P) regular expressions.
610
611 Returns 0 and asserts PASS when "file" exists and contains given
612 "pattern".
613
614 rlAssertNotGrep
615
616 Assertion checking that the file does not contain a pattern.
617
618 rlAssertNotGrep pattern file [options]
619
620 pattern
621 Regular expression to be searched for.
622
623 file
624 Path to the file.
625
626 options
627 Optional parameters to be passed to grep, default is "-q". Can be
628 used to perform case insensitive matches (-i), or using extended
629 (-E) or perl (-P) regular expressions.
630
631 Returns 0 and asserts PASS when "file" exists and does not contain
632 given "pattern".
633
634 rlAssertDiffer
635
636 Assertion checking that two files differ (are not identical).
637
638 rlAssertDiffer file1 file2
639
640 file1
641 Path to first file1
642
643 file2
644 Path to second file
645
646 Returns 0 and asserts PASS when "file1" and "file2" differs.
647
648 rlAssertNotDiffer
649
650 Assertion checking that two files do not differ (are identical).
651
652 rlAssertNotDiffer file1 file2
653
654 file1
655 Path to first file1
656
657 file2
658 Path to second file
659
660 Returns 0 and asserts PASS when "file1" and "file2" do not differ.
661
662 Run, Watch, Report
663 rlRun
664
665 Run command with optional comment and make sure its exit code matches
666 expectations.
667
668 rlRun [-t] [-l] [-c] [-s] command [status[,status...] [comment]]
669
670 -t If specified, stdout and stderr of the command output will be
671 tagged with strings 'STDOUT: ' and 'STDERR: '.
672
673 -l If specified, output of the command (tagged, if -t was specified)
674 is logged using rlLog function. This is intended for short outputs,
675 and therefore only last 50 lines are logged this way. Longer
676 outputs should be analysed separately, or uploaded via rlFileSubmit
677 or rlBundleLogs.
678
679 -c Same as "-l", but only log the command output if it failed.
680
681 -s Store stdout and stderr to a file (mixed together, as the user
682 would see it on a terminal) and set $rlRun_LOG variable to name of
683 the file. $rlRun_LOG is now actually an array where the first index
684 holds the last reference to the file. Thus its behavior is not
685 changed if used without an index. The array is consumed by the
686 rlJournalEnd function to remove the leftover files, so no manual
687 files removal is needed anymore. Note that if you need to use such
688 a file after calling the rlJournalEnd function you need to create
689 your own copy of the respective file. When -t option is used, the
690 content of the file becomes tagged too.
691
692 If the -s option is not used, $rlRun_LOG is not modified and keeps
693 its content from the last "rlRun -s".
694
695 command
696 Command to run.
697
698 status
699 Expected exit code(s). Optional, default 0. If you expect more exit
700 codes, separate them with comma (e.g. "0,1" when both 0 and 1 are
701 OK and expected), or use from-to notation (i.e. "2-5" for
702 "2,3,4,5"), or combine them (e.g. "2-4,26" for "2,3,4,26").
703
704 comment
705 Short summary describing the action (optional, but recommended -
706 explain what you are doing here).
707
708 Returns the exit code of the command run. Asserts PASS when command\'s
709 exit status is in the list of expected exit codes.
710
711 Note:
712
713 • The output of rlRun is buffered when using "-t", "-l" or "-s"
714 option (they use unix pipes, which are buffered by nature). If you
715 need an unbuffered output just make sure that "expect" package is
716 installed on your system (its "unbuffer" tool will automatically be
717 used to produce unbuffered output).
718
719 • Be aware that there are some variables which can collide with your
720 code executed within rlRun. You should avoid using
721 __INTERNAL_rlRun_* variables.
722
723 • When any of "-t" "-l", "-c", or "-s" option is used, special file
724 descriptors 111 and 112 are used to avoid the issue with incomplete
725 log file, bz1361246. As there might be an indefinite loop, there's
726 a timeout of two minutes implemented as a fix for bz1416796. Also
727 an error message is issued to signal the possibility of running
728 subprocess which keeps the file descriptors open.
729
730 Do not use these options if you expect process forking and
731 continuouse run. Try your own apropriate solution instead.
732
733 Warning: using "unbuffer" tool is now disabled because of bug 547686.
734
735 rlWatchdog
736
737 Run "command". If it does not finish in specified time, then kill it
738 using "signal". Note that the command is executed in a sub-shell so
739 modified environment (e.g. set variables) is not relfected in the test
740 environment.
741
742 rlWatchdog command timeout [signal] [callback]
743
744 command
745 Command to run.
746
747 timeout
748 Timeout to wait, in seconds.
749
750 signal
751 Signal to use (optional, default KILL).
752
753 callback
754 Callback function to be called before the signal is send (optional,
755 none by default). The callback function will have one argument
756 available -- PGID of the process group.
757
758 Returns 0 if the command ends normally, without need to be killed.
759
760 rlReport
761
762 Report test result to the test harness. The command to be used for
763 reporting is set by the respective plugin. You can also use the
764 $BEAKERLIB_COMMAND_REPORT_RESULT variable to use your custom command.
765
766 rlReport name result [score] [log]
767
768 name
769 Name of the test result.
770
771 result
772 Result (one of PASS, WARN, FAIL). If called with something else,
773 will use WARN.
774
775 score
776 Test score (optional).
777
778 log Optional log file to be submitted instead of default "OUTPUTFILE".
779
780 rlCmpVersion
781
782 Compare two given versions composed by numbers and letters divided by
783 dot (.), underscore (_), or dash (-).
784
785 rlCmpVersion ver1 ver2
786
787 If ver1 = ver2, sign '=' is printed to stdout and 0 is returned. If
788 ver1 > ver2, sign '>' is printed to stdout and 1 is returned. If ver1
789 < ver2, sign '<' is printed to stdout and 2 is returned.
790
791 rlTestVersion
792
793 Test releation between two given versions based on given operator.
794
795 rlTestVersion ver1 op ver2
796
797 op Operator defining the logical expression. It can be '=', '==',
798 '!=', '<', '<=', '=<', '>', '>=', or '=>'.
799
800 Returns 0 if the expresison ver1 op ver2 is true; 1 if the expression
801 is false and 2 if something went wrong.
802
803 Release Info
804 rlIsRHEL
805
806 rlIsRHEL [VERSION_SPEC]...
807
808 VERSION_SPEC
809 Argument specifies version of particular RHEL distribution, eg. 8,
810 8.4 ">8.4".
811
812 For more details see description of "rlIsOSVersion".
813
814 Returns 0 when we're running on RHEL. With given version specification
815 in arguments returns 0 if the particular RHEL version is running.
816
817 Prototype:
818
819 rlIsRHEL
820
821 Returns 0 if we are running on RHEL.
822
823 rlIsRHEL 7 '>=8.5'
824
825 Returns 0 if we are running any RHEL 7 or RHEL 8.5 and higher.
826
827 rlIsFedora
828
829 rlIsFedora [VERSION_SPEC]...
830
831 VERSION_SPEC
832 Argument specifies version of particular Fedora distribution, eg.
833 30, ">30".
834
835 For more details see description of "rlIsOSVersion".
836
837 Returns 0 when we're running on Fedora. With given version
838 specification in arguments returns 0 if the particular Fedora version
839 is running.
840
841 Prototype:
842
843 rlIsFedora
844
845 Returns 0 if we are running on Fedora.
846
847 rlIsFedora 30 32
848
849 Returns 0 if we are running Fedora 30 or 32.
850
851 rlIsCentOS
852
853 rlIsCentOS [VERSION_SPEC]...
854
855 VERSION_SPEC
856 Argument specifies version of particular CentOS distribution, eg.
857 7, ">7".
858
859 For more details see description of "rlIsOSVersion".
860
861 Returns 0 when we're running on CentOS. With given version
862 specification in arguments returns 0 if the particular CentOS version
863 is running.
864
865 Prototype:
866
867 rlIsCentOS
868
869 Returns 0 if we are running on CentOS.
870
871 rlIsCentOS 7.1 6
872
873 Returns 0 if we are running CentOS 7.1 or any CentOS 6.
874
875 rlIsOS
876
877 rlIsOS ID
878
879 ID Argument is based on contents of /etc/os-release. Possible options
880 of ID are e.g. fedora, rhel, centos, ol.
881
882 Returns 0 when we're running on system with respective ID. Returns 1
883 when parameter does not match with ID in os-release. Returns 2 when
884 there is no ID defined. Returns 3 when no argument is given.
885
886 Prototype:
887
888 rlIsOS rhel
889
890 Returns 0 if we are running on RHEL.
891
892 rlIsOSLike
893
894 rlIsOSLike ID_LIKE
895
896 ID_LIKE
897 Argument is based on contents of /etc/os-release. Possible options
898 of ID_LIKE are e.g. fedora, rhel.
899
900 Returns 0 when we're running on system with requested ID_LIKE. Returns
901 1 when parameter does not match with ID nor ID_LIKE in os-release.
902 Returns 2 when there is no ID or ID_LIKE defined. Returns 3 when no
903 argument is given.
904
905 Prototype:
906
907 rlIsOSLike rhel
908
909 Returns 0 if we are running on RHEL, CentOS, Rocky Linux, etc..
910
911 rlIsOSLike fedora
912
913 Returns 0 if we are running on Fedora, RHEL, CentOS, Oracle Linux, etc..
914
915 rlIsOSVersion
916
917 rlIsOsVersion VERSION_SPEC...
918
919 VERSION_SPEC
920 Parameter is based on VERSION_ID in /etc/os-release. It consists
921 of either "major" or "major"."minor" refering to a particular
922 release.
923
924 It accepts multiple arguments separated by space (8.1 8.2 8.3 9).
925
926 To specify a group of distributions optional operator can be passed
927 in argument together with the version number as one string
928 ('>8.5'). Operator can be '<', '<=', '=<', '=', '>', '>=' matching
929 whether the currently installed version is lesser, lesser or equal,
930 equal, equal or greater, greater than the version number supplied
931 as second half of the argument.
932
933 Note that when using >/< operators you have to either put the
934 argument in quotes or escape the operators to avoid them being
935 interpreted as bash redirection operator.
936
937 Returns 0 when we're running distribution of the particular version
938 requested by the argument.
939
940 It usually follows after "rlIsOS" and "rlIsOSLike".
941
942 Be cautious when using together with "rlIsOSLike" as different
943 distributions may use different versioning schema.
944
945 Prototype:
946
947 rlIsOSVersion 6 7 9
948
949 Returns 0 if we are running distribution with VERSION_ID 6, 7 or 9.
950
951 rlIsOSVersion 7.8 8
952
953 Returns 0 if we are running distribution 7.8 or any 8.
954
955 rlIsOSVersion ">=7.5" or rlIsOSVersion \>=7.5
956
957 Returns 0 if we are running distribution 7.5 or higher (both minors or majors).
958
959 Note:
960
961 rlIsOSVersion '<7.5' || rlIsOSVersion '<8.5'
962
963 would also cover 7.9 as it is less than 8.5, which is not what you want.
964 So if you want to construct a condition for a distribution <7.5 within the major 7 or
965 a distribution <8.5 within the major 8 you actually need to use following construct:
966
967 rlIsOSVersion 7 && rlIsOSVersion '<7.5' || rlIsOSVersion 8 && rlIsOSVersion '<8.5'
968
969 This returns 0 when running distribution less than 7.5 and less then 8.5, but not 7.9 (nor 6.9).
970
971 rlIsRHELLike
972
973 rlIsRHELLike [VERSION_SPEC]...
974
975 VERSION_SPEC
976 Argument specifies version of particular RHEL distribution, eg. 8,
977 8.4 ">8.4".
978
979 For more details see description of "rlIsOSVersion".
980
981 Returns 0 when we're running on RHEL-like distribution. These are
982 considered to be RHEL, CentOS, Rocky Linux, etc.. With given version
983 specification in arguments returns 0 if the particular version of RHEL-
984 like distribution is running.
985
986 Prototype:
987
988 rlIsRHELLike
989
990 Returns 0 if we are running on RHEL-like system.
991
992 rlIsRHELLike ">=6"
993
994 Returns 0 if we are running on RHEL-like distribution of version 6.0 or higher.
995
996 Rpm Handling
997 rlCheckRpm
998
999 Check whether a package is installed.
1000
1001 rlCheckRpm name [version] [release] [arch]
1002
1003 name
1004 Package name like "kernel"
1005
1006 version
1007 Package version like 2.6.25.6
1008
1009 release
1010 Package release like "55.fc9"
1011
1012 arch
1013 Package architucture like "i386"
1014
1015 Returns 0 if the specified package is installed.
1016
1017 rlAssertRpm
1018
1019 Assertion making sure that a package is installed.
1020
1021 rlAssertRpm name [version] [release] [arch]>
1022 rlAssertRpm --all
1023
1024 name
1025 Package name like "kernel"
1026
1027 version
1028 Package version like 2.6.25.6
1029
1030 release
1031 Package release like "55.fc9"
1032
1033 arch
1034 Package architucture like "i386"
1035
1036 --all
1037 Assert all packages listed in the $PACKAGES $REQUIRES and
1038 $COLLECTIONS environment variables.
1039
1040 Returns 0 and asserts PASS if the specified package is installed.
1041
1042 rlAssertNotRpm
1043
1044 Assertion making sure that a package is not installed. This is just
1045 inverse of "rlAssertRpm".
1046
1047 rlAssertNotRpm name [version] [release] [arch]>
1048
1049 name
1050 Package name like "kernel"
1051
1052 version
1053 Package version like 2.6.25.6
1054
1055 release
1056 Package release like "55.fc9"
1057
1058 arch
1059 Package architucture like "i386"
1060
1061 Returns 0 and asserts PASS if the specified package is not installed.
1062
1063 Example
1064
1065 Function "rlAssertRpm" is useful especially in prepare phase where it
1066 causes abort if a package is missing, while "rlCheckRpm" is handy when
1067 doing something like:
1068
1069 if ! rlCheckRpm package; then
1070 yum install package
1071 rlAssertRpm package
1072 fi
1073
1074 rlAssertBinaryOrigin
1075
1076 Assertion making sure that given binary is owned by (one of) the given
1077 package(s).
1078
1079 rlAssertBinaryOrigin binary package [package2 [...]]
1080 PACKAGES=... rlAssertBinaryOrigin binary
1081
1082 binary
1083 Binary name like "ksh" or "/bin/ksh"
1084
1085 package
1086 List of packages like "ksh mksh". The parameter is optional. If
1087 missing, contents of environment variable $PACKAGES are taken into
1088 account.
1089
1090 Returns 0 and asserts PASS if the specified binary belongs to (one of)
1091 the given package(s). Returns 1 and asserts FAIL if the specified
1092 binary does not belong to (any of) the given package(s). Returns 2 and
1093 asserts FAIL if the specified binary is not found. Returns 3 and
1094 asserts FAIL if no packages are given. Returns 100 and asserts FAIL if
1095 invoked with no parameters.
1096
1097 Example
1098
1099 Function "rlAssertBinaryOrigin" is useful especially in prepare phase
1100 where it causes abort if a binary is missing or is owned by different
1101 package:
1102
1103 PACKAGES=mksh rlAssertBinaryOrigin ksh
1104 or
1105 rlAssertBinaryOrigin ksh mksh
1106
1107 Returns true if ksh is owned by the mksh package (in this case:
1108 /bin/ksh is a symlink pointing to /bin/mksh).
1109
1110 rlGetMakefileRequires
1111
1112 Prints space separated list of requirements defined in Makefile using
1113 'Requires' attribute.
1114
1115 Return 0 if success.
1116
1117 rlGetYAMLdeps
1118
1119 Prints space separated list of requirements defined in metadata.yaml
1120 using 'require' and / or 'recommend' attribute.
1121
1122 Full fmf ids and library references are to be ignored.
1123
1124 rlGetYAMLdeps DEP_TYPE [array_var_name]
1125
1126 DEP_TYPE
1127 Dependency type defined as a regexp. Expected values are 'require',
1128 'recommend', or 'require|recommend'. The matching attribute values
1129 are then processed. Defaults to 'require'.
1130
1131 array_var_name
1132 Name of the variable to put the output to in a form of an array.
1133 This can hold also dependencies with specific version. If used,
1134 the output to stdout is suppressed.
1135
1136 Return 0 if success.
1137
1138 rlCheckRequirements
1139
1140 Check that all given requirements are covered eigther by installed
1141 package or by binary available in PATHs or by some package's provides.
1142
1143 rlRun "rlCheckRequirements REQ..."
1144
1145 REQ Requirement to be checked. It can be package name, provides string
1146 or binary name. Moreover, the requirement can be written the same
1147 way as the Require in the spec file, including the version
1148 specification, e.g. "bash >= 4.4". The comparsion operator may be
1149 any of supported by rlTestVersion(), see its manual.
1150
1151 Returns number of unsatisfied requirements.
1152
1153 rlCheckMakefileRequires
1154
1155 Check presence of required packages / binaries defined in metadata.yaml
1156 provided by "tmt" or Makefile of the test.
1157
1158 Also check presence of recommended packages / binaries defined in
1159 metadata.yaml provided by "tmt". These however do not participate on
1160 the return code, these are just informative.
1161
1162 Example
1163
1164 rlRun "rlCheckMakefileRequires"
1165
1166 Return 255 if requirements could not be retrieved, 0 if all
1167 requirements are satisfied or number of unsatisfied requirements.
1168
1169 rlGetRequired =head3 rlGetRecommended
1170
1171 Get a list of required or recommended packages / binaries defined in
1172 metadata.yaml provided by "tmt" or in a Makefile of the test.
1173
1174 rlGetRequired [ARRAY_VAR_NAME]
1175 rlGetRecommended [ARRAY_VAR_NAME]
1176
1177 ARRAY_VAR_NAME
1178 If provided the variable is populated as an array with the
1179 respective dependencies. Otherwise the dependencies are printed out
1180 to the STDOUT.
1181
1182 Return 255 if requirements could not be retrieved, 0 otherwise.
1183
1184 rlCheckRequired =head3 rlCheckRecommended =head3 rlCheckDependencies
1185
1186 Check presence of required, recommended or both packages / binaries
1187 defined in metadata.yaml provided by "tmt" or in a Makefile of the
1188 test.
1189
1190 Example
1191
1192 rlRun "rlCheckRequired"
1193 rlRun "rlCheckRecommended"
1194 rlRun "rlCheckDependencies"
1195
1196 Return 255 if requirements could not be retrieved, 0 if all
1197 requirements are satisfied or number of unsatisfied requirements.
1198
1199 rlAssertRequired
1200
1201 Ensures that all required packages provided in either metadata.yaml or
1202 Makefile are installed.
1203
1204 rlAssertRequired
1205
1206 Prints out a verbose list of installed/missing packages during
1207 operation.
1208
1209 Returns 0 if all required packages are installed, 1 if one or more
1210 packages are missing or if no Makefile is present.
1211
1212 Getting RPMs
1213 Download methods
1214
1215 Functions handling rpm downloading/installing can use more methods for
1216 actual download of the rpm.
1217
1218 Currently there are two download methonds available:
1219
1220 direct
1221 Use use dirct download from build system (brew).
1222
1223 yum Use yumdownloader or dnf download.
1224
1225 The methods and their order are defined by
1226 BEAKERLIB_RPM_DOWNLOAD_METHODS variable as space separated list. By
1227 default it is 'direct yum'. This can be overridden by user. There may
1228 be done also additions or changes to the original value, e.g.
1229 BEAKERLIB_RPM_DOWNLOAD_METHODS='yum
1230 ${BEAKERLIB_RPM_DOWNLOAD_METHODS/yum/}'
1231
1232
1233
1234 Beakerlib is prepared for more Koji-based sources of packages while
1235 usigng direct download method. By default packages are fetched from
1236 Koji, particularly from https://kojipkgs.fedoraproject.org/packages.
1237
1238 rlRpmInstall
1239
1240 Try to install specified package from local Red Hat sources.
1241
1242 rlRpmInstall [--quiet] package version release arch
1243
1244 --quiet
1245 Make the download and the install process be quiet.
1246
1247 package
1248 Package name like "kernel"
1249
1250 version
1251 Package version like 2.6.25.6
1252
1253 release
1254 Package release like "55.fc9"
1255
1256 arch
1257 Package arch like "i386"
1258
1259 Returns 0 if specified package was installed successfully.
1260
1261 rlRpmDownload
1262
1263 Try to download specified package.
1264
1265 rlRpmDownload [--quiet] {package version release arch|N-V-R.A}
1266 rlRpmDownload [--quiet] --source {package version release|N-V-R}
1267
1268 --quiet
1269 Make the download process be quiet.
1270
1271 package
1272 Package name like "kernel"
1273
1274 version
1275 Package version like 2.6.25.6
1276
1277 release
1278 Package release like "55.fc9"
1279
1280 arch
1281 Package arch like "i386"
1282
1283 Returns 0 if specified package was downloaded successfully.
1284
1285 rlFetchSrcForInstalled
1286
1287 Tries various ways to download source rpm for specified installed rpm.
1288
1289 rlFetchSrcForInstalled [--quiet] package
1290
1291 --quiet
1292 Make the download process be quiet.
1293
1294 package
1295 Installed package name like "kernel". It accepts in-direct names.
1296 E.g. for the package name "krb5-libs" the function will download
1297 the "krb5" source rpm.
1298
1299 Returns 0 if the source package was successfully downloaded.
1300
1301 Mounting
1302 rlMount
1303
1304 Create mount point (if neccessary) and mount a NFS share.
1305
1306 rlMount [-o MOUNT_OPTS] server share mountpoint
1307
1308 server
1309 NFS server hostname.
1310
1311 share
1312 Shared directory name.
1313
1314 mountpoint
1315 Local mount point.
1316
1317 MOUNT_OPTS
1318 Mount options.
1319
1320 Returns 0 if mounting the share was successful.
1321
1322 rlCheckMount
1323
1324 Check either if a directory is a mountpoint, if it is a mountpoint to a
1325 specific server, or if it is a mountpoint to a specific export on a
1326 specific server and if it uses specific mount options.
1327
1328 rlCheckMount [-o MOUNT_OPTS] mountpoint
1329 rlCheckMount [-o MOUNT_OPTS] server mountpoint
1330 rlCheckMount [-o MOUNT_OPTS] server share mountpoint
1331
1332 mountpoint
1333 Local mount point.
1334
1335 server
1336 NFS server hostname
1337
1338 share
1339 Shared directory name
1340
1341 MOUNT_OPTS
1342 Mount options to check (comma separated list)
1343
1344 With one parameter, returns 0 when specified directory exists and is a
1345 mountpoint. With two parameters, returns 0 when specific directory
1346 exists, is a mountpoint and an export from specific server is mounted
1347 there. With three parameters, returns 0 if a specific shared directory
1348 is mounted on a given server on a given mountpoint
1349
1350 If the -o option is provided, returns 0 if the mountpoint uses all the
1351 given options, 2 otherwise.
1352
1353 rlAssertMount
1354
1355 Assertion making sure that given directory is a mount point, if it is a
1356 mountpoint to a specific server, or if it is a mountpoint to a specific
1357 export on a specific server and if it uses specific mount options.
1358
1359 rlAssertMount [-o MOUNT_OPTS] mountpoint
1360 rlAssertMount [-o MOUNT_OPTS] server mountpoint
1361 rlAssertMount [-o MOUNT_OPTS] server share mountpoint
1362
1363 mountpoint
1364 Local mount point.
1365
1366 server
1367 NFS server hostname
1368
1369 share
1370 Shared directory name
1371
1372 MOUNT_OPTS
1373 Mount options to check (comma separated list)
1374
1375 With one parameter, returns 0 when specified directory exists and is a
1376 mountpoint. With two parameters, returns 0 when specific directory
1377 exists, is a mountpoint and an export from specific server is mounted
1378 there. With three parameters, returns 0 if a specific shared directory
1379 is mounted on a given server on a given mountpoint. Asserts PASS when
1380 the condition is true.
1381
1382 If the -o option is provided, asserts PASS if the above conditions are
1383 met and the mountpoint uses all the given options.
1384
1385 rlHash, rlUnhash
1386
1387 Hashes/Unhashes given string and prints the result to stdout.
1388
1389 rlHash [--decode] [--algorithm HASH_ALG] --stdin|STRING
1390 rlUnhash [--algorithm HASH_ALG] --stdin|STRING
1391
1392 --decode
1393 Unhash given string.
1394
1395 --algorithm
1396 Use given hash algorithm. Currently supported algorithms:
1397 base64
1398 base64_ - this is standard base64 where '=' is replaced by '_'
1399 hex
1400
1401 Defaults to hex. Default algorithm can be override using global
1402 variable rlHashAlgorithm.
1403
1404 --stdin
1405 Get the string from stdin.
1406
1407 STRING
1408 String to be hashed/unhashed.
1409
1410 Returns 0 if success.
1411
1412 Backup and Restore
1413 rlFileBackup
1414
1415 Create a backup of files or directories (recursive). Can be used
1416 multiple times to add more files to backup. Backing up an already
1417 backed up file overwrites the original backup.
1418
1419 rlFileBackup [--clean] [--namespace name] [--missing-ok|--no-missing-ok] file [file...]
1420
1421 You can use "rlRun" for asserting the result but keep in mind meaning
1422 of exit codes, especialy exit code 8, if using without --clean option.
1423
1424 --clean
1425 If this option is provided (has to be the first option of the
1426 command), then file/dir backed up using this command (provided in
1427 next options) will be (recursively) removed before we restore it.
1428 This option implies --missing-ok, which can be overridden by
1429 --no-missing-ok.
1430
1431 --namespace name
1432 Specifies the namespace to use. Namespaces can be used to separate
1433 backups and their restoration.
1434
1435 --missing-ok
1436 Do not raise an error in case of missing file to backup.
1437
1438 --no-missing-ok
1439 Do raise an error in case of missing file to backup. This is
1440 useful with --clean. This behaviour can be globally set by global
1441 variable BEAKERLIB_FILEBACKUP_MISSING_OK=false.
1442
1443 file
1444 Files and/or directories to be backed up.
1445
1446 Returns 0 if the backup was successful. Returns 1 if parsing of
1447 parameters was not successful. Returns 2 if no files specification was
1448 provided. Returns 3 if BEAKERLIB_DIR variable is not set, e.g.
1449 rlJournalStart was not executed. Returns 4 if creating of main backup
1450 destination directories was not successful. Returns 5 if creating of
1451 file specific backup destination directories was not successful.
1452 Returns 6 if the copy of backed up files was not successful. Returns 7
1453 if attributes of backed up files were not successfuly copied. Returns
1454 8 if backed up files do not exist. This can be suppressed based on
1455 other options.
1456
1457 Example with --clean:
1458
1459 touch cleandir/aaa
1460 rlRun "rlFileBackup --clean cleandir/"
1461 touch cleandir/bbb
1462 ls cleandir/
1463 aaa bbb
1464 rlRun "rlFileRestore"
1465 ls cleandir/
1466 aaa
1467
1468 rlFileRestore
1469
1470 Restore backed up files to their original location. "rlFileRestore"
1471 does not remove new files appearing after backup has been made. If you
1472 don't want to leave anything behind just remove the whole original tree
1473 before running "rlFileRestore", or see "--clean" option of
1474 "rlFileBackup".
1475
1476 rlFileRestore [--namespace name]
1477
1478 You can use "rlRun" for asserting the result.
1479
1480 --namespace name
1481 Specifies the namespace to use. Namespaces can be used to separate
1482 backups and their restoration.
1483
1484 Returns 0 if backup dir is found and files are restored successfully.
1485
1486 Return code bits meaning:
1487
1488 XXXXX
1489 |||||
1490 ||||\_ error parsing parameters
1491 |||\__ could not find backup directory
1492 ||\___ files cleanup failed
1493 |\____ files restore failed
1494 \_____ no files were restored nor cleaned
1495
1496 Services
1497 Following routines implement comfortable way how to start/stop system
1498 services with the possibility to restore them to their original state
1499 after testing.
1500
1501 rlServiceStart
1502
1503 Make sure the given "service" is running with fresh configuration.
1504 (Start it if it is stopped and restart if it is already running.) In
1505 addition, when called for the first time, the current state is saved so
1506 that the "service" can be restored to its original state when testing
1507 is finished, see "rlServiceRestore".
1508
1509 rlServiceStart service [service...]
1510
1511 service
1512 Name of the service(s) to start.
1513
1514 Returns number of services which failed to start/restart; thus zero is
1515 returned when everything is OK.
1516
1517 rlServiceStop
1518
1519 Make sure the given "service" is stopped. Stop it if it is running and
1520 do nothing when it is already stopped. In addition, when called for the
1521 first time, the current state is saved so that the "service" can be
1522 restored to its original state when testing is finished, see
1523 "rlServiceRestore".
1524
1525 rlServiceStop service [service...]
1526
1527 service
1528 Name of the service(s) to stop.
1529
1530 Returns number of services which failed to become stopped; thus zero is
1531 returned when everything is OK.
1532
1533 rlServiceRestore
1534
1535 Restore given "service" into its original state (before the first
1536 "rlServiceStart" or "rlServiceStop" was called). If "rlServiceStart"
1537 was called on already running "service", "rlServiceRestore" will
1538 restart the "service" when restoring its state.
1539
1540 rlServiceRestore [service...]
1541
1542 service
1543 Name of the service(s) to restore to original state. All services
1544 will be restored in reverse order if no service name is given.
1545
1546 Returns number of services which failed to get back to their original
1547 state; thus zero is returned when everything is OK.
1548
1549 rlServiceStatus
1550
1551 Print status (output of `service SERVICE status` or `systemctl status
1552 SERVICE`) of given "SERVICE".
1553
1554 rlServiceStatus SERVICE [SERVICE...]
1555
1556 SERVICE
1557 The service to get the status of.
1558
1559 Returns service status return code of the last provided SERVICE.
1560
1561 rlServiceEnable
1562
1563 Enables selected services if needed, or does nothing if already
1564 enabled. In addition, when called for the first time, the current
1565 state is saved so that the "service" can be restored to its original
1566 state when testing is finished, see "rlServiceRestore".
1567
1568 rlServiceEnable service [service...]
1569
1570 service
1571 Name of the service(s) to enable.
1572
1573 Returns number of services which failed enablement; thus zero is
1574 returned when everything is OK.
1575
1576 rlServiceDisable
1577
1578 Disables selected services if needed, or does nothing if already
1579 disabled. In addition, when called for the first time, the current
1580 state is saved so that the "service" can be restored to its original
1581 state when testing is finished, see "rlServiceRestore".
1582
1583 rlServiceDisable service [service...]
1584
1585 service
1586 Name of the service(s) to disable.
1587
1588 Returns number of services which failed disablement; thus zero is
1589 returned when everything is OK.
1590
1591 Sockets
1592 Following routines implement comfortable way how to start/stop system
1593 sockets with the possibility to restore them to their original state
1594 after testing.
1595
1596 rlSocketStart
1597
1598 Make sure the given "socket" is running. (Start it if stopped, leave it
1599 if already running.) In addition, when called for the first time, the
1600 current state is saved so that the "socket" can be restored to its
1601 original state when testing is finished, see "rlSocketRestore".
1602
1603 rlSocketStart socket [socket...]
1604
1605 socket
1606 Name of the socket(s) to start.
1607
1608 Returns number of sockets which failed to start/restart; thus zero is
1609 returned when everything is OK.
1610
1611 rlSocketStop
1612
1613 Make sure the given "socket" is stopped. Stop it if it is running and
1614 do nothing when it is already stopped. In addition, when called for the
1615 first time, the current state is saved so that the "socket" can be
1616 restored to its original state when testing is finished, see
1617 "rlSocketRestore".
1618
1619 rlSocketStop socket [socket...]
1620
1621 socket
1622 Name of the socket(s) to stop.
1623
1624 Returns number of sockets which failed to become stopped; thus zero is
1625 returned when everything is OK.
1626
1627 rlSocketRestore
1628
1629 Restore given "socket" into its original state (before the first
1630 "rlSocketStart" or "rlSocketStop" was called).
1631
1632 Warning !!! Xinetd process [even though it might have been used] is
1633 NOT restored. It is recommended to call rlServiceRestore xinetd as
1634 well.
1635
1636 rlSocketRestore socket [socket...]
1637
1638 socket
1639 Name of the socket(s) to restore to original state.
1640
1641 Returns number of sockets which failed to get back to their original
1642 state; thus zero is returned when everything is OK.
1643
1644 Cleanup management
1645 Cleanup management works with a so-called cleanup buffer, which is a
1646 temporary representation of what should be run at cleanup time, and a
1647 final cleanup script (executable), which is generated from this buffer
1648 and wraps it using BeakerLib essentials (journal initialization,
1649 cleanup phase, ...). The cleanup script must always be updated on an
1650 atomic basis (filesystem-wise) to allow an asynchronous execution by a
1651 third party (ie. test watcher).
1652
1653 The test watcher usage is mandatory for the cleanup management system
1654 to work properly as it is the test watcher that executes the actual
1655 cleanup script. Limited, catastrophe-avoiding mechanism is in place
1656 even when the test is not run in test watcher, but that should be seen
1657 as a backup and such situation is to be avoided whenever possible.
1658
1659 The cleanup script shares all environment (variables, exported or not,
1660 and functions) with the test itself - the cleanup append/prepend
1661 functions "sample" or "snapshot" the environment at the time of their
1662 call, IOW any changes to the test environment are synchronized to the
1663 cleanup script only upon calling append/prepend. When the
1664 append/prepend functions are called within a function which has local
1665 variables, these will appear as global in the cleanup.
1666
1667 While the cleanup script receives $PWD from the test, its working dir
1668 is set to the initial test execution dir even if $PWD contains
1669 something else. It is impossible to use relative paths inside cleanup
1670 reliably - certain parts of the cleanup might have been added under
1671 different current directories (CWDs). Therefore always use absolute
1672 paths in append/prepend cleanup or make sure you never 'cd' elsewhere
1673 (ie. to a TmpDir).
1674
1675 rlCleanupAppend
1676
1677 Appends a string to the cleanup buffer and recreates the cleanup
1678 script.
1679
1680 rlCleanupAppend string
1681
1682 Returns 0 if the operation was successful, 1 otherwise.
1683
1684 rlCleanupPrepend
1685
1686 Prepends a string to the cleanup buffer and recreates the cleanup
1687 script.
1688
1689 rlCleanupPrepend string
1690
1691 Returns 0 if the operation was successful, 1 otherwise.
1692
1693 Time Performance
1694 rlPerfTime_RunsInTime
1695
1696 Measures, how many runs of some commands can be done in specified time.
1697 This approach is suitable for short-time running tasks (up to few
1698 seconds), where averaging few runs is not precise. This is done several
1699 times, and the final result is the average of all runs. It prints the
1700 number on stdout, so it has to be captured.
1701
1702 rlPerfTime_RunsInTime command [time] [runs]
1703
1704 command
1705 Command to run.
1706
1707 time
1708 Time in seconds (optional, default=30).
1709
1710 runs
1711 Number of averaged runs (optional, default=3).
1712
1713 rlPerfTime_AvgFromRuns
1714
1715 Measures the average time of running some task. This approach is
1716 suitable for long-time running tasks (tens of seconds and more), where
1717 it is precise enough. Measured runs can be preceded by dry run, which
1718 is not measured and it's purpose is to warm up various caches. It
1719 prints the number on stdout, so it has to be captured. Or, result is
1720 then stored in special rl_retval variable.
1721
1722 rlPerfTime_AvgFromRuns command [count] [warmup]
1723
1724 command
1725 Command to run.
1726
1727 count
1728 Times to run (optional, default=3).
1729
1730 warmup
1731 Warm-up run, run if this option is not "warmup" (optional,
1732 default="warmup")
1733
1734 Analyze
1735 rlDejaSum
1736
1737 TODO description
1738
1739 rlDejaSum par1 par2
1740
1741 par1
1742 TODO description
1743
1744 par2
1745 TODO description
1746
1747 Return 0 if... TODO
1748
1749 rlImport
1750
1751 Imports code provided by one or more libraries into the test namespace.
1752 The library search mechanism is based on Beaker test hierarchy system,
1753 i.e.:
1754
1755 /component/type/test-name/test-file
1756
1757 When test-file calls rlImport with 'foo/bar' parameter, the libraries
1758 are searched in following locations: these are the possible path
1759 prefixes
1760
1761 - colon-separated paths from $BEAKERLIB_LIBRARY_PATH
1762 - /mnt/tests
1763 - /usr/share/beakerlib-libraries
1764
1765 the next component of the path is one of the following:
1766
1767 - /foo/Library/bar
1768 - /foo/bar
1769 - /libs/foo/bar
1770 - /*/foo/Library/bar
1771 - /libs/*/foo/Library/bar
1772 - /libs/*/foo/bar
1773
1774 the directory path is then constructed as prefix/path/lib.sh If the
1775 library is still not found an upwards directory traversal is used, and
1776 a check for presence of the library in the above mentioned possible
1777 paths is to be performed. This means this function needs to be called
1778 from the test hierarchy, not e.g. the /tmp directory.
1779
1780 Once library is found, it is sourced and a verifier function is called.
1781 The verifier function is cunstructed by composing the library prefix
1782 and LibraryLoaded. Library prefix must be defined in the library
1783 itself. It should be part of lib.sh header in format: '# library-
1784 prefix = <PREFIX>'. If the verifier passes the library is ready to
1785 use. Also variable <PREFIX>LibraryDir is created and it points to the
1786 library folder.
1787
1788 Usage:
1789
1790 rlImport --all
1791 rlImport LIBRARY [LIBRARY2...]
1792
1793 --all
1794 Read $BEAKERLIB_DIR/metadata.yaml or ./Makefile, pickup the library
1795 requirements and import them all.
1796
1797 LIBRARY
1798 Must have 'component[/path]' format. Identifies the library to
1799 import.
1800
1801 Returns 0 if the import of all libraries was successful. Returns non-
1802 zero if one or more library failed to import.
1803
1804 Process Synchronisation
1805 rlWaitForCmd
1806
1807 Pauses script execution until command exit status is the expeced value.
1808 Logs a WARNING and returns 1 if the command didn't exit successfully
1809 before timeout elapsed or a maximum number of invocations has been
1810 reached.
1811
1812 rlWaitForCmd command [-p PID] [-t time] [-m count] [-d delay] [-r retval]
1813
1814 command
1815 Command that will be executed until its return code is equal 0 or
1816 value speciefied as option to '-r'.
1817
1818 -t time
1819 Timeout in seconds, default=120. If the command doesn't return 0
1820 before time elapses, the command will be killed.
1821
1822 -p PID
1823 PID of the process to check before running command. If the process
1824 exits before the socket is opened, the command will log a WARNING.
1825
1826 -m count
1827 Maximum number of 'command' executions before continuing anyway.
1828 Default is infite. Returns 1 if the maximum was reached.
1829
1830 -d delay
1831 Delay between 'command' invocations. Default 1.
1832
1833 -r retval
1834 Expected return value of command. Default 0.
1835
1836 rlWaitForFile
1837
1838 Pauses script execution until specified file or directory starts
1839 existing. Returns 0 if file started existing, 1 if timeout was reached
1840 or PID exited. Return code is greater than 1 in case of error.
1841
1842 rlWaitForFile path [-p PID] [-t time] [-d delay]
1843
1844 path
1845 Path to file that should start existing.
1846
1847 -t time
1848 Timeout in seconds (optional, default=120). If the file isn't
1849 opened before the time elapses the command returns 1.
1850
1851 -p PID
1852 PID of the process that should also be running. If the process
1853 exits before the file is created, the command returns with status
1854 code of 1.
1855
1856 -d delay
1857 Delay between subsequent checks for existence of file. Default 1.
1858
1859 rlWaitForSocket
1860
1861 Pauses script execution until local socket starts listening. Returns 0
1862 if socket started listening, 1 if timeout was reached or PID exited.
1863 Return code is greater than 1 in case of error.
1864
1865 rlWaitForSocket {port|path} [-p PID] [-t time] [-d delay] [--close] [--remote]
1866
1867 port|path
1868 Network port to wait for opening or a path to UNIX socket. Regular
1869 expressions are also supported.
1870
1871 -t time
1872 Timeout in seconds (optional, default=120). If the socket isn't
1873 opened before the time elapses the command returns 1.
1874
1875 -p PID
1876 PID of the process that should also be running. If the process
1877 exits before the socket is opened, the command returns with status
1878 code of 1.
1879
1880 -d delay
1881 Delay between subsequent checks for availability of socket. Default
1882 1.
1883
1884 --close
1885 Wait for the socket to stop listening.
1886
1887 --remote
1888 Wait for the remote socket to start listening instead of local one.
1889
1890 rlWait
1891
1892 Wrapper around bash builtin 'wait' command. See bash_builtins(1) man
1893 page. Kills the process and all its children if the timeout elapses.
1894
1895 rlWaitFor [n ...] [-s SIGNAL] [-t time]
1896
1897 n List of PIDs to wait for. They need to be background tasks of
1898 current shell. See bash_builtins(1) section for 'wait' command.
1899
1900 -t time
1901 Timeout in seconds (optional, default=30). If the wait isn't
1902 successful before the time elapses then all specified tasks are
1903 killed.
1904
1905 -s SIGNAL
1906 Signal used to kill the process, optional SIGTERM by default.
1907
1908 Virtual X Server
1909 Functions providing simple way how to start and stop virtual X server.
1910
1911 rlVirtualXStart
1912
1913 Start a virtual X server on a first free display. Tries only first N
1914 displays, so you can run out of them.
1915
1916 rlVirtualXStart name [N]
1917
1918 name
1919 String identifying the X server.
1920
1921 N Maximum number of displays to try. Defaults to 3.
1922
1923 Returns 0 when the server is started successfully.
1924
1925 rlVirtualXGetDisplay
1926
1927 Get the DISPLAY variable for specified virtual X server.
1928
1929 rlVirtualXGetDisplay name
1930
1931 name
1932 String identifying the X server.
1933
1934 Displays the number of display where specified virtual X server is
1935 running to standard output. Returns 0 on success.
1936
1937 rlVirtualXStop
1938
1939 Kill the specified X server.
1940
1941 rlVirtualXStop name
1942
1943 name
1944 String identifying the X server.
1945
1946 Returns 0 when the server is stopped successfully.
1947
1948 Example
1949
1950 Below is a simple example of usage. Note that a lot of usefull
1951 debugging information is reported on the DEBUG level, so you can run
1952 your test with "DEBUG=1 make run" to get them.
1953
1954 rlVirtualXStart $TEST
1955 rlAssert0 "Virtual X server started" $?
1956 export DISPLAY="$( rlVirtualXGetDisplay $TEST )"
1957 # ...your test which needs X...
1958 rlVirtualXStop $TEST
1959 rlAssert0 "Virtual X server killed" $?
1960
1961 These are "Requires" lines for your scripts - note different package
1962 names for different RHEL versions:
1963
1964 @echo "Requires: xorg-x11-server-Xvfb" >> $(METADATA) # RHEL-5
1965 @echo "Requires: xorg-x11-Xvfb" >> $(METADATA) # RHEL-4
1966 @echo "Requires: XFree86-Xvfb" >> $(METADATA) # RHEL-3
1967
1968 rlYash_parse
1969
1970 Parse yaml data to the associative array.
1971
1972 rlYash_parse VAR_NAME YAML_DATA
1973
1974 VAR_NAME
1975 Name of the variable to which the yaml structure will be saved.
1976
1977 Note that the variable needs to be predeclared as an associative
1978 array.
1979
1980 YAML_DATA
1981 The actual yaml data.
1982
1983 Beakerlib Profiling
1984 Enable profiling
1985
1986 Set environment variable BEAKERLIB_PROFILING=1
1987
1988 BEAKERLIB_PROFILING=1 make run
1989
1990 A file /dev/shm/beakerlib_profile will be created for later processing.
1991
1992 Process the profile
1993
1994 /usr/share/beakerlib/profiling.sh process > profile.csv
1995
1997 Location of test results related output files can be configured by
1998 setting BEAKERLIB_DIR variable before running the test. If it is not
1999 set, temporary directory is created.
2000
2001 journal.txt
2002 Journal in human readable form.
2003
2004 journal.xml
2005 Journal in XML format, requires python. This dependency can be avoided
2006 if the test is run with variable BEAKERLIB_JOURNAL set to 0 in which
2007 case journal.xml is not created.
2008
2009 XSLT
2010
2011 XML journal can be transformed through XSLT template. Which template is
2012 used is configurable by setting BEAKERLIB_JOURNAL variable. Value can
2013 be either filename in which case beakerlib will try to use
2014 $INSTALL_DIR/xslt-template/$filename (e.g.:
2015 /usr/share/beakerlib/xstl-templates/xunit.xsl) or it can be path to a
2016 template anywhere on the system.
2017
2018 TestResults
2019 Overall results of the test in a 'sourceable' form. Each line contains
2020 a pair VAR=VALUE. All variable names have 'TESTRESULT_' prefix.
2021
2022 List of variables:
2023
2024 TESTRESULT_STATE - Current state of the test run; possible values:
2025 started, incomplete and complete.
2026 - 'started' is set after a Journal is opened.
2027 - 'incomplete' is set after a Phase is closed.
2028 - 'complete' is set after a Journal is closed.
2029
2030 TESTRESULT_RESULT_STRING - Result of the test in a string, e.g.: PASS,
2031 FAIL, WARN.
2032
2033 TESTRESULT_RESULT_ECODE - Result of the test as an integer, 0 equals to
2034 PASS.
2035
2036 TESTRESULT_PHASES_PASSED - Number of phases that ended with PASS.
2037
2038 TESTRESULT_PHASES_FAILED - Number of phases that ended with non-PASS
2039 result.
2040
2041 TESTRESULT_PHASES_SKIPPED - Number of skipped phases.
2042
2043 TESTRESULT_ASSERTS_FAILED - Number of asserts that ended with non-PASS
2044 result in the whole test.
2045
2046 TESTRESULT_STARTTIME - Time when test started in seconds since epoch.
2047
2048 TESTRESULT_ENDTIME - Time when test ended in seconds since epoch.
2049
2050 TESTRESULT_DURATION - Duration of the test run in seconds.
2051
2052 TESTRESULT_BEAKERLIB_DIR - Directory with test results files.
2053
2055 Simple
2056 A minimal BeakerLib test can look like this:
2057
2058 . /usr/share/beakerlib/beakerlib.sh
2059
2060 rlJournalStart
2061 rlPhaseStartTest
2062 rlAssertRpm "setup"
2063 rlAssertExists "/etc/passwd"
2064 rlAssertGrep "root" "/etc/passwd"
2065 rlPhaseEnd
2066 rlJournalEnd
2067
2068 Phases
2069 Here comes a bit more interesting example of a test which sets all the
2070 recommended variables and makes use of the phases:
2071
2072 # Include the BeakerLib environment
2073 . /usr/share/beakerlib/beakerlib.sh
2074
2075 # Set the full test name
2076 TEST="/examples/beakerlib/Sanity/phases"
2077
2078 # Package being tested
2079 PACKAGE="coreutils"
2080
2081 rlJournalStart
2082 # Setup phase: Prepare test directory
2083 rlPhaseStartSetup
2084 rlAssertRpm $PACKAGE
2085 rlRun 'TmpDir=$(mktemp -d)' 0 'Creating tmp directory' # no-reboot
2086 rlRun "pushd $TmpDir"
2087 rlPhaseEnd
2088
2089 # Test phase: Testing touch, ls and rm commands
2090 rlPhaseStartTest
2091 rlRun "touch foo" 0 "Creating the foo test file"
2092 rlAssertExists "foo"
2093 rlRun "ls -l foo" 0 "Listing the foo test file"
2094 rlRun "rm foo" 0 "Removing the foo test file"
2095 rlAssertNotExists "foo"
2096 rlRun "ls -l foo" 2 "Listing foo should now report an error"
2097 rlPhaseEnd
2098
2099 # Cleanup phase: Remove test directory
2100 rlPhaseStartCleanup
2101 rlRun "popd"
2102 rlRun "rm -r $TmpDir" 0 "Removing tmp directory"
2103 rlPhaseEnd
2104 rlJournalEnd
2105
2106 # Print the test report
2107 rlJournalPrintText
2108
2109 The ouput of the rlJournalPrintText command would produce an output
2110 similar to the following:
2111
2112 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2113 :: TEST PROTOCOL
2114 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2115
2116 Package : coreutils
2117 Installed : coreutils-8.27-19.fc27.x86_64
2118 beakerlib RPM : beakerlib-1.17-6.fc27.noarch
2119 Test started : 2018-02-08 15:43:03 CET
2120 Test finished : 2018-02-08 15:43:04 CET
2121 Test duration : 1 seconds
2122 Test name : /examples/beakerlib/Sanity/phases
2123 Distro : Fedora release 27 (Twenty Seven)
2124 Hostname : localhost
2125 Architecture : x86_64
2126 CPUs : 4 x Intel Core Processor (Skylake)
2127 RAM size : 1992 MB
2128 HDD size : 17.55 GB
2129
2130 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2131 :: Test description
2132 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2133
2134 PURPOSE of /examples/beakerlib/Sanity/phases
2135 Description: Testing BeakerLib phases
2136 Author: Petr Splichal <psplicha@redhat.com>
2137
2138 This example shows how the phases work in the BeakerLib on a
2139 trivial smoke test for the "touch", "ls" and "rm" commands from
2140 the coreutils package.
2141
2142
2143
2144 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2145 :: Setup
2146 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2147
2148 :: [ 15:43:03 ] :: [ PASS ] :: Checking for the presence of coreutils rpm
2149 :: [ 15:43:03 ] :: [ LOG ] :: Package versions:
2150 :: [ 15:43:03 ] :: [ LOG ] :: coreutils-8.27-19.fc27.x86_64
2151 :: [ 15:43:03 ] :: [ PASS ] :: Creating tmp directory (Expected 0, got 0)
2152 :: [ 15:43:03 ] :: [ PASS ] :: Command 'pushd /tmp/tmp.MMQf7dj9QV' (Expected 0, got 0)
2153 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2154 :: Duration: 1s
2155 :: Assertions: 3 good, 0 bad
2156 :: RESULT: PASS
2157
2158
2159 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2160 :: Test
2161 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2162
2163 :: [ 15:43:04 ] :: [ PASS ] :: Creating the foo test file (Expected 0, got 0)
2164 :: [ 15:43:04 ] :: [ PASS ] :: File foo should exist
2165 :: [ 15:43:04 ] :: [ PASS ] :: Listing the foo test file (Expected 0, got 0)
2166 :: [ 15:43:04 ] :: [ PASS ] :: Removing the foo test file (Expected 0, got 0)
2167 :: [ 15:43:04 ] :: [ PASS ] :: File foo should not exist
2168 :: [ 15:43:04 ] :: [ PASS ] :: Listing foo should now report an error (Expected 2, got 2)
2169 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2170 :: Duration: 0s
2171 :: Assertions: 6 good, 0 bad
2172 :: RESULT: PASS
2173
2174
2175 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2176 :: Cleanup
2177 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2178
2179 :: [ 15:43:04 ] :: [ PASS ] :: Command 'popd' (Expected 0, got 0)
2180 :: [ 15:43:04 ] :: [ PASS ] :: Removing tmp directory (Expected 0, got 0)
2181 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2182 :: Duration: 0s
2183 :: Assertions: 2 good, 0 bad
2184 :: RESULT: PASS
2185
2186
2187 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2188 :: /examples/beakerlib/Sanity/phases
2189 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2190
2191 :: [ 15:43:04 ] :: [ LOG ] :: JOURNAL XML: /var/tmp/beakerlib-pRiJfWE/journal.xml
2192 :: [ 15:43:04 ] :: [ LOG ] :: JOURNAL TXT: /var/tmp/beakerlib-pRiJfWE/journal.txt
2193 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2194 :: Duration: 1s
2195 :: Phases: 3 good, 0 bad
2196 :: OVERALL RESULT: PASS
2197
2198 Note that the detailed test description is read from a separate file
2199 PURPOSE placed in the same directory as the test itself.
2200
2201 A lot of useful debugging information is reported on the DEBUG level.
2202 You can run your test with "DEBUG=1 make run" to get them.
2203
2204 Verbosity of the test logging may be altered also by setting the
2205 LOG_LEVEL variable. Possible values are "ERROR", "WARNING", "INFO" and
2206 "DEBUG". You will see messages like the ones below.
2207
2208 :: [ WARNING ] :: rlGetArch: Update test to use rlGetPrimaryArch/rlGetSecondaryArch
2209 :: [ DEBUG ] :: rlGetArch: This is architecture 'x86_64'
2210 :: [ ERROR ] :: this function was dropped as its development is completely moved to the beaker library
2211 :: [ INFO ] :: if you realy on this function and you really need to have it present in core beakerlib, file a RFE, please
2212
2213 Setting LOG_LEVEL="DEBUG" is equivalent to DEBUG=1.
2214
2215 Set DEBUG_TO_CONSOLE_ONLY=1 in conjuction with DEBUG=1 to avoid storing
2216 debug messages in journal. This also speeds up the execution in debug
2217 mode as those messages are not fully processed than.
2218
2220 Description
2221 Bkrdoc is a documentation generator from tests written using
2222 BeakerLib library. This generator makes documentation from test
2223 code with and also without any documentation markup.
2224
2225 What it's good for
2226 For fast, brief and reliable documentation creation. It`s good for
2227 quick start with unknown BeakerLib test. Created documentations
2228 provides information about the documentation credibility. Also
2229 created documentations shows environmental variables and helps
2230 reader to run test script from which was documentation created.
2231
2232 Bkrdoc project page
2233 https://github.com/rh-lab-q/bkrdoc
2234
2236 Project Page
2237 https://github.com/beakerlib/beakerlib
2238
2239 Manual
2240 https://github.com/beakerlib/beakerlib/wiki/man
2241
2242 Issues list
2243 https://bugzilla.redhat.com/buglist.cgi?component=beakerlib&&order=bug_status%2Cassigned_to%2Cpriority
2244
2245 https://github.com/beakerlib/beakerlib/issues
2246
2247 Reporting issues
2248 https://bugzilla.redhat.com/enter_bug.cgi?product=Fedora&component=beakerlib
2249
2250 https://github.com/beakerlib/beakerlib/issues/new
2251
2253 • Petr Muller <pmuller@redhat.com>
2254
2255 • Ondrej Hudlicky <ohudlick@redhat.com>
2256
2257 • Jan Hutar <jhutar@redhat.com>
2258
2259 • Petr Splichal <psplicha@redhat.com>
2260
2261 • Ales Zelinka <azelinka@redhat.com>
2262
2263 • Dalibor Pospisil <dapospis@redhat.com>
2264
2265 • Martin Kyral <mkyral@redhat.com>
2266
2267 • Jakub Prokes <jprokes@redhat.com>
2268
2269 • Jakub Heger <jheger@redhat.com>
2270
2271
2272
2273perl v5.34.0 2022-01-19 BEAKERLIB(1)