liri 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -15,29 +15,32 @@ module Liri
15
15
  def run(source_code_folder_path, stop = false)
16
16
  return unless valid_project
17
17
 
18
- setup_manager = Liri.set_setup(source_code_folder_path)
18
+ setup_manager = Liri.set_setup(source_code_folder_path, :manager, manager_tests_results_folder_time: DateTime.now.strftime("%d_%m_%y_%H_%M_%S"))
19
19
  manager_folder_path = setup_manager.manager_folder_path
20
+ manager_tests_results_folder_path = setup_manager.manager_tests_results_folder_path
20
21
 
21
22
  Liri.set_logger(setup_manager.logs_folder_path, 'liri-manager.log')
22
- Liri.logger.info("Proceso Manager iniciado")
23
- Liri.logger.info("Presione Ctrl + c para terminar el proceso Manager manualmente\n", true)
23
+ Liri.logger.info('Manager process started')
24
+ Liri.logger.info("Press Ctrl + c to finish Manager process manually\n", true)
24
25
 
25
26
  user, password = get_credentials(setup_manager.setup_folder_path)
26
27
  source_code = compress_source_code(source_code_folder_path, manager_folder_path)
27
- manager_data = get_manager_data(user, password, manager_folder_path, source_code)
28
+ manager_data = get_manager_data(user, password, manager_tests_results_folder_path, source_code)
28
29
  all_tests = get_all_tests(source_code)
29
- tests_result = Common::TestsResult.new(manager_folder_path)
30
+ tests_result = Common::TestsResult.new(manager_tests_results_folder_path)
30
31
 
31
- manager = Manager.new(Liri.udp_port, Liri.tcp_port, all_tests, tests_result, manager_folder_path)
32
+ manager = Manager.new(Liri.udp_port, Liri.tcp_port, all_tests, tests_result)
32
33
 
33
34
  threads = []
34
35
  threads << manager.start_client_socket_to_search_agents(manager_data) # Enviar peticiones broadcast a toda la red para encontrar Agents
35
36
  manager.start_server_socket_to_process_tests(threads[0]) unless stop # Esperar y enviar los test unitarios a los Agents
36
37
 
38
+ source_code.delete_compressed_file
39
+
37
40
  Liri.init_exit(stop, threads, 'Manager')
38
- Liri.logger.info("Proceso Manager terminado")
41
+ Liri.logger.info('Manager process finished')
39
42
  rescue SignalException => e
40
- Liri.logger.info("Exception(#{e}) Proceso Manager terminado manualmente")
43
+ Liri.logger.info("Exception(#{e}) Proceso Manager process finished manually")
41
44
  Liri.kill(threads)
42
45
  end
43
46
 
@@ -50,9 +53,9 @@ module Liri
50
53
  if File.exist?(File.join(Dir.pwd, 'Gemfile'))
51
54
  true
52
55
  else
53
- Liri.logger.info("No se encuentra un archivo Gemfile por lo que se asume que el directorio actual no corresponde a un proyecto Ruby")
54
- Liri.logger.info("Liri sólo puede ejecutarse en proyectos Ruby")
55
- Liri.logger.info("Proceso Manager terminado")
56
+ Liri.logger.info('Not found Gemfile. Assuming run Manager in not Ruby project')
57
+ Liri.logger.info('Liri can be run only in Ruby projects')
58
+ Liri.logger.info('Manager process finished')
56
59
  false
57
60
  end
58
61
  end
@@ -65,7 +68,7 @@ module Liri
65
68
  def compress_source_code(source_code_folder_path, manager_folder_path)
66
69
  source_code = Common::SourceCode.new(source_code_folder_path, manager_folder_path, Liri.compression_class, Liri.unit_test_class)
67
70
 
68
- Common::Progressbar.start(total: nil, length: 100, format: 'Comprimiendo Código Fuente |%B| %a') do
71
+ Common::Progressbar.start(total: nil, length: 100, format: 'Compressing source code |%B| %a') do
69
72
  source_code.compress_folder
