kaya 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +26 -0
- data/CHANGELOG +52 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/NOTAS +19 -0
- data/README.md +279 -0
- data/Rakefile +1 -0
- data/bin/kaya +4 -0
- data/documentation/api.md +47 -0
- data/documentation/api_execution_data.md +47 -0
- data/documentation/configuration.md +13 -0
- data/documentation/custom_parameters.md +117 -0
- data/documentation/document_kaya.md +122 -0
- data/documentation/link.md +12 -0
- data/documentation/results.md +119 -0
- data/documentation/start.md +19 -0
- data/documentation/suites.md +60 -0
- data/documentation/test_suite_information.md +9 -0
- data/kaya.gemspec +42 -0
- data/lib/generators/task_rack.rb +160 -0
- data/lib/generators/templates/Gemfile.tt +2 -0
- data/lib/generators/templates/config.ru.tt +2 -0
- data/lib/generators/templates/kaya_conf.tt +49 -0
- data/lib/generators/templates/kaya_log.tt +0 -0
- data/lib/generators/templates/sidekiq_log.tt +0 -0
- data/lib/generators/templates/tasks.kaya.tt +10 -0
- data/lib/generators/templates/unicorn.rb.tt +21 -0
- data/lib/kaya/API/error.rb +17 -0
- data/lib/kaya/API/execution.rb +141 -0
- data/lib/kaya/API/result.rb +49 -0
- data/lib/kaya/API/results.rb +31 -0
- data/lib/kaya/API/suite.rb +42 -0
- data/lib/kaya/API/suites.rb +36 -0
- data/lib/kaya/background_jobs/sidekiq.rb +35 -0
- data/lib/kaya/background_jobs/workers/execution_checker.rb +20 -0
- data/lib/kaya/background_jobs/workers/garbage_cleaner.rb +31 -0
- data/lib/kaya/commands/bye.rb +12 -0
- data/lib/kaya/commands/help.rb +13 -0
- data/lib/kaya/commands/install.rb +27 -0
- data/lib/kaya/commands/reset.rb +39 -0
- data/lib/kaya/commands/reset_suites.rb +40 -0
- data/lib/kaya/commands/restart.rb +9 -0
- data/lib/kaya/commands/start.rb +104 -0
- data/lib/kaya/commands/stop.rb +53 -0
- data/lib/kaya/cuba.rb +287 -0
- data/lib/kaya/cucumber/features.rb +15 -0
- data/lib/kaya/cucumber/task.rb +64 -0
- data/lib/kaya/custom/execution_data.rb +50 -0
- data/lib/kaya/custom/params.rb +34 -0
- data/lib/kaya/database/mongo_connector.rb +285 -0
- data/lib/kaya/error/errors.rb +55 -0
- data/lib/kaya/execution.rb +57 -0
- data/lib/kaya/results/result.rb +493 -0
- data/lib/kaya/results/results.rb +47 -0
- data/lib/kaya/suites/custom/params.rb +151 -0
- data/lib/kaya/suites/suite.rb +177 -0
- data/lib/kaya/suites/suites.rb +130 -0
- data/lib/kaya/support/clean.rb +12 -0
- data/lib/kaya/support/configuration.rb +254 -0
- data/lib/kaya/support/console.rb +11 -0
- data/lib/kaya/support/documentation.rb +34 -0
- data/lib/kaya/support/error_handler_helper.rb +24 -0
- data/lib/kaya/support/files_cleanner.rb +136 -0
- data/lib/kaya/support/git.rb +161 -0
- data/lib/kaya/support/if_config.rb +14 -0
- data/lib/kaya/support/logo.rb +23 -0
- data/lib/kaya/support/logs.rb +37 -0
- data/lib/kaya/support/notification.rb +127 -0
- data/lib/kaya/support/processes.rb +96 -0
- data/lib/kaya/support/query_string.rb +22 -0
- data/lib/kaya/support/request.rb +32 -0
- data/lib/kaya/support/risk.rb +9 -0
- data/lib/kaya/support/time_helper.rb +11 -0
- data/lib/kaya/support/update.rb +65 -0
- data/lib/kaya/version.rb +3 -0
- data/lib/kaya/view/body.mote +60 -0
- data/lib/kaya/view/custom/params/select_list.mote +14 -0
- data/lib/kaya/view/custom/params/text.mote +9 -0
- data/lib/kaya/view/custom/params.mote +9 -0
- data/lib/kaya/view/error_handler.mote +40 -0
- data/lib/kaya/view/features/feature.mote +14 -0
- data/lib/kaya/view/features/features_list.mote +10 -0
- data/lib/kaya/view/features.mote +57 -0
- data/lib/kaya/view/footer.mote +10 -0
- data/lib/kaya/view/git_information.mote +21 -0
- data/lib/kaya/view/help/main.mote +21 -0
- data/lib/kaya/view/help/page.mote +2 -0
- data/lib/kaya/view/help/search_result.mote +29 -0
- data/lib/kaya/view/help.mote +72 -0
- data/lib/kaya/view/javascript.mote +96 -0
- data/lib/kaya/view/logs/log.mote +3 -0
- data/lib/kaya/view/modals.mote +31 -0
- data/lib/kaya/view/navigation_bar.mote +48 -0
- data/lib/kaya/view/not_found.mote +40 -0
- data/lib/kaya/view/parser.rb +79 -0
- data/lib/kaya/view/results/all.mote +59 -0
- data/lib/kaya/view/results/console.mote +106 -0
- data/lib/kaya/view/results/detailed_info.mote +112 -0
- data/lib/kaya/view/results/report.mote +1 -0
- data/lib/kaya/view/results/result.mote +23 -0
- data/lib/kaya/view/results/results.mote +52 -0
- data/lib/kaya/view/screenshot.mote +42 -0
- data/lib/kaya/view/sections.rb +25 -0
- data/lib/kaya/view/styles.mote +58 -0
- data/lib/kaya/view/suites/suite.mote +73 -0
- data/lib/kaya/view/suites/suites.mote +9 -0
- data/lib/kaya/view/view.rb +72 -0
- data/lib/kaya.rb +175 -0
- data/test/features/install.feature +18 -0
- data/test/features/support/env.rb +3 -0
- metadata +395 -0
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
module Kaya
|
|
2
|
+
module Results
|
|
3
|
+
class Result
|
|
4
|
+
|
|
5
|
+
attr_accessor\
|
|
6
|
+
:id,
|
|
7
|
+
:started_at,
|
|
8
|
+
:saw,
|
|
9
|
+
:suite,
|
|
10
|
+
:suite_name,
|
|
11
|
+
:execution_name,
|
|
12
|
+
:command,
|
|
13
|
+
:custom_params,
|
|
14
|
+
:execution_data,
|
|
15
|
+
:kaya_command,
|
|
16
|
+
:html_report,
|
|
17
|
+
:finished_at,
|
|
18
|
+
:status,
|
|
19
|
+
:summary,
|
|
20
|
+
:show_as,
|
|
21
|
+
:kaya_report_file_name,
|
|
22
|
+
:console_output_file_name,
|
|
23
|
+
:console_output,
|
|
24
|
+
:bundle_output,
|
|
25
|
+
:git_log,
|
|
26
|
+
:pid,
|
|
27
|
+
:last_check_time,
|
|
28
|
+
:configuration_values,
|
|
29
|
+
:timeout
|
|
30
|
+
|
|
31
|
+
attr_reader :console_output
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
# data_for_result = {
|
|
35
|
+
# :suite_name,
|
|
36
|
+
# :execution_name,
|
|
37
|
+
# :type:}
|
|
38
|
+
def initialize data_for_result
|
|
39
|
+
|
|
40
|
+
if data_for_result["_id"]
|
|
41
|
+
# It comes from mongo because there is a result id
|
|
42
|
+
@id = data_for_result["_id"]
|
|
43
|
+
load_values(data_for_result)
|
|
44
|
+
|
|
45
|
+
else # It comes from a new execution request
|
|
46
|
+
@id = Kaya::Database::MongoConnector.generate_id
|
|
47
|
+
@suite = data_for_result['suite']
|
|
48
|
+
@execution_name = data_for_result["execution_name"] || ""
|
|
49
|
+
@custom_params = data_for_result["custom_params"]
|
|
50
|
+
@git_log = data_for_result["git_log"]
|
|
51
|
+
@started_at = now_in_seconds
|
|
52
|
+
@finished_at = nil
|
|
53
|
+
@status = "started"
|
|
54
|
+
@timeout = nil
|
|
55
|
+
@show_as = "pending"
|
|
56
|
+
@html_report = ""
|
|
57
|
+
@summary = "Not available yet"
|
|
58
|
+
|
|
59
|
+
# Save suite info
|
|
60
|
+
suite_data = Kaya::Database::MongoConnector.suite_data_for(@suite["id"])
|
|
61
|
+
@command = data_for_result['command']
|
|
62
|
+
@suite_name = suite_data["name"]
|
|
63
|
+
@command = suite_data["command"]
|
|
64
|
+
@console_output = ""
|
|
65
|
+
@last_check_time = now_in_seconds
|
|
66
|
+
@execution_data = {}
|
|
67
|
+
@configuration_values = Kaya::Support::Configuration.pretty_configuration_values
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def load_values data
|
|
72
|
+
data.each_pair do |var, value|
|
|
73
|
+
begin
|
|
74
|
+
send("#{var}=",value) if send("#{var}").nil?
|
|
75
|
+
rescue; end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def self.get(result_id)
|
|
80
|
+
result_data = Kaya::Database::MongoConnector.result_data_for_id(result_id)
|
|
81
|
+
new(result_data) if result_data
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def result_data_structure
|
|
86
|
+
{
|
|
87
|
+
"_id" => id,
|
|
88
|
+
"suite" => @suite,
|
|
89
|
+
"execution_name" => execution_name,
|
|
90
|
+
"command" => command,
|
|
91
|
+
"custom_params" => custom_params,
|
|
92
|
+
"kaya_command" => kaya_command,
|
|
93
|
+
"kaya_report_file_name" => kaya_report_file_name,
|
|
94
|
+
"html_report" => html_report,
|
|
95
|
+
"started_at" => started_at,
|
|
96
|
+
"finished_at" => finished_at,
|
|
97
|
+
"status" => status,
|
|
98
|
+
"timeout" => timeout,
|
|
99
|
+
"summary" => summary,
|
|
100
|
+
"show_as" => show_as,
|
|
101
|
+
"bundle_output" => bundle_output,
|
|
102
|
+
"console_output_file_name" => console_output_file_name,
|
|
103
|
+
"console_output" => console_output,
|
|
104
|
+
"git_log" => git_log,
|
|
105
|
+
"saw" => saw,
|
|
106
|
+
"pid" => pid,
|
|
107
|
+
"last_check_time" => last_check_time,
|
|
108
|
+
"execution_data" => execution_data,
|
|
109
|
+
"configuration_values" => configuration_values
|
|
110
|
+
}
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def api_response
|
|
114
|
+
data = result_data_structure
|
|
115
|
+
data["has_report"] = self.has_report?
|
|
116
|
+
data["elapsed_time"] = self.elapsed_time
|
|
117
|
+
# List of fields to omit in api response
|
|
118
|
+
["html_report","console_output_file_name","kaya_command","kaya_report_file_name","pid","last_check_time","console_output","git_log","bundle_output"].each{|field| data.delete(field)}
|
|
119
|
+
data
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Returns the string of custom params values
|
|
123
|
+
# @return [String] foo=bar john=doe
|
|
124
|
+
def custom_params_values
|
|
125
|
+
"kaya_custom_params='#{validate_params(@custom_params).to_json}'".gsub(',', ', ')
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
# Returns a hash with valid parameters. This is to prevent command line command with could cause problems
|
|
130
|
+
# @param [hash] custom params
|
|
131
|
+
# @return [hash] validated custom params
|
|
132
|
+
def validate_params custom_params={}
|
|
133
|
+
unless custom_params.nil?
|
|
134
|
+
validated = custom_params.select do |key, value|
|
|
135
|
+
unless value.nil?
|
|
136
|
+
Kaya::Support::Risk.secure? value
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
validated || {}
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def add_execution_data key, value
|
|
144
|
+
@execution_data.store(key, value)
|
|
145
|
+
self.save!
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def suite_id
|
|
149
|
+
@suite["id"]
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# def suite_name
|
|
153
|
+
# @suite["name"]
|
|
154
|
+
# end
|
|
155
|
+
|
|
156
|
+
# Gets all the console log, status, etc values and update itself
|
|
157
|
+
# If detect report as finished kill the asociated process and return true
|
|
158
|
+
# else returns false wich means that the process is still runnnig
|
|
159
|
+
# @return [Boolean] true if process has been killed
|
|
160
|
+
def update_values!
|
|
161
|
+
$K_LOG.debug "[#{@id}] Updating values" if $K_LOG
|
|
162
|
+
self.save_report!
|
|
163
|
+
self.get_summary!
|
|
164
|
+
self.get_status!
|
|
165
|
+
self.append_result_to_console_output!
|
|
166
|
+
if (self.report_says_finished? and !self.stopped?)
|
|
167
|
+
self.finished!
|
|
168
|
+
$K_LOG.debug "[#{@id}] Values updated" if $K_LOG
|
|
169
|
+
finished = true
|
|
170
|
+
|
|
171
|
+
elsif (self.seconds_without_changes > Kaya::Support::Configuration.execution_time_to_live)
|
|
172
|
+
self.finished_by_timeout!
|
|
173
|
+
finished = true
|
|
174
|
+
else
|
|
175
|
+
return false
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
if finished
|
|
179
|
+
@summary = @status if @summary == "running"
|
|
180
|
+
self.save!
|
|
181
|
+
self.delete_asociated_files!
|
|
182
|
+
Kaya::Support::Processes.kill_by_result_id(self.id)
|
|
183
|
+
true
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
# Reads, copy html report from cucumber output file and saves it on a instance variable
|
|
189
|
+
# Persists changes on mongo and then deletes the html reporte file
|
|
190
|
+
def save_report!
|
|
191
|
+
if is_there_a_report_file?
|
|
192
|
+
new_content = Kaya::View::Parser.adapt_to_kaya(read_report, self)
|
|
193
|
+
if new_content.size > @html_report.size
|
|
194
|
+
@html_report= new_content
|
|
195
|
+
$K_LOG.debug "[#{@id}] Report saved" if $K_LOG
|
|
196
|
+
self.save!
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
def is_there_a_report_file?
|
|
202
|
+
begin
|
|
203
|
+
!open_report_file.nil?
|
|
204
|
+
rescue
|
|
205
|
+
false
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def has_report?
|
|
210
|
+
!@html_report.empty?
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
def get_summary!
|
|
214
|
+
report = if is_there_a_report_file?
|
|
215
|
+
read_report
|
|
216
|
+
else
|
|
217
|
+
@html_report
|
|
218
|
+
end
|
|
219
|
+
@summary = Kaya::View::Parser.extract_summary(report) unless summary?
|
|
220
|
+
self.save!
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def summary?
|
|
224
|
+
!(["Not available yet", "running"].include? @summary)
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
# Returns the html report file created by KAYA
|
|
228
|
+
# @param [String] html report file name
|
|
229
|
+
# @return [String] html code read from report
|
|
230
|
+
def read_report
|
|
231
|
+
begin
|
|
232
|
+
content = ''
|
|
233
|
+
open_report_file.each_line do |line|
|
|
234
|
+
content+= line
|
|
235
|
+
end
|
|
236
|
+
rescue; end
|
|
237
|
+
content
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
def open_report_file
|
|
241
|
+
begin
|
|
242
|
+
FileUtils.cp("#{Dir.pwd}/kaya/temp/#{kaya_report_file_name}", "#{Dir.pwd}/kaya/temp/#{kaya_report_file_name}~")
|
|
243
|
+
file_content = File.open "#{Dir.pwd}/kaya/temp/#{kaya_report_file_name}~", "r"
|
|
244
|
+
|
|
245
|
+
File.delete("#{Dir.pwd}/kaya/temp/#{kaya_report_file_name}~")
|
|
246
|
+
|
|
247
|
+
rescue
|
|
248
|
+
false
|
|
249
|
+
end
|
|
250
|
+
file_content
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
def running!
|
|
254
|
+
@status = "running"
|
|
255
|
+
$K_LOG.debug "[#{@id}] Setted as running" if $K_LOG
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
def running?
|
|
259
|
+
@status == "running"
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
# tries to get status
|
|
263
|
+
def get_status!
|
|
264
|
+
|
|
265
|
+
value = Kaya::View::Parser.get_status(read_report) if is_there_a_report_file?
|
|
266
|
+
|
|
267
|
+
@status = @show_as = value if value
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
def append_result_to_console_output!
|
|
271
|
+
if is_there_console_output_file?
|
|
272
|
+
begin
|
|
273
|
+
output = []
|
|
274
|
+
open_console_output_file.each_line do |line|
|
|
275
|
+
output << line
|
|
276
|
+
end
|
|
277
|
+
text = output.join "\n"
|
|
278
|
+
if (text.size > @console_output.size )
|
|
279
|
+
save_console_output(text)
|
|
280
|
+
@last_check_time = now_in_seconds
|
|
281
|
+
end
|
|
282
|
+
true
|
|
283
|
+
rescue
|
|
284
|
+
false
|
|
285
|
+
end
|
|
286
|
+
end
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
def is_there_console_output_file?
|
|
291
|
+
begin
|
|
292
|
+
open_console_output_file and true
|
|
293
|
+
rescue
|
|
294
|
+
false
|
|
295
|
+
end
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
def open_console_output_file
|
|
299
|
+
begin
|
|
300
|
+
FileUtils.cp("#{Dir.pwd}/kaya/temp/#{console_output_file_name}", "#{Dir.pwd}/kaya/temp/#{console_output_file_name}~")
|
|
301
|
+
file_content = File.open "#{Dir.pwd}/kaya/temp/#{console_output_file_name}~", "r"
|
|
302
|
+
File.delete("#{Dir.pwd}/kaya/temp/#{console_output_file_name}~")
|
|
303
|
+
rescue Errno::ENOENT
|
|
304
|
+
false
|
|
305
|
+
end
|
|
306
|
+
file_content
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
# Append text to console output
|
|
310
|
+
# @param [String] text = the text to be appended
|
|
311
|
+
def append_to_console_output text
|
|
312
|
+
@console_output += text
|
|
313
|
+
self.save!
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
def save_to_bundle_output text
|
|
317
|
+
@bundle_output = text
|
|
318
|
+
self.save!
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
# Save console output text
|
|
323
|
+
# @param [String] text = the text to be appended
|
|
324
|
+
def save_console_output text
|
|
325
|
+
@console_output = text
|
|
326
|
+
self.save!
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
def finished!
|
|
330
|
+
@finished_at= now_in_seconds
|
|
331
|
+
@status = "finished"
|
|
332
|
+
save_report!
|
|
333
|
+
get_summary!
|
|
334
|
+
@summary = @status if @summary == "running"
|
|
335
|
+
$K_LOG.debug "[#{@id}] Executuion finished" if $K_LOG
|
|
336
|
+
self.save!
|
|
337
|
+
begin
|
|
338
|
+
$NOTIF.execution_finished self
|
|
339
|
+
rescue => e
|
|
340
|
+
$K_LOG.error "Error at notifying #{e}"
|
|
341
|
+
end
|
|
342
|
+
@summary
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
def finished_by_timeout!
|
|
346
|
+
reason = "Inactivity Timeout reached"
|
|
347
|
+
reset!(reason)
|
|
348
|
+
@timeout = "#{Kaya::Support::Configuration.execution_time_to_live}"
|
|
349
|
+
# @summary = @status if @summary == "running"
|
|
350
|
+
$K_LOG.debug "[#{@id}] Finished by timeout (#{Kaya::Support::Configuration.execution_time_to_live} sec)" if $K_LOG
|
|
351
|
+
begin
|
|
352
|
+
$NOTIF.execution_stopped self, "#{reason} - (@timeout) sec"
|
|
353
|
+
rescue => e
|
|
354
|
+
$K_LOG.error "Error at notifying #{e}"
|
|
355
|
+
end
|
|
356
|
+
self.save!
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
def started?
|
|
360
|
+
@status == "started"
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
def finished?
|
|
364
|
+
@status =~ /(finished|stopped)/i
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
def process_finished?
|
|
368
|
+
! process_running?
|
|
369
|
+
end
|
|
370
|
+
|
|
371
|
+
def process_running?
|
|
372
|
+
Kaya::Support::Processes.process_running? pid
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
def is_finished?; self.finished?; end
|
|
376
|
+
|
|
377
|
+
def report_says_finished?
|
|
378
|
+
Kaya::View::Parser.finished_statement? @html_report
|
|
379
|
+
end
|
|
380
|
+
|
|
381
|
+
def stopped?
|
|
382
|
+
@status =~ /(reset|stopped)/i
|
|
383
|
+
end
|
|
384
|
+
|
|
385
|
+
def reset! reason=nil
|
|
386
|
+
status_text = "stopped"
|
|
387
|
+
status_text += " (#{reason})" if reason
|
|
388
|
+
self.status= self.summary= status_text
|
|
389
|
+
self.finished_at = now_in_seconds
|
|
390
|
+
$K_LOG.debug "[#{@id}] Execution stoppped (reset)" if $K_LOG
|
|
391
|
+
self.save!
|
|
392
|
+
end
|
|
393
|
+
|
|
394
|
+
def has_summary?
|
|
395
|
+
report_has_summary?
|
|
396
|
+
end
|
|
397
|
+
|
|
398
|
+
def report_has_summary?
|
|
399
|
+
@summary.include? "scenario"
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
def has_scenario_executed?
|
|
403
|
+
Kaya::View::Parser.has_scenarios_executed? @html_report
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
def mark_as_saw!
|
|
407
|
+
@saw = true
|
|
408
|
+
$K_LOG.debug "[#{@id}] Marked as saw" if $K_LOG
|
|
409
|
+
self.save!
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
def delete_console_output_file!
|
|
413
|
+
begin
|
|
414
|
+
File.delete("#{Dir.pwd}/kaya/temp/#{console_output_file_name}")
|
|
415
|
+
$K_LOG.debug "[#{@id}] Console output files deleted" if $K_LOG
|
|
416
|
+
true
|
|
417
|
+
rescue => e
|
|
418
|
+
false
|
|
419
|
+
end
|
|
420
|
+
end
|
|
421
|
+
|
|
422
|
+
def delete_kaya_report_file!
|
|
423
|
+
begin
|
|
424
|
+
File.delete("#{Dir.pwd}/kaya/temp/#{kaya_report_file_name}")
|
|
425
|
+
$K_LOG.debug "[#{@id}] Report files deleted" if $K_LOG
|
|
426
|
+
true
|
|
427
|
+
rescue => e
|
|
428
|
+
false
|
|
429
|
+
end
|
|
430
|
+
end
|
|
431
|
+
|
|
432
|
+
def delete_copy_kaya_report_file!
|
|
433
|
+
begin
|
|
434
|
+
File.delete("#{Dir.pwd}/kaya/temp/#{kaya_report_file_name}~")
|
|
435
|
+
true
|
|
436
|
+
rescue => e
|
|
437
|
+
false
|
|
438
|
+
end
|
|
439
|
+
end
|
|
440
|
+
|
|
441
|
+
def delete_asociated_files!
|
|
442
|
+
delete_console_output_file!
|
|
443
|
+
delete_kaya_report_file!
|
|
444
|
+
delete_copy_kaya_report_file!
|
|
445
|
+
end
|
|
446
|
+
|
|
447
|
+
# Returns the seconds that there is no console output changes only if it is not finished, else returns 0
|
|
448
|
+
# This is aimed to help to detect if execution is freezed (or may have a debugger statement)
|
|
449
|
+
def seconds_without_changes
|
|
450
|
+
(self.finished? or self.stopped?) ? 0 : (now_in_seconds - @last_check_time)
|
|
451
|
+
end
|
|
452
|
+
|
|
453
|
+
def elapsed_time
|
|
454
|
+
(finished_at || now_in_seconds) - started_at
|
|
455
|
+
end
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
|
|
459
|
+
# Returns actal timestamp
|
|
460
|
+
# @return [Time]
|
|
461
|
+
def now
|
|
462
|
+
Time.now.localtime
|
|
463
|
+
end
|
|
464
|
+
|
|
465
|
+
# Returns the started at time attribute in a format way (configured on kaya info)
|
|
466
|
+
# @return [String]
|
|
467
|
+
def started_at_formatted
|
|
468
|
+
Kaya::Support::TimeHelper.formatted_time_for @started_at
|
|
469
|
+
end
|
|
470
|
+
|
|
471
|
+
# Returns the finished at time attribute in a format way (configured on kaya info)
|
|
472
|
+
# @return [String]
|
|
473
|
+
def finished_at_formatted
|
|
474
|
+
Kaya::Support::TimeHelper.formatted_time_for @finished_at
|
|
475
|
+
end
|
|
476
|
+
|
|
477
|
+
# Returns the timestamp in seconds
|
|
478
|
+
# @param [Fixnum] timestamp
|
|
479
|
+
def now_in_seconds
|
|
480
|
+
now.to_i
|
|
481
|
+
end
|
|
482
|
+
|
|
483
|
+
# Persists the status of the object on mongo.
|
|
484
|
+
# If result exist update it, else creates it
|
|
485
|
+
# @return [Boolean] operation result
|
|
486
|
+
def save!
|
|
487
|
+
Kaya::Database::MongoConnector.result_data_for_id(id) ? Kaya::Database::MongoConnector.update_result(result_data_structure) : Kaya::Database::MongoConnector.insert_result(result_data_structure)
|
|
488
|
+
$K_LOG.debug "[#{@id}] Result saved" if $K_LOG
|
|
489
|
+
end
|
|
490
|
+
|
|
491
|
+
end
|
|
492
|
+
end
|
|
493
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
module Kaya
|
|
2
|
+
module Results
|
|
3
|
+
|
|
4
|
+
def self.all_results_for suite_id
|
|
5
|
+
Kaya::Database::MongoConnector.results_for suite_id
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def self.results_ids_for suite_id
|
|
9
|
+
all_results_for(suite_id).map do |result|
|
|
10
|
+
result["_id"]
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.all_results_ids
|
|
15
|
+
Kaya::Database::MongoConnector.all_results_ids
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def self.find_for key
|
|
19
|
+
Kaya::Database::MongoConnector.find_results_for_key key
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def self.find_for_status status
|
|
23
|
+
Kaya::Database::MongoConnector.find_results_for_status status
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def self.all_results
|
|
27
|
+
Kaya::Database::MongoConnector.all_results
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def self.find_all_for_key key
|
|
31
|
+
Kaya::Database::MongoConnector.find_results_for_key key
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Resets all results with running status
|
|
35
|
+
def self.reset_defuncts
|
|
36
|
+
Kaya::Database::MongoConnector.all_results.select do |result|
|
|
37
|
+
["started","running"].include? result["status"]
|
|
38
|
+
end.each do |result|
|
|
39
|
+
Kaya::Support::Processes.kill_by_result_id(result["_id"])
|
|
40
|
+
end.each do |result|
|
|
41
|
+
result = Kaya::Results::Result.get(result["_id"])
|
|
42
|
+
result.reset!
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
module Kaya
|
|
2
|
+
module Suites
|
|
3
|
+
module Custom
|
|
4
|
+
class Params
|
|
5
|
+
|
|
6
|
+
attr_reader :params
|
|
7
|
+
|
|
8
|
+
# This class provides methods related to custom params
|
|
9
|
+
# This is useful to ask about each params and its attributes
|
|
10
|
+
|
|
11
|
+
# It receives plain string with the definitions of each custom param
|
|
12
|
+
# @param [String] custom secion:
|
|
13
|
+
# a_text_field_param, required_text_param:*, with_a_default_value:foobar, required_and_with_default:foobar:* , a_select_list:[value1|value2|value3]
|
|
14
|
+
#
|
|
15
|
+
# Text fields examples
|
|
16
|
+
#
|
|
17
|
+
# 'a_text_field_param' -> will be interpreted as a text field accepting any value
|
|
18
|
+
# 'required_text_param:*' -> will be interpreted as a text field with a required value (* indicates required field)
|
|
19
|
+
# 'with_a_default_value:foobar' -> will be interpreted as a text field with a default value
|
|
20
|
+
# 'required_and_with_default:foobar:*' -> will be interpreted as a text field with a default value and as a required field
|
|
21
|
+
#
|
|
22
|
+
# Select list examples
|
|
23
|
+
# 'a_select_list:(value1|value2|value3)' -> will be interpreted as a select list with listed values. First is used as default value
|
|
24
|
+
# 'none_default_select_list:(none|value1|value2|value3)' -> will be interpreted as a select list with listed values. First is used as default value and none indicates as empty value
|
|
25
|
+
#
|
|
26
|
+
|
|
27
|
+
def initialize custom_params_definition
|
|
28
|
+
if custom_params_definition
|
|
29
|
+
plain_params = custom_params_definition.gsub(/\s+,/,",").gsub(/\,\s+/,",").split(",")
|
|
30
|
+
@params = plain_params.map do |param|
|
|
31
|
+
send(type_of(param), param)
|
|
32
|
+
end
|
|
33
|
+
else
|
|
34
|
+
@params = {}
|
|
35
|
+
end
|
|
36
|
+
@params
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# Returns the type of the parameter according to its structure
|
|
41
|
+
def type_of entire_param
|
|
42
|
+
parts = entire_param.split(":")
|
|
43
|
+
|
|
44
|
+
if parts.last =~ /^\(.*\)$/ # It is a select list
|
|
45
|
+
|
|
46
|
+
"select_list"
|
|
47
|
+
|
|
48
|
+
else # It is a text field
|
|
49
|
+
|
|
50
|
+
case parts.size
|
|
51
|
+
|
|
52
|
+
when 1
|
|
53
|
+
"single_text_field"
|
|
54
|
+
|
|
55
|
+
when 2
|
|
56
|
+
return "required_text_field" if parts.last == "*"
|
|
57
|
+
"default_text_field"
|
|
58
|
+
|
|
59
|
+
when 3
|
|
60
|
+
if parts.last == "*"
|
|
61
|
+
"required_default_text_field"
|
|
62
|
+
else
|
|
63
|
+
raise "Malformed custom param"
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Returns the structure of a select list element
|
|
71
|
+
# @param [String] the plain structure of a custom param
|
|
72
|
+
# @return [Hash] a hash with the required structure
|
|
73
|
+
def select_list param
|
|
74
|
+
plus = Hash.new
|
|
75
|
+
name, values = param.split(":")
|
|
76
|
+
values.gsub!(/\(|\)/, "")
|
|
77
|
+
values = values.split("|").map do |val|
|
|
78
|
+
if val.include? "*"
|
|
79
|
+
h = val.split("*")
|
|
80
|
+
plus[h[0]] = h[1]
|
|
81
|
+
val = h[0]
|
|
82
|
+
end
|
|
83
|
+
val
|
|
84
|
+
end
|
|
85
|
+
{
|
|
86
|
+
"name" => name,
|
|
87
|
+
"type" => "select_list",
|
|
88
|
+
"options" => values,
|
|
89
|
+
"plus_options" => plus,
|
|
90
|
+
"required" => nil,
|
|
91
|
+
"value" => nil
|
|
92
|
+
}
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Returns the structure of a single text field
|
|
96
|
+
# @param [String] the plain structure of a custom param
|
|
97
|
+
# @return [Hash] a hash with the required structure
|
|
98
|
+
def single_text_field param
|
|
99
|
+
{
|
|
100
|
+
"name" => param.split.first,
|
|
101
|
+
"type" => "text",
|
|
102
|
+
"options" => nil,
|
|
103
|
+
"required" => nil,
|
|
104
|
+
"value" => nil
|
|
105
|
+
}
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Returns the structure of a required text field
|
|
109
|
+
# @param [String] the plain structure of a custom param
|
|
110
|
+
# @return [Hash] a hash with the required structure
|
|
111
|
+
def required_text_field param
|
|
112
|
+
{
|
|
113
|
+
"name" => param.split(":").first,
|
|
114
|
+
"type" => "text",
|
|
115
|
+
"options" => nil,
|
|
116
|
+
"required" => true,
|
|
117
|
+
"value" => nil
|
|
118
|
+
}
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# Returns the structure of a text field with a default value
|
|
122
|
+
# @param [String] the plain structure of a custom param
|
|
123
|
+
# @return [Hash] a hash with the required structure
|
|
124
|
+
def default_text_field param
|
|
125
|
+
name, value = param.split ":"
|
|
126
|
+
{
|
|
127
|
+
"name" => name,
|
|
128
|
+
"type" => "text",
|
|
129
|
+
"options" => value,
|
|
130
|
+
"required" => false,
|
|
131
|
+
"value" => nil
|
|
132
|
+
}
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# Returns the structure of a text field with a default value and required
|
|
136
|
+
# @param [String] the plain structure of a custom param
|
|
137
|
+
# @return [Hash] a hash with the required structure
|
|
138
|
+
def required_default_text_field param
|
|
139
|
+
name, value= param.split(":")
|
|
140
|
+
{
|
|
141
|
+
"name" => name,
|
|
142
|
+
"type" => "text",
|
|
143
|
+
"options" => value,
|
|
144
|
+
"required" => true,
|
|
145
|
+
"value" => nil
|
|
146
|
+
}
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|