teuton 2.1.11 → 2.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +15 -12
- data/bin/check_teuton +0 -2
- data/docs/changelog/ideas.md +132 -0
- data/docs/changelog/v2.1.md +14 -122
- data/docs/changelog/v2.2.md +52 -28
- data/docs/changelog/version2.1.md +4 -0
- data/docs/commands/README.md +58 -15
- data/docs/commands/example_check.md +0 -4
- data/docs/commands/example_run.md +0 -4
- data/docs/dsl/README.md +1 -1
- data/docs/dsl/definition/result.md +1 -0
- data/docs/dsl/definition/run_remote.md +12 -6
- data/docs/dsl/definition/target.md +9 -10
- data/docs/install/README.md +13 -18
- data/docs/install/vagrant_docker.md +1 -1
- data/docs/learn/README.md +8 -8
- data/docs/learn/example-01-target.md +25 -25
- data/docs/learn/example-02-config.md +38 -49
- data/docs/learn/example-03-remote-hosts.md +22 -22
- data/docs/learn/{example-11-first-test.md → example-04-new-test.md} +23 -24
- data/docs/learn/{example-04-use.md → example-05-use.md} +6 -6
- data/docs/learn/{example-05-debug.md → example-06-debug.md} +8 -8
- data/docs/learn/{example-06-log.md → example-07-log.md} +7 -7
- data/docs/learn/{example-07-readme.md → example-08-readme.md} +10 -10
- data/docs/learn/{example-08-preserve.md → example-09-preserve.md} +6 -6
- data/docs/videos.md +19 -0
- data/lib/teuton/application.rb +22 -3
- data/lib/teuton/case_manager/case/dsl/goto.rb +2 -2
- data/lib/teuton/case_manager/case/dsl/macro.rb +1 -0
- data/lib/teuton/case_manager/case/dsl/send.rb +2 -1
- data/lib/teuton/case_manager/case/play.rb +2 -0
- data/lib/teuton/case_manager/case/result/ext_compare.rb +16 -0
- data/lib/teuton/case_manager/case/result/result.rb +1 -1
- data/lib/teuton/case_manager/case/runner.rb +30 -4
- data/lib/teuton/case_manager/case_manager.rb +1 -1
- data/lib/teuton/case_manager/export_manager.rb +21 -11
- data/lib/teuton/case_manager/utils.rb +1 -1
- data/lib/teuton/{project/laboratory → check}/builtin.rb +0 -0
- data/lib/teuton/{project/laboratory → check}/dsl.rb +40 -28
- data/lib/teuton/{project/laboratory → check}/laboratory.rb +3 -8
- data/lib/teuton/{project/laboratory → check}/show.rb +53 -59
- data/lib/teuton/cli.rb +85 -14
- data/lib/teuton/{project/readme → readme}/dsl.rb +0 -0
- data/lib/teuton/{project/readme → readme}/lang.rb +1 -1
- data/lib/teuton/{project/readme → readme}/readme.rb +22 -18
- data/lib/teuton/report/formatter/array_formatter.rb +13 -1
- data/lib/teuton/report/formatter/base_formatter.rb +18 -5
- data/lib/teuton/{project/skeleton.rb → skeleton.rb} +7 -19
- data/lib/teuton/utils/configfile_reader.rb +121 -0
- data/lib/teuton/{project → utils}/name_file_finder.rb +46 -26
- data/lib/teuton/version.rb +8 -0
- data/lib/teuton.rb +39 -32
- metadata +107 -65
- data/lib/teuton/cli/check.rb +0 -38
- data/lib/teuton/cli/main.rb +0 -6
- data/lib/teuton/cli/play.rb +0 -38
- data/lib/teuton/cli/readme.rb +0 -26
- data/lib/teuton/cli/version.rb +0 -12
- data/lib/teuton/files/gitignore +0 -2
- data/lib/teuton/project/configfile_reader.rb +0 -49
- data/lib/teuton/project/project.rb +0 -80
@@ -1,21 +1,21 @@
|
|
1
1
|
[<< back](README.md)
|
2
2
|
|
3
|
-
1. [Definition section](#definition-section)
|
4
|
-
2. [Execute command](#execute-command)
|
5
|
-
3. [Result](#result)
|
6
|
-
|
7
3
|
# Example: learn-07-readme
|
8
4
|
|
5
|
+
> This example is on GitHub repository at `examples/learn-08-readme/`.
|
6
|
+
|
9
7
|
Create README files (with test instructions) from our test definition.
|
10
8
|
|
11
|
-
|
9
|
+
1. [Definition section](#definition-section)
|
10
|
+
2. [Execute command](#execute-command)
|
11
|
+
3. [Result](#result)
|
12
12
|
|
13
13
|
## Definition section
|
14
14
|
|
15
15
|
Take a look at our test definition section (Group):
|
16
16
|
```ruby
|
17
17
|
group "Customize readme output" do
|
18
|
-
readme "This is our example
|
18
|
+
readme "This is our README example."
|
19
19
|
readme "And here we'll see how to use readme keyword"
|
20
20
|
|
21
21
|
target "Create user david."
|
@@ -37,19 +37,19 @@ There exists some `readme` instructions after `group` and `target` lines.
|
|
37
37
|
To generate automatically a README file from previous test, execute this:
|
38
38
|
|
39
39
|
```
|
40
|
-
teuton readme example/learn-
|
40
|
+
teuton readme example/learn-08-readme > example/learn-08-readme/README.md
|
41
41
|
```
|
42
42
|
|
43
43
|
## Result
|
44
44
|
|
45
|
-
**Let's see the output**: Content of `example/learn-
|
45
|
+
**Let's see the output**: Content of `example/learn-08-readme/README.md` file.
|
46
46
|
|
47
47
|
---
|
48
|
-
# learn-
|
48
|
+
# learn-08-readme
|
49
49
|
|
50
50
|
## Customize readme output
|
51
51
|
|
52
|
-
This is our example
|
52
|
+
This is our README example.
|
53
53
|
And here we'll see how to use readme keyword
|
54
54
|
|
55
55
|
Go to [LOCALHOST](#required-hosts) host, and do next:
|
@@ -1,13 +1,13 @@
|
|
1
1
|
[<< back](README.md)
|
2
2
|
|
3
|
-
|
4
|
-
2. [Result](#result)
|
3
|
+
# Example: learn-09-preserve
|
5
4
|
|
6
|
-
|
5
|
+
> This example is on GitHub repository at `examples/learn-09-preserve/`.
|
7
6
|
|
8
7
|
Older output report files are overwritten with new reports, every time we run teuton test. With `preserve` option we keep copies.
|
9
8
|
|
10
|
-
|
9
|
+
1. [Execution section](#execution-section)
|
10
|
+
2. [Result](#result)
|
11
11
|
|
12
12
|
## Execution section
|
13
13
|
|
@@ -22,11 +22,11 @@ end
|
|
22
22
|
> More information about [export](../dsl/execution/export.md) keyword.
|
23
23
|
## Result
|
24
24
|
|
25
|
-
Example, executing `teuton run example/learn-
|
25
|
+
Example, executing `teuton run example/learn-09-preserve` twice:
|
26
26
|
|
27
27
|
```
|
28
28
|
var
|
29
|
-
└── learn-
|
29
|
+
└── learn-09-preserve
|
30
30
|
├── 20200519-113035
|
31
31
|
│ ├── case-01.txt
|
32
32
|
│ ├── moodle.csv
|
data/docs/videos.md
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
[<< back](../README.md)
|
2
|
+
|
3
|
+
# News
|
4
|
+
|
5
|
+
* [Introducción a Teuton](https://elpuig.xeill.net/Members/vcarceler/articulos/introduccion-a-teuton): iniciarse en el uso de Teutón gracias al fantástico artículo de Víctor Carceler.
|
6
|
+
* [Verificar prácticas de GNS3 con Teuton](https://elpuig.xeill.net/Members/juanmorote/articulos/verificar-practicas-de-gns3-con-teuton): GNS3 es un excelente simulador de red Open Source que además se entiende con Teuton a las mil maravillas.
|
7
|
+
|
8
|
+
# Videos
|
9
|
+
|
10
|
+
Teuton en el 2016 se llamaba "sysadmingame".
|
11
|
+
* [CHAPI16 - Presentación sysadmingame chapi16 - Abril 2016](https://youtu.be/cNJaB5xzHHQ)
|
12
|
+
* sysadmingame:
|
13
|
+
1. [Instalación del programa](https://youtu.be/dnyMq9_KDco)
|
14
|
+
2. [Crear un caso simple](https://youtu.be/0e2g5Izvc6c)
|
15
|
+
3. [Crear un caso complejo](https://youtu.be/ebEK6OXH8kQ)
|
16
|
+
|
17
|
+
Teuton:
|
18
|
+
* [Apuntes FP Informática - I Congreso Virtual - Mayo 2020](https://youtu.be/RxIV26BAoGo)
|
19
|
+
* [Teuton Software 2.1 - Tutorial - Oct 2020](https://youtu.be/cyBN-rOYQeY)
|
data/lib/teuton/application.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'singleton'
|
4
|
+
require_relative 'version'
|
5
|
+
require_relative 'utils/name_file_finder'
|
4
6
|
|
5
7
|
# This Singleton contains application params
|
6
8
|
class Application
|
7
9
|
include Singleton
|
8
|
-
|
9
|
-
VERSION = '2.1.11' # Application version
|
10
|
-
NAME = 'teuton' # Application name
|
10
|
+
include Teuton
|
11
11
|
|
12
12
|
attr_reader :letter
|
13
13
|
attr_reader :running_basedir, :output_basedir
|
@@ -71,4 +71,23 @@ class Application
|
|
71
71
|
|
72
72
|
false
|
73
73
|
end
|
74
|
+
|
75
|
+
##
|
76
|
+
# Preprocess input options:
|
77
|
+
# * Convert input case options String to an Array of integers
|
78
|
+
# * Read color input option
|
79
|
+
# rubocop:disable Metrics/AbcSize
|
80
|
+
def add_input_params(projectpath, options)
|
81
|
+
@options.merge! options
|
82
|
+
NameFileFinder.find_filenames_for(projectpath)
|
83
|
+
@options['color'] = true if @options['color'].nil?
|
84
|
+
Rainbow.enabled = @options['color']
|
85
|
+
@options['panel'] = false if @options['panel'].nil?
|
86
|
+
|
87
|
+
return if @options['case'].nil?
|
88
|
+
|
89
|
+
a = @options['case'].split(',')
|
90
|
+
@options['case'] = a.collect!(&:to_i)
|
91
|
+
end
|
92
|
+
# rubocop:enable Metrics/AbcSize
|
74
93
|
end
|
@@ -22,8 +22,8 @@ module DSL
|
|
22
22
|
def goto(host = :localhost, args = {})
|
23
23
|
@result.reset
|
24
24
|
args[:on] = host unless args[:on]
|
25
|
-
@action[:command] = args[:execute] if args[:execute]
|
26
|
-
@action[:command] = args[:exec] if args[:exec]
|
25
|
+
@action[:command] = args[:execute].to_s if args[:execute]
|
26
|
+
@action[:command] = args[:exec].to_s if args[:exec]
|
27
27
|
tempfile(args[:tempfile]) if args[:tempfile]
|
28
28
|
@action[:encoding] = args[:encoding] || 'UTF-8'
|
29
29
|
|
@@ -18,6 +18,7 @@ module DSL
|
|
18
18
|
ip = get((host + '_ip').to_sym)
|
19
19
|
username = get((host + '_username').to_sym).to_s
|
20
20
|
password = get((host + '_password').to_sym).to_s
|
21
|
+
port = get((host + '_port').to_sym) || 22
|
21
22
|
|
22
23
|
filename = @report.filename + '.' + @report.format.to_s
|
23
24
|
localfilepath = File.join(@report.output_dir, filename)
|
@@ -32,7 +33,7 @@ module DSL
|
|
32
33
|
|
33
34
|
# Upload a file or directory to the remote host
|
34
35
|
begin
|
35
|
-
Net::SFTP.start(ip, username, password: password) do |sftp|
|
36
|
+
Net::SFTP.start(ip, username, password: password, port: port) do |sftp|
|
36
37
|
sftp.upload!(localfilepath, remotefilepath)
|
37
38
|
end
|
38
39
|
verboseln("=> [ OK ] #{(get(:tt_members)[0,15]).ljust(16)} : #{remotefilepath}")
|
@@ -58,6 +58,7 @@ class Case
|
|
58
58
|
|
59
59
|
##
|
60
60
|
# Fill case report with time information
|
61
|
+
# rubocop:disable Metrics/AbcSize
|
61
62
|
def fill_report(start_time, finish_time)
|
62
63
|
@report.head.merge! @config.global
|
63
64
|
@report.head.merge! @config.local
|
@@ -67,4 +68,5 @@ class Case
|
|
67
68
|
@report.tail[:finish_time] = finish_time
|
68
69
|
@report.tail[:duration] = finish_time - start_time
|
69
70
|
end
|
71
|
+
# rubocop:enable Metrics/AbcSize
|
70
72
|
end
|
@@ -1,7 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# This is an extension of Result class
|
4
|
+
# rubocop:disable Metrics/ClassLength
|
4
5
|
class Result
|
6
|
+
# rubocop:disable Metrics/MethodLength
|
7
|
+
# Return true when content is equal than input
|
8
|
+
# @param input (Object)
|
5
9
|
def eq(input)
|
6
10
|
@expected = input
|
7
11
|
|
@@ -21,11 +25,13 @@ class Result
|
|
21
25
|
end
|
22
26
|
value == input
|
23
27
|
end
|
28
|
+
# rubocop:enable Metrics/MethodLength
|
24
29
|
alias eq? eq
|
25
30
|
alias equal eq
|
26
31
|
alias equal? eq
|
27
32
|
alias is_equal? eq
|
28
33
|
|
34
|
+
# rubocop:disable Metrics/MethodLength
|
29
35
|
def neq(external)
|
30
36
|
@expected = "Not equal to #{external}"
|
31
37
|
|
@@ -43,10 +49,12 @@ class Result
|
|
43
49
|
end
|
44
50
|
internal != external
|
45
51
|
end
|
52
|
+
# rubocop:enable Metrics/MethodLength
|
46
53
|
alias neq? neq
|
47
54
|
alias not_equal neq
|
48
55
|
alias not_equal? neq
|
49
56
|
|
57
|
+
# rubocop:disable Metrics/MethodLength
|
50
58
|
def ge(input)
|
51
59
|
@expected = "Greater or equal to #{input}"
|
52
60
|
return false if @content.nil? || @content[0].nil?
|
@@ -64,9 +72,11 @@ class Result
|
|
64
72
|
end
|
65
73
|
value >= input
|
66
74
|
end
|
75
|
+
# rubocop:enable Metrics/MethodLength
|
67
76
|
alias greater_or_equal ge
|
68
77
|
alias greater_or_equal? ge
|
69
78
|
|
79
|
+
# rubocop:disable Metrics/MethodLength
|
70
80
|
def gt(input)
|
71
81
|
@expected = "Greater than #{input}"
|
72
82
|
return false if @content.nil? || @content[0].nil?
|
@@ -84,9 +94,11 @@ class Result
|
|
84
94
|
end
|
85
95
|
value > input
|
86
96
|
end
|
97
|
+
# rubocop:enable Metrics/MethodLength
|
87
98
|
alias greater gt
|
88
99
|
alias greater_than gt
|
89
100
|
|
101
|
+
# rubocop:disable Metrics/MethodLength
|
90
102
|
def le(input)
|
91
103
|
@expected = "Lesser or equal to #{input}"
|
92
104
|
|
@@ -105,9 +117,11 @@ class Result
|
|
105
117
|
end
|
106
118
|
value <= input
|
107
119
|
end
|
120
|
+
# rubocop:enable Metrics/MethodLength
|
108
121
|
alias lesser_or_equal le
|
109
122
|
alias lesser_or_equal? le
|
110
123
|
|
124
|
+
# rubocop:disable Metrics/MethodLength
|
111
125
|
def lt(input)
|
112
126
|
@expected = "Lesser than #{input}"
|
113
127
|
return false if @content.nil? || @content[0].nil?
|
@@ -125,6 +139,7 @@ class Result
|
|
125
139
|
end
|
126
140
|
value < input
|
127
141
|
end
|
142
|
+
# rubocop:enable Metrics/MethodLength
|
128
143
|
alias lesser lt
|
129
144
|
alias smaller lt
|
130
145
|
alias lesser_than lt
|
@@ -145,3 +160,4 @@ class Result
|
|
145
160
|
alias near? near_to?
|
146
161
|
alias near near_to?
|
147
162
|
end
|
163
|
+
# rubocop:enable Metrics/ClassLength
|
@@ -8,6 +8,7 @@ require_relative 'dsl/log'
|
|
8
8
|
# * run_local_cmd
|
9
9
|
# * run_remote_cmd
|
10
10
|
# * run_remote_cmd_ssh
|
11
|
+
# * reconfigure_command_with_gateway
|
11
12
|
# * run_remote_cmd_telnet
|
12
13
|
class Case
|
13
14
|
|
@@ -65,21 +66,45 @@ class Case
|
|
65
66
|
def run_cmd_remote_ssh(input_hostname)
|
66
67
|
@action[:conn_type] = :ssh
|
67
68
|
hostname = input_hostname.to_s
|
68
|
-
ip = @config.get(
|
69
|
-
username = @config.get(
|
70
|
-
password = @config.get(
|
69
|
+
ip = @config.get("#{hostname}_ip".to_sym).to_s
|
70
|
+
username = @config.get("#{hostname}_username".to_sym).to_s
|
71
|
+
password = @config.get("#{hostname}_password".to_sym).to_s
|
72
|
+
port = @config.get("#{hostname}_port".to_sym).to_i || 22
|
73
|
+
|
74
|
+
unless @config.get("#{hostname}_route".to_sym) == 'NODATA'
|
75
|
+
# Reconfigure command with gateway. Example host1_route: IP.
|
76
|
+
hostname2 = hostname
|
77
|
+
ip2 = ip
|
78
|
+
username2 = username
|
79
|
+
password2 = password
|
80
|
+
command2 = @action[:command]
|
81
|
+
hostname = @config.get("#{hostname}_route".to_sym)
|
82
|
+
ip = @config.get("#{hostname}_ip".to_sym).to_s
|
83
|
+
username = @config.get("#{hostname}_username".to_sym).to_s
|
84
|
+
password = @config.get("#{hostname}_password".to_sym).to_s
|
85
|
+
ostype = @config.get("#{hostname}_ostype".to_sym).to_s
|
86
|
+
|
87
|
+
if ostype.downcase.start_with? 'win'
|
88
|
+
# echo y | plink idp@2.tcp.eu.ngrok.io -ssh -P 16256 -pw idp "echo > Desktop\hola.txt"
|
89
|
+
@action[:command] = "echo y | plink #{username2}@#{ip2} -ssh -pw #{password2} \"#{command2}\""
|
90
|
+
else
|
91
|
+
@action[:command] = "sshpass -p #{password2} #{username2}@#{ip2} #{command2}"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
71
95
|
text = ''
|
72
96
|
begin
|
73
97
|
if @sessions[hostname].nil?
|
74
98
|
@sessions[hostname] = Net::SSH.start(ip,
|
75
99
|
username,
|
100
|
+
port: port,
|
76
101
|
password: password,
|
77
102
|
keepalive: true,
|
78
103
|
timeout: 30,
|
79
104
|
non_interactive: true)
|
80
105
|
end
|
81
106
|
if @sessions[hostname].class == Net::SSH::Connection::Session
|
82
|
-
text = @sessions[hostname].exec!(@action[:command]
|
107
|
+
text = @sessions[hostname].exec!(@action[:command])
|
83
108
|
end
|
84
109
|
rescue Errno::EHOSTUNREACH
|
85
110
|
@sessions[hostname] = :nosession
|
@@ -109,6 +134,7 @@ class Case
|
|
109
134
|
" exec: #{@action[:command]}", :error)
|
110
135
|
end
|
111
136
|
output = encode_and_split(@action[:encoding], text)
|
137
|
+
# revise: @result.exitstatus = text.exitstatus
|
112
138
|
@result.content = output
|
113
139
|
@result.content.compact!
|
114
140
|
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
require 'singleton'
|
4
4
|
require_relative '../application'
|
5
5
|
require_relative '../report/report'
|
6
|
-
require_relative '../
|
6
|
+
require_relative '../utils/configfile_reader'
|
7
7
|
require_relative 'case/case'
|
8
8
|
require_relative 'export_manager'
|
9
9
|
require_relative 'main'
|
@@ -10,16 +10,10 @@ module ExportManager
|
|
10
10
|
# @param main_report (Report)
|
11
11
|
# @param cases (Array)
|
12
12
|
# @param input (Hash) Selected export options
|
13
|
-
# rubocop:
|
13
|
+
# rubocop:disable Metrics/AbcSize
|
14
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
14
15
|
def self.run(main_report, cases, input)
|
15
|
-
args =
|
16
|
-
input.each_pair do |key, value|
|
17
|
-
if value.class == String
|
18
|
-
args[key] = value.to_sym
|
19
|
-
else
|
20
|
-
args[key] = value
|
21
|
-
end
|
22
|
-
end
|
16
|
+
args = strings2symbols(input)
|
23
17
|
|
24
18
|
# default :mode=>:all, :format=>:txt
|
25
19
|
format = args[:format] || Application.instance.default[:format]
|
@@ -36,12 +30,29 @@ module ExportManager
|
|
36
30
|
preserve_files if args[:preserve] == true
|
37
31
|
end
|
38
32
|
# rubocop:enable Metrics/AbcSize
|
33
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
34
|
+
|
35
|
+
##
|
36
|
+
# Convert Hash String values into Symbol values
|
37
|
+
# @param input (Hash)
|
38
|
+
# rubocop:disable Style/ConditionalAssignment
|
39
|
+
private_class_method def self.strings2symbols(input)
|
40
|
+
args = {}
|
41
|
+
input.each_pair do |key, value|
|
42
|
+
if value.class == String
|
43
|
+
args[key] = value.to_sym
|
44
|
+
else
|
45
|
+
args[key] = value
|
46
|
+
end
|
47
|
+
end
|
48
|
+
args
|
49
|
+
end
|
50
|
+
# rubocop:enable Style/ConditionalAssignment
|
39
51
|
|
40
52
|
##
|
41
53
|
# Preserve output files for current project
|
42
54
|
# rubocop:disable Metrics/AbcSize
|
43
55
|
# rubocop:disable Metrics/MethodLength
|
44
|
-
# rubocop:disable Layout/LineLength
|
45
56
|
private_class_method def self.preserve_files
|
46
57
|
app = Application.instance
|
47
58
|
t = Time.now
|
@@ -57,5 +68,4 @@ module ExportManager
|
|
57
68
|
end
|
58
69
|
# rubocop:enable Metrics/AbcSize
|
59
70
|
# rubocop:enable Metrics/MethodLength
|
60
|
-
# rubocop:enable Layout/LineLength
|
61
71
|
end
|
@@ -26,7 +26,7 @@ module Utils
|
|
26
26
|
text = ec.convert(text)
|
27
27
|
rescue StandardError => e
|
28
28
|
puts "[ERROR] #{e}: Declare text encoding..."
|
29
|
-
puts "
|
29
|
+
puts " run 'command', on: :host, :encoding => 'ISO-8859-1'"
|
30
30
|
end
|
31
31
|
|
32
32
|
text.split("\n")
|
File without changes
|
@@ -1,36 +1,27 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
|
4
|
-
#
|
5
|
-
# * goto
|
6
|
-
# * run
|
7
|
-
# * expect
|
8
|
-
# * get
|
9
|
-
# * unique
|
10
|
-
# * log
|
11
|
-
# * set
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
##
|
4
|
+
# Include Teuton DSL keywords into Laboratory class
|
12
5
|
class Laboratory
|
6
|
+
##
|
7
|
+
# Execute Teuton DSL readme keyword
|
13
8
|
def readme(_text)
|
14
9
|
# Usefull for "teuton readme" command action.
|
15
10
|
end
|
16
11
|
|
12
|
+
##
|
13
|
+
# Execute Teuton DSL target keyword
|
17
14
|
def target(desc, args = {})
|
18
15
|
@stats[:targets] += 1
|
19
16
|
@targetid += 1
|
20
17
|
weight = args[:weight] || 1.0
|
21
|
-
verboseln '(%
|
18
|
+
verboseln format('(%03<targetid>d) target %<desc>s', targetid: @targetid, desc: desc)
|
22
19
|
verboseln " weight #{weight}"
|
23
20
|
end
|
24
21
|
alias goal target
|
25
22
|
|
26
|
-
|
27
|
-
#
|
28
|
-
# end
|
29
|
-
|
30
|
-
def tempfile(_tempfile = nil)
|
31
|
-
'tempfile'
|
32
|
-
end
|
33
|
-
|
23
|
+
##
|
24
|
+
# Execute Teuton DSL run keyword
|
34
25
|
def run(command, args = {})
|
35
26
|
args[:exec] = command
|
36
27
|
host = :localhost
|
@@ -38,6 +29,8 @@ class Laboratory
|
|
38
29
|
goto(host, args)
|
39
30
|
end
|
40
31
|
|
32
|
+
##
|
33
|
+
# Execute Teuton DSL goto keyword
|
41
34
|
def goto(host = :localhost, args = {})
|
42
35
|
result.reset
|
43
36
|
args[:on] = host unless args[:on]
|
@@ -50,24 +43,32 @@ class Laboratory
|
|
50
43
|
verboseln " run '#{args[:exec]}' on #{args[:on]}"
|
51
44
|
end
|
52
45
|
|
53
|
-
|
46
|
+
##
|
47
|
+
# Execute Teuton DSL expect keyword
|
48
|
+
def expect(cond)
|
54
49
|
verboseln " alter #{result.alterations}" unless result.alterations.empty?
|
55
|
-
verboseln " expect #{
|
50
|
+
verboseln " expect #{cond} (#{cond.class})"
|
56
51
|
verboseln ''
|
57
52
|
end
|
58
53
|
|
59
|
-
|
54
|
+
##
|
55
|
+
# Execute Teuton DSL expect_one keyword
|
56
|
+
def expect_one(cond)
|
60
57
|
verboseln " alter #{result.alterations}" unless result.alterations.empty?
|
61
|
-
verboseln " expect_one #{
|
58
|
+
verboseln " expect_one #{cond} (#{cond.class})"
|
62
59
|
verboseln ''
|
63
60
|
end
|
64
61
|
|
65
|
-
|
62
|
+
##
|
63
|
+
# Execute Teuton DSL expect_none keyword
|
64
|
+
def expect_none(cond)
|
66
65
|
verboseln " alter #{result.alterations}" unless result.alterations.empty?
|
67
|
-
verboseln " expect_none #{
|
66
|
+
verboseln " expect_none #{cond} (#{cond.class})"
|
68
67
|
verboseln ''
|
69
68
|
end
|
70
69
|
|
70
|
+
##
|
71
|
+
# Execute Teuton DSL get keyword
|
71
72
|
def get(varname)
|
72
73
|
@stats[:gets] += 1
|
73
74
|
|
@@ -80,17 +81,24 @@ class Laboratory
|
|
80
81
|
"get(#{varname})"
|
81
82
|
end
|
82
83
|
|
83
|
-
# If a method call is missing, then
|
84
|
+
# If a method call is missing, then try to call get(var)
|
85
|
+
# rubocop:disable Style/MissingRespondToMissing
|
84
86
|
def method_missing(method)
|
85
87
|
a = method.to_s
|
86
|
-
instance_eval("get(:#{a[0, a.size - 1]})") if a[a.size - 1] == '?'
|
88
|
+
instance_eval("get(:#{a[0, a.size - 1]})", __FILE__, __LINE__) if a[a.size - 1] == '?'
|
87
89
|
end
|
90
|
+
# rubocop:enable Style/MissingRespondToMissing
|
88
91
|
|
92
|
+
##
|
93
|
+
# Execute Teuton DSL gett keyword
|
94
|
+
# Same as get keyword, but show pretty output when used by readme command.
|
89
95
|
def gett(option)
|
90
96
|
value = get(option)
|
91
97
|
value
|
92
98
|
end
|
93
99
|
|
100
|
+
##
|
101
|
+
# Execute Teuton DSL unique keyword
|
94
102
|
def unique(key, _value)
|
95
103
|
@stats[:uniques] += 1
|
96
104
|
|
@@ -98,11 +106,15 @@ class Laboratory
|
|
98
106
|
verboseln ''
|
99
107
|
end
|
100
108
|
|
109
|
+
##
|
110
|
+
# Execute Teuton DSL log keyword
|
101
111
|
def log(text = '', type = :info)
|
102
112
|
@stats[:logs] += 1
|
103
113
|
verboseln " log [#{type}]: " + text.to_s
|
104
114
|
end
|
105
115
|
|
116
|
+
##
|
117
|
+
# Execute Teuton DSL set keyword
|
106
118
|
def set(key, value)
|
107
119
|
@stats[:sets] += 1
|
108
120
|
|
@@ -1,10 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
require_relative '../../application'
|
7
|
-
require_relative '../../case_manager/case/result/result'
|
3
|
+
require_relative '../application'
|
4
|
+
require_relative '../case_manager/case/result/result'
|
8
5
|
require_relative 'show'
|
9
6
|
require_relative 'dsl'
|
10
7
|
require_relative 'builtin'
|
@@ -35,7 +32,7 @@ alias task group
|
|
35
32
|
# DSL start: Define main teuton test execution
|
36
33
|
# @param block (Proc)
|
37
34
|
def start(&block)
|
38
|
-
#
|
35
|
+
# Don't do nothing. We are checking test not running it
|
39
36
|
end
|
40
37
|
alias play start
|
41
38
|
|
@@ -54,8 +51,6 @@ class Laboratory
|
|
54
51
|
reset
|
55
52
|
end
|
56
53
|
|
57
|
-
##
|
58
|
-
# Set attibutes to default values
|
59
54
|
def reset
|
60
55
|
@result = Result.new
|
61
56
|
@targetid = 0
|