70
73
  end
71
74
  puts "\n\n"
@@ -73,9 +76,9 @@ module Liri
73
76
  source_code
74
77
  end
75
78
 
76
- def get_manager_data(user, password, manager_folder_path, source_code)
79
+ def get_manager_data(user, password, tests_results_folder_path, source_code)
77
80
  Common::ManagerData.new(
78
- folder_path: manager_folder_path,
81
+ tests_results_folder_path: tests_results_folder_path,
79
82
  compressed_file_path: source_code.compressed_file_path,
80
83
  user: user,
81
84
  password: password
@@ -85,7 +88,7 @@ module Liri
85
88
  def get_all_tests(source_code)
86
89
  all_tests = {}
87
90
 
88
- Common::Progressbar.start(total: nil, length: 100, format: 'Extrayendo Pruebas Unitarias |%B| %a') do
91
+ Common::Progressbar.start(total: nil, length: 100, format: 'Getting unit tests |%B| %a') do
89
92
  all_tests = source_code.all_tests
90
93
  end
91
94
  puts "\n\n"
@@ -94,7 +97,7 @@ module Liri
94
97
  end
95
98
  end
96
99
 
97
- def initialize(udp_port, tcp_port, all_tests, tests_result, manager_folder_path)
100
+ def initialize(udp_port, tcp_port, all_tests, tests_result)
98
101
  @udp_port = udp_port
99
102
  @udp_socket = UDPSocket.new
100
103
  @tcp_port = tcp_port
@@ -102,7 +105,7 @@ module Liri
102
105
  @all_tests = all_tests
103
106
  @all_tests_count = all_tests.size
104
107
  @all_tests_results = {}
105
- @all_tests_results_count = 0
108
+ @files_processed = 0
106
109
  @all_tests_processing_count = 0
107
110
  @agents = {}
108
111
 
@@ -110,13 +113,11 @@ module Liri
110
113
  @test_processing_enabled = true
111
114
 
112
115
  @tests_batch_number = 0
113
- @tests_batches = {}
116
+ @processed_tests_batches = {}
114
117
 
115
118
  @tests_result = tests_result
116
119
  @semaphore = Mutex.new
117
120
 
118
- @manager_folder_path = manager_folder_path
119
-
120
121
  @progressbar = ProgressBar.create(starting_at: 0, total: @all_tests_count, length: 100, format: 'Progress %c/%C |%b=%i| %p%% | %a')
121
122
  end
122
123
 
@@ -125,10 +126,8 @@ module Liri
125
126
  # El cliente udp se ejecuta en bucle dentro de un hilo, esto permite realizar otras tareas mientras este hilo sigue sondeando
126
127
  # la red para obtener mas Agents. Una vez que los tests terminan de ejecutarse, este hilo será finalizado.
127
128
  Thread.new do
128
- Liri.logger.info("Buscando Agentes... Espere")
129
- Liri.logger.info("Se emite un broadcast cada #{Liri.udp_request_delay} segundos en el puerto UDP: #{@udp_port}
130
- (Se mantiene escaneando la red para encontrar Agents)
131
- ")
129
+ Liri.logger.info('Searching agents... Wait')
130
+ Liri.logger.info("Sending UDP broadcast each #{Liri.udp_request_delay} seconds in UDP port: #{@udp_port}")
132
131
  while agents_search_processing_enabled
133
132
  @udp_socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, true)
134
133
  @udp_socket.send(manager_data.to_h.to_json, 0, '<broadcast>', @udp_port)
@@ -142,88 +141,94 @@ module Liri
142
141
  begin
143
142
  tcp_socket = TCPServer.new(@tcp_port) # se hace un bind al puerto dado
144
143
  rescue Errno::EADDRINUSE => e
145
- Liri.logger.error("Exception(#{e}) Puerto TCP #{@tcp_port} ocupado.")
144
+ Liri.logger.error("Exception(#{e}) Busy UDP port #{@tcp_port}.")
146
145
  Thread.kill(search_agents_thread)
147
- Thread.exit
146
+ return
148
147
  end
149
148
 
150
- Liri.logger.info("En espera para establecer conexión con los Agents en el puerto TCP: #{@tcp_port}
151
- (Se espera que algún Agent se conecte para ejecutar las pruebas como respuesta al broadcast UDP)
152
- ")
149
+ Liri.logger.info("Waiting Agents connection in TCP port: #{@tcp_port}")
153
150
  # El siguiente bucle permite que varios clientes es decir Agents se conecten
154
151
  # De: http://www.w3big.com/es/ruby/ruby-socket-programming.html
155
152
  while test_processing_enabled
156
153
  Thread.start(tcp_socket.accept) do |client|
157
154
  agent_ip_address = client.remote_address.ip_address
158
- response = client.recvfrom(1000).first
159
-
160
- Liri.logger.info("\nConexión iniciada con el Agente: #{agent_ip_address}")
161
- Liri.logger.info("Respuesta al broadcast recibida del Agent: #{agent_ip_address} en el puerto TCP: #{@tcp_port}: #{response}")
162
-
163
- # Se le indica al agente que proceda
164
- client.puts({ msg: 'Recibido', exist_tests: all_tests.any? }.to_json)
165
-
166
- if all_tests.empty?
167
- # No importa lo que le haga, el broadcast udp no se muere al instante y el agente sigue respondiendo
168
- # Las siguientes dos lineas son para que se deje de hacer el broadcast pero aun asi se llegan a hacer
169
- # 3 a 4 broadcast antes de que se finalize el proceso, al parecer el broadcast va a tener que quedar asi
170
- # y mejorar el codigo para que se envien test pendientes para eso hay que llevar una lista de test pendientes
171
- # tests enviados sin resultados, tests finalizados, si se recibe respuesta al broadcast se trata de enviar primero test pendientes
172
- # luego test enviados sin resultados o sino ignorar
173
- Thread.kill(search_agents_thread)
174
- agents_search_processing_enabled = false
175
- Liri.logger.info("Se termina cualquier proceso pendiente con el Agent #{agent_ip_address} en el puerto TCP: #{@tcp_port}: #{response}")
176
- client.close
177
- Thread.exit
178
- end
155
+ hardware_model = nil
156
+ run_tests_batch_time_start = nil
179
157
 
180
- while all_tests.any?
181
- time_in_seconds = Liri::Common::Benchmarking.start(start_msg: "Proceso de Ejecución de pruebas. Agent: #{agent_ip_address}. Espere... ", end_msg: "Proceso de Ejecución de pruebas. Agent: #{agent_ip_address}. Duración: ", stdout: false) do
182
- tests_batch = tests_batch(agent_ip_address)
183
- break unless tests_batch
158
+ while line = client.gets
159
+ client_data = JSON.parse(line.chop)
160
+ msg = client_data['msg']
184
161
 
185
- begin
186
- Liri.logger.debug("Conjunto de pruebas enviadas al Agent #{agent_ip_address}: #{tests_batch}")
162
+ if msg == 'get_source_code'
163
+ if registered_agent?(agent_ip_address)
164
+ client.puts({ msg: 'already_connected' }.to_json)
165
+ client.close
166
+ break
167
+ else
168
+ register_agent(agent_ip_address)
169
+ hardware_model = client_data['hardware_model']
170
+ msg = all_tests.any? ? 'proceed_get_source_code' : 'no_exist_tests'
171
+ client.puts({ msg: msg }.to_json)
172
+ end
173
+ end
187
174
 
188
- client.puts(tests_batch.to_json) # Se envia el lote de tests
189
- response = client.recvfrom(1000).first # Se recibe la respuesta. Cuando mas alto es el parámetro de recvfrom, mas datos se reciben osino se truncan.
190
- rescue Errno::EPIPE => e
191
- # Esto al parecer se da cuando el Agent ya cerró las conexiones y el Manager intenta contactar
192
- Liri.logger.error("Exception(#{e}) El Agent #{agent_ip_address} ya terminó la conexión")
193
- # Si el Agente ya no responde es mejor romper el bucle para que no quede colgado
175
+ if msg == 'get_source_code_fail'
176
+ client.puts({ msg: 'finish_agent' }.to_json)
177
+ client.close
178
+ break
179
+ end
180
+
181
+ if msg == 'get_tests_files'
182
+ Liri.logger.info("Running unit tests. Agent: #{agent_ip_address}. Wait... ", false)
183
+ run_tests_batch_time_start = Time.now
184
+
185
+ tests_batch = tests_batch(agent_ip_address)
186
+ if tests_batch.empty?
187
+ client.puts({ msg: 'no_exist_tests' }.to_json)
188
+ client.close
194
189
  break
190
+ else
191
+ client.puts(tests_batch.to_json) # Se envia el lote de tests
195
192
  end
196
193
  end
197
194
 
198
- # Se captura por si acaso los errores de parseo JSON
199
- begin
200
- tests_result = JSON.parse(response)
201
- Liri.logger.debug("Respuesta del Agent #{agent_ip_address}: #{tests_result}")
202
- process_tests_result(agent_ip_address, tests_result, time_in_seconds)
203
- rescue JSON::ParserError => e
204
- Liri.logger.error("Exception(#{e}) Error de parseo JSON")
195
+ if msg == 'processed_tests'
196
+ tests_result = client_data
197
+ Liri.logger.debug("Agent response #{agent_ip_address}: #{tests_result}")
198
+ batch_run = Time.now - run_tests_batch_time_start
199
+ process_tests_result(agent_ip_address, hardware_model, tests_result, batch_run)
200
+
201
+ run_tests_batch_time_start = Time.now
202
+
203
+ tests_batch = tests_batch(agent_ip_address)
204
+ if tests_batch.empty?
205
+ client.puts({ msg: 'no_exist_tests' }.to_json)
206
+ client.close
207
+ break
208
+ else
209
+ client.puts(tests_batch.to_json) # Se envia el lote de tests
210
+ end
205
211
  end
206
212
  end
207
213
 
208
214
  update_processing_statuses
209
- Liri.logger.info("Se termina la conexión con el Agent #{agent_ip_address} en el puerto TCP: #{@tcp_port}")
210
- begin
211
- client.puts('exit') # Se envía el string exit para que el Agent sepa que el proceso terminó
212
- client.close # se desconecta el cliente
213
- rescue Errno::EPIPE => e
214
- # Esto al parecer se da cuando el Agent ya cerró las conexiones y el Manager intenta contactar
215
- Liri.logger.error("Exception(#{e}) El Agent #{agent_ip_address} ya terminó la conexión")
216
- # Si el Agente ya no responde es mejor terminar el hilo. Aunque igual quedará colgado el Manager
217
- # mientras sigan pruebas pendientes
218
- Thread.exit
219
- end
215
+ Thread.kill(search_agents_thread)
216
+ unregister_agent(agent_ip_address)
217
+ rescue Errno::EPIPE => e
218
+ # Esto al parecer se da cuando el Agent ya cerró las conexiones y el Manager intenta contactar
219
+ Liri.logger.error("Exception(#{e}) Agent #{agent_ip_address} already finished connection")
220
+ # Si el Agente ya no responde es mejor terminar el hilo. Aunque igual quedará colgado el Manager
221
+ # mientras sigan pruebas pendientes
222
+ unregister_agent(agent_ip_address)
223
+ Thread.exit
220
224
  end
221
225
  end
222
226
 
223
- Liri.clean_folder_content(@manager_folder_path)
224
227
  @tests_result.print_summary
225
228
  print_agents_summary
226
- @tests_result.print_failures if Liri.print_failures
229
+ print_agents_detailed_summary if Liri.print_agents_detailed_summary
230
+ @tests_result.print_failures_list if Liri.print_failures_list
231
+ @tests_result.print_failed_examples if Liri.print_failed_examples
227
232
  end
228
233
 
229
234
  def all_tests
@@ -252,7 +257,7 @@ module Liri
252
257
 
253
258
  def update_processing_statuses
254
259
  @semaphore.synchronize do
255
- @test_processing_enabled = false if @all_tests_count == @all_tests_results_count
260
+ @test_processing_enabled = false if @all_tests_count == @files_processed
256
261
  @agents_search_processing_enabled = false if @all_tests_count == @all_tests_processing_count
257
262
  end
258
263
  end
@@ -260,61 +265,120 @@ module Liri
260
265
  def tests_batch(agent_ip_address)
261
266
  # Se inicia un semáforo para evitar que varios hilos actualicen variables compartidas
262
267
  @semaphore.synchronize do
263
- return nil if @all_tests.empty?
268
+ return {} if @all_tests.empty?
264
269
 
265
270
  @tests_batch_number += 1 # Se numera cada lote
266
271
  samples = @all_tests.sample!(Manager.test_files_by_runner) # Se obtiene algunos tests
267
272
  samples_keys = samples.keys # Se obtiene la clave asignada a los tests
268
273
  @all_tests_processing_count += samples_keys.size
269
274
 
270
- @agents[agent_ip_address] = { agent_ip_address: agent_ip_address, tests_processed_count: 0, examples: 0, failures: 0, time_in_seconds: 0, duration: '' } unless @agents[agent_ip_address]
271
-
272
- #@tests_batches[@tests_batch_number] = { agent_ip_address: agent_ip_address, tests_batch_keys: samples_keys } # Se guarda el lote a enviar
273
- tests_batch = { tests_batch_number: @tests_batch_number, tests_batch_keys: samples_keys } # Se construye el lote a enviar
275
+ tests_batch = { msg: 'process_tests', tests_batch_number: @tests_batch_number, tests_batch_keys: samples_keys } # Se construye el lote a enviar
276
+ Liri.logger.debug("Tests batches sent to Agent #{agent_ip_address}: #{tests_batch}")
274
277
  tests_batch
275
278
  end
276
279
  end
277
280
 
278
- def process_tests_result(agent_ip_address, tests_result, time_in_seconds)
281
+ def process_tests_result(agent_ip_address, hardware_model, tests_result, batch_run)
279
282
  # Se inicia un semáforo para evitar que varios hilos actualicen variables compartidas
280
283
  @semaphore.synchronize do
281
284
  tests_batch_number = tests_result['tests_batch_number']
282
285
  tests_result_file_name = tests_result['tests_result_file_name']
283
- tests_batch_keys_size = tests_result['tests_batch_keys_size']
284
-
285
- #tests_batch_keys = @tests_batches[tests_batch_number][:tests_batch_keys]
286
- tests_processed_count = tests_batch_keys_size
287
- @all_tests_results_count += tests_processed_count
286
+ files_processed = tests_result['tests_batch_keys_size']
288
287
 
289
- @progressbar.progress = @all_tests_results_count
288
+ @files_processed += files_processed
290
289
 
291
- #@tests_batches[tests_batch_number][:tests_result_file_name] = tests_result_file_name
290
+ @progressbar.progress = @files_processed
292
291
 
293
- tests_result = @tests_result.process(tests_result_file_name)
292
+ tests_result = @tests_result.process(tests_result_file_name, files_processed)
294
293
 
295
- @agents[agent_ip_address][:tests_processed_count] += tests_processed_count
296
- @agents[agent_ip_address][:examples] += tests_result[:example_quantity]
297
- @agents[agent_ip_address][:failures] += tests_result[:failure_quantity]
298
- @agents[agent_ip_address][:time_in_seconds] += time_in_seconds
299
- @agents[agent_ip_address][:duration] = @agents[agent_ip_address][:time_in_seconds].to_duration
294
+ @processed_tests_batches[tests_batch_number] = tests_result.clone
295
+ @processed_tests_batches[tests_batch_number][:batch_run] = batch_run
296
+ @processed_tests_batches[tests_batch_number][:agent_ip_address] = agent_ip_address
297
+ @processed_tests_batches[tests_batch_number][:hardware_model] = hardware_model
298
+ @processed_tests_batches[tests_batch_number][:tests_batch_number] = tests_batch_number
300
299
 
301
- Liri.logger.info("Pruebas procesadas por Agente: #{agent_ip_address}: #{@agents[agent_ip_address][:tests_processed_count]}")
300
+ Liri.logger.info("Processed unit tests by Agent: #{agent_ip_address}: #{files_processed}")
302
301
  end
303
302
  end
304
303
 
305
304
  def print_agents_summary
306
- rows = @agents.values.map { |line| line.values }
307
- headings = @agents.values.first.keys
305
+ processed_tests_batches_by_agent = processed_tests_batches_by_agents
306
+ rows = processed_tests_batches_by_agent.values.map do |value|
307
+ value[:finish_in] = value[:finish_in].to_duration
308
+ value[:files_load] = value[:files_load].to_duration
309
+ value[:batch_run] = value[:batch_run].to_duration
310
+ value.values
311
+ end
308
312
 
309
- table = Terminal::Table.new title: "Resúmen", headings: headings, rows: rows
310
- table.style = {padding_left: 3, border_x: "=", border_i: "x" }
311
- table.align_column(1, :right)
312
- table.align_column(2, :right)
313
- table.align_column(3, :right)
314
- table.align_column(4, :right)
315
- table.align_column(5, :right)
313
+ rows << Array.new(9) # Se agrega una linea vacia antes de mostrar los totales
314
+ rows << get_footer_values
315
+ header = processed_tests_batches_by_agent.values.first.keys
316
316
 
317
+ table = Terminal::Table.new title: 'Summary', headings: header, rows: rows
318
+ table.style = { padding_left: 3, border_x: '=', border_i: 'x'}
317
319
  puts table
318
320
  end
321
+
322
+ def processed_tests_batches_by_agents
323
+ tests_batches = {}
324
+ @processed_tests_batches.values.each do |processed_test_batch|
325
+ agent_ip_address = processed_test_batch[:agent_ip_address]
326
+ if tests_batches[agent_ip_address]
327
+ tests_batches[agent_ip_address][:examples] += processed_test_batch[:examples]
328
+ tests_batches[agent_ip_address][:failures] += processed_test_batch[:failures]
329
+ tests_batches[agent_ip_address][:pending] += processed_test_batch[:pending]
330
+ tests_batches[agent_ip_address][:passed] += processed_test_batch[:passed]
331
+ tests_batches[agent_ip_address][:finish_in] += processed_test_batch[:finish_in]
332
+ tests_batches[agent_ip_address][:files_load] += processed_test_batch[:files_load]
333
+ tests_batches[agent_ip_address][:files_processed] += processed_test_batch[:files_processed]
334
+ tests_batches[agent_ip_address][:batch_run] += processed_test_batch[:batch_run]
335
+ else
336
+ _processed_test_batch = processed_test_batch.clone # Clone to change values in other hash
337
+ _processed_test_batch.remove!(:failures_list, :failed_examples, :agent_ip_address, :tests_batch_number)
338
+ tests_batches[agent_ip_address] = _processed_test_batch
339
+ end
340
+ end
341
+ tests_batches
342
+ end
343
+
344
+ def print_agents_detailed_summary
345
+ puts "\n"
346
+ rows = @processed_tests_batches.values.map do |value|
347
+ value.remove!(:failures_list, :failed_examples, :agent_ip_address, :tests_batch_number)
348
+ value[:finish_in] = value[:finish_in].to_duration
349
+ value[:files_load] = value[:files_load].to_duration
350
+ value[:batch_run] = value[:batch_run].to_duration
351
+ value.values
352
+ end
353
+
354
+ rows << Array.new(9) # Se agrega una linea vacia antes de mostrar los totales
355
+ rows << get_footer_values
356
+ header = @processed_tests_batches.values.first.keys
357
+
358
+ table = Terminal::Table.new title: 'Detailed Summary', headings: header, rows: rows
359
+ table.style = { padding_left: 3, border_x: '=', border_i: 'x' }
360
+
361
+ puts table
362
+ end
363
+
364
+ def get_footer_values
365
+ footer = { examples: @tests_result.examples, failures: @tests_result.failures, pending: @tests_result.pending,
366
+ passed: @tests_result.passed, finish_in: "", files_load: "",
367
+ files_processed: @tests_result.files_processed, batch_run: "", hardware_model: "" }
368
+ footer.values
369
+ end
370
+
371
+ def registered_agent?(agent_ip_address)
372
+ @agents[agent_ip_address]
373
+ end
374
+
375
+ def register_agent(agent_ip_address)
376
+ @agents[agent_ip_address] = agent_ip_address
377
+ Liri.logger.info("\nStarted connection with Agent: #{agent_ip_address} in TCP port: #{@tcp_port}")
378
+ end
379
+
380
+ def unregister_agent(agent_ip_address)
381
+ @agents.remove!(agent_ip_address)
382
+ end
319
383
  end
320
384
  end
data/lib/task.rb CHANGED
@@ -5,9 +5,13 @@
5
5
  module Liri
6
6
  module Task
7
7
  class << self
8
- def tests_count(source_code_folder_path)
8
+ def tests_files(source_code_folder_path)
9
9
  source_code = Liri::Common::SourceCode.new(source_code_folder_path,'', Liri.compression_class, Liri.unit_test_class)
10
- source_code.all_tests.size
10
+ source_code.all_tests
11
+ end
12
+
13
+ def tests_count(source_code_folder_path)
14
+ tests_files(source_code_folder_path).size
11
15
  end
12
16
  end
13
17
  end
@@ -2,10 +2,16 @@
2
2
  # Configuración del Nombre del archivo de código fuente comprimido enviado a los agentes
3
3
  # Obs.: Puede que no sea útil para el usuario poder cambiar este nombre
4
4
  compressed_file_name: compressed_source_code
5
- # Configuración de la cantidad de tests a ejecutar por tandas
5
+ # Configuración de la cantidad de archivos de tests a ejecutar en cada tanda
6
6
  test_files_by_runner: 10
7
- print_failures: false
8
- udp_request_delay: 10
7
+ # Configuración para imprimir la lista detallada de tests fallidos
8
+ print_failures_list: false
9
+ # Configuración para imprimir la lista resumida de tests fallidos
10
+ print_failed_examples: false
11
+ # Configuración para imprimir un resumen detallado del proceso realizado por los agentes
12
+ print_agents_detailed_summary: false
13
+ # Configuración para definir cada cuantos segundo el Manager enviará un broadcast UDP a la red para sondear agentes
14
+ udp_request_delay: 3
9
15
  log:
10
16
  stdout:
11
17
  # Configuración que define si se muestra el log de ejecución del programa en línea de comando. Puede ser true o false.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: liri
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rodrigo Fernández
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2022-05-14 00:00:00.000000000 Z
12
+ date: 2022-05-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rubyzip
@@ -192,7 +192,9 @@ files:
192
192
  - lib/common/setup.rb
193
193
  - lib/common/source_code.rb
194
194
  - lib/common/tests_result.rb
195
+ - lib/common/text_time_parser.rb
195
196
  - lib/common/unit_test/rspec.rb
197
+ - lib/common/unit_test/rspec_result_parser.rb
196
198
  - lib/exe/agent.rb
197
199
  - lib/exe/manager.rb
198
200
  - lib/hash_extend.rb