Class: Megatest::MultiProcess::Job

Inherits:
Object
  • Object
show all
Defined in:
lib/megatest/multi_process.rb

Instance Method Summary collapse

Constructor Details

#initialize(config, index) ⇒ Job

Returns a new instance of Job.



83
84
85
86
87
88
89
90
# File 'lib/megatest/multi_process.rb', line 83

def initialize(config, index)
  @config = config
  @index = index
  @pid = nil
  @child_socket, @parent_socket = MultiProcess.socketpair
  @assigned_test = nil
  @idle = false
end

Instance Method Details

#closeObject



131
132
133
134
# File 'lib/megatest/multi_process.rb', line 131

def close
  @parent_socket.close
  @child_socket.close
end

#closed?Boolean

Returns:

  • (Boolean)


136
137
138
# File 'lib/megatest/multi_process.rb', line 136

def closed?
  @parent_socket.closed?
end

#idle?Boolean

Returns:

  • (Boolean)


140
141
142
# File 'lib/megatest/multi_process.rb', line 140

def idle?
  @idle
end

#on_exit(queue, reporters) ⇒ Object



175
176
177
178
179
180
181
# File 'lib/megatest/multi_process.rb', line 175

def on_exit(queue, reporters)
  if @assigned_test
    result = queue.record_lost_test(@assigned_test)
    @assigned_test = nil
    reporters.each { |r| r.after_test_case(queue, nil, result) }
  end
end

#process(queue, reporters) ⇒ Object



144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# File 'lib/megatest/multi_process.rb', line 144

def process(queue, reporters)
  if @idle
    if @assigned_test = queue.pop_test
      @idle = false
      @parent_socket << @assigned_test&.id
    end
    return
  end

  message, *args = @parent_socket.read
  case message
  when nil
    # Socket closed, child probably died
    @parent_socket.close
  when :pop
    if @assigned_test = queue.pop_test
      @parent_socket << @assigned_test&.id
    else
      @idle = true
    end
  when :record
    result = queue.record_result(*args)
    @assigned_test = nil
    @parent_socket << result
    reporters.each { |r| r.after_test_case(queue, nil, result) }
    @config.circuit_breaker.record_result(result)
  else
    raise "Unexpected message: #{message.inspect}"
  end
end

#reapObject



183
184
185
# File 'lib/megatest/multi_process.rb', line 183

def reap
  Process.wait(@pid)
end

#run(executor, parent_queue) ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/megatest/multi_process.rb', line 92

def run(executor, parent_queue)
  @pid = Process.fork do
    @config.job_index = @index
    @parent_socket.close
    executor.after_fork_in_child(self)

    queue = ClientQueue.new(@child_socket, parent_queue)
    @config.run_job_setup_callbacks(@index)

    runner = Runner.new(@config)

    begin
      while (test_case = queue.pop_test)
        result = runner.execute(test_case)
        result = queue.record_result(result)
        @config.circuit_breaker.record_result(result)
        break if @config.circuit_breaker.break?
      end
    rescue Interrupt
    end
    queue.close

    # We don't want to run at_exit hooks the app may have
    # installed.
    Process.exit!(0)
  end
  @child_socket.close
end

#termObject



125
126
127
128
129
# File 'lib/megatest/multi_process.rb', line 125

def term
  Process.kill(:TERM, @pid)
rescue Errno::ESRCH
  # Already dead
end

#to_ioObject



121
122
123
# File 'lib/megatest/multi_process.rb', line 121

def to_io
  @parent_socket.to_io
end