rrrspec-server 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,121 @@
1
+ require 'spec_helper'
2
+
3
+ module RRRSpec
4
+ module Server
5
+ describe Persister do
6
+ before do
7
+ RRRSpec.configuration = Configuration.new
8
+ RRRSpec.configuration.redis = @redis
9
+ end
10
+
11
+ before do
12
+ @worker, @taskset, @task, @worker_log, @slave, @trial =
13
+ RRRSpec.finished_fullset
14
+ end
15
+
16
+ describe '.persist' do
17
+ let(:task_json) do
18
+ {
19
+ taskset: {key: @taskset.key},
20
+ estimate_sec: @task.estimate_sec,
21
+ key: @task.key,
22
+ spec_file: @task.spec_file,
23
+ status: @task.status,
24
+ trials: [{key: @trial.key}],
25
+ }
26
+ end
27
+
28
+ let(:slave_json) do
29
+ {
30
+ key: @slave.key,
31
+ log: @slave.log,
32
+ status: @slave.status,
33
+ trials: [{key: @trial.key}],
34
+ }
35
+ end
36
+
37
+ def eq_json(actual, expected)
38
+ expect(
39
+ JSON.parse(JSON.generate(actual))
40
+ ).to eq(
41
+ JSON.parse(JSON.generate(expected))
42
+ )
43
+ end
44
+
45
+ def check_persistence
46
+ Persister.persist(@taskset)
47
+ p_taskset = Persistence::Taskset.first
48
+ eq_json(p_taskset.as_short_json, @taskset)
49
+
50
+ expect(p_taskset.tasks.size).to eq(1)
51
+ p_task = p_taskset.tasks.first
52
+ eq_json(p_task.as_short_json, task_json)
53
+
54
+ trial = @task.trials[0]
55
+ expect(p_task.trials.size).to eq(1)
56
+ p_trial = p_task.trials.first
57
+ eq_json(p_trial.as_short_json, @trial)
58
+
59
+ expect(p_taskset.slaves.size).to eq(1)
60
+ p_slave = p_taskset.slaves.first
61
+ eq_json(p_slave.as_short_json, slave_json)
62
+
63
+ expect(p_taskset.worker_logs.size).to eq(1)
64
+ p_worker_log = p_taskset.worker_logs.first
65
+ eq_json(p_worker_log.as_short_json, @worker_log)
66
+ end
67
+
68
+ it 'persists the whole taskset' do
69
+ check_persistence
70
+ end
71
+
72
+ context "trial is finished after the taskset's finish" do
73
+ before do
74
+ @late_trial = Trial.create(@task, @slave)
75
+ @late_trial.start
76
+ Timecop.freeze(Time.now+1) do
77
+ @late_trial.finish('error', '', '', nil, nil, nil)
78
+ end
79
+ end
80
+
81
+ it "does not persist trials finished after taskset's finish" do
82
+ check_persistence
83
+ end
84
+ end
85
+ end
86
+
87
+ describe '.create_api_cache' do
88
+ before { Persister.persist(@taskset) }
89
+
90
+ it 'writes cached json file' do
91
+ Dir.mktmpdir do |dir|
92
+ Persister.create_api_cache(@taskset, dir)
93
+ json_path = File.join(dir, 'v1', 'tasksets', @taskset.key.gsub(':', '-'))
94
+ expect(File).to exist(json_path)
95
+ expect(File).to exist(json_path + ".gz")
96
+
97
+ p_taskset = Persistence::Taskset.first
98
+ expect(IO.read(json_path)).to eq(
99
+ JSON.generate(p_taskset.as_full_json.update('is_full' => true))
100
+ )
101
+ expect(Zlib::GzipReader.open(json_path + ".gz").read).to eq(
102
+ IO.read(json_path)
103
+ )
104
+ end
105
+ end
106
+ end
107
+
108
+ describe '.update_estimate_sec' do
109
+ before { Persister.persist(@taskset) }
110
+
111
+ it 'udpates estimation of the time taken to finish the tasks' do
112
+ pending "sqlite3 doesn't have UNIT_TIMESTAMP function"
113
+ Persister.update_estimate_sec(@taskset)
114
+ expect(RRRSpec::TasksetEstimation.estimate_secs(@taskset.taskset_class)).to eq(
115
+ {"spec/test_spec.rb" => 0}
116
+ )
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,75 @@
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.treat_symbols_as_metadata_keys_with_true_values = true
15
+ config.run_all_when_everything_filtered = true
16
+ config.filter_run :focus
17
+
18
+ # Run specs in random order to surface order dependencies. If you find an
19
+ # order dependency and want to debug it, you can fix the order by providing
20
+ # the seed, which is printed after each run.
21
+ # --seed 1234
22
+ config.order = 'random'
23
+
24
+ pid = nil
25
+ config.before(:suite) do
26
+ pid = Kernel.spawn("redis-server --port 9999 --save ''",
27
+ in: '/dev/null', out: '/dev/null', err: '/dev/null')
28
+ redis = Redis.new(port: 9999)
29
+ retry_count = 1
30
+ loop do
31
+ begin
32
+ redis.client.connect
33
+ break
34
+ rescue Redis::CannotConnectError
35
+ if retry_count < 10
36
+ retry_count += 1
37
+ sleep 0.01
38
+ retry
39
+ end
40
+ raise
41
+ end
42
+ end
43
+ end
44
+
45
+ config.before(:each) do
46
+ @redis = Redis.new(port: 9999)
47
+ @redis.flushall
48
+
49
+ RRRSpec.configuration = nil
50
+ RRRSpec.flushredis
51
+ RRRSpec.hostname = 'testhostname'
52
+ end
53
+
54
+ config.after(:suite) do
55
+ Process.kill('KILL', pid) if pid
56
+ end
57
+
58
+ config.before(:suite) do
59
+ ActiveRecord::Base.establish_connection(
60
+ adapter: "sqlite3", database: ":memory:"
61
+ )
62
+ ActiveRecord::Migration.verbose = false
63
+ ActiveRecord::Migrator.up "db/migrate"
64
+ DatabaseCleaner.strategy = :transaction
65
+ DatabaseCleaner.clean_with(:truncation)
66
+ end
67
+
68
+ config.before(:each) do
69
+ DatabaseCleaner.start
70
+ end
71
+
72
+ config.after(:each) do
73
+ DatabaseCleaner.clean
74
+ end
75
+ end
data/tasks/db.rake ADDED
@@ -0,0 +1,62 @@
1
+ require "active_support/core_ext/string"
2
+ require "active_record"
3
+ require "rrrspec/server"
4
+
5
+ RRRSpec::Server::MIGRATIONS_DIR = File.expand_path('../../db/migrate', __FILE__)
6
+
7
+ namespace :rrrspec do
8
+ namespace :server do
9
+ task :server_config do
10
+ RRRSpec.setup(RRRSpec::Server::ServerConfiguration.new, [])
11
+ ActiveRecord::Base.establish_connection(**RRRSpec.configuration.persistence_db)
12
+ ActiveRecord::Migrator.migrations_paths = [RRRSpec::Server::MIGRATIONS_DIR]
13
+ end
14
+
15
+ namespace :db do
16
+ task :create => 'rrrspec:server:server_config' do
17
+ config = RRRSpec.configuration.persistence_db
18
+
19
+ if config[:adapter] =~ /sqlite/
20
+ if File.exist?(config[:database])
21
+ $stderr.puts "#{config[:database]} already exists"
22
+ else
23
+ ActiveRecord::Base.connection
24
+ end
25
+ elsif config[:adapter] =~ /mysql/
26
+ ActiveRecord::Base.connection.create_database(config[:database])
27
+ else
28
+ fail 'unknown database adapter'
29
+ end
30
+ end
31
+
32
+ desc "migrate the database"
33
+ task :migrate => 'rrrspec:server:server_config' do
34
+ ActiveRecord::Migrator.migrate(ActiveRecord::Migrator.migrations_paths)
35
+ Rake::Task["rrrspec:server:db:schema:dump"].invoke
36
+ end
37
+
38
+ desc "create a migration file"
39
+ task :create_migration, "name" do |t, args|
40
+ version = Time.now.utc.strftime("%Y%m%d%H%M%S")
41
+ filepath = File.join(RRRSpec::Server::MIGRATIONS_DIR, "#{version}_#{args.name}.rb")
42
+
43
+ open(filepath, "w") do |f|
44
+ f.write(<<-EOF.strip_heredoc)
45
+ class #{args.name.camelize} < ActiveRecord::Migration
46
+ def change
47
+ end
48
+ end
49
+ EOF
50
+ end
51
+ end
52
+
53
+ namespace :schema do
54
+ task :dump => 'rrrspec:server:server_config' do
55
+ File.open(File.expand_path('../../db/schema.rb', __FILE__), "w:utf-8") do |file|
56
+ ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
metadata ADDED
@@ -0,0 +1,256 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rrrspec-server
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Masaya Suzuki
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-02-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: database_cleaner
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 1.2.0
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 1.2.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: mysql2
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: sqlite3
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: timecop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: activerecord
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: '3.0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: '3.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: activerecord-import
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 0.3.1
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ~>
123
+ - !ruby/object:Gem::Version
124
+ version: 0.3.1
125
+ - !ruby/object:Gem::Dependency
126
+ name: activesupport
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: bundler
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: redis
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - '>='
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: rrrspec-client
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - '>='
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: thor
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - '>='
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - '>='
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ description: Execute RSpec in a distributed manner
196
+ email:
197
+ - draftcode@gmail.com
198
+ executables:
199
+ - rrrspec-server
200
+ extensions: []
201
+ extra_rdoc_files: []
202
+ files:
203
+ - .rspec
204
+ - Gemfile
205
+ - Rakefile
206
+ - bin/rrrspec-server
207
+ - db/migrate/20131105050718_create_tables.rb
208
+ - db/schema.rb
209
+ - lib/rrrspec/server.rb
210
+ - lib/rrrspec/server/arbiter.rb
211
+ - lib/rrrspec/server/cli.rb
212
+ - lib/rrrspec/server/configuration.rb
213
+ - lib/rrrspec/server/dispatcher.rb
214
+ - lib/rrrspec/server/persistent_models.rb
215
+ - lib/rrrspec/server/persister.rb
216
+ - lib/rrrspec/server/version.rb
217
+ - lib/rrrspec/server/worker_runner.rb
218
+ - rrrspec-server.gemspec
219
+ - spec/fixture.rb
220
+ - spec/rrrspec/server/arbiter_spec.rb
221
+ - spec/rrrspec/server/dispatcher_spec.rb
222
+ - spec/rrrspec/server/persistent_models_spec.rb
223
+ - spec/rrrspec/server/persister_spec.rb
224
+ - spec/spec_helper.rb
225
+ - tasks/db.rake
226
+ homepage: ''
227
+ licenses:
228
+ - MIT
229
+ metadata: {}
230
+ post_install_message:
231
+ rdoc_options: []
232
+ require_paths:
233
+ - lib
234
+ required_ruby_version: !ruby/object:Gem::Requirement
235
+ requirements:
236
+ - - '>='
237
+ - !ruby/object:Gem::Version
238
+ version: '0'
239
+ required_rubygems_version: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - '>='
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ requirements: []
245
+ rubyforge_project:
246
+ rubygems_version: 2.0.3
247
+ signing_key:
248
+ specification_version: 4
249
+ summary: Execute RSpec in a distributed manner
250
+ test_files:
251
+ - spec/fixture.rb
252
+ - spec/rrrspec/server/arbiter_spec.rb
253
+ - spec/rrrspec/server/dispatcher_spec.rb
254
+ - spec/rrrspec/server/persistent_models_spec.rb
255
+ - spec/rrrspec/server/persister_spec.rb
256
+ - spec/spec_helper.rb