teuton 2.8.0 → 2.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -4
- data/docs/changelog/changelog.1.md +119 -0
- data/docs/changelog/changelog.2.md +105 -0
- data/docs/diagram.md +10 -10
- data/docs/dsl/expect.md +76 -25
- data/docs/dsl/result.md +24 -30
- data/docs/learn/02-target.md +32 -27
- data/docs/learn/25-expect-result.md +39 -0
- data/docs/learn/26-expect_sequence.md +79 -0
- data/docs/learn/27-run_script.md +91 -0
- data/docs/learn/28-upload.md +55 -0
- data/docs/learn/README.md +4 -15
- data/docs/videos.md +14 -8
- data/lib/teuton/case/case.rb +3 -2
- data/lib/teuton/case/config.rb +0 -5
- data/lib/teuton/case/dsl/all.rb +5 -1
- data/lib/teuton/case/dsl/expect.rb +13 -42
- data/lib/teuton/case/dsl/expect_exitcode.rb +31 -0
- data/lib/teuton/case/dsl/expect_sequence.rb +173 -0
- data/lib/teuton/case/dsl/getset.rb +0 -1
- data/lib/teuton/case/dsl/host.rb +5 -0
- data/lib/teuton/case/dsl/macro.rb +7 -3
- data/lib/teuton/case/dsl/run_script.rb +35 -0
- data/lib/teuton/case/dsl/upload.rb +42 -0
- data/lib/teuton/case/dsl/weight.rb +12 -0
- data/lib/teuton/case/host.rb +68 -0
- data/lib/teuton/case/play.rb +2 -6
- data/lib/teuton/{utils → case}/result/ext_array.rb +0 -1
- data/lib/teuton/{utils → case}/result/ext_compare.rb +0 -1
- data/lib/teuton/{utils → case}/result/ext_filter.rb +0 -2
- data/lib/teuton/{utils → case}/result/result.rb +13 -21
- data/lib/teuton/check/checker.rb +82 -0
- data/lib/teuton/check/dsl/all.rb +37 -0
- data/lib/teuton/check/{builtin.rb → dsl/builtin.rb} +1 -3
- data/lib/teuton/check/dsl/expect.rb +90 -0
- data/lib/teuton/check/dsl/expect_sequence.rb +29 -0
- data/lib/teuton/check/dsl/getset.rb +23 -0
- data/lib/teuton/check/dsl/run.rb +35 -0
- data/lib/teuton/check/main.rb +29 -0
- data/lib/teuton/check/show.rb +75 -100
- data/lib/teuton/deprecated/application_test.rb +32 -0
- data/lib/teuton/readme/dsl/all.rb +32 -0
- data/lib/teuton/readme/dsl/expect.rb +29 -0
- data/lib/teuton/readme/dsl/getset.rb +33 -0
- data/lib/teuton/readme/dsl/run.rb +51 -0
- data/lib/teuton/readme/lang.rb +8 -10
- data/lib/teuton/readme/main.rb +27 -0
- data/lib/teuton/readme/readme.rb +31 -58
- data/lib/teuton/readme/result.rb +7 -0
- data/lib/teuton/utils/configfile_reader.rb +8 -4
- data/lib/teuton/utils/logger.rb +32 -0
- data/lib/teuton/utils/verbose.rb +1 -1
- data/lib/teuton/version.rb +1 -1
- data/lib/teuton.rb +6 -5
- metadata +45 -39
- data/docs/CHANGELOG.md +0 -10
- data/docs/changelog/v2.0.md +0 -18
- data/docs/changelog/v2.1.md +0 -54
- data/docs/changelog/v2.2.md +0 -42
- data/docs/changelog/v2.3.md +0 -10
- data/docs/changelog/v2.4.md +0 -41
- data/docs/changelog/v2.5.md +0 -6
- data/docs/changelog/v2.6.md +0 -4
- data/docs/changelog/v2.7.md +0 -23
- data/docs/changelog/v2.8.md +0 -11
- data/docs/changelog/version2.1.md +0 -4
- data/docs/learn/videos.md +0 -13
- data/lib/teuton/case/execute/copy_ssh.rb +0 -70
- data/lib/teuton/check/dsl.rb +0 -112
- data/lib/teuton/check/laboratory.rb +0 -59
- data/lib/teuton/readme/dsl.rb +0 -126
- /data/lib/teuton/case/dsl/{goto.rb → run.rb} +0 -0
- /data/lib/teuton/{utils → deprecated}/application.rb +0 -0
- /data/lib/teuton/{case/deprecated → deprecated}/runner.rb +0 -0
- /data/lib/teuton/{case/deprecated → deprecated}/utils.rb +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 41d7f02d5c9cc429427966cadfc4b7190a30194d4e23af3b436100dac3a1ee17
|
4
|
+
data.tar.gz: 41a7034fad8189b98ff0d17e5d875a5ed3512ddfb0dcac3e22d9b750e6c62304
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3c6058ce58e3794926125f6bb06b27d98412e6ebf230c27e2f1abec30da87334fa519329ebff176e8ed649f79d876f15be811a6976aeef79e0168b647df637be
|
7
|
+
data.tar.gz: 1447f163a0b1d83c8ffa0cc1e3813810b2b22b59bb1ad359b2e5364f840f196ab8dc35906b612eb0912ec48b7dc67b9e136d42302b5943a08c4ec642e6b91faf
|
data/README.md
CHANGED
@@ -47,12 +47,12 @@ CASE RESULTS
|
|
47
47
|
|
48
48
|
# Documentation
|
49
49
|
|
50
|
+
* [Installation](docs/install/README.md)
|
50
51
|
* [Getting started](docs/learn/README.md)
|
51
|
-
* [
|
52
|
+
* [Examples](examples)
|
52
53
|
* [Commands](docs/commands/README.md)
|
53
|
-
* [
|
54
|
-
|
55
|
-
> [Blogs and videos](docs/videos.md)
|
54
|
+
* [Language reference](docs/dsl/README.md)
|
55
|
+
* [Blogs and videos](docs/videos.md)
|
56
56
|
|
57
57
|
# Contact
|
58
58
|
|
@@ -0,0 +1,119 @@
|
|
1
|
+
[<< back](../CHANGELOG.md)
|
2
|
+
|
3
|
+
# CHANGELOG
|
4
|
+
|
5
|
+
## [0.22.1] June 2017
|
6
|
+
|
7
|
+
* Now it's posible to use config files with YAML and JSON format
|
8
|
+
* Preparing migration of CLI command to use Thor gem
|
9
|
+
|
10
|
+
## [1.0.0] July 2017
|
11
|
+
|
12
|
+
* New stable version
|
13
|
+
|
14
|
+
## 2019
|
15
|
+
|
16
|
+
## [1.10.0] Janyary 2019
|
17
|
+
|
18
|
+
* SysadminGame change his name by TEUTON. "project" command replaced by "teuton".
|
19
|
+
* Challenges (Teuton scripts) moved to "teuton-challenges" github repository.
|
20
|
+
* Execute "rake get_challenges" to get sample teuton challenges
|
21
|
+
|
22
|
+
## [2.0.4] August 2019
|
23
|
+
|
24
|
+
* TEUTON project grew up and was divided into the folowing repositories: teuton, challenges, panel, resources and vagrant.
|
25
|
+
* Documentation has been moved into respository teuton wiki. Only maintain English docs.
|
26
|
+
|
27
|
+
## [2.1.0]
|
28
|
+
|
29
|
+
**Export grades on csv file using Moodle format**
|
30
|
+
|
31
|
+
* Automaticaly exports `moodle.csv` file with all cases grades, using adecuate format so it could be imported directly into Moodle platform.
|
32
|
+
* We need to configure some params like this:
|
33
|
+
|
34
|
+
```
|
35
|
+
---
|
36
|
+
:global:
|
37
|
+
:cases:
|
38
|
+
- :tt_members: ...
|
39
|
+
:tt_moodle_id: User Moodle Identity
|
40
|
+
```
|
41
|
+
|
42
|
+
**readme keyword**
|
43
|
+
|
44
|
+
We currently use the "teuton readme pry-folder" command to export README file from the challenge.
|
45
|
+
|
46
|
+
* This example shows how to use readme keyword to add group description or target description:
|
47
|
+
|
48
|
+
```
|
49
|
+
group "GROUPNAME" do
|
50
|
+
readme "Description for this group"
|
51
|
+
|
52
|
+
target "target1"
|
53
|
+
readme "Description for this target"
|
54
|
+
goto :host, :exec => 'id root'
|
55
|
+
expec_one 'root'
|
56
|
+
```
|
57
|
+
|
58
|
+
**Installation process**
|
59
|
+
|
60
|
+
* Use Bundler to install gems instead of rake.
|
61
|
+
* It will be usefull use sysadming-game as gem? And install it with `gem install teuton`.
|
62
|
+
* Vagrant: test how to use vagrant machines as case hosts.
|
63
|
+
|
64
|
+
**Info sobre novedades de la versión 2.1**
|
65
|
+
|
66
|
+
1. Teuton readme y dsl readme
|
67
|
+
2. Macros de define macro
|
68
|
+
3. Export yaml y html
|
69
|
+
4. Teuton --no-color
|
70
|
+
5. teuton run --case
|
71
|
+
6. teuton run --cname
|
72
|
+
7. teuton run --cpath
|
73
|
+
8. actualizar formatos de salida
|
74
|
+
9. instalación mediante gemas
|
75
|
+
10. teuton panel
|
76
|
+
11. teuton client y server
|
77
|
+
12. nuevos nombres de comandos...
|
78
|
+
13. cambio de goto a run
|
79
|
+
|
80
|
+
## [2.2.0]
|
81
|
+
|
82
|
+
**New features**
|
83
|
+
|
84
|
+
* Let's see new features examples:
|
85
|
+
* 10 result and moodle_id
|
86
|
+
* 11 get_vars
|
87
|
+
* 12 alias
|
88
|
+
* 13 include (tt_include config param)
|
89
|
+
* 14 macros
|
90
|
+
|
91
|
+
**Configuration file**
|
92
|
+
|
93
|
+
* Por defecto los valores de clave de los ficheros de configuración serán Strings en lugar de símbolos, aunque lo símbolos seguirán funcionando.
|
94
|
+
|
95
|
+
**get_vars: To think - We are not sure about this***
|
96
|
+
|
97
|
+
* "get" keyword simplification: Simplify getting and setting params process. For example: `_username_`, may be alias for `get(:username)`. Then
|
98
|
+
|
99
|
+
```
|
100
|
+
target "Create user #{_username_}"
|
101
|
+
run "id #{_username_}"
|
102
|
+
expect_one _username_
|
103
|
+
```
|
104
|
+
Same as
|
105
|
+
|
106
|
+
```
|
107
|
+
target "Create user "+get(:username)
|
108
|
+
run "id " + get(:username)
|
109
|
+
expect_one get(:username)
|
110
|
+
```
|
111
|
+
|
112
|
+
* Promocinar el proyecto:
|
113
|
+
* Documentar y hacer videos.
|
114
|
+
* Charlas y talleres
|
115
|
+
|
116
|
+
**Fixed**
|
117
|
+
|
118
|
+
* Solucionar fallo en --cname
|
119
|
+
* Revisar doc options como cpanel
|
@@ -0,0 +1,105 @@
|
|
1
|
+
|
2
|
+
## [2.3.9]
|
3
|
+
|
4
|
+
- FIX: Remove warnings from linter
|
5
|
+
- FIX: Remove warning about thor gem version. Upgrade gem to 1.2
|
6
|
+
|
7
|
+
## [2.3.11]
|
8
|
+
|
9
|
+
- Issue #18
|
10
|
+
|
11
|
+
## [2.4.0]
|
12
|
+
|
13
|
+
New features:
|
14
|
+
- Hide feedback from reports: `export feedback: false`
|
15
|
+
- Add new DSL keyword: expect_last, expect_fisrt
|
16
|
+
- Remove os gem.
|
17
|
+
- Change test output colors to green as use others test tools.
|
18
|
+
- Change show DSL params. Accepts one param "verbose: NUMBER" to adjust verbosity output level on screen.
|
19
|
+
|
20
|
+
New doc and example:
|
21
|
+
- 14-alias
|
22
|
+
- 16-exit_codes
|
23
|
+
|
24
|
+
Bug fixed:
|
25
|
+
- All "expect*" keywords must require 2 arguments. The second is optional.
|
26
|
+
|
27
|
+
Revise
|
28
|
+
- Remove colors to log text
|
29
|
+
- teuton readme: macros, getvars, expect_last, expect_first
|
30
|
+
|
31
|
+
## [2.4.2]
|
32
|
+
|
33
|
+
- Fix bug with result.grep_v(Array)
|
34
|
+
|
35
|
+
## [2.4.3]
|
36
|
+
|
37
|
+
- Fix: "expect_none" without params works as "expect result.count.eq 0"
|
38
|
+
- Add: "expect_nothing" that works as "expect result.count.eq 0".
|
39
|
+
|
40
|
+
## [2.4.4]
|
41
|
+
|
42
|
+
-- Modify: teuton check output colors and exit codes.
|
43
|
+
exit code 0 = check OK
|
44
|
+
exit code 1 = check error
|
45
|
+
-- Fix teuton check docs.
|
46
|
+
|
47
|
+
## [2.4.5]
|
48
|
+
|
49
|
+
-- FIX: "expect_nothing" was always TRUE when SSH/Telnet connections fails!
|
50
|
+
Now when SSH/Telnet connections fails result contains "SSH: NO CONNECTION!"
|
51
|
+
So "expect_nothing" will fail.
|
52
|
+
|
53
|
+
## [2.5.0]
|
54
|
+
|
55
|
+
- ADD: "tt_moodle_max_score" global configuration param. Teuton grades (0-100) are divided by this value when exporting data into "moodle.csv" output file.
|
56
|
+
- UPDATE: Revise documentation. Doc learn 10,11, 12,13 y 14. 10 result and moodle_id, 12 alias, 13 include, 14 macro, Doc tt_include
|
57
|
+
- UPDATE: Internal changes. Remove Colorize gem and replace with Rainbow.
|
58
|
+
|
59
|
+
## [2.6.0]
|
60
|
+
|
61
|
+
- [ADD] When running local or SSH commands, stdout and stderr are captured and readed by "expect" sentence.
|
62
|
+
|
63
|
+
## [2.7.0]
|
64
|
+
|
65
|
+
New features:
|
66
|
+
- [ADD] "teuton config PROJECTPATH" will suggest suitable configuration for the project.
|
67
|
+
- [ADD] Every one line command output is registered into reports.
|
68
|
+
- [ADD] "expect_exit 1", check last command exit code is equal to 1.
|
69
|
+
|
70
|
+
Internal changes:
|
71
|
+
* Application class splited into Settings and Project classes
|
72
|
+
* Create SendManager similar to ExportManager
|
73
|
+
|
74
|
+
## [2.7.1]
|
75
|
+
|
76
|
+
- [FIX] Fixed an issue that appeared when executing test and fail connection to remote computer.
|
77
|
+
|
78
|
+
## [2.7.2] 20230607
|
79
|
+
|
80
|
+
- [FIX] Fixed an issue that appeared when exporting reports without feedback after failing to connect to remote computer.
|
81
|
+
|
82
|
+
## [2.7.3] 20230607
|
83
|
+
|
84
|
+
- [FIX] Hall of fame now use Project class instead of Application.
|
85
|
+
|
86
|
+
## [2.8.0] 20230630
|
87
|
+
|
88
|
+
DSL expect:
|
89
|
+
- [ADD] "expect_ok" as "expect_exit 0 ".
|
90
|
+
- [ADD] "expect_fail" as "expect_exit NUMBER" where NUMBER > 0.
|
91
|
+
- [FIX] expect evaluation fail when there is no remote connection.
|
92
|
+
|
93
|
+
DSL send:
|
94
|
+
- [UPDATE] Rename "remote_dir" send param to "dir".
|
95
|
+
- [UPDATE] send output messages
|
96
|
+
|
97
|
+
## [2.9.0] unrelease
|
98
|
+
|
99
|
+
- [ADD] "expect_sequence" that check if sequence is present
|
100
|
+
- [ADD] New DSL "run_script". Example: `run_script script, on: :host1`, upload script to host1 and then execute it on remote.
|
101
|
+
- [ADD] New DSL "upload". Upload local file to remote host. Example `upload "localfile", to: :host1`
|
102
|
+
- [ADD] `teuton check` works with `expect_sequence`, `run_script` and `upload`.
|
103
|
+
- [FIX] `teuton check` works fine with `macros`.
|
104
|
+
- [ADD] `teuton readme` works with `expect_sequence`, `run_script` and `upload`.
|
105
|
+
- [FIX] `teuton readme` works fine with `macros`.
|
data/docs/diagram.md
CHANGED
@@ -9,15 +9,15 @@ subgraph user
|
|
9
9
|
CLI --> Teuton
|
10
10
|
end
|
11
11
|
|
12
|
-
subgraph "create
|
13
|
-
Teuton -- create --> Skeleton("
|
12
|
+
subgraph "create new project"
|
13
|
+
Teuton -- create --> Skeleton("Skeleton\nFiles")
|
14
14
|
end
|
15
15
|
|
16
|
-
subgraph "Check\nproject
|
16
|
+
subgraph "Check\nproject"
|
17
17
|
Teuton -- check --> Laboratory("Laboratory\nDSL\nShow\nBuiltin!")
|
18
18
|
end
|
19
19
|
|
20
|
-
subgraph "Create readme
|
20
|
+
subgraph "Create\nproject readme"
|
21
21
|
Teuton -- readme --> Readme("Readme\nDSL\nLang!")
|
22
22
|
end
|
23
23
|
|
@@ -27,8 +27,8 @@ subgraph manager
|
|
27
27
|
ReportManager --> HallOfFame
|
28
28
|
end
|
29
29
|
|
30
|
-
subgraph "case
|
31
|
-
CaseManager --> Case("Case\nConfig\
|
30
|
+
subgraph "case"
|
31
|
+
CaseManager --> Case("Case\nConfig\nDSL\nPlay\nExecute\nResult\nClose\nbuiltin!")
|
32
32
|
end
|
33
33
|
|
34
34
|
subgraph utils
|
@@ -42,10 +42,10 @@ subgraph utils
|
|
42
42
|
Readme --> Result("Result\next_array\next_compare\next_filter")
|
43
43
|
Case --> Result
|
44
44
|
|
45
|
-
Laboratory -->
|
46
|
-
Readme -->
|
47
|
-
manager/DSL -- use/macros/groups -->
|
48
|
-
Case -->
|
45
|
+
Laboratory --> Project
|
46
|
+
Readme --> Project
|
47
|
+
manager/DSL -- use/macros/groups --> Project("Project\nNameFileFinder")
|
48
|
+
Case --> Project
|
49
49
|
end
|
50
50
|
|
51
51
|
subgraph report
|
data/docs/dsl/expect.md
CHANGED
@@ -9,33 +9,84 @@ Compare the obtained result with the expected one. This comparation process is r
|
|
9
9
|
Let's see some examples:
|
10
10
|
|
11
11
|
```ruby
|
12
|
-
target
|
13
|
-
run
|
14
|
-
expect
|
12
|
+
target "Exist user obiwan"
|
13
|
+
run "id obiwan"
|
14
|
+
expect "obiwan" # Expect run command output will contain "obiwan"
|
15
15
|
```
|
16
16
|
|
17
|
-
##
|
17
|
+
## Simple evaluations
|
18
18
|
|
19
|
-
| Command
|
20
|
-
|
|
21
|
-
| expect "yoda"
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
19
|
+
| Command | Description |
|
20
|
+
| ----------------------------- | ------------------------------ |
|
21
|
+
| expect "yoda" | one or more line/s with "yoda" |
|
22
|
+
| expect_any "yoda" | one or more line/s with "yoda" |
|
23
|
+
| expect ["obiwan", "kenobi"] | one or more line/s with "obiwan" and kenobi" |
|
24
|
+
| expect_first "episode" | the first line with "episode" |
|
25
|
+
| expect_last "the end" | the last line with "the end" |
|
26
|
+
| expect_one "rogue" | only one line with "rogue" |
|
26
27
|
| expect_one ["obiwan","kenobi"] | only one line with "obiwan" and "kenobi" |
|
27
|
-
|
|
28
|
+
| expect /Obiwan\|obi-wan/ | one or more line/s with Obiwan or obi-wan. This example uses regular expresions. |
|
29
|
+
|
30
|
+
## Negative evaluations
|
31
|
+
|
32
|
+
| Command | Description |
|
33
|
+
| ------------------------------ | ---------------------------- |
|
34
|
+
| expect_none "vader" | Expects no line with "vader" |
|
28
35
|
| expect_none ["darth", "vader"] | no line with "darth" or "vader" |
|
29
|
-
| expect_none
|
30
|
-
| expect_nothing
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
|
36
|
+
| expect_none | no output lines expected |
|
37
|
+
| expect_nothing | no output lines expected |
|
38
|
+
|
39
|
+
## Exitcode evaluations
|
40
|
+
|
41
|
+
| Command | Description |
|
42
|
+
| -------------------- | ------------------------- |
|
43
|
+
| expect_ok | Check exit code is 0 |
|
44
|
+
| expect_fail | Check exit code is > 0 |
|
45
|
+
| expect_exit NUMBER | Check exit code is NUMBER |
|
46
|
+
| expect_exit MIN..MAX | Check exit code is >= MIN and < MAXNUMBER |
|
47
|
+
|
48
|
+
## Evaluate sequence
|
49
|
+
|
50
|
+
* **Simple sequence**. Validate sequences where the elements are in order. Use `find` statement to find each element of the sequence.
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
# Examples: [A,B,C], [A,s,B,s,C], [x,A,B,s,C,x], etc.
|
54
|
+
|
55
|
+
expect_sequence do
|
56
|
+
find "A"
|
57
|
+
find "B"
|
58
|
+
find "C"
|
59
|
+
end
|
60
|
+
```
|
61
|
+
|
62
|
+
* **Strict sequence**. validate sequences where the elements are in strict consecutive order. First use `find` to find an element in the sequence and then `next_to` for the next element in strict order.
|
63
|
+
|
64
|
+
```ruby
|
65
|
+
# Examples: [A,B,C], [x,A,B,C,x], etc.
|
66
|
+
|
67
|
+
expect_sequence do
|
68
|
+
find "A"
|
69
|
+
next_to "B"
|
70
|
+
next_to "C"
|
71
|
+
end
|
72
|
+
```
|
73
|
+
|
74
|
+
* **Strict sequence with jumps**. Use `ignore N` to indicate that there are N lines between 2 elements of the sequence.
|
75
|
+
|
76
|
+
```ruby
|
77
|
+
# Examples: [A,B,s,s,C], [x,A,B,s,s,C,x], etc.
|
78
|
+
|
79
|
+
expect_sequence do
|
80
|
+
find "A"
|
81
|
+
next_to "B"
|
82
|
+
ignore 2
|
83
|
+
next_to "C"
|
84
|
+
end
|
85
|
+
```
|
35
86
|
|
36
|
-
##
|
87
|
+
## Complex evaluations
|
37
88
|
|
38
|
-
After every execution keyword
|
89
|
+
After every execution keyword `run`, command outputs is wrapped into **result** object. We may use **result** to make complex evaluations.
|
39
90
|
|
40
91
|
For example, if we have this execution
|
41
92
|
|
@@ -44,10 +95,10 @@ target 'Exist user vader'
|
|
44
95
|
run 'cat /etc/passwd'
|
45
96
|
```
|
46
97
|
|
47
|
-
Then we check result with:
|
98
|
+
Then we can check result with:
|
48
99
|
|
49
|
-
* **expect result.find(
|
50
|
-
* **expect result.find(/
|
51
|
-
* **expect result.not_find('#').find('
|
100
|
+
* **expect result.find(/obiwan|kenobi/).count.eq(1)**, expect there exists only 1 line with "obiwan" or "kenobi".
|
101
|
+
* **expect result.find(/darth/).find(/vader/).count.gt(2)**, expect there exists more than 2 lines with texts "darth" and "vader".
|
102
|
+
* **expect result.not_find('#').find('yoda').count.lt(3)**, expects there exists less than 3 lines with text "yoda" and without "#" symbol.
|
52
103
|
|
53
|
-
Read [result](result.md)
|
104
|
+
Read more about [result](result.md) object.
|
data/docs/dsl/result.md
CHANGED
@@ -33,18 +33,12 @@ run "cat /etc/passwd", on: :host1
|
|
33
33
|
```
|
34
34
|
|
35
35
|
And then we could do:
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
result.grep_v("nologin").grep("/bin/bash").count
|
43
|
-
```
|
44
|
-
* Return true if the number when count all lines that dosn't contain "nologin" and contain "/bin/bash" is greater than 0
|
45
|
-
```
|
46
|
-
result.grep_v("nologin").grep("/bin/bash").count.gt 0
|
47
|
-
```
|
36
|
+
|
37
|
+
| Description | Command |
|
38
|
+
| ----------- | ------- |
|
39
|
+
| Get all lines that dosn't contain "nologin" and contain "/bin/bash" | result.grep_v("nologin").grep("/bin/bash") |
|
40
|
+
| Count all lines that dosn't contain "nologin" and contain "/bin/bash" | result.grep_v("nologin").grep("/bin/bash").count |
|
41
|
+
| Return true if the number when count all lines that dosn't contain "nologin" and contain "/bin/bash" is greater than 0 | result.grep_v("nologin").grep("/bin/bash").count.gt 0 |
|
48
42
|
|
49
43
|
## Functions
|
50
44
|
|
@@ -52,33 +46,33 @@ result.grep_v("nologin").grep("/bin/bash").count.gt 0
|
|
52
46
|
|
53
47
|
| Function | Description |
|
54
48
|
| ------------------- | ------------------------- |
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
49
|
+
| result.eq(VALUE) | Result equal to VALUE |
|
50
|
+
| result.neq(VALUE) | Result not equal to VALUE |
|
51
|
+
| result.gt(VALUE) | Result greater than VALUE |
|
52
|
+
| result.ge(VALUE) | Result equal or greater than VALUE |
|
53
|
+
| result.lt(VALUE) | Result lesser than VALUE |
|
54
|
+
| result.le(VALUE) | Result equal or lesser than VALUE |
|
61
55
|
|
62
56
|
**Filtering functions:**
|
63
57
|
|
64
58
|
| Function | VALUE type | Description |
|
65
59
|
| -------------------- | ----------- | ------------------------------------- |
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
60
|
+
| result.count | | Count lines from result and save this number into result object. |
|
61
|
+
| result.first | | Remove all lines except first one.|
|
62
|
+
| result.find(VALUE) | String | Filter lines that contains VALUE text |
|
69
63
|
| | RegExp | Filter lines that match VALUE regexp. For example `/?ello]`, filter lines with "Hello" or "hello" |
|
70
64
|
| | Array | Apply filter to every array element. For example `["Hi","Hello"]`, filter lines with "Hi" or "Hello". |
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
65
|
+
| result.grep(VALUE) | String, RegExp, Array | Same as find |
|
66
|
+
| result.grep_v(VALUE) | String, RegExp, Array | Same as not_find |
|
67
|
+
| result.last | | Remove all lines except last one.|
|
68
|
+
| result.not_find(VALUE) | | Filter lines that not contains VALUE. VALUE may be String, Regular Expresion or an Array. |
|
69
|
+
| result.restore | | Restore result data. After every filtering action result is modified, but this function restore data to their original state. |
|
76
70
|
|
77
71
|
**Information functions:**
|
78
72
|
|
79
73
|
| Function | Description |
|
80
74
|
| -------------------- | --------------------------------- |
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
75
|
+
| result.alterations | Return transformations applied to the output |
|
76
|
+
| result.content | Return all output lines |
|
77
|
+
| result.debug | Print the result content on screen. Usefull for debugging process |
|
78
|
+
| result.value | Return first output line or value |
|
data/docs/learn/02-target.md
CHANGED
@@ -7,37 +7,40 @@ A [target](../dsl/target.md) is a feature you want to check. Targets are defined
|
|
7
7
|
## Target definition
|
8
8
|
|
9
9
|
* [target](dsl/target.md): Description of the element to be tested.
|
10
|
-
* [run](../dsl/run.md): Execute a command `id
|
10
|
+
* [run](../dsl/run.md): Execute a command `id obiwan` on localhost.
|
11
11
|
* [expect](../&dsl/expect.md): Verify that the result contains expected value.
|
12
12
|
|
13
13
|
```ruby
|
14
14
|
group "Learn about targets" do
|
15
15
|
|
16
|
-
target "
|
17
|
-
run "id
|
18
|
-
expect ["uid=", "(
|
16
|
+
target "Exist user obiwan"
|
17
|
+
run "id obiwan"
|
18
|
+
expect ["uid=", "(obiwan)", "gid="]
|
19
19
|
|
20
20
|
target "Delete user vader"
|
21
21
|
run "id vader"
|
22
|
-
|
23
|
-
|
22
|
+
expect_fail
|
24
23
|
end
|
25
24
|
```
|
26
25
|
|
27
|
-
> In this example, our localhost's OS is GNU/Linux (or any other compatible OS) because the command executed is `id
|
26
|
+
> In this example, our localhost's OS is GNU/Linux (or any other compatible OS) because the command executed is `id obiwan`.
|
28
27
|
|
29
|
-
When the user exists, we expect this words: `uid=, (
|
28
|
+
When the user exists, we expect this words: `uid=, (obiwan), gid=`.
|
30
29
|
|
31
30
|
```
|
32
|
-
❯ id
|
33
|
-
uid=1000(
|
31
|
+
❯ id obiwan
|
32
|
+
uid=1000(obiwan) gid=1000(obiwan) grupos=1000(obiwan)
|
34
33
|
```
|
35
34
|
|
36
35
|
But when user does not exist, we expect different words: `id:, vader, no exist`.
|
37
36
|
|
38
37
|
```
|
39
38
|
❯ id vader
|
40
|
-
id: «vader»: no
|
39
|
+
id: «vader»: no such user
|
40
|
+
|
41
|
+
❯ echo $?
|
42
|
+
1
|
43
|
+
|
41
44
|
```
|
42
45
|
|
43
46
|
## Execution section
|
@@ -93,32 +96,34 @@ CONFIGURATION
|
|
93
96
|
|
94
97
|
GROUPS
|
95
98
|
- Learn about targets
|
96
|
-
01 (
|
97
|
-
Description : Create user
|
98
|
-
Command : id
|
99
|
+
01 (0.0/1.0)
|
100
|
+
Description : Create user obiwan
|
101
|
+
Command : id obiwan
|
102
|
+
Output : id: «obiwan»: no existe ese usuario
|
99
103
|
Duration : 0.002 (local)
|
100
|
-
Alterations : find(uid=) & find((
|
101
|
-
Expected : Greater than 0
|
102
|
-
Result :
|
104
|
+
Alterations : find(uid=) & find((obiwan)) & find(gid=) & count
|
105
|
+
Expected : Greater than 0
|
106
|
+
Result : 0
|
103
107
|
02 (1.0/1.0)
|
104
108
|
Description : Delete user vader
|
105
109
|
Command : id vader
|
110
|
+
Output : id: «vader»: no existe ese usuario
|
106
111
|
Duration : 0.002 (local)
|
107
|
-
Alterations :
|
108
|
-
Expected : Greater than 0
|
109
|
-
Result : 1
|
112
|
+
Alterations : Read exit code
|
113
|
+
Expected : Greater than 0
|
114
|
+
Result : 1
|
110
115
|
|
111
116
|
RESULTS
|
112
117
|
+--------------+---------------------------+
|
113
118
|
| case_id | 01 |
|
114
|
-
| start_time | 2023-
|
115
|
-
| finish_time | 2023-
|
116
|
-
| duration | 0.
|
119
|
+
| start_time | 2023-06-16 08:42:13 +0100 |
|
120
|
+
| finish_time | 2023-06-16 08:42:13 +0100 |
|
121
|
+
| duration | 0.004527443 |
|
117
122
|
| unique_fault | 0 |
|
118
123
|
| max_weight | 2.0 |
|
119
|
-
| good_weight |
|
120
|
-
| fail_weight |
|
121
|
-
| fail_counter |
|
122
|
-
| grade |
|
124
|
+
| good_weight | 1.0 |
|
125
|
+
| fail_weight | 1.0 |
|
126
|
+
| fail_counter | 1 |
|
127
|
+
| grade | 50 |
|
123
128
|
+--------------+---------------------------+
|
124
129
|
```
|
@@ -0,0 +1,39 @@
|
|
1
|
+
[<<back](README.md)
|
2
|
+
|
3
|
+
# expect vs result
|
4
|
+
|
5
|
+
* `expect` is the statement we use to evaluate the result generated by a previous `run` statement.
|
6
|
+
* `result` allows you to manipulate the output of the run command in more detail.
|
7
|
+
|
8
|
+
`expect` is easier to use but less powerful than `result`.
|
9
|
+
|
10
|
+
> Example files at [examples/25-expect-result](../../examples/25-expect-result)
|
11
|
+
|
12
|
+
## Expect
|
13
|
+
|
14
|
+
`expect` has different ways to evaluate result.
|
15
|
+
|
16
|
+
| DSL | Description |
|
17
|
+
| ------------------ | ----------- |
|
18
|
+
| expect FILTER | it finds lines in the output with the content FILTER |
|
19
|
+
| expect_none FILTER | it finds lines in the output without the FILTER content |
|
20
|
+
| expect_nothing | is true when the result is empty |
|
21
|
+
| expect_exit NUMBER | Exit code is NUMBER |
|
22
|
+
| expect_ok | Exit code 0 |
|
23
|
+
| expect_fail | Exit code > 0 |
|
24
|
+
|
25
|
+
> Learn more about [expect](../dsl/expect.md)
|
26
|
+
|
27
|
+
## Result
|
28
|
+
|
29
|
+
`result` is an object that encapsulates the output of the run command and allows manipulation of its contents before being evaluated by `expect`.
|
30
|
+
|
31
|
+
| Result command | Description |
|
32
|
+
| -------------- | ----------- |
|
33
|
+
| expect result.count.eq NUMBER | Is true when output has NUMBER lines |
|
34
|
+
| expect result.count.gt NUMBER | Is true when output has more than NUMBER lines |
|
35
|
+
| expect result.count.lt NUMBER | is true when output has less than NUMBER lines |
|
36
|
+
| expect result.grep(FILTER).count.eq NUMBER | output has NUMBER lines with FILTER |
|
37
|
+
| expect result.grep_v(FILTER).count.eq NUMBER | output has NUMBER lines without FILTER |
|
38
|
+
|
39
|
+
> Learn more about [result](../dsl/result.md)
|