rrrspec-server 0.4.2 → 0.4.3
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 +4 -4
- data/lib/rrrspec/server/daemonizer.rb +0 -1
- data/lib/rrrspec/server/persister.rb +4 -4
- data/lib/rrrspec/server/version.rb +1 -1
- metadata +14 -40
- data/.rspec +0 -2
- data/Gemfile +0 -4
- data/Rakefile +0 -2
- data/rrrspec-server.gemspec +0 -40
- data/spec/fixture.rb +0 -32
- data/spec/rrrspec/server/arbiter_spec.rb +0 -497
- data/spec/rrrspec/server/dispatcher_spec.rb +0 -53
- data/spec/rrrspec/server/log_file_persister_spec.rb +0 -34
- data/spec/rrrspec/server/persistent_models_spec.rb +0 -55
- data/spec/rrrspec/server/persister_spec.rb +0 -125
- data/spec/rrrspec/server/statistics_updater_spec.rb +0 -28
- data/spec/spec_helper.rb +0 -76
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9625ccb0410299f07a3d0ef6930c82b5098e988d
|
4
|
+
data.tar.gz: 53072551cd5d091fde57fe140c13fcd7bca9604e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 59b97dbd4247ff5596a2274eb40f1b5cea27142421de0d983853087ef186e5d2bd385b8bec4c58359e8b473937bf6149a2ec55b9f36b0af63414659d8e87a189
|
7
|
+
data.tar.gz: 4b4089c4edd6c9d966a20333c6d8ce16bd91ed2457de6098ad2fcbabf708c90dc6efd229378b15b787741ca0748e1ac855a24f847af74d5e96c6e592ff3276af
|
@@ -71,7 +71,7 @@ module RRRSpec
|
|
71
71
|
h.delete('taskset')
|
72
72
|
h.delete('trials')
|
73
73
|
p_task = Persistence::Task.new(h)
|
74
|
-
p_task.taskset_id = p_taskset
|
74
|
+
p_task.taskset_id = p_taskset.id
|
75
75
|
p_task
|
76
76
|
end
|
77
77
|
Persistence::Task.import(p_tasks)
|
@@ -92,8 +92,8 @@ module RRRSpec
|
|
92
92
|
slave_key = h.delete('slave')['key']
|
93
93
|
h.delete('task')
|
94
94
|
p_trial = Persistence::Trial.new(h)
|
95
|
-
p_trial.task_id = p_task
|
96
|
-
p_trial.slave_id = p_slaves[slave_key]
|
95
|
+
p_trial.task_id = p_task.id
|
96
|
+
p_trial.slave_id = p_slaves[slave_key].id
|
97
97
|
|
98
98
|
p_trials << p_trial
|
99
99
|
end
|
@@ -109,7 +109,7 @@ module RRRSpec
|
|
109
109
|
h.delete('worker')
|
110
110
|
h.delete('taskset')
|
111
111
|
p_worker_log = Persistence::WorkerLog.new(h)
|
112
|
-
p_worker_log.taskset_id = p_taskset
|
112
|
+
p_worker_log.taskset_id = p_taskset.id
|
113
113
|
p_worker_log
|
114
114
|
end
|
115
115
|
Persistence::WorkerLog.import(p_worker_logs)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rrrspec-server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Masaya Suzuki
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-06-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: database_cleaner
|
@@ -98,36 +98,30 @@ dependencies:
|
|
98
98
|
name: activerecord
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- - "
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '4.0'
|
104
|
-
- - "<"
|
101
|
+
- - "~>"
|
105
102
|
- !ruby/object:Gem::Version
|
106
|
-
version:
|
103
|
+
version: 4.2.0
|
107
104
|
type: :runtime
|
108
105
|
prerelease: false
|
109
106
|
version_requirements: !ruby/object:Gem::Requirement
|
110
107
|
requirements:
|
111
|
-
- - "
|
112
|
-
- !ruby/object:Gem::Version
|
113
|
-
version: '4.0'
|
114
|
-
- - "<"
|
108
|
+
- - "~>"
|
115
109
|
- !ruby/object:Gem::Version
|
116
|
-
version:
|
110
|
+
version: 4.2.0
|
117
111
|
- !ruby/object:Gem::Dependency
|
118
112
|
name: activerecord-import
|
119
113
|
requirement: !ruby/object:Gem::Requirement
|
120
114
|
requirements:
|
121
|
-
- - "
|
115
|
+
- - ">="
|
122
116
|
- !ruby/object:Gem::Version
|
123
|
-
version: 0.
|
117
|
+
version: 0.7.0
|
124
118
|
type: :runtime
|
125
119
|
prerelease: false
|
126
120
|
version_requirements: !ruby/object:Gem::Requirement
|
127
121
|
requirements:
|
128
|
-
- - "
|
122
|
+
- - ">="
|
129
123
|
- !ruby/object:Gem::Version
|
130
|
-
version: 0.
|
124
|
+
version: 0.7.0
|
131
125
|
- !ruby/object:Gem::Dependency
|
132
126
|
name: activesupport
|
133
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -204,14 +198,14 @@ dependencies:
|
|
204
198
|
requirements:
|
205
199
|
- - ">="
|
206
200
|
- !ruby/object:Gem::Version
|
207
|
-
version:
|
201
|
+
version: 0.18.0
|
208
202
|
type: :runtime
|
209
203
|
prerelease: false
|
210
204
|
version_requirements: !ruby/object:Gem::Requirement
|
211
205
|
requirements:
|
212
206
|
- - ">="
|
213
207
|
- !ruby/object:Gem::Version
|
214
|
-
version:
|
208
|
+
version: 0.18.0
|
215
209
|
description: Execute RSpec in a distributed manner
|
216
210
|
email:
|
217
211
|
- draftcode@gmail.com
|
@@ -220,9 +214,6 @@ executables:
|
|
220
214
|
extensions: []
|
221
215
|
extra_rdoc_files: []
|
222
216
|
files:
|
223
|
-
- ".rspec"
|
224
|
-
- Gemfile
|
225
|
-
- Rakefile
|
226
217
|
- bin/rrrspec-server
|
227
218
|
- db/migrate/20131105050718_create_tables.rb
|
228
219
|
- db/migrate/20140221062741_expand_log.rb
|
@@ -241,15 +232,6 @@ files:
|
|
241
232
|
- lib/rrrspec/server/statistics_updater.rb
|
242
233
|
- lib/rrrspec/server/version.rb
|
243
234
|
- lib/rrrspec/server/worker_runner.rb
|
244
|
-
- rrrspec-server.gemspec
|
245
|
-
- spec/fixture.rb
|
246
|
-
- spec/rrrspec/server/arbiter_spec.rb
|
247
|
-
- spec/rrrspec/server/dispatcher_spec.rb
|
248
|
-
- spec/rrrspec/server/log_file_persister_spec.rb
|
249
|
-
- spec/rrrspec/server/persistent_models_spec.rb
|
250
|
-
- spec/rrrspec/server/persister_spec.rb
|
251
|
-
- spec/rrrspec/server/statistics_updater_spec.rb
|
252
|
-
- spec/spec_helper.rb
|
253
235
|
- tasks/db.rake
|
254
236
|
homepage: https://github.com/cookpad/rrrspec
|
255
237
|
licenses:
|
@@ -271,16 +253,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
271
253
|
version: '0'
|
272
254
|
requirements: []
|
273
255
|
rubyforge_project:
|
274
|
-
rubygems_version: 2.
|
256
|
+
rubygems_version: 2.5.1
|
275
257
|
signing_key:
|
276
258
|
specification_version: 4
|
277
259
|
summary: Execute RSpec in a distributed manner
|
278
|
-
test_files:
|
279
|
-
- spec/fixture.rb
|
280
|
-
- spec/rrrspec/server/arbiter_spec.rb
|
281
|
-
- spec/rrrspec/server/dispatcher_spec.rb
|
282
|
-
- spec/rrrspec/server/log_file_persister_spec.rb
|
283
|
-
- spec/rrrspec/server/persistent_models_spec.rb
|
284
|
-
- spec/rrrspec/server/persister_spec.rb
|
285
|
-
- spec/rrrspec/server/statistics_updater_spec.rb
|
286
|
-
- spec/spec_helper.rb
|
260
|
+
test_files: []
|
data/.rspec
DELETED
data/Gemfile
DELETED
data/Rakefile
DELETED
data/rrrspec-server.gemspec
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
3
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require 'rrrspec/server/version'
|
5
|
-
require 'pathname'
|
6
|
-
|
7
|
-
Gem::Specification.new do |spec|
|
8
|
-
spec.name = "rrrspec-server"
|
9
|
-
spec.version = RRRSpec::Server::VERSION
|
10
|
-
spec.authors = ["Masaya Suzuki"]
|
11
|
-
spec.email = ["draftcode@gmail.com"]
|
12
|
-
spec.description = "Execute RSpec in a distributed manner"
|
13
|
-
spec.summary = "Execute RSpec in a distributed manner"
|
14
|
-
spec.homepage = "https://github.com/cookpad/rrrspec"
|
15
|
-
spec.license = "MIT"
|
16
|
-
|
17
|
-
gemspec_dir = File.expand_path('..', __FILE__)
|
18
|
-
spec.files = `git ls-files`.split($/).
|
19
|
-
map { |f| File.absolute_path(f) }.
|
20
|
-
select { |f| f.start_with?(gemspec_dir) }.
|
21
|
-
map { |f| Pathname(f).relative_path_from(Pathname(gemspec_dir)).to_s }
|
22
|
-
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
23
|
-
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
24
|
-
spec.require_paths = ["lib"]
|
25
|
-
|
26
|
-
spec.add_development_dependency "database_cleaner", "~> 1.2.0"
|
27
|
-
spec.add_development_dependency "mysql2"
|
28
|
-
spec.add_development_dependency "rake"
|
29
|
-
spec.add_development_dependency "rspec"
|
30
|
-
spec.add_development_dependency "sqlite3"
|
31
|
-
spec.add_development_dependency "timecop"
|
32
|
-
spec.add_dependency "activerecord", ">= 4.0", "< 4.2"
|
33
|
-
spec.add_dependency "activerecord-import", "~> 0.4.1"
|
34
|
-
spec.add_dependency "activesupport"
|
35
|
-
spec.add_dependency "bundler"
|
36
|
-
spec.add_dependency "facter"
|
37
|
-
spec.add_dependency "redis"
|
38
|
-
spec.add_dependency "rrrspec-client"
|
39
|
-
spec.add_dependency "thor"
|
40
|
-
end
|
data/spec/fixture.rb
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
module RRRSpec
|
2
|
-
def self.finished_fullset
|
3
|
-
worker = Worker.create('default')
|
4
|
-
taskset = Taskset.create(
|
5
|
-
'testuser', 'echo 1', 'echo 2', 'default', 'default', 3, 3, 5, 5
|
6
|
-
)
|
7
|
-
task = Task.create(taskset, 10, 'spec/test_spec.rb')
|
8
|
-
taskset.add_task(task)
|
9
|
-
taskset.enqueue_task(task)
|
10
|
-
ActiveTaskset.add(taskset)
|
11
|
-
worker_log = WorkerLog.create(worker, taskset)
|
12
|
-
worker_log.set_rsync_finished_time
|
13
|
-
worker_log.append_log('worker_log log body')
|
14
|
-
worker_log.set_setup_finished_time
|
15
|
-
slave = Slave.create
|
16
|
-
taskset.add_slave(slave)
|
17
|
-
slave.append_log('slave log body')
|
18
|
-
trial = Trial.create(task, slave)
|
19
|
-
trial.start
|
20
|
-
trial.finish('pending', 'stdout body', 'stderr body', 10, 2, 0)
|
21
|
-
task.update_status('pending')
|
22
|
-
taskset.incr_succeeded_count
|
23
|
-
taskset.finish_task(task)
|
24
|
-
taskset.update_status('succeeded')
|
25
|
-
taskset.set_finished_time
|
26
|
-
ActiveTaskset.remove(taskset)
|
27
|
-
slave.update_status('normal_exit')
|
28
|
-
worker_log.set_finished_time
|
29
|
-
|
30
|
-
return worker, taskset, task, worker_log, slave, trial
|
31
|
-
end
|
32
|
-
end
|
@@ -1,497 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module RRRSpec
|
4
|
-
module Server
|
5
|
-
RSpec.describe Arbiter do
|
6
|
-
before do
|
7
|
-
RRRSpec.configuration = Configuration.new
|
8
|
-
RRRSpec.configuration.redis = @redis
|
9
|
-
end
|
10
|
-
|
11
|
-
let(:taskset) do
|
12
|
-
Taskset.create(
|
13
|
-
'testuser', 'echo 1', 'echo 2', 'default', 'default', 3, 3, 5, 5
|
14
|
-
)
|
15
|
-
end
|
16
|
-
|
17
|
-
let(:task1) do
|
18
|
-
Task.create(taskset, 10, 'spec/test_spec.rb')
|
19
|
-
end
|
20
|
-
|
21
|
-
before do
|
22
|
-
ActiveTaskset.add(taskset)
|
23
|
-
end
|
24
|
-
|
25
|
-
describe '.cancel' do
|
26
|
-
context 'with the taskset running' do
|
27
|
-
before { taskset.update_status('running') }
|
28
|
-
|
29
|
-
it 'cancels the taskset' do
|
30
|
-
Arbiter.cancel(taskset)
|
31
|
-
expect(taskset.status).to eq('cancelled')
|
32
|
-
expect(taskset).to be_queue_empty
|
33
|
-
expect(taskset.finished_at).not_to be_nil
|
34
|
-
expect(ActiveTaskset.list).not_to include(taskset)
|
35
|
-
expect(PersisterQueue).not_to be_empty
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
context 'with the taskset failed' do
|
40
|
-
before { taskset.update_status('failed') }
|
41
|
-
|
42
|
-
it 'does nothing' do
|
43
|
-
Arbiter.cancel(taskset)
|
44
|
-
expect(taskset.status).not_to eq('cancelled')
|
45
|
-
expect(ActiveTaskset.list).not_to include(taskset)
|
46
|
-
expect(PersisterQueue).not_to be_empty
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
describe '.check' do
|
52
|
-
before do
|
53
|
-
taskset.add_task(task1)
|
54
|
-
taskset.enqueue_task(task1)
|
55
|
-
end
|
56
|
-
|
57
|
-
context 'when the taskset is succeeded or failed or cancelled' do
|
58
|
-
before { taskset.update_status('failed') }
|
59
|
-
it 'does nothing' do
|
60
|
-
Arbiter.check(taskset)
|
61
|
-
expect(ActiveTaskset.list).not_to include(taskset)
|
62
|
-
expect(PersisterQueue).not_to be_empty
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
context 'with the taskset running' do
|
67
|
-
before { taskset.update_status('running') }
|
68
|
-
|
69
|
-
context 'with tasks_left having item' do
|
70
|
-
it 'calls check_task' do
|
71
|
-
expect(Arbiter).to receive(:check_task)
|
72
|
-
Arbiter.check(taskset)
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
context 'with tasks_left non-empty after check_task' do
|
77
|
-
context 'with the queue empty' do
|
78
|
-
before do
|
79
|
-
taskset.dequeue_task(0)
|
80
|
-
end
|
81
|
-
it 'calls requeue_speculative' do
|
82
|
-
expect(Arbiter).to receive(:requeue_speculative)
|
83
|
-
Arbiter.check(taskset)
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
context 'with the queue non-empty' do
|
88
|
-
it 'does nothing' do
|
89
|
-
Arbiter.check(taskset)
|
90
|
-
expect(taskset.status).to eq('running')
|
91
|
-
expect(taskset.finished_at).to be_blank
|
92
|
-
expect(ActiveTaskset.list).to include(taskset)
|
93
|
-
expect(PersisterQueue).to be_empty
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
context 'with tasks_left empty after check_task' do
|
99
|
-
before { taskset.finish_task(task1) }
|
100
|
-
|
101
|
-
context 'with all tasks succeeded' do
|
102
|
-
before { taskset.incr_succeeded_count }
|
103
|
-
|
104
|
-
it 'marks the taskset as succeeded' do
|
105
|
-
Arbiter.check(taskset)
|
106
|
-
expect(taskset.status).to eq("succeeded")
|
107
|
-
expect(taskset.finished_at).not_to be_blank
|
108
|
-
expect(ActiveTaskset.list).not_to include(taskset)
|
109
|
-
expect(PersisterQueue).not_to be_empty
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
context 'with some tasks failed' do
|
114
|
-
before { taskset.incr_failed_count }
|
115
|
-
|
116
|
-
it 'marks the taskset as failed' do
|
117
|
-
Arbiter.check(taskset)
|
118
|
-
expect(taskset.status).to eq("failed")
|
119
|
-
expect(taskset.finished_at).not_to be_nil
|
120
|
-
expect(ActiveTaskset.list).not_to include(taskset)
|
121
|
-
expect(PersisterQueue).not_to be_empty
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
describe '.check_task' do
|
129
|
-
before do
|
130
|
-
taskset.add_task(task1)
|
131
|
-
taskset.enqueue_task(task1)
|
132
|
-
end
|
133
|
-
|
134
|
-
let(:logger) { TimedLogger.new(taskset) }
|
135
|
-
let(:slave) { Slave.create }
|
136
|
-
|
137
|
-
context 'with some trials running' do
|
138
|
-
let(:trial1) { Trial.create(task1, slave) }
|
139
|
-
|
140
|
-
before do
|
141
|
-
trial1.start
|
142
|
-
end
|
143
|
-
|
144
|
-
context 'with the slave alive' do
|
145
|
-
before { slave.heartbeat(30) }
|
146
|
-
|
147
|
-
it 'does nothing' do
|
148
|
-
Arbiter.check_task(logger, taskset, task1)
|
149
|
-
expect(trial1.status).to be_blank
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
context 'with the slave failed' do
|
154
|
-
it 'marks error' do
|
155
|
-
Arbiter.check_task(logger, taskset, task1)
|
156
|
-
expect(trial1.status).to eq('error')
|
157
|
-
end
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
context 'with a trial passed' do
|
162
|
-
let(:trial1) { Trial.create(task1, slave) }
|
163
|
-
let(:trial2) { Trial.create(task1, slave) }
|
164
|
-
|
165
|
-
before do
|
166
|
-
trial1.start
|
167
|
-
trial1.finish('passed', '', '', nil, nil, nil)
|
168
|
-
trial2.start
|
169
|
-
trial2.finish('error', '', '', nil, nil, nil)
|
170
|
-
end
|
171
|
-
|
172
|
-
it 'sets status passed' do
|
173
|
-
Arbiter.check_task(logger, taskset, task1)
|
174
|
-
expect(task1.status).to eq('passed')
|
175
|
-
expect(taskset.tasks_left).not_to include(task1)
|
176
|
-
expect(taskset.succeeded_count).to eq(1)
|
177
|
-
expect(taskset.failed_count).to eq(0)
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
context 'with a trial pending' do
|
182
|
-
let(:trial1) { Trial.create(task1, slave) }
|
183
|
-
let(:trial2) { Trial.create(task1, slave) }
|
184
|
-
|
185
|
-
before do
|
186
|
-
trial1.start
|
187
|
-
trial1.finish('pending', '', '', nil, nil, nil)
|
188
|
-
trial2.start
|
189
|
-
trial2.finish('error', '', '', nil, nil, nil)
|
190
|
-
end
|
191
|
-
|
192
|
-
it 'sets status pending' do
|
193
|
-
Arbiter.check_task(logger, taskset, task1)
|
194
|
-
expect(task1.status).to eq('pending')
|
195
|
-
expect(taskset.tasks_left).not_to include(task1)
|
196
|
-
expect(taskset.succeeded_count).to eq(1)
|
197
|
-
expect(taskset.failed_count).to eq(0)
|
198
|
-
end
|
199
|
-
end
|
200
|
-
|
201
|
-
context 'with the task fully tried' do
|
202
|
-
let(:trial1) { Trial.create(task1, slave) }
|
203
|
-
let(:trial2) { Trial.create(task1, slave) }
|
204
|
-
let(:trial3) { Trial.create(task1, slave) }
|
205
|
-
|
206
|
-
before do
|
207
|
-
trial1.start
|
208
|
-
trial1.finish('error', '', '', nil, nil, nil)
|
209
|
-
trial2.start
|
210
|
-
trial2.finish('error', '', '', nil, nil, nil)
|
211
|
-
trial3.start
|
212
|
-
trial3.finish('error', '', '', nil, nil, nil)
|
213
|
-
end
|
214
|
-
|
215
|
-
it 'marks failed' do
|
216
|
-
Arbiter.check_task(logger, taskset, task1)
|
217
|
-
expect(task1.status).to eq('failed')
|
218
|
-
expect(taskset.tasks_left).not_to include(task1)
|
219
|
-
expect(taskset.succeeded_count).to eq(0)
|
220
|
-
expect(taskset.failed_count).to eq(1)
|
221
|
-
end
|
222
|
-
end
|
223
|
-
|
224
|
-
context 'when re-triable' do
|
225
|
-
let(:trial1) { Trial.create(task1, slave) }
|
226
|
-
let(:trial2) { Trial.create(task1, slave) }
|
227
|
-
|
228
|
-
before do
|
229
|
-
trial1.start
|
230
|
-
trial1.finish('error', '', '', nil, nil, nil)
|
231
|
-
trial2.start
|
232
|
-
trial2.finish('error', '', '', nil, nil, nil)
|
233
|
-
end
|
234
|
-
|
235
|
-
it 'does nothing' do
|
236
|
-
Arbiter.check_task(logger, taskset, task1)
|
237
|
-
expect(task1.status).to be_blank
|
238
|
-
expect(taskset.tasks_left).to include(task1)
|
239
|
-
expect(taskset.succeeded_count).to eq(0)
|
240
|
-
expect(taskset.failed_count).to eq(0)
|
241
|
-
end
|
242
|
-
end
|
243
|
-
end
|
244
|
-
|
245
|
-
describe '.requeue_speculative' do
|
246
|
-
let(:logger) { TimedLogger.new(taskset) }
|
247
|
-
let(:slave) { Slave.create }
|
248
|
-
|
249
|
-
let(:task2) do
|
250
|
-
Task.create(taskset, 10, 'spec/test_spec2.rb')
|
251
|
-
end
|
252
|
-
|
253
|
-
before do
|
254
|
-
taskset.add_task(task1)
|
255
|
-
taskset.add_task(task2)
|
256
|
-
end
|
257
|
-
|
258
|
-
context 'with some no-running-trial tasks' do
|
259
|
-
let(:trial1_1) { Trial.create(task1, slave) }
|
260
|
-
|
261
|
-
before do
|
262
|
-
trial1_1.start
|
263
|
-
end
|
264
|
-
|
265
|
-
it 'enqueues one no-running-trial task' do
|
266
|
-
Arbiter.requeue_speculative(logger, taskset, [task1, task2])
|
267
|
-
expect(taskset).not_to be_queue_empty
|
268
|
-
expect(taskset.dequeue_task(0)).to eq(task2)
|
269
|
-
end
|
270
|
-
end
|
271
|
-
|
272
|
-
context 'with all tasks running' do
|
273
|
-
let(:trial1_1) { Trial.create(task1, slave) }
|
274
|
-
let(:trial1_2) { Trial.create(task2, slave) }
|
275
|
-
let(:trial2_2) { Trial.create(task2, slave) }
|
276
|
-
|
277
|
-
before do
|
278
|
-
trial1_1.start
|
279
|
-
trial1_2.start
|
280
|
-
trial2_2.start
|
281
|
-
end
|
282
|
-
|
283
|
-
it 'enqueues one least tried task' do
|
284
|
-
Arbiter.requeue_speculative(logger, taskset, [task1, task2])
|
285
|
-
expect(taskset).not_to be_queue_empty
|
286
|
-
expect(taskset.dequeue_task(0)).to eq(task1)
|
287
|
-
end
|
288
|
-
end
|
289
|
-
end
|
290
|
-
|
291
|
-
describe '.fail' do
|
292
|
-
context 'with the taskset running' do
|
293
|
-
before { taskset.update_status('running') }
|
294
|
-
|
295
|
-
it 'fails the taskset' do
|
296
|
-
Arbiter.fail(taskset)
|
297
|
-
expect(taskset.status).to eq('failed')
|
298
|
-
expect(taskset).to be_queue_empty
|
299
|
-
expect(taskset.finished_at).not_to be_nil
|
300
|
-
expect(ActiveTaskset.list).not_to include(taskset)
|
301
|
-
expect(PersisterQueue).not_to be_empty
|
302
|
-
end
|
303
|
-
end
|
304
|
-
|
305
|
-
context 'with the taskset cancelled' do
|
306
|
-
before { taskset.update_status('cancelled') }
|
307
|
-
|
308
|
-
it 'does nothing' do
|
309
|
-
Arbiter.fail(taskset)
|
310
|
-
expect(taskset.status).not_to eq('failed')
|
311
|
-
expect(ActiveTaskset.list).not_to include(taskset)
|
312
|
-
expect(PersisterQueue).not_to be_empty
|
313
|
-
end
|
314
|
-
end
|
315
|
-
end
|
316
|
-
|
317
|
-
describe '.trial' do
|
318
|
-
before do
|
319
|
-
taskset.add_task(task1)
|
320
|
-
taskset.enqueue_task(task1)
|
321
|
-
end
|
322
|
-
|
323
|
-
before do
|
324
|
-
taskset.dequeue_task(0)
|
325
|
-
end
|
326
|
-
|
327
|
-
let(:slave) { Slave.create }
|
328
|
-
let(:trial) { Trial.create(task1, slave) }
|
329
|
-
|
330
|
-
context 'when the task is already finished' do
|
331
|
-
before { task1.update_status('passed') }
|
332
|
-
|
333
|
-
it 'does nothing' do
|
334
|
-
Arbiter.trial(trial)
|
335
|
-
expect(trial.status).to be_nil
|
336
|
-
expect(task1.status).to eq('passed')
|
337
|
-
end
|
338
|
-
end
|
339
|
-
|
340
|
-
context 'with the trial not-running' do
|
341
|
-
context 'with maximally retried' do
|
342
|
-
let(:trial2) { Trial.create(task1, slave) }
|
343
|
-
let(:trial3) { Trial.create(task1, slave) }
|
344
|
-
|
345
|
-
before do
|
346
|
-
trial2.finish('error', '', '', nil, nil, nil)
|
347
|
-
trial3.finish('error', '', '', nil, nil, nil)
|
348
|
-
end
|
349
|
-
|
350
|
-
it 'finishes the trial and marks the task failed' do
|
351
|
-
Arbiter.trial(trial)
|
352
|
-
expect(trial.status).to eq('error')
|
353
|
-
expect(task1.status).to eq('failed')
|
354
|
-
expect(taskset.tasks_left).not_to include(task1)
|
355
|
-
expect(taskset).to be_queue_empty
|
356
|
-
expect(taskset.succeeded_count).to eq(0)
|
357
|
-
expect(taskset.failed_count).to eq(1)
|
358
|
-
end
|
359
|
-
end
|
360
|
-
|
361
|
-
context 'when re-triable' do
|
362
|
-
it 'finishes the trial and requeues the task' do
|
363
|
-
Arbiter.trial(trial)
|
364
|
-
expect(trial.status).to eq('error')
|
365
|
-
expect(task1.status).to be_nil
|
366
|
-
expect(taskset.tasks_left).to include(task1)
|
367
|
-
expect(taskset.dequeue_task(0)).to eq(task1)
|
368
|
-
expect(taskset.succeeded_count).to eq(0)
|
369
|
-
expect(taskset.failed_count).to eq(0)
|
370
|
-
end
|
371
|
-
end
|
372
|
-
end
|
373
|
-
|
374
|
-
context 'with the trial passed' do
|
375
|
-
before do
|
376
|
-
trial.finish('passed', '', '', nil, nil, nil)
|
377
|
-
end
|
378
|
-
|
379
|
-
it 'marks the task as passed' do
|
380
|
-
Arbiter.trial(trial)
|
381
|
-
expect(task1.status).to eq('passed')
|
382
|
-
expect(taskset.tasks_left).not_to include(task1)
|
383
|
-
expect(taskset).to be_queue_empty
|
384
|
-
expect(taskset.succeeded_count).to eq(1)
|
385
|
-
expect(taskset.failed_count).to eq(0)
|
386
|
-
end
|
387
|
-
end
|
388
|
-
|
389
|
-
context 'with the trial pending' do
|
390
|
-
before { trial.finish('pending', '', '', 0, 1, 0) }
|
391
|
-
|
392
|
-
it 'marks the task as pending' do
|
393
|
-
Arbiter.trial(trial)
|
394
|
-
expect(task1.status).to eq('pending')
|
395
|
-
expect(taskset.tasks_left).not_to include(task1)
|
396
|
-
expect(taskset).to be_queue_empty
|
397
|
-
expect(taskset.succeeded_count).to eq(1)
|
398
|
-
expect(taskset.failed_count).to eq(0)
|
399
|
-
end
|
400
|
-
end
|
401
|
-
|
402
|
-
context 'with the trial failed' do
|
403
|
-
before { trial.finish('failed', '', '', 0, 0, 1) }
|
404
|
-
|
405
|
-
context 'with another trial running' do
|
406
|
-
let(:trial2) { Trial.create(task1, slave) }
|
407
|
-
|
408
|
-
before { trial2 }
|
409
|
-
|
410
|
-
context 'maximally retried' do
|
411
|
-
let(:trial3) { Trial.create(task1, slave) }
|
412
|
-
let(:trial4) { Trial.create(task1, slave) }
|
413
|
-
|
414
|
-
before do
|
415
|
-
trial3
|
416
|
-
trial4
|
417
|
-
end
|
418
|
-
|
419
|
-
context 'enough to judge failed' do
|
420
|
-
before do
|
421
|
-
trial3.finish('error', '', '', nil, nil, nil)
|
422
|
-
trial4.finish('error', '', '', nil, nil, nil)
|
423
|
-
end
|
424
|
-
|
425
|
-
it 'finishes the trial and marks the task failed' do
|
426
|
-
Arbiter.trial(trial)
|
427
|
-
expect(trial.status).to eq('failed')
|
428
|
-
expect(task1.status).to eq('failed')
|
429
|
-
expect(taskset.tasks_left).not_to include(task1)
|
430
|
-
expect(taskset).to be_queue_empty
|
431
|
-
expect(taskset.succeeded_count).to eq(0)
|
432
|
-
expect(taskset.failed_count).to eq(1)
|
433
|
-
end
|
434
|
-
end
|
435
|
-
|
436
|
-
context 'not-enough to judge failed' do
|
437
|
-
it 'does nothing' do
|
438
|
-
Arbiter.trial(trial)
|
439
|
-
expect(task1.status).to be_blank
|
440
|
-
expect(taskset.tasks_left).to include(task1)
|
441
|
-
expect(taskset).to be_queue_empty
|
442
|
-
expect(taskset.succeeded_count).to eq(0)
|
443
|
-
expect(taskset.failed_count).to eq(0)
|
444
|
-
end
|
445
|
-
end
|
446
|
-
end
|
447
|
-
|
448
|
-
context 'retriable' do
|
449
|
-
before do
|
450
|
-
trial2.finish('error', '', '', nil, nil, nil)
|
451
|
-
end
|
452
|
-
|
453
|
-
it 'requeue the task' do
|
454
|
-
Arbiter.trial(trial)
|
455
|
-
expect(task1.status).to be_nil
|
456
|
-
expect(taskset.tasks_left).to include(task1)
|
457
|
-
expect(taskset.dequeue_task(0)).to eq(task1)
|
458
|
-
expect(taskset.succeeded_count).to eq(0)
|
459
|
-
expect(taskset.failed_count).to eq(0)
|
460
|
-
end
|
461
|
-
end
|
462
|
-
end
|
463
|
-
|
464
|
-
context 'maximally retried' do
|
465
|
-
let(:trial2) { Trial.create(task1, slave) }
|
466
|
-
let(:trial3) { Trial.create(task1, slave) }
|
467
|
-
|
468
|
-
before do
|
469
|
-
trial2.finish('error', '', '', nil, nil, nil)
|
470
|
-
trial3.finish('error', '', '', nil, nil, nil)
|
471
|
-
end
|
472
|
-
|
473
|
-
it 'marks the task as failed' do
|
474
|
-
Arbiter.trial(trial)
|
475
|
-
expect(task1.status).to eq('failed')
|
476
|
-
expect(taskset.tasks_left).not_to include(task1)
|
477
|
-
expect(taskset).to be_queue_empty
|
478
|
-
expect(taskset.succeeded_count).to eq(0)
|
479
|
-
expect(taskset.failed_count).to eq(1)
|
480
|
-
end
|
481
|
-
end
|
482
|
-
|
483
|
-
context 'when re-triable' do
|
484
|
-
it 'requeue the task' do
|
485
|
-
Arbiter.trial(trial)
|
486
|
-
expect(task1.status).to be_nil
|
487
|
-
expect(taskset.tasks_left).to include(task1)
|
488
|
-
expect(taskset.dequeue_task(0)).to eq(task1)
|
489
|
-
expect(taskset.succeeded_count).to eq(0)
|
490
|
-
expect(taskset.failed_count).to eq(0)
|
491
|
-
end
|
492
|
-
end
|
493
|
-
end
|
494
|
-
end
|
495
|
-
end
|
496
|
-
end
|
497
|
-
end
|
@@ -1,53 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module RRRSpec
|
4
|
-
module Server
|
5
|
-
RSpec.describe Dispatcher do
|
6
|
-
before do
|
7
|
-
RRRSpec.configuration = Configuration.new
|
8
|
-
RRRSpec.configuration.redis = @redis
|
9
|
-
end
|
10
|
-
|
11
|
-
describe '#work' do
|
12
|
-
context 'when the worker no longer exists' do
|
13
|
-
let(:worker) { Worker.create('default', 'hostname1') }
|
14
|
-
before { worker }
|
15
|
-
|
16
|
-
it 'evicts the worker' do
|
17
|
-
Dispatcher.work
|
18
|
-
expect(Worker.list).not_to include(worker)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
context 'a worker exists' do
|
23
|
-
let(:taskset) do
|
24
|
-
Taskset.create(
|
25
|
-
'testuser', 'echo 1', 'echo 2', 'default', 'default', 3, 3, 5, 5
|
26
|
-
)
|
27
|
-
end
|
28
|
-
|
29
|
-
let(:worker1) { Worker.create('default', 'hostname1') }
|
30
|
-
let(:worker2) { Worker.create('default', 'hostname2') }
|
31
|
-
let(:worker3) { Worker.create('default', 'hostname3') }
|
32
|
-
let(:worker4) { Worker.create('default', 'hostname4') }
|
33
|
-
|
34
|
-
before do
|
35
|
-
ActiveTaskset.add(taskset)
|
36
|
-
worker1.update_current_taskset(taskset)
|
37
|
-
worker1.heartbeat(30)
|
38
|
-
worker2.heartbeat(30)
|
39
|
-
worker3.heartbeat(30)
|
40
|
-
worker4.heartbeat(30)
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'assignes worker upto the max_workers' do
|
44
|
-
Dispatcher.work
|
45
|
-
expect(worker1).to be_queue_empty
|
46
|
-
workers = [worker1, worker2, worker3, worker4]
|
47
|
-
expect(workers.count { |worker| worker.queue_empty? }).to eq(2)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module RRRSpec
|
4
|
-
module Server
|
5
|
-
class TestClass
|
6
|
-
include LogFilePersister
|
7
|
-
def self.after_save(&block); end
|
8
|
-
save_as_file :log, suffix: 'log'
|
9
|
-
|
10
|
-
attr_accessor :key
|
11
|
-
end
|
12
|
-
|
13
|
-
RSpec.describe LogFilePersister do
|
14
|
-
before do
|
15
|
-
RRRSpec.configuration = ServerConfiguration.new
|
16
|
-
RRRSpec.configuration.execute_log_text_path = '/tmp/log_path'
|
17
|
-
end
|
18
|
-
|
19
|
-
describe '#log_log_path' do
|
20
|
-
subject { TestClass.new }
|
21
|
-
|
22
|
-
it 'subsitutes colons in the key' do
|
23
|
-
subject.key = 'rrrspec:test'
|
24
|
-
expect(subject.log_log_path).to eq('/tmp/log_path/rrrspec/test_log.log')
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'subsitutes slashes in the key' do
|
28
|
-
subject.key = 'rrrspec:test/path'
|
29
|
-
expect(subject.log_log_path).to eq('/tmp/log_path/rrrspec/test_path_log.log')
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,55 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module RRRSpec
|
4
|
-
module Server
|
5
|
-
module Persistence
|
6
|
-
RSpec.describe Taskset do
|
7
|
-
before do
|
8
|
-
RRRSpec.configuration = ServerConfiguration.new
|
9
|
-
RRRSpec.configuration.redis = @redis
|
10
|
-
RRRSpec.configuration.execute_log_text_path = Dir.mktmpdir
|
11
|
-
end
|
12
|
-
|
13
|
-
before do
|
14
|
-
@worker, @taskset, @task, @worker_log, @slave, @trial =
|
15
|
-
RRRSpec.finished_fullset
|
16
|
-
Persister.persist(@taskset)
|
17
|
-
end
|
18
|
-
|
19
|
-
describe '#as_nodetail_json' do
|
20
|
-
it 'produces a json object' do
|
21
|
-
h = @taskset.to_h
|
22
|
-
h.delete('slaves')
|
23
|
-
h.delete('tasks')
|
24
|
-
h.delete('worker_logs')
|
25
|
-
|
26
|
-
expect(
|
27
|
-
JSON.parse(JSON.generate(Taskset.first.as_nodetail_json()))
|
28
|
-
).to eq(
|
29
|
-
JSON.parse(JSON.generate(h))
|
30
|
-
)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
describe '#as_full_json' do
|
35
|
-
it 'produces a json object' do
|
36
|
-
h = @taskset.to_h
|
37
|
-
h['slaves'] = [@slave.to_h]
|
38
|
-
|
39
|
-
task_h = @task.to_h
|
40
|
-
task_h['trials'] = [@trial.to_h]
|
41
|
-
h['tasks'] = [task_h]
|
42
|
-
|
43
|
-
h['worker_logs'] = [@worker_log.to_h]
|
44
|
-
|
45
|
-
expect(
|
46
|
-
JSON.parse(JSON.generate(Taskset.first.as_full_json()))
|
47
|
-
).to eq(
|
48
|
-
JSON.parse(JSON.generate(h))
|
49
|
-
)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
@@ -1,125 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module RRRSpec
|
4
|
-
module Server
|
5
|
-
RSpec.describe Persister do
|
6
|
-
before do
|
7
|
-
RRRSpec.configuration = ServerConfiguration.new
|
8
|
-
RRRSpec.configuration.redis = @redis
|
9
|
-
RRRSpec.configuration.execute_log_text_path = Dir.mktmpdir
|
10
|
-
end
|
11
|
-
|
12
|
-
before do
|
13
|
-
@worker, @taskset, @task, @worker_log, @slave, @trial =
|
14
|
-
RRRSpec.finished_fullset
|
15
|
-
end
|
16
|
-
|
17
|
-
after do
|
18
|
-
FileUtils.remove_entry_secure(RRRSpec.configuration.execute_log_text_path)
|
19
|
-
end
|
20
|
-
|
21
|
-
describe '.persist' do
|
22
|
-
let(:task_json) do
|
23
|
-
{
|
24
|
-
taskset: {key: @taskset.key},
|
25
|
-
estimate_sec: @task.estimate_sec,
|
26
|
-
key: @task.key,
|
27
|
-
spec_file: @task.spec_file,
|
28
|
-
status: @task.status,
|
29
|
-
trials: [{key: @trial.key}],
|
30
|
-
}
|
31
|
-
end
|
32
|
-
|
33
|
-
let(:slave_json) do
|
34
|
-
{
|
35
|
-
key: @slave.key,
|
36
|
-
log: @slave.log,
|
37
|
-
status: @slave.status,
|
38
|
-
trials: [{key: @trial.key}],
|
39
|
-
}
|
40
|
-
end
|
41
|
-
|
42
|
-
def log_path_of(filename)
|
43
|
-
File.join(RRRSpec.configuration.execute_log_text_path, filename)
|
44
|
-
end
|
45
|
-
|
46
|
-
let(:taskset_log_name) { @taskset.key.gsub(/\//, '_').gsub(/:/, '/') + "_log.log" }
|
47
|
-
let(:worker_log_name) { @worker_log.key.gsub(/\//, '_').gsub(/:/, '/') + "_worker_log.log" }
|
48
|
-
let(:slave_log_name) { @slave.key.gsub(/\//, '_').gsub(/:/, '/') + "_slave_log.log" }
|
49
|
-
let(:trial_stdout_name) { @trial.key.gsub(/\//, '_').gsub(/:/, '/') + "_stdout.log" }
|
50
|
-
let(:trial_stderr_name) { @trial.key.gsub(/\//, '_').gsub(/:/, '/') + "_stderr.log" }
|
51
|
-
|
52
|
-
def eq_json(actual, expected)
|
53
|
-
expect(
|
54
|
-
JSON.parse(JSON.generate(actual))
|
55
|
-
).to eq(
|
56
|
-
JSON.parse(JSON.generate(expected))
|
57
|
-
)
|
58
|
-
end
|
59
|
-
|
60
|
-
def check_persistence
|
61
|
-
Persister.persist(@taskset)
|
62
|
-
p_taskset = Persistence::Taskset.first
|
63
|
-
eq_json(p_taskset.as_short_json, @taskset)
|
64
|
-
|
65
|
-
expect(p_taskset.tasks.size).to eq(1)
|
66
|
-
p_task = p_taskset.tasks.first
|
67
|
-
eq_json(p_task.as_short_json, task_json)
|
68
|
-
|
69
|
-
trial = @task.trials[0]
|
70
|
-
expect(p_task.trials.size).to eq(1)
|
71
|
-
p_trial = p_task.trials.first
|
72
|
-
eq_json(p_trial.as_short_json, @trial)
|
73
|
-
|
74
|
-
expect(p_taskset.slaves.size).to eq(1)
|
75
|
-
p_slave = p_taskset.slaves.first
|
76
|
-
eq_json(p_slave.as_short_json, slave_json)
|
77
|
-
|
78
|
-
expect(p_taskset.worker_logs.size).to eq(1)
|
79
|
-
p_worker_log = p_taskset.worker_logs.first
|
80
|
-
eq_json(p_worker_log.as_short_json, @worker_log)
|
81
|
-
end
|
82
|
-
|
83
|
-
it 'persists the whole taskset' do
|
84
|
-
check_persistence
|
85
|
-
end
|
86
|
-
|
87
|
-
context 'when logs are too long' do
|
88
|
-
before do
|
89
|
-
RRRSpec.redis.hset(@trial.key, 'stdout', 'out' * 30000)
|
90
|
-
end
|
91
|
-
|
92
|
-
it 'saves full logs to the files' do
|
93
|
-
Persister.persist(@taskset)
|
94
|
-
expect(File.read(log_path_of(trial_stdout_name))).to eq(@trial.stdout)
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
|
99
|
-
it 'creates log text files' do
|
100
|
-
Persister.persist(@taskset)
|
101
|
-
|
102
|
-
expect(File.read(log_path_of(taskset_log_name))).to eq(@taskset.log)
|
103
|
-
expect(File.read(log_path_of(worker_log_name))).to eq(@worker_log.log)
|
104
|
-
expect(File.read(log_path_of(slave_log_name))).to eq(@slave.log)
|
105
|
-
expect(File.read(log_path_of(trial_stdout_name))).to eq(@trial.stdout)
|
106
|
-
expect(File.read(log_path_of(trial_stderr_name))).to eq(@trial.stderr)
|
107
|
-
end
|
108
|
-
|
109
|
-
context "trial is finished after the taskset's finish" do
|
110
|
-
before do
|
111
|
-
@late_trial = Trial.create(@task, @slave)
|
112
|
-
@late_trial.start
|
113
|
-
Timecop.freeze(Time.now+1) do
|
114
|
-
@late_trial.finish('error', '', '', nil, nil, nil)
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
it "does not persist trials finished after taskset's finish" do
|
119
|
-
check_persistence
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module RRRSpec
|
4
|
-
module Server
|
5
|
-
RSpec.describe StatisticsUpdater do
|
6
|
-
before do
|
7
|
-
RRRSpec.configuration = ServerConfiguration.new
|
8
|
-
RRRSpec.configuration.redis = @redis
|
9
|
-
|
10
|
-
@worker, @taskset, @task, @worker_log, @slave, @trial =
|
11
|
-
RRRSpec.finished_fullset
|
12
|
-
end
|
13
|
-
|
14
|
-
describe '.update_estimate_sec' do
|
15
|
-
before { Persister.persist(@taskset) }
|
16
|
-
|
17
|
-
xit 'updates estimation of the time taken to finish the tasks' do
|
18
|
-
pending "sqlite3 doesn't have UNIT_TIMESTAMP function"
|
19
|
-
Persister.update_estimate_sec(@taskset)
|
20
|
-
expect(RRRSpec::TasksetEstimation.estimate_secs(@taskset.taskset_class)).to eq(
|
21
|
-
{"spec/test_spec.rb" => 0}
|
22
|
-
)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
data/spec/spec_helper.rb
DELETED
@@ -1,76 +0,0 @@
|
|
1
|
-
# This file was generated by the `rspec --init` command. Conventionally, all
|
2
|
-
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
3
|
-
# Require this file using `require "spec_helper"` to ensure that it is only
|
4
|
-
# loaded once.
|
5
|
-
#
|
6
|
-
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
7
|
-
require 'rrrspec/server'
|
8
|
-
require 'tmpdir'
|
9
|
-
require 'database_cleaner'
|
10
|
-
require 'timecop'
|
11
|
-
require 'fixture'
|
12
|
-
|
13
|
-
RSpec.configure do |config|
|
14
|
-
config.raise_errors_for_deprecations!
|
15
|
-
config.disable_monkey_patching!
|
16
|
-
config.run_all_when_everything_filtered = true
|
17
|
-
config.filter_run :focus
|
18
|
-
|
19
|
-
# Run specs in random order to surface order dependencies. If you find an
|
20
|
-
# order dependency and want to debug it, you can fix the order by providing
|
21
|
-
# the seed, which is printed after each run.
|
22
|
-
# --seed 1234
|
23
|
-
config.order = 'random'
|
24
|
-
|
25
|
-
pid = nil
|
26
|
-
config.before(:suite) do
|
27
|
-
pid = Kernel.spawn("redis-server --port 9999 --save ''",
|
28
|
-
in: '/dev/null', out: '/dev/null', err: '/dev/null')
|
29
|
-
redis = Redis.new(port: 9999)
|
30
|
-
retry_count = 1
|
31
|
-
loop do
|
32
|
-
begin
|
33
|
-
redis.client.connect
|
34
|
-
break
|
35
|
-
rescue Redis::CannotConnectError
|
36
|
-
if retry_count < 10
|
37
|
-
retry_count += 1
|
38
|
-
sleep 0.01
|
39
|
-
retry
|
40
|
-
end
|
41
|
-
raise
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
config.before(:each) do
|
47
|
-
@redis = Redis.new(port: 9999)
|
48
|
-
@redis.flushall
|
49
|
-
|
50
|
-
RRRSpec.configuration = nil
|
51
|
-
RRRSpec.flushredis
|
52
|
-
RRRSpec.hostname = 'testhostname'
|
53
|
-
end
|
54
|
-
|
55
|
-
config.after(:suite) do
|
56
|
-
Process.kill('KILL', pid) if pid
|
57
|
-
end
|
58
|
-
|
59
|
-
config.before(:suite) do
|
60
|
-
ActiveRecord::Base.establish_connection(
|
61
|
-
adapter: "sqlite3", database: ":memory:"
|
62
|
-
)
|
63
|
-
ActiveRecord::Migration.verbose = false
|
64
|
-
ActiveRecord::Migrator.up "db/migrate"
|
65
|
-
DatabaseCleaner.strategy = :transaction
|
66
|
-
DatabaseCleaner.clean_with(:truncation)
|
67
|
-
end
|
68
|
-
|
69
|
-
config.before(:each) do
|
70
|
-
DatabaseCleaner.start
|
71
|
-
end
|
72
|
-
|
73
|
-
config.after(:each) do
|
74
|
-
DatabaseCleaner.clean
|
75
|
-
end
|
76
|
-
end
|