mesa_test 0.0.14 → 0.0.16
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/bin/mesa_test +124 -141
- data/lib/mesa_test.rb +154 -60
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a8cc4cbf769460ee63c65aaff5c1e61d5d762fe7
|
4
|
+
data.tar.gz: '096c818d3a7f9f0e86cc2a2fe1dc59d03476cc51'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 92f2cfd3aa55cb4bcc396499d993bc994f112c8f192a938966120f05c174cd125308d922889848a78aef4f78aae329f1157794344d43be3486036c75ab26a1dd
|
7
|
+
data.tar.gz: 73550ea45adde5b962ef00bea03efaadab4b378601286239c78b4ccf62cf1bccd2478c3d365bbfc32d5d3239e131df78f3f59bc37d6011c03120f86a7fc027f8
|
data/bin/mesa_test
CHANGED
@@ -5,6 +5,8 @@ require 'mesa_test'
|
|
5
5
|
require 'thor'
|
6
6
|
|
7
7
|
class MesaTest < Thor
|
8
|
+
DEVLOPMENT_URI = 'http://localhost:3000'.freeze
|
9
|
+
|
8
10
|
desc 'setup [CONFIG_FILE]', 'Setup MesaTestHub config file.'
|
9
11
|
long_desc <<-LONGDESC
|
10
12
|
If optional CONFIG_FILE is provided, search for that file and load it
|
@@ -17,11 +19,11 @@ class MesaTest < Thor
|
|
17
19
|
force_setup: true)
|
18
20
|
end
|
19
21
|
|
20
|
-
desc 'test_one MESA_DIR TEST_CASE',
|
22
|
+
desc 'test_one MESA_DIR TEST_CASE', 'run, check, and submit one test case'
|
21
23
|
long_desc <<-LONGDESC
|
22
24
|
Run and check TEST_CASE, which resides in MESA_DIR/star/test_suite. Then
|
23
25
|
report results to MesaTestHub. TEST_CASE can also be an integer corresponding
|
24
|
-
to the line number of the test name in its do1_test_source file (or a
|
26
|
+
to the line number of the test name in its do1_test_source file (or a
|
25
27
|
concatenated version of that file if no module is specified). Modules are
|
26
28
|
searched/concatenated in this order:
|
27
29
|
|
@@ -49,38 +51,11 @@ class MesaTest < Thor
|
|
49
51
|
option :module, type: :string, default: :all
|
50
52
|
option :submit, type: :boolean, default: true
|
51
53
|
def test_one(mesa_dir, test_case_name)
|
52
|
-
if options[:submit]
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
check_user_and_computer s
|
59
|
-
end
|
60
|
-
|
61
|
-
# set up and check mesa directory (doesn't really check to see if it's
|
62
|
-
# installed, just to see if it has a version number and a test suite
|
63
|
-
# directory)
|
64
|
-
m = Mesa.new mesa_dir: mesa_dir
|
65
|
-
raise MesaDirError, "Invalid MESA_DIR: #{mesa_dir}. Please download and " +
|
66
|
-
"install a valid MESA version or provide the path to one." unless
|
67
|
-
m.installed?
|
68
|
-
m.load_test_source_data
|
69
|
-
|
70
|
-
# choose whether to update checksums
|
71
|
-
m.update_checksums = !options[:diff]
|
72
|
-
|
73
|
-
# make sure the test case is valid
|
74
|
-
t = m.find_test_case(test_case_name: test_case_name,
|
75
|
-
mod: options[:module].downcase.to_sym)
|
76
|
-
if t.nil?
|
77
|
-
msg = "No such test case, #{test_case_name} found in any of "
|
78
|
-
msg << MesaTestCase.modules.map do |mod|
|
79
|
-
File.join(m.test_suite_dir(mod: mod), 'do1_test_source')
|
80
|
-
end.join(' or ')
|
81
|
-
msg << '.'
|
82
|
-
raise TestCaseDirError, msg
|
83
|
-
end
|
54
|
+
s = create_and_check_submitter(force: options[:force]) if options[:submit]
|
55
|
+
m = create_and_check_mesa(mesa_dir: mesa_dir, diff: options[:diff],
|
56
|
+
mod: options[:module].downcase.to_sym)
|
57
|
+
t = create_and_check_test_case(mesa: m, test_case_name: test_case_name,
|
58
|
+
mod: options[:module].downcase.to_sym)
|
84
59
|
|
85
60
|
# clean and run test
|
86
61
|
t.clean
|
@@ -89,17 +64,16 @@ class MesaTest < Thor
|
|
89
64
|
# log results
|
90
65
|
t.log_results if options[:log]
|
91
66
|
|
67
|
+
# bail out if not submitting
|
68
|
+
return unless options[:submit]
|
69
|
+
|
92
70
|
# submit results
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
puts "Done."
|
97
|
-
puts ""
|
98
|
-
end
|
71
|
+
print 'Submitting results to ' + s.base_uri + '... '
|
72
|
+
s.submit(t)
|
73
|
+
puts "Done.\n"
|
99
74
|
end
|
100
75
|
|
101
|
-
|
102
|
-
desc "test_all MESA_DIR", "run, check, and submit all test cases"
|
76
|
+
desc 'test_all MESA_DIR', 'run, check, and submit all test cases'
|
103
77
|
long_desc <<-LONGDESC
|
104
78
|
Run and check all test cases residing in MESA_DIR/star/test_suite. Then
|
105
79
|
report results to MesaTestHub. Specifically, runs and checks all tests
|
@@ -113,6 +87,9 @@ class MesaTest < Thor
|
|
113
87
|
in ~/.mesa_test.yml are correct. Only relevant if --submit option is on
|
114
88
|
(by default it is).
|
115
89
|
|
90
|
+
With --module option, select which module to search through, with the default
|
91
|
+
being "all" (search all modules in order). Example: --module=star.
|
92
|
+
|
116
93
|
With --log option, save yml file of test results in test directory and a
|
117
94
|
summary in the test suite directory. On by default. Shut off with --no-log.
|
118
95
|
|
@@ -122,34 +99,19 @@ class MesaTest < Thor
|
|
122
99
|
option :diff, type: :boolean, default: true
|
123
100
|
option :force, type: :boolean, aliases: '-f'
|
124
101
|
option :log, type: :boolean, default: true
|
102
|
+
option :module, type: :string, default: :all
|
125
103
|
option :submit, type: :boolean, default: true
|
126
104
|
def test_all(mesa_dir)
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
unless options[:force]
|
131
|
-
unless s.confirm_computer_data
|
132
|
-
s.setup
|
133
|
-
end
|
134
|
-
end
|
135
|
-
check_user_and_computer s
|
136
|
-
end
|
137
|
-
|
138
|
-
# set up and check mesa directory (doesn't really check to see if it's
|
139
|
-
# installed, just to see if it has a version number and a test suite
|
140
|
-
# directory)
|
141
|
-
m = Mesa.new mesa_dir: mesa_dir
|
142
|
-
raise MesaDirError, "Invalid MESA_DIR: #{mesa_dir}. Please download and " +
|
143
|
-
"install a valid MESA version or provide the path to one." unless
|
144
|
-
m.installed?
|
145
|
-
m.load_test_source_data
|
105
|
+
s = create_and_check_submitter(force: options[:force]) if options[:submit]
|
106
|
+
m = create_and_check_mesa(mesa_dir: mesa_dir, diff: options[:diff],
|
107
|
+
mod: options[:module].downcase.to_sym)
|
146
108
|
|
147
109
|
# run all tests
|
148
|
-
m.
|
149
|
-
|
110
|
+
m.each_test_run_and_diff(log_results: options[:log],
|
111
|
+
mod: options[:module].downcase.to_sym)
|
150
112
|
|
151
113
|
# submit all tests
|
152
|
-
s.submit_all(m) if options[:submit]
|
114
|
+
s.submit_all(m, options[:module].downcase.to_sym) if options[:submit]
|
153
115
|
end
|
154
116
|
|
155
117
|
desc 'submit_one MESA_DIR TEST_CASE', 'submit one completed test case'
|
@@ -159,7 +121,7 @@ class MesaTest < Thor
|
|
159
121
|
name in its do1_test_source file (or a concatenated version of that file if
|
160
122
|
no module is specified). Modules are searched/concatenated in this order:
|
161
123
|
|
162
|
-
#{MesaTestCase.modules.map { |mod| ' ' + mod.to_s }.join(
|
124
|
+
#{MesaTestCase.modules.map { |mod| ' ' + mod.to_s }.join(', ')}
|
163
125
|
|
164
126
|
With --force option, skip confirmation of computer details, assuming values
|
165
127
|
in ~/.mesa_test.yml are correct.
|
@@ -170,35 +132,11 @@ class MesaTest < Thor
|
|
170
132
|
option :force, type: :boolean, aliases: '-f'
|
171
133
|
option :module, type: :string, aliases: '-m', default: 'all'
|
172
134
|
def submit_one(mesa_dir, test_case_name)
|
173
|
-
s =
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
check_user_and_computer s
|
179
|
-
|
180
|
-
# set up and check mesa directory (doesn't really check to see if it's
|
181
|
-
# installed, just to see if it has a version number and a test suite
|
182
|
-
# directory)
|
183
|
-
m = Mesa.new mesa_dir: mesa_dir
|
184
|
-
unless m.installed?
|
185
|
-
raise MesaDirError, "Invalid MESA_DIR: #{mesa_dir}. Please download " \
|
186
|
-
'and install a valid MESA version or provide the path to one.'
|
187
|
-
end
|
188
|
-
m.load_test_source_data
|
189
|
-
|
190
|
-
# make sure the test case is valid
|
191
|
-
t = m.find_test_case(test_case_name: test_case_name,
|
192
|
-
mod: options[:module].downcase.to_sym)
|
193
|
-
if t.nil?
|
194
|
-
msg = "No such test case, #{test_case_name} found in any of "
|
195
|
-
msg << MesaTestCase.modules.map do |mod|
|
196
|
-
File.join(m.test_suite_dir(mod: mod), 'do1_test_source')
|
197
|
-
end.join(' or ')
|
198
|
-
msg << '.'
|
199
|
-
raise TestCaseDirError, msg
|
200
|
-
end
|
201
|
-
|
135
|
+
s = create_and_check_submitter(force: options[:force])
|
136
|
+
m = create_and_check_mesa(mesa_dir: mesa_dir,
|
137
|
+
mod: options[:module].downcase.to_sym)
|
138
|
+
t = create_and_check_test_case(mesa: m, test_case_name: test_case_name,
|
139
|
+
mod: options[:module].downcase.to_sym)
|
202
140
|
# load test results
|
203
141
|
t.load_results
|
204
142
|
|
@@ -216,103 +154,105 @@ class MesaTest < Thor
|
|
216
154
|
|
217
155
|
With --force option, skip confirmation of computer details, assuming values
|
218
156
|
in ~/.mesa_test.yml are correct.
|
157
|
+
|
158
|
+
With --module option, select which module to search through, with the default
|
159
|
+
being "all" (search all modules in order). Example: --module=star.
|
219
160
|
LONGDESC
|
220
161
|
option :force, type: :boolean, aliases: '-f'
|
162
|
+
option :module, type: :string, aliases: '-m', default: 'all'
|
221
163
|
def submit_all(mesa_dir)
|
222
|
-
s =
|
223
|
-
|
224
|
-
|
225
|
-
end
|
226
|
-
check_user_and_computer s
|
164
|
+
s = create_and_check_submitter(force: options[:force])
|
165
|
+
m = create_and_check_mesa(mesa_dir: mesa_dir,
|
166
|
+
mod: options[:module].downcase.to_sym)
|
227
167
|
|
228
|
-
#
|
229
|
-
|
230
|
-
# directory)
|
231
|
-
m = Mesa.new mesa_dir: mesa_dir
|
232
|
-
unless m.installed?
|
233
|
-
raise MesaDirError, "Invalid MESA_DIR: #{mesa_dir}. Please download " \
|
234
|
-
'and install a valid MESA version or provide the path to one.'
|
235
|
-
end
|
236
|
-
m.load_test_source_data
|
237
|
-
|
238
|
-
# run all tests
|
239
|
-
m.each_test_load_results
|
168
|
+
# load all test data
|
169
|
+
m.each_test_load_results(mod: options[:module].downcase.to_sym)
|
240
170
|
|
241
171
|
# submit all tests
|
242
|
-
s.submit_all(m)
|
172
|
+
s.submit_all(m, options[:module].downcase.to_sym)
|
243
173
|
end
|
244
174
|
|
245
|
-
|
246
|
-
desc "install VERSION_NUMBER MESA_DIR", 'download and install mesa release '+
|
175
|
+
desc 'install VERSION_NUMBER MESA_DIR', 'download and install mesa release '\
|
247
176
|
'VERSION_NUMBER to directory MESA_DIR'
|
248
177
|
long_desc <<-LONGDESC
|
249
|
-
Calls to svn to install mesa release VERSION_NUMBER into the directory
|
178
|
+
Calls to svn to install mesa release VERSION_NUMBER into the directory
|
250
179
|
MESA_DIR. Basically just an svn checkout followed by going into the directory
|
251
180
|
and running ./clean and ./install. SDK or compilers must be set up prior.
|
252
181
|
Does not affect the user's MESA_DIR or other environment variables.
|
253
182
|
LONGDESC
|
254
183
|
def install(version, mesa_dir)
|
255
|
-
m = Mesa.download(version_number:version, new_mesa_dir: mesa_dir)
|
184
|
+
m = Mesa.download(version_number: version, new_mesa_dir: mesa_dir)
|
256
185
|
m.clean
|
257
186
|
m.install
|
258
187
|
end
|
259
188
|
|
260
|
-
|
261
|
-
desc "install_and_test_all VERSION_NUMBER MESA_DIR", 'download and install ' +
|
189
|
+
desc 'install_and_test_all VERSION_NUMBER MESA_DIR', 'download and install '\
|
262
190
|
'mesa release VERSION_NUMBER to directory MESA_DIR and run/submit all tests'
|
263
191
|
long_desc <<-LONGDESC
|
264
|
-
Calls to svn to install mesa release VERSION_NUMBER into the directory
|
192
|
+
Calls to svn to install mesa release VERSION_NUMBER into the directory
|
265
193
|
MESA_DIR. Basically just an svn checkout followed by going into the directory
|
266
194
|
and running ./clean and ./install. SDK or compilers must be set up prior.
|
267
|
-
Once installation is complete, run the test suite, and report results to
|
195
|
+
Once installation is complete, run the test suite, and report results to
|
268
196
|
MesaTestHub. Does not affect the user's MESA_DIR or other environment
|
269
|
-
variables. This is basically a shortcut for running
|
197
|
+
variables. This is basically a shortcut for running
|
270
198
|
|
271
199
|
`mesa_test install SOME_VERSION SOME_DIR`
|
272
200
|
|
273
|
-
followed by
|
201
|
+
followed by
|
274
202
|
|
275
203
|
`mesa_test test_all SOME_DIR`
|
276
204
|
|
205
|
+
If VERSION_NUMBER is 'non-paxton', then the most recent commit by anyone
|
206
|
+
other than Bill Paxton ('bill_paxton') is tested and the --diff flag is
|
207
|
+
ignored and set to false. Note that using 'HEAD' for version number will
|
208
|
+
automatically select the most recent release, regardless of the author.
|
209
|
+
|
210
|
+
With --diff option, assume the checksums are up-to-date (behave like
|
211
|
+
each_test_run_and_diff), on by default. To update checksums after ./rn
|
212
|
+
(behave like each_test_run), use --no-diff.
|
213
|
+
|
277
214
|
Use flag --destroy to self destruct MESA_DIR after successful test
|
278
215
|
submission. Essentially does rm -rf MESA_DIR after the test suite. Useful
|
279
216
|
for automated testing without piling up disk space.
|
280
217
|
|
281
218
|
Use flag --force to skip confirmation of computer details if they can be
|
282
219
|
read from ~/.mesa_test.yml.
|
220
|
+
|
221
|
+
With --log option, save yml file of test results in test directory and a
|
222
|
+
summary in the test suite directory. On by default. Shut off with --no-log.
|
223
|
+
|
224
|
+
With --module option, select which module to search through, with the default
|
225
|
+
being "all". Example: --module=star.
|
283
226
|
LONGDESC
|
227
|
+
option :diff, type: :boolean, default: true
|
284
228
|
option :destroy, type: :boolean
|
229
|
+
option :log, type: :boolean, default: true
|
285
230
|
option :force, type: :boolean, aliases: '-f'
|
231
|
+
option :module, type: :string, aliases: '-m', default: 'all'
|
286
232
|
def install_and_test_all(version, mesa_dir)
|
287
|
-
s =
|
288
|
-
|
289
|
-
|
290
|
-
s.setup
|
291
|
-
end
|
292
|
-
end
|
293
|
-
|
294
|
-
m = Mesa.download(version_number:version, new_mesa_dir: mesa_dir)
|
233
|
+
s = create_and_check_submitter(force: options[:force])
|
234
|
+
mesa_version, diff = filter_version_and_diff(version, s)
|
235
|
+
m = Mesa.download(version_number: mesa_version, new_mesa_dir: mesa_dir)
|
295
236
|
m.clean
|
296
237
|
m.install
|
297
238
|
|
298
|
-
|
299
|
-
|
300
|
-
m.installed?
|
301
|
-
m.load_test_source_data
|
239
|
+
m = create_and_check_mesa(mesa_dir: mesa_dir, diff: diff,
|
240
|
+
mod: options[:module].downcase.to_sym)
|
302
241
|
|
303
|
-
# run all tests
|
304
|
-
|
242
|
+
# run all tests. Don't be fooled, whether or not a diff happens is set
|
243
|
+
# by the diff attribute of the mesa object, set above.
|
244
|
+
m.each_test_run_and_diff(mod: options[:module].downcase.to_sym,
|
245
|
+
log_results: options[:log])
|
305
246
|
|
306
247
|
# submit all tests
|
307
|
-
successfully_submitted = s.submit_all(m)
|
248
|
+
successfully_submitted = s.submit_all(m, options[:module].downcase.to_sym)
|
308
249
|
|
309
250
|
# if requested, and if submission successful, destroy the directory
|
310
|
-
if successfully_submitted
|
311
|
-
m.destroy
|
312
|
-
end
|
251
|
+
m.destroy if successfully_submitted && options[:destroy]
|
313
252
|
end
|
314
253
|
|
315
254
|
private
|
255
|
+
|
316
256
|
def check_user_and_computer(submitter)
|
317
257
|
computer_check = submitter.confirm_computer
|
318
258
|
if computer_check['valid']
|
@@ -323,9 +263,52 @@ class MesaTest < Thor
|
|
323
263
|
end
|
324
264
|
end
|
325
265
|
|
266
|
+
def create_and_check_submitter(force: false)
|
267
|
+
s = MesaTestSubmitter.new_from_config
|
268
|
+
# s = MesaTestSubmitter.new_from_config(base_uri: DEFAULT_URI)
|
269
|
+
unless force
|
270
|
+
s.setup unless s.confirm_computer_data
|
271
|
+
end
|
272
|
+
check_user_and_computer s
|
273
|
+
s
|
274
|
+
end
|
326
275
|
|
327
|
-
|
276
|
+
def create_and_check_mesa(mesa_dir:, diff: true, mod: :all)
|
277
|
+
m = Mesa.new mesa_dir: mesa_dir
|
278
|
+
unless m.installed?
|
279
|
+
raise MesaDirError, "Invalid MESA_DIR: #{mesa_dir}. Please download " \
|
280
|
+
'and install a valid MESA version or provide the path to one.'
|
281
|
+
end
|
282
|
+
m.load_test_source_data(mod: mod)
|
283
|
+
|
284
|
+
# choose whether to update checksums
|
285
|
+
m.update_checksums = !diff
|
286
|
+
m
|
287
|
+
end
|
328
288
|
|
289
|
+
def create_and_check_test_case(mesa:, test_case_name:, mod: :all)
|
290
|
+
t = mesa.find_test_case(test_case_name: test_case_name, mod: mod)
|
291
|
+
# return test case if it was found
|
292
|
+
return t unless t.nil?
|
293
|
+
# test case was not found. Throw an error.
|
294
|
+
msg = "No such test case, #{test_case_name} found in any of "
|
295
|
+
# this should care about the value in `mod`. Current behavior is only
|
296
|
+
# appropriate if `mod` is :all.
|
297
|
+
msg << MesaTestCase.modules.map do |this_mod|
|
298
|
+
File.join(m.test_suite_dir(mod: this_mod), 'do1_test_source')
|
299
|
+
end.join(' or ')
|
300
|
+
msg << '.'
|
301
|
+
raise TestCaseDirError, msg
|
302
|
+
end
|
303
|
+
|
304
|
+
def filter_version_and_diff(version, submitter)
|
305
|
+
if version.downcase == 'non-paxton'
|
306
|
+
[Mesa.last_non_paxton_revision(submitter.last_tested), false]
|
307
|
+
else
|
308
|
+
[version, options[:diff]]
|
309
|
+
end
|
310
|
+
end
|
311
|
+
end
|
329
312
|
|
330
313
|
# actually start the CLI
|
331
314
|
MesaTest.start(ARGV)
|
data/lib/mesa_test.rb
CHANGED
@@ -12,11 +12,16 @@ MesaDirError = Class.new(StandardError)
|
|
12
12
|
TestCaseDirError = Class.new(StandardError)
|
13
13
|
InvalidDataType = Class.new(StandardError)
|
14
14
|
|
15
|
+
Commit = Struct.new(:revision, :author, :datetime, :message)
|
16
|
+
DEFAULT_REVISION = 10_000
|
17
|
+
|
15
18
|
class MesaTestSubmitter
|
19
|
+
DEFAULT_URI = 'https://mesa-test-hub.herokuapp.com'.freeze
|
20
|
+
|
16
21
|
# set up config file for computer
|
17
22
|
def setup
|
18
23
|
update do |s|
|
19
|
-
shell.say 'This wizard will guide you through setting up a computer
|
24
|
+
shell.say 'This wizard will guide you through setting up a computer
|
20
25
|
profile and default data for test case submissions to MESATestHub. You
|
21
26
|
will be able to confirm entries at the end. Default/current values are always
|
22
27
|
shown in parentheses at the end of a prompt. Pressing enter will accept the
|
@@ -74,6 +79,12 @@ e-mail and password will be stored in plain text.'
|
|
74
79
|
"7.2.0)? (#{s.compiler_version}): ", :blue
|
75
80
|
s.compiler_version = response unless response.empty?
|
76
81
|
|
82
|
+
# Get earliest revision to check
|
83
|
+
response = shell.ask "What's the earliest revision to search back to " \
|
84
|
+
'when finding the latest testable revision (eg. 10000)? ' \
|
85
|
+
"(#{s.last_tested}): ", :blue
|
86
|
+
s.last_tested = response.to_i unless response.empty?
|
87
|
+
|
77
88
|
# Confirm save location
|
78
89
|
response = shell.ask "This will be saved in #{s.config_file}. Press " \
|
79
90
|
'enter to accept or enter a new location:', :blue, path: true
|
@@ -91,7 +102,7 @@ e-mail and password will be stored in plain text.'
|
|
91
102
|
|
92
103
|
def self.new_from_config(
|
93
104
|
config_file: File.join(ENV['HOME'], '.mesa_test.yml'), force_setup: false,
|
94
|
-
base_uri:
|
105
|
+
base_uri: DEFAULT_URI
|
95
106
|
# base_uri: 'http://localhost:3000'
|
96
107
|
)
|
97
108
|
new_submitter = new(config_file: config_file, base_uri: base_uri)
|
@@ -107,7 +118,7 @@ e-mail and password will be stored in plain text.'
|
|
107
118
|
|
108
119
|
attr_accessor :computer_name, :user_name, :email, :password, :platform,
|
109
120
|
:platform_version, :processor, :ram_gb, :compiler,
|
110
|
-
:compiler_version, :config_file, :base_uri
|
121
|
+
:compiler_version, :config_file, :base_uri, :last_tested
|
111
122
|
|
112
123
|
attr_reader :shell
|
113
124
|
|
@@ -115,7 +126,7 @@ e-mail and password will be stored in plain text.'
|
|
115
126
|
def initialize(
|
116
127
|
computer_name: nil, user_name: nil, email: nil, platform: nil,
|
117
128
|
platform_version: nil, processor: nil, ram_gb: nil, compiler: nil,
|
118
|
-
compiler_version: nil, config_file: nil, base_uri: nil
|
129
|
+
compiler_version: nil, config_file: nil, base_uri: nil, last_tested: nil
|
119
130
|
)
|
120
131
|
@computer_name = computer_name || Socket.gethostname.scan(/^[^\.]+\.?/)[0]
|
121
132
|
@computer_name.chomp!('.') if @computer_name
|
@@ -140,6 +151,7 @@ e-mail and password will be stored in plain text.'
|
|
140
151
|
@compiler_version = compiler_version || ''
|
141
152
|
@config_file = config_file || File.join(ENV['HOME'], '.mesa_test.yml')
|
142
153
|
@base_uri = base_uri
|
154
|
+
@last_tested = last_tested || DEFAULT_REVISION
|
143
155
|
|
144
156
|
# set up thor-proof way to get responses from user. Thor hijacks the
|
145
157
|
# gets command, so we have to use its built-in "ask" method, which is
|
@@ -164,11 +176,12 @@ e-mail and password will be stored in plain text.'
|
|
164
176
|
puts "Processor #{processor}"
|
165
177
|
puts "RAM #{ram_gb} GB"
|
166
178
|
puts "Compiler #{compiler} #{compiler_version}"
|
179
|
+
puts "Last tested revision #{last_tested}"
|
167
180
|
puts "Config location #{config_file}"
|
168
181
|
puts '-------------------------------------------------------'
|
169
182
|
puts ''
|
170
183
|
response = shell.ask 'Is this correct? (y/Y = Yes, anything else = No):'
|
171
|
-
response.strip.casecmp('y')
|
184
|
+
response.strip.casecmp('y').zero?
|
172
185
|
end
|
173
186
|
|
174
187
|
# For one "computer" on the web server, and for [subjective] consistency
|
@@ -196,7 +209,8 @@ e-mail and password will be stored in plain text.'
|
|
196
209
|
'ram_gb' => ram_gb,
|
197
210
|
'platform_version' => platform_version,
|
198
211
|
'compiler' => compiler,
|
199
|
-
'compiler_version' => compiler_version
|
212
|
+
'compiler_version' => compiler_version,
|
213
|
+
'last_tested' => last_tested
|
200
214
|
}
|
201
215
|
File.open(config_file, 'w') { |f| f.write(YAML.dump(data_hash)) }
|
202
216
|
end
|
@@ -213,6 +227,7 @@ e-mail and password will be stored in plain text.'
|
|
213
227
|
@platform_version = data_hash['platform_version']
|
214
228
|
@compiler = data_hash['compiler']
|
215
229
|
@compiler_version = data_hash['compiler_version']
|
230
|
+
@last_tested = data_hash['last_tested'] || @last_tested
|
216
231
|
end
|
217
232
|
|
218
233
|
# create and return hash of parameters for a TestInstance submission
|
@@ -290,58 +305,117 @@ e-mail and password will be stored in plain text.'
|
|
290
305
|
response.is_a? Net::HTTPCreated
|
291
306
|
end
|
292
307
|
|
293
|
-
def submit_all(mesa)
|
308
|
+
def submit_all(mesa, mod = :all)
|
294
309
|
submitted_cases = []
|
295
310
|
unsubmitted_cases = []
|
296
|
-
|
297
|
-
|
311
|
+
if mod == :all
|
312
|
+
success = true
|
313
|
+
mesa.test_names.each_key do |this_mod|
|
314
|
+
success &&= submit_all(mesa, mod = this_mod)
|
315
|
+
end
|
316
|
+
else
|
317
|
+
mesa.test_names[mod].each do |test_name|
|
298
318
|
# get at test case
|
299
319
|
test_case = mesa.test_cases[mod][test_name]
|
300
320
|
# try to submit and note if it does or doesn't successfully submit
|
301
321
|
submitted = false
|
302
|
-
unless test_case.outcome == :not_tested
|
303
|
-
submitted = submit(test_case)
|
304
|
-
end
|
305
|
-
|
322
|
+
submitted = submit(test_case) unless test_case.outcome == :not_tested
|
306
323
|
if submitted
|
307
324
|
submitted_cases << test_name
|
308
325
|
else
|
309
326
|
unsubmitted_cases << test_name
|
310
327
|
end
|
311
328
|
end
|
329
|
+
puts "\n Submission results for #{mod} module:"
|
330
|
+
puts '#####################################'
|
331
|
+
if !submitted_cases.empty?
|
332
|
+
shell.say 'Submitted the following cases:', :green
|
333
|
+
puts submitted_cases.join("\n")
|
334
|
+
else
|
335
|
+
shell.say 'Did not successfully submit any cases.', :red
|
336
|
+
end
|
337
|
+
unless unsubmitted_cases.empty?
|
338
|
+
puts "\n\n\n"
|
339
|
+
shell.say 'Failed to submit the following cases:', :red
|
340
|
+
puts unsubmitted_cases.join("\n")
|
341
|
+
end
|
342
|
+
# return true and update last tested if all cases were submitted
|
343
|
+
success = submitted_cases.length == mesa.test_names.length
|
344
|
+
if success
|
345
|
+
last_tested = mesa.version
|
346
|
+
shell.say "\n\nUpdating last tested revision to #{last_tested}."
|
347
|
+
save_computer_data
|
348
|
+
end
|
312
349
|
end
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
puts submitted_cases.join("\n")
|
317
|
-
else
|
318
|
-
shell.say 'Did not successfully submit any cases.', :red
|
319
|
-
end
|
320
|
-
if not unsubmitted_cases.empty?
|
321
|
-
puts "\n\n\n"
|
322
|
-
shell.say 'Failed to submit the following cases:', :red
|
323
|
-
puts unsubmitted_cases.join("\n")
|
324
|
-
end
|
325
|
-
# return true if all cases were submitted
|
326
|
-
submitted_cases.length == mesa.test_names.length
|
350
|
+
# return boolean indicating whether or not all cases successfully
|
351
|
+
# SUBMITTED (irrespective of passing status)
|
352
|
+
success
|
327
353
|
end
|
328
354
|
end
|
329
355
|
|
330
356
|
class Mesa
|
357
|
+
SVN_URI = 'svn://svn.code.sf.net/p/mesa/code/trunk'.freeze
|
358
|
+
|
331
359
|
attr_reader :mesa_dir, :test_data, :test_names, :test_cases, :shell
|
332
360
|
attr_accessor :update_checksums
|
333
361
|
|
334
362
|
def self.download(version_number: nil, new_mesa_dir: nil)
|
335
363
|
new_mesa_dir ||= File.join(ENV['HOME'], 'mesa-test-r' + version_number.to_s)
|
336
|
-
success = system("svn co -r #{version_number} "
|
364
|
+
success = system("svn co -r #{version_number} " \
|
337
365
|
"svn://svn.code.sf.net/p/mesa/code/trunk #{new_mesa_dir}")
|
338
366
|
unless success
|
339
|
-
raise MesaDirError,
|
367
|
+
raise MesaDirError, 'Encountered a problem in download mesa ' \
|
340
368
|
"revision #{version_number}."
|
341
369
|
end
|
342
370
|
Mesa.new(mesa_dir: new_mesa_dir)
|
343
371
|
end
|
344
372
|
|
373
|
+
def self.log_since(last_tested = DEFAULT_REVISION)
|
374
|
+
# svn commit log back to, but excluding, the last revision tested
|
375
|
+
`svn log #{SVN_URI} -r #{last_tested + 1}:HEAD`
|
376
|
+
end
|
377
|
+
|
378
|
+
def self.log_lines_since(last_tested = DEFAULT_REVISION)
|
379
|
+
log_since(last_tested).split("\n").reject(&:empty?)
|
380
|
+
end
|
381
|
+
|
382
|
+
def self.add_commit(commits, revision, author)
|
383
|
+
commits << Commit.new
|
384
|
+
commits.last.revision = revision.to_i
|
385
|
+
commits.last.author = author
|
386
|
+
commits.last.message = []
|
387
|
+
end
|
388
|
+
|
389
|
+
def self.process_line(commits, line)
|
390
|
+
last = commits.last
|
391
|
+
if line =~ /^-+$/
|
392
|
+
# dashed lines separate commits
|
393
|
+
# Done with last commit (if it exists), so clean up message
|
394
|
+
last.message = last.message.join("\n") unless last.nil?
|
395
|
+
elsif line =~ /^r(\d+) \| (\w+) \| .* \| \d+ lines?$/
|
396
|
+
# first line of a commit, scrape data and make new commit
|
397
|
+
add_commit(commits, $1, $2)
|
398
|
+
else
|
399
|
+
# add lines to the message (will concatenate later to single String)
|
400
|
+
last.message << line.strip
|
401
|
+
end
|
402
|
+
end
|
403
|
+
|
404
|
+
# all commits since the given version number
|
405
|
+
def self.commits_since(last_tested = DEFAULT_REVISION)
|
406
|
+
commits = []
|
407
|
+
log_lines_since(last_tested).each { |line| process_line(commits, line) }
|
408
|
+
commits.sort_by(&:revision).reverse
|
409
|
+
end
|
410
|
+
|
411
|
+
def self.last_non_paxton_revision(last_tested = DEFAULT_REVISION)
|
412
|
+
commits_since(last_tested).each do |commit|
|
413
|
+
return commit.revision unless commit.author == 'bill_paxton'
|
414
|
+
end
|
415
|
+
# give out garbage if no valid commit is found
|
416
|
+
nil
|
417
|
+
end
|
418
|
+
|
345
419
|
def initialize(mesa_dir: ENV['MESA_DIR'])
|
346
420
|
@mesa_dir = mesa_dir
|
347
421
|
@update_checksums = false
|
@@ -355,8 +429,23 @@ class Mesa
|
|
355
429
|
@shell = Thor::Shell::Color.new
|
356
430
|
end
|
357
431
|
|
358
|
-
# read version number from $MESA_DIR/data/version_number
|
359
432
|
def version_number
|
433
|
+
# prefer svn's reported version number
|
434
|
+
version = svn_version_number
|
435
|
+
# fall back to MESA_DIR/data's version number svn didn't work
|
436
|
+
version = data_version_number unless version > 0
|
437
|
+
version
|
438
|
+
end
|
439
|
+
|
440
|
+
# get version number from svn (preferred method)
|
441
|
+
def svn_version_number
|
442
|
+
return `svnversion #{mesa_dir}`.strip.to_i
|
443
|
+
rescue Errno::ENOENT
|
444
|
+
return 0
|
445
|
+
end
|
446
|
+
|
447
|
+
# read version number from $MESA_DIR/data/version_number
|
448
|
+
def data_version_number
|
360
449
|
contents = ''
|
361
450
|
File.open(File.join(mesa_dir, 'data', 'version_number'), 'r') do |f|
|
362
451
|
contents = f.read
|
@@ -365,8 +454,8 @@ class Mesa
|
|
365
454
|
end
|
366
455
|
|
367
456
|
def clean
|
368
|
-
|
369
|
-
visit_and_check mesa_dir, MesaDirError,
|
457
|
+
with_mesa_dir do
|
458
|
+
visit_and_check mesa_dir, MesaDirError, 'E\countered a problem in ' \
|
370
459
|
"running `clean` in #{mesa_dir}." do
|
371
460
|
puts 'MESA_DIR = ' + ENV['MESA_DIR']
|
372
461
|
puts './clean'
|
@@ -377,8 +466,8 @@ class Mesa
|
|
377
466
|
end
|
378
467
|
|
379
468
|
def install
|
380
|
-
|
381
|
-
visit_and_check mesa_dir, MesaDirError,
|
469
|
+
with_mesa_dir do
|
470
|
+
visit_and_check mesa_dir, MesaDirError, 'Encountered a problem in ' \
|
382
471
|
"running `install` in #{mesa_dir}." do
|
383
472
|
puts 'MESA_DIR = ' + ENV['MESA_DIR']
|
384
473
|
puts './install'
|
@@ -397,7 +486,7 @@ class Mesa
|
|
397
486
|
def check_mod(mod)
|
398
487
|
return if MesaTestCase.modules.include? mod
|
399
488
|
raise TestCaseDirError, "Invalid module: #{mod}. Must be one of: " +
|
400
|
-
|
489
|
+
MesaTestCase.modules.join(', ')
|
401
490
|
end
|
402
491
|
|
403
492
|
def test_suite_dir(mod: nil)
|
@@ -435,7 +524,7 @@ class Mesa
|
|
435
524
|
if line =~ no_skip
|
436
525
|
found_test = true
|
437
526
|
@test_data[mod][$1] = { success_string: $2, final_model: $3,
|
438
|
-
photo: $4}
|
527
|
+
photo: $4}
|
439
528
|
elsif line =~ one_skip
|
440
529
|
found_test = true
|
441
530
|
@test_data[mod][$1] = { success_string: $2, final_model: $3,
|
@@ -447,16 +536,17 @@ class Mesa
|
|
447
536
|
end
|
448
537
|
|
449
538
|
if found_test
|
450
|
-
@test_names[mod] << $1 unless @test_names.include? $1
|
539
|
+
@test_names[mod] << $1 unless @test_names[mod].include? $1
|
451
540
|
end
|
452
541
|
end
|
453
542
|
|
454
543
|
# make MesaTestCase objects accessible by name
|
455
544
|
@test_names[mod].each do |test_name|
|
456
545
|
data = @test_data[mod][test_name]
|
457
|
-
@test_cases[mod][test_name] = MesaTestCase.new(
|
458
|
-
mesa: self, success_string: data[:success_string],
|
459
|
-
final_model: data[:final_model], photo: data[:photo]
|
546
|
+
@test_cases[mod][test_name] = MesaTestCase.new(
|
547
|
+
test: test_name, mesa: self, success_string: data[:success_string],
|
548
|
+
mod: mod, final_model: data[:final_model], photo: data[:photo]
|
549
|
+
)
|
460
550
|
end
|
461
551
|
end
|
462
552
|
end
|
@@ -470,7 +560,7 @@ class Mesa
|
|
470
560
|
end
|
471
561
|
end
|
472
562
|
|
473
|
-
# based off of `$MESA_DIR/star/test_suite/each_test_run_and_diff` from
|
563
|
+
# based off of `$MESA_DIR/star/test_suite/each_test_run_and_diff` from
|
474
564
|
# revision 10000
|
475
565
|
def each_test_clean(mod: :all)
|
476
566
|
if mod == :all
|
@@ -495,7 +585,7 @@ class Mesa
|
|
495
585
|
test_cases[mod][test_name].do_one
|
496
586
|
test_cases[mod][test_name].log_results if log_results
|
497
587
|
end
|
498
|
-
log_summary if log_results
|
588
|
+
log_summary(mod: mod) if log_results
|
499
589
|
end
|
500
590
|
end
|
501
591
|
|
@@ -522,14 +612,14 @@ class Mesa
|
|
522
612
|
def check_mesa_dir
|
523
613
|
res = File.exist?(File.join(mesa_dir, 'data', 'version_number'))
|
524
614
|
MesaTestCase.modules.each do |mod|
|
525
|
-
res
|
526
|
-
end
|
615
|
+
res &&= File.directory?(test_suite_dir(mod: mod))
|
616
|
+
end
|
527
617
|
res
|
528
618
|
end
|
529
619
|
|
530
620
|
# change MESA_DIR for the execution of the block and then revert to the
|
531
621
|
# original value
|
532
|
-
def
|
622
|
+
def with_mesa_dir
|
533
623
|
# change MESA_DIR, holding on to old value
|
534
624
|
orig_mesa_dir = ENV['MESA_DIR']
|
535
625
|
ENV['MESA_DIR'] = mesa_dir
|
@@ -567,7 +657,7 @@ class Mesa
|
|
567
657
|
end
|
568
658
|
summary_file = File.join(test_suite_dir(mod: mod), 'test_summary.yml')
|
569
659
|
File.open(summary_file, 'w') do |f|
|
570
|
-
f.write(YAML
|
660
|
+
f.write(YAML.dump(res))
|
571
661
|
end
|
572
662
|
end
|
573
663
|
end
|
@@ -752,6 +842,7 @@ class MesaTestCase
|
|
752
842
|
'test_results.yml', color = :blue
|
753
843
|
FileUtils.rm_f 'binary_history.data'
|
754
844
|
FileUtils.rm_f 'out.txt'
|
845
|
+
FileUtils.rm_f 'test_results.yml'
|
755
846
|
if File.directory? File.join('star_history', 'history_out')
|
756
847
|
shell.say 'Removing all files of the form history_out* from ' \
|
757
848
|
'star_history', :blue
|
@@ -809,13 +900,19 @@ class MesaTestCase
|
|
809
900
|
return
|
810
901
|
end
|
811
902
|
data = YAML.safe_load(File.read(load_file), [Symbol])
|
812
|
-
@runtime_seconds = data['runtime_seconds']
|
813
|
-
@mod = data['module']
|
814
|
-
@mesa_version = data['mesa_version']
|
815
|
-
@outcome = data['outcome']
|
816
|
-
@test_omp_num_threads = data['omp_num_threads']
|
817
|
-
@success_type = data['success_type']
|
818
|
-
@failure_type = data['failure_type']
|
903
|
+
@runtime_seconds = data['runtime_seconds'] || @runtime_seconds
|
904
|
+
@mod = data['module'] || @mod
|
905
|
+
@mesa_version = data['mesa_version'] || @mesa_version
|
906
|
+
@outcome = data['outcome'] || @outcome
|
907
|
+
@test_omp_num_threads = data['omp_num_threads'] || @test_omp_num_threads
|
908
|
+
@success_type = data['success_type'] || @success_type
|
909
|
+
@failure_type = data['failure_type'] || @failure_type
|
910
|
+
|
911
|
+
# convert select data to symbols since that is how they are used
|
912
|
+
@outcome = @outcome.to_sym if @outcome
|
913
|
+
@success_type = @success_type.to_sym if @success_type
|
914
|
+
@failure_type = @failure_type.to_sym if @failure_type
|
915
|
+
|
819
916
|
shell.say "Done loading data from #{load_file}.\n", :green
|
820
917
|
end
|
821
918
|
|
@@ -928,13 +1025,10 @@ class MesaTestCase
|
|
928
1025
|
puts "md5sum \"#{final_model}\" > checks.md5"
|
929
1026
|
FileUtils.cp final_model, 'final_check.mod'
|
930
1027
|
|
931
|
-
if
|
932
|
-
|
933
|
-
|
934
|
-
|
935
|
-
# if there is a photo, we'll have to wait and see
|
936
|
-
return true
|
937
|
-
end
|
1028
|
+
# if there's no photo, we won't check the checksum, so we've succeeded
|
1029
|
+
return succeed(:run_test_string) unless photo
|
1030
|
+
# if there is a photo, we'll have to wait and see
|
1031
|
+
return true
|
938
1032
|
end
|
939
1033
|
|
940
1034
|
# check that final model matches
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mesa_test
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- William Wolf
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-12-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|