11# frozen_string_literal: true
22
3- require 'parallel '
3+ require 'json '
44require_relative '../test_core/test_case_loader'
55require_relative '../../utils/config'
66require_relative './test_class_generator'
@@ -26,6 +26,8 @@ def parallel_new_worker_each(data_set, max_processes, &block)
2626 # If child process dead, available workers increase
2727 Signal . trap ( 'CLD' ) { available_workers += 1 }
2828
29+ r_pipe , w_pipe = IO . pipe
30+
2931 data_set . each do |data |
3032 # Wait until worker is available and handle exit code from previous process
3133 unless available_workers . positive?
@@ -34,28 +36,51 @@ def parallel_new_worker_each(data_set, max_processes, &block)
3436 end
3537 # Workers decrease when start working
3638 available_workers -= 1
37- fork { block . call ( data ) }
39+ fork { block . call ( data , w_pipe ) }
3840 end
3941 # Handle all exit code in waitall
4042 Process . waitall . each do |child |
4143 Bucky ::Core ::TestCore ::ExitHandler . instance . raise unless child [ 1 ] . exitstatus . zero?
4244 end
45+
46+ w_pipe . close
47+ results_set = collect_results_set ( r_pipe )
48+ r_pipe . close
49+
50+ results_set
4351 end
4452
4553 def parallel_distribute_into_workers ( data_set , max_processes , &block )
4654 # Group the data by remainder of index
4755 data_set_grouped = data_set . group_by . with_index { |_elem , index | index % max_processes }
56+ r_pipe , w_pipe = IO . pipe
4857 # Use 'values' method to get only hash's key into an array
4958 data_set_grouped . values . each do |data_for_pre_worker |
5059 # Number of child process is equal to max_processes (or equal to data_set length when data_set length is less than max_processes)
5160 fork do
52- data_for_pre_worker . each { |data | block . call ( data ) }
61+ data_for_pre_worker . each { |data | block . call ( data , w_pipe ) }
5362 end
5463 end
5564 # Handle all exit code in waitall
5665 Process . waitall . each do |child |
5766 Bucky ::Core ::TestCore ::ExitHandler . instance . raise unless child [ 1 ] . exitstatus . zero?
5867 end
68+
69+ w_pipe . close
70+ results_set = collect_results_set ( r_pipe )
71+ r_pipe . close
72+
73+ results_set
74+ end
75+
76+ def collect_results_set ( r_pipe )
77+ results_set = { }
78+ r_pipe . each_line do |line |
79+ r = JSON . parse ( line )
80+ results_set [ r [ 'test_class_name' ] ] = r
81+ end
82+
83+ results_set
5984 end
6085 end
6186
@@ -69,6 +94,20 @@ def initialize(test_cond)
6994 @tdo = Bucky ::Core ::Database ::TestDataOperator . new
7095 @start_time = Time . now
7196 $job_id = @tdo . save_job_record_and_get_job_id ( @start_time , @test_cond [ :command_and_option ] )
97+ @json_report = {
98+ summary : {
99+ cases_count : 0 ,
100+ success_count : 0 ,
101+ failure_count : 0 ,
102+ job_id : $job_id,
103+ test_category : test_cond [ :test_category ] ,
104+ device : test_cond [ :device ] ,
105+ labels : test_cond [ :label ] ,
106+ exclude_labels : test_cond [ :xlabel ] ,
107+ rerun_job_id : test_cond [ :job ] ,
108+ round_count : 0
109+ }
110+ }
72111 end
73112
74113 def run
@@ -102,25 +141,42 @@ def do_test_suites(test_suite_data)
102141 e2e_parallel_num = Bucky ::Utils ::Config . instance [ :e2e_parallel_num ]
103142 linkstatus_parallel_num = Bucky ::Utils ::Config . instance [ :linkstatus_parallel_num ]
104143 tcg = Bucky ::Core ::TestCore ::TestClassGenerator . new ( @test_cond )
105- case @test_cond [ :test_category ] [ 0 ]
106- when 'e2e' then parallel_new_worker_each ( test_suite_data , e2e_parallel_num ) { |data | tcg . generate_test_class ( data ) }
144+ case @test_cond [ :test_category ]
145+ when 'e2e' then results_set = parallel_new_worker_each ( test_suite_data , e2e_parallel_num ) { |data , w_pipe | tcg . generate_test_class ( data : data , w_pipe : w_pipe ) }
107146 when 'linkstatus' then
108- link_status_url_log = { }
109- parallel_distribute_into_workers ( test_suite_data , linkstatus_parallel_num ) { |data | tcg . generate_test_class ( data , link_status_url_log ) }
147+ linkstatus_url_log = { }
148+ results_set = parallel_distribute_into_workers ( test_suite_data , linkstatus_parallel_num ) { |data , w_pipe | tcg . generate_test_class ( data : data , linkstatus_url_log : linkstatus_url_log , w_pipe : w_pipe ) }
110149 end
150+
151+ results_set
111152 end
112153
113154 def execute_test
155+ results_set = { }
114156 @re_test_count . times do |i |
115157 Bucky ::Core ::TestCore ::ExitHandler . instance . reset
116158 $round = i + 1
159+ @json_report [ :summary ] [ :round_count ] = $round
117160 test_suite_data = load_test_suites
118- do_test_suites ( test_suite_data )
161+ results_set = do_test_suites ( test_suite_data )
119162 @test_cond [ :re_test_cond ] = @tdo . get_ng_test_cases_at_last_execution (
120163 is_error : 1 , job_id : $job_id, round : $round
121164 )
122165 break if @test_cond [ :re_test_cond ] . empty?
123166 end
167+
168+ return unless @test_cond [ :out ]
169+
170+ results_set . each do |_class_name , res |
171+ @json_report [ :summary ] [ :cases_count ] += res [ 'cases_count' ]
172+ @json_report [ :summary ] [ :success_count ] += res [ 'success_count' ]
173+ @json_report [ :summary ] [ :failure_count ] += res [ 'failure_count' ]
174+ end
175+
176+ File . open ( @test_cond [ :out ] , 'w' ) do |f |
177+ f . puts ( @json_report . to_json )
178+ puts "\n Save report : #{ @test_cond [ :out ] } \n "
179+ end
124180 end
125181 end
126182 end
0 commit comments