rspec-background-process 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.rspec +1 -0
- data/Gemfile +13 -0
- data/Gemfile.lock +76 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +19 -0
- data/Rakefile +41 -0
- data/VERSION +1 -0
- data/lib/rspec-background-process.rb +4 -0
- data/lib/rspec-background-process/background_process.rb +416 -0
- data/lib/rspec-background-process/background_process_helpers.rb +95 -0
- data/lib/rspec-background-process/process_pool.rb +356 -0
- data/lib/rspec-background-process/readiness_checks.rb +48 -0
- data/lib/rspec-background-process/refresh_actions.rb +15 -0
- data/lib/rspec-background-process/server.rb +49 -0
- data/rspec-background-process.gemspec +96 -0
- data/spec/background_process_helpers_spec.rb +32 -0
- data/spec/background_process_spec.rb +90 -0
- data/spec/features/cwd_spec.rb +51 -0
- data/spec/features/dead_detection_spec.rb +81 -0
- data/spec/features/exec_and_loading_spec.rb +26 -0
- data/spec/features/pool_lru_spec.rb +23 -0
- data/spec/features/ready_test_spec.rb +48 -0
- data/spec/features/refresh_spec.rb +46 -0
- data/spec/features/reuse_spec.rb +81 -0
- data/spec/features/server_spec.rb +35 -0
- data/spec/features/variables_replacement_spec.rb +68 -0
- data/spec/process_definition_spec.rb +182 -0
- data/spec/spec_helper.rb +102 -0
- data/spec/support/test_die +3 -0
- data/spec/support/test_http_server +28 -0
- data/spec/support/test_process +16 -0
- data/spec/support/test_slow_die +7 -0
- metadata +232 -0
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
require 'file-tail'
|
3
|
+
require 'retries'
|
4
|
+
|
5
|
+
require_relative 'process_pool'
|
6
|
+
|
7
|
+
module RSpecBackgroundProcess
|
8
|
+
class ProcessPool
|
9
|
+
class ProcessDefinition
|
10
|
+
def ready_when_log_includes(log_line)
|
11
|
+
ready_test do |instance|
|
12
|
+
log_line = instance.render(log_line)
|
13
|
+
|
14
|
+
# NOTE: log file my not be crated just after process is started (spawned) so we need to retry
|
15
|
+
with_retries(
|
16
|
+
max_tries: 10000,
|
17
|
+
base_sleep_seconds: 0.01,
|
18
|
+
max_sleep_seconds: 0.2,
|
19
|
+
rescue: Errno::ENOENT
|
20
|
+
) do
|
21
|
+
File::Tail::Logfile.tail(instance.log_file, forward: 0, interval: 0.01, max_interval: 1, suspicious_interval: 4) do |line|
|
22
|
+
line.include?(log_line) and break true
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def ready_when_url_response_status(uri, status = 'OK')
|
29
|
+
ready_test do |instance|
|
30
|
+
_uri = instance.render(uri) # NOTE: new variable (_uri) is needed or strange things happen...
|
31
|
+
|
32
|
+
begin
|
33
|
+
with_retries(
|
34
|
+
max_tries: 10000,
|
35
|
+
base_sleep_seconds: 0.06,
|
36
|
+
max_sleep_seconds: 0.2,
|
37
|
+
rescue: Errno::ECONNREFUSED
|
38
|
+
) do
|
39
|
+
open(_uri).status.last.strip == status and break true
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require_relative 'process_pool'
|
2
|
+
|
3
|
+
module RSpecBackgroundProcess
|
4
|
+
class ProcessPool
|
5
|
+
class ProcessDefinition
|
6
|
+
def refresh_command(command)
|
7
|
+
refresh_action do |instance|
|
8
|
+
_command = instance.render(command)
|
9
|
+
system _command
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module RSpecBackgroundProcess
|
2
|
+
class ProcessPool
|
3
|
+
class ProcessDefinition
|
4
|
+
def http_port_allocated_form(base_port, port_count = 1)
|
5
|
+
extend RSpecBackgroundProcess::BackgroundProcess::Server, base_port: base_port, port_count: port_count
|
6
|
+
end
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class BackgroundProcess
|
11
|
+
module Server
|
12
|
+
def self.extended(mod)
|
13
|
+
mod.allocate_ports
|
14
|
+
end
|
15
|
+
|
16
|
+
def template_variables
|
17
|
+
super.merge(
|
18
|
+
/allocated port (\d)/ => ->(port_no) { allocated_port(port_no) }
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
def allocate_ports
|
23
|
+
base_port = @options[:base_port] or fail "no base_port option set for #{self}: #{@options}"
|
24
|
+
port_count = @options[:port_count] or fail "no port_count option set for #{self}: #{@options}"
|
25
|
+
|
26
|
+
global_ports = @options[:global_context][:ports] ||= Set[]
|
27
|
+
|
28
|
+
begin
|
29
|
+
@ports = (base_port ... base_port + port_count).to_a
|
30
|
+
base_port += port_count
|
31
|
+
end until (global_ports & @ports).empty?
|
32
|
+
|
33
|
+
@options[:global_context][:ports] = global_ports + @ports
|
34
|
+
end
|
35
|
+
|
36
|
+
def ports
|
37
|
+
@ports
|
38
|
+
end
|
39
|
+
|
40
|
+
def allocated_port(port_no)
|
41
|
+
@ports[port_no.to_i - 1] or fail "no port #{port_no} allocated: #{@ports}"
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_s
|
45
|
+
super + "{ports: #{ports.join(', ')}}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "rspec-background-process"
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Jakub Pastuszek"]
|
12
|
+
s.date = "2014-09-29"
|
13
|
+
s.description = "RSpec and Cucumber DSL that allows definition of processes with their arguments, working directory, time outs, port numbers etc. and start/stop them during test runs. Processes with same definitions can pooled and reused between example runs to save time on startup/shutdown. Pooling supports process number limiting with LRU to limit memory used."
|
14
|
+
s.email = "jpastuszek@gmail.com"
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE.txt",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
".rspec",
|
22
|
+
"Gemfile",
|
23
|
+
"Gemfile.lock",
|
24
|
+
"LICENSE.txt",
|
25
|
+
"README.rdoc",
|
26
|
+
"Rakefile",
|
27
|
+
"VERSION",
|
28
|
+
"lib/rspec-background-process.rb",
|
29
|
+
"lib/rspec-background-process/background_process.rb",
|
30
|
+
"lib/rspec-background-process/background_process_helpers.rb",
|
31
|
+
"lib/rspec-background-process/process_pool.rb",
|
32
|
+
"lib/rspec-background-process/readiness_checks.rb",
|
33
|
+
"lib/rspec-background-process/refresh_actions.rb",
|
34
|
+
"lib/rspec-background-process/server.rb",
|
35
|
+
"rspec-background-process.gemspec",
|
36
|
+
"spec/background_process_helpers_spec.rb",
|
37
|
+
"spec/background_process_spec.rb",
|
38
|
+
"spec/features/cwd_spec.rb",
|
39
|
+
"spec/features/dead_detection_spec.rb",
|
40
|
+
"spec/features/exec_and_loading_spec.rb",
|
41
|
+
"spec/features/pool_lru_spec.rb",
|
42
|
+
"spec/features/ready_test_spec.rb",
|
43
|
+
"spec/features/refresh_spec.rb",
|
44
|
+
"spec/features/reuse_spec.rb",
|
45
|
+
"spec/features/server_spec.rb",
|
46
|
+
"spec/features/variables_replacement_spec.rb",
|
47
|
+
"spec/process_definition_spec.rb",
|
48
|
+
"spec/spec_helper.rb",
|
49
|
+
"spec/support/test_die",
|
50
|
+
"spec/support/test_http_server",
|
51
|
+
"spec/support/test_process",
|
52
|
+
"spec/support/test_slow_die"
|
53
|
+
]
|
54
|
+
s.homepage = "http://github.com/jpastuszek/rspec-background-process"
|
55
|
+
s.licenses = ["MIT"]
|
56
|
+
s.require_paths = ["lib"]
|
57
|
+
s.rubygems_version = "1.8.23"
|
58
|
+
s.summary = "RSpec and Cucumber DSL library that helps managing background processes during test runs"
|
59
|
+
|
60
|
+
if s.respond_to? :specification_version then
|
61
|
+
s.specification_version = 3
|
62
|
+
|
63
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
64
|
+
s.add_development_dependency(%q<faraday>, [">= 0.8"])
|
65
|
+
s.add_development_dependency(%q<rspec>, ["~> 3.1"])
|
66
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.8.4"])
|
67
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.0"])
|
68
|
+
s.add_development_dependency(%q<daemon>, ["~> 1.2"])
|
69
|
+
s.add_development_dependency(%q<micromachine>, ["~> 1.1"])
|
70
|
+
s.add_development_dependency(%q<rufus-lru>, ["~> 1.0"])
|
71
|
+
s.add_development_dependency(%q<file-tail>, ["~> 1.0"])
|
72
|
+
s.add_development_dependency(%q<retries>, ["~> 0.0.5"])
|
73
|
+
else
|
74
|
+
s.add_dependency(%q<faraday>, [">= 0.8"])
|
75
|
+
s.add_dependency(%q<rspec>, ["~> 3.1"])
|
76
|
+
s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
|
77
|
+
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
78
|
+
s.add_dependency(%q<daemon>, ["~> 1.2"])
|
79
|
+
s.add_dependency(%q<micromachine>, ["~> 1.1"])
|
80
|
+
s.add_dependency(%q<rufus-lru>, ["~> 1.0"])
|
81
|
+
s.add_dependency(%q<file-tail>, ["~> 1.0"])
|
82
|
+
s.add_dependency(%q<retries>, ["~> 0.0.5"])
|
83
|
+
end
|
84
|
+
else
|
85
|
+
s.add_dependency(%q<faraday>, [">= 0.8"])
|
86
|
+
s.add_dependency(%q<rspec>, ["~> 3.1"])
|
87
|
+
s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
|
88
|
+
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
89
|
+
s.add_dependency(%q<daemon>, ["~> 1.2"])
|
90
|
+
s.add_dependency(%q<micromachine>, ["~> 1.1"])
|
91
|
+
s.add_dependency(%q<rufus-lru>, ["~> 1.0"])
|
92
|
+
s.add_dependency(%q<file-tail>, ["~> 1.0"])
|
93
|
+
s.add_dependency(%q<retries>, ["~> 0.0.5"])
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
describe BackgroundProcessHelpers, with: :background_process do
|
4
|
+
describe '#process_pool' do
|
5
|
+
it 'should provide singleton pool object ' do
|
6
|
+
expect {
|
7
|
+
process_pool
|
8
|
+
}.not_to change {
|
9
|
+
process_pool
|
10
|
+
}
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '#background_process' do
|
15
|
+
it 'should allow specifying executable to run' do
|
16
|
+
process = background_process('features/support/test_process')
|
17
|
+
expect(process.instance.command).to include 'features/support/test_process'
|
18
|
+
end
|
19
|
+
|
20
|
+
describe 'load option' do
|
21
|
+
it 'when set to true will change instance type to LoadedBackgroundProcess' do
|
22
|
+
process = background_process('features/support/test_process', load: true)
|
23
|
+
expect(process.instance).to be_a RSpecBackgroundProcess::LoadedBackgroundProcess
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should return process definition' do
|
28
|
+
process = background_process('features/support/test_process')
|
29
|
+
expect(process).to be_a RSpecBackgroundProcess::ProcessPool::ProcessDefinition
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
describe RSpecBackgroundProcess::BackgroundProcess, subject: :instance do
|
4
|
+
describe 'running' do
|
5
|
+
it '#command should represent command to be executed' do
|
6
|
+
expect(subject.command).to include 'test_process'
|
7
|
+
end
|
8
|
+
|
9
|
+
it '#start should spawn the process by calling #spawn' do
|
10
|
+
expect(subject).to receive(:spawn).once.and_return([0, Thread.new{}])
|
11
|
+
subject.start
|
12
|
+
end
|
13
|
+
|
14
|
+
it '#stop should stop the process by sending TERM signal' do
|
15
|
+
expect(subject).to receive(:spawn).once.and_return([0, Thread.new{sleep 0.1}])
|
16
|
+
subject.start
|
17
|
+
|
18
|
+
expect(Process).to receive(:kill).once.with('TERM', kind_of(Numeric))
|
19
|
+
subject.stop
|
20
|
+
end
|
21
|
+
|
22
|
+
it '#restart should stop and then start the process' do
|
23
|
+
expect(subject).to receive(:spawn).once.and_return([0, Thread.new{sleep 0.1}])
|
24
|
+
subject.start
|
25
|
+
|
26
|
+
expect(subject).to receive(:spawn).once.and_return([1, Thread.new{sleep 0.1}])
|
27
|
+
expect(Process).to receive(:kill).once.with('TERM', kind_of(Numeric))
|
28
|
+
|
29
|
+
expect {
|
30
|
+
subject.restart
|
31
|
+
}.to change {
|
32
|
+
subject.pid
|
33
|
+
}.from(0).to(1)
|
34
|
+
end
|
35
|
+
|
36
|
+
describe 'related predicates' do
|
37
|
+
it '#pid should be integer when process is running and nil otherwise' do
|
38
|
+
expect(subject.pid).to be_nil
|
39
|
+
|
40
|
+
expect(subject).to receive(:spawn).once.and_return([42, Thread.new{sleep 0.1}])
|
41
|
+
subject.start
|
42
|
+
|
43
|
+
expect(subject.pid).to be_a(Integer).and eq(42)
|
44
|
+
|
45
|
+
expect(Process).to receive(:kill).once.with('TERM', kind_of(Numeric))
|
46
|
+
subject.stop
|
47
|
+
expect(subject.pid).to be_nil
|
48
|
+
end
|
49
|
+
|
50
|
+
it '#running? should be true when process is running' do
|
51
|
+
expect(subject).not_to be_running
|
52
|
+
expect(subject).to receive(:spawn).once.and_return([42, Thread.new{sleep 0.1}])
|
53
|
+
subject.start
|
54
|
+
expect(subject).to be_running
|
55
|
+
end
|
56
|
+
|
57
|
+
it '#dead? should be true when process exited but was not stopped by us' do
|
58
|
+
expect(subject).not_to be_dead
|
59
|
+
expect(subject).to receive(:spawn).once.and_return([42, Thread.new{sleep 0.1}])
|
60
|
+
subject.start
|
61
|
+
expect(subject).not_to be_dead
|
62
|
+
|
63
|
+
expect(Process).to receive(:kill).once.with('TERM', kind_of(Numeric))
|
64
|
+
subject.stop
|
65
|
+
expect(subject).not_to be_dead
|
66
|
+
|
67
|
+
expect(subject).to receive(:spawn).once.and_return([42, Thread.new{}])
|
68
|
+
subject.start
|
69
|
+
sleep 0.2
|
70
|
+
expect(subject).to be_dead
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe 'readiness', subject: :process do
|
76
|
+
it 'instance #wait_ready should call readiness block with self as argument' do
|
77
|
+
expect { |b|
|
78
|
+
subject.ready_test do |*args|
|
79
|
+
b.to_proc.call(*args)
|
80
|
+
# need to return true
|
81
|
+
true
|
82
|
+
end
|
83
|
+
instance = subject.instance
|
84
|
+
expect(instance).to receive(:spawn).once.and_return([42, Thread.new{sleep 0.1}])
|
85
|
+
instance.start
|
86
|
+
instance.wait_ready
|
87
|
+
}.to yield_with_args(RSpecBackgroundProcess::BackgroundProcess)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
|
3
|
+
def process_cwd_from_log(log)
|
4
|
+
log.readlines.grep(/^cwd:/).first.split(': ', 2).last.match(/'(.*)'/).captures.first.strip || fail('cannot extract cwd from log')
|
5
|
+
end
|
6
|
+
|
7
|
+
feature 'auto managing current working directory', subject: :process_ready_variables do
|
8
|
+
scenario 'processes by default run in own different directory' do
|
9
|
+
instance1 = subject.start.wait_ready
|
10
|
+
instance2 = subject.with{|p| p.argument 'blah'}.start.wait_ready
|
11
|
+
|
12
|
+
# reported cwd
|
13
|
+
expect(instance1.working_directory.to_s).not_to eq(instance2.working_directory.to_s)
|
14
|
+
|
15
|
+
# actual cwd
|
16
|
+
expect(process_cwd_from_log(instance1.log_file)).to eq(instance1.working_directory.realpath.to_s)
|
17
|
+
expect(process_cwd_from_log(instance2.log_file)).to eq(instance2.working_directory.realpath.to_s)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
feature 'process current working directory does not affect test current directory', subject: :process_ready_variables do
|
22
|
+
scenario 'master process current working directory unchanged over instance start' do
|
23
|
+
expect {
|
24
|
+
subject.start.wait_ready
|
25
|
+
}.not_to change {
|
26
|
+
Dir.pwd
|
27
|
+
}
|
28
|
+
|
29
|
+
# reported cwd
|
30
|
+
expect(subject.instance.working_directory.to_s).not_to eq(Dir.pwd)
|
31
|
+
|
32
|
+
# actual cwd
|
33
|
+
expect(process_cwd_from_log(subject.instance.log_file)).to eq(subject.instance.working_directory.realpath.to_s)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
feature 'current working directory can be configured to custom directory', subject: :process_ready_variables do
|
38
|
+
let :test_dir do
|
39
|
+
Pathname.new(Dir.pwd) + 'tmp'
|
40
|
+
end
|
41
|
+
|
42
|
+
scenario 'setting current working directory to test directory' do
|
43
|
+
instance = subject.with{|p| p.working_directory test_dir}.start.wait_ready
|
44
|
+
|
45
|
+
# reported cwd
|
46
|
+
expect(instance.working_directory.to_s).to eq(test_dir.to_s)
|
47
|
+
|
48
|
+
# actual cwd
|
49
|
+
expect(process_cwd_from_log(instance.log_file)).to eq(instance.working_directory.realpath.to_s)
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
|
3
|
+
feature 'background process is marked as dead if it exits before stop was called', subject: :dying_process do
|
4
|
+
scenario 'running dieing process renders it marked as dead' do
|
5
|
+
instance = subject.start
|
6
|
+
expect(instance).not_to be_dead
|
7
|
+
|
8
|
+
# git it some time to spawn and exit
|
9
|
+
sleep 0.5
|
10
|
+
expect(instance).to be_dead
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
feature 'dead instance should not be usable any more', subject: :dying_process do
|
15
|
+
scenario 'trying to #start dead instance' do
|
16
|
+
instance = subject.start
|
17
|
+
|
18
|
+
# git it some time to spawn and exit
|
19
|
+
sleep 0.5
|
20
|
+
|
21
|
+
expect {
|
22
|
+
instance.start
|
23
|
+
}.to raise_error RSpecBackgroundProcess::BackgroundProcess::StateError, /can't start when in state: dead/
|
24
|
+
end
|
25
|
+
|
26
|
+
scenario 'trying to #stop or #restart dead instance' do
|
27
|
+
instance = subject.start
|
28
|
+
|
29
|
+
# git it some time to spawn and exit
|
30
|
+
sleep 0.5
|
31
|
+
|
32
|
+
expect {
|
33
|
+
instance.stop
|
34
|
+
}.to raise_error RSpecBackgroundProcess::BackgroundProcess::StateError, /can't stop when in state: dead/
|
35
|
+
|
36
|
+
expect {
|
37
|
+
instance.restart
|
38
|
+
}.to raise_error RSpecBackgroundProcess::BackgroundProcess::StateError, /can't stop when in state: dead/
|
39
|
+
end
|
40
|
+
|
41
|
+
scenario 'trying to #wait_ready on dead instance' do
|
42
|
+
instance = subject.start
|
43
|
+
|
44
|
+
# git it some time to spawn and exit
|
45
|
+
sleep 0.5
|
46
|
+
|
47
|
+
expect {
|
48
|
+
instance.wait_ready
|
49
|
+
}.to raise_error RSpecBackgroundProcess::BackgroundProcess::StateError, /can't wait ready when in state: dead/
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
feature 'detecting instance death wile waiting for it to become ready', subject: :slowly_dying_process do
|
54
|
+
context 'with log file based check' do
|
55
|
+
scenario 'instance dying while we wait for it to become ready' do
|
56
|
+
subject.ready_when_log_includes 'bye'
|
57
|
+
|
58
|
+
instance = subject.start
|
59
|
+
|
60
|
+
expect {
|
61
|
+
instance.wait_ready
|
62
|
+
}.to raise_error RSpecBackgroundProcess::BackgroundProcess::ProcessExitedError, /exited with exit code: 0/
|
63
|
+
|
64
|
+
expect(instance).to be_dead
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context 'with URL based check' do
|
69
|
+
scenario 'instance dying while we wait for it to become ready' do
|
70
|
+
subject.ready_when_url_response_status 'http://localhost:1234/health_check', 'OK'
|
71
|
+
|
72
|
+
instance = subject.start
|
73
|
+
|
74
|
+
expect {
|
75
|
+
instance.wait_ready
|
76
|
+
}.to raise_error RSpecBackgroundProcess::BackgroundProcess::ProcessExitedError, /exited with exit code: 0/
|
77
|
+
|
78
|
+
expect(instance).to be_dead
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|