mesa_test 0.0.7 → 0.0.8
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 +34 -16
- data/lib/mesa_test.rb +199 -174
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1b5dbc4e6e9d398d2025a0e33f1d4af8b2307d10
|
4
|
+
data.tar.gz: 3d2f461671275b93fac84f42b0480f9384da1737
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8d1e7371f07c36e6426f59bb2f24fca0fc43ea6d161bccad0b3bbd5decbebe3d721348a78c616e04776df083e8e07d6be7023a84a141cdea0da08acb18076a32
|
7
|
+
data.tar.gz: 0247ae3320af6c6a4b07c9528d3e1dd0a075f55018ece0d8f899bfcd120365986977281820235ab2dbb73c39df346aeaecaf4b6021ef61b8859088fbb4584abd
|
data/bin/mesa_test
CHANGED
@@ -16,30 +16,37 @@ class MesaTest < Thor
|
|
16
16
|
MesaTestSubmitter.new_from_config(config_file: config_file).setup
|
17
17
|
end
|
18
18
|
|
19
|
-
desc
|
19
|
+
desc 'test_one MESA_DIR TEST_CASE', "run, check, and submit one test case"
|
20
20
|
long_desc <<-LONGDESC
|
21
|
-
Run and check TEST_CASE, which resides in MESA_DIR/star/test_suite. Then
|
22
|
-
report results to MesaTestHub.
|
21
|
+
Run and check TEST_CASE, which resides in MESA_DIR/star/test_suite. Then
|
22
|
+
report results to MesaTestHub. TEST_CASE can also be an integer corresponding
|
23
|
+
to the line number of the test name in its do1_test_source file (or a
|
24
|
+
concatenated version of that file if no module is specified). Modules are
|
25
|
+
searched/concatenated in this order:
|
26
|
+
|
27
|
+
#{MesaTestCase.modules.map { |mod| ' ' + mod.to_s }.join(', ')}
|
23
28
|
|
24
29
|
With --force option, skip confirmation of computer details, assuming values
|
25
30
|
in ~/.mesa_test.yml are correct.
|
26
31
|
|
32
|
+
With --module option, select which module to search through, with the default
|
33
|
+
being "all" (search all modules in order). Example: --module=star.
|
34
|
+
|
27
35
|
With --log option, save yml file of test results in test directory, on
|
28
36
|
by default. Shut off with --no-log.
|
29
37
|
|
30
38
|
With --submit option, upload results to MESATestHub. By default, this is on.
|
31
|
-
To run without submission, use --no-submit.
|
39
|
+
To run without submission, use --no-submit.
|
32
40
|
LONGDESC
|
33
|
-
option :force, type: :boolean
|
41
|
+
option :force, type: :boolean, aliases: '-f'
|
34
42
|
option :log, type: :boolean, default: true
|
43
|
+
option :module, type: :string, default: :all
|
35
44
|
option :submit, type: :boolean, default: true
|
36
45
|
def test_one(mesa_dir, test_case_name)
|
37
46
|
if options[:submit]
|
38
47
|
s = MesaTestSubmitter.new_from_config
|
39
48
|
unless options[:force]
|
40
|
-
unless s.confirm_computer_data
|
41
|
-
s.setup
|
42
|
-
end
|
49
|
+
s.setup unless s.confirm_computer_data
|
43
50
|
end
|
44
51
|
|
45
52
|
check_user_and_computer s
|
@@ -55,7 +62,8 @@ class MesaTest < Thor
|
|
55
62
|
m.load_test_source_data
|
56
63
|
|
57
64
|
# make sure the test case is valid
|
58
|
-
t = m.find_test_case
|
65
|
+
t = m.find_test_case(test_case_name: test_case_name,
|
66
|
+
mod: options[:module].downcase.to_sym)
|
59
67
|
if t.nil?
|
60
68
|
msg = "No such test case, #{test_case_name} found in any of "
|
61
69
|
msg << MesaTestCase.modules.map do |mod|
|
@@ -84,7 +92,7 @@ class MesaTest < Thor
|
|
84
92
|
|
85
93
|
desc "test_all MESA_DIR", "run, check, and submit all test cases"
|
86
94
|
long_desc <<-LONGDESC
|
87
|
-
Run and check all test cases residing in MESA_DIR/star/test_suite. Then
|
95
|
+
Run and check all test cases residing in MESA_DIR/star/test_suite. Then
|
88
96
|
report results to MesaTestHub. Specifically, runs and checks all tests
|
89
97
|
detailed in MESA_DIR/star/test_suite/do1_test_source.
|
90
98
|
|
@@ -98,7 +106,7 @@ class MesaTest < Thor
|
|
98
106
|
With --submit option, upload results to MESATestHub. By default, this is on.
|
99
107
|
To run without submission, use --no-submit.
|
100
108
|
LONGDESC
|
101
|
-
option :force, type: :boolean
|
109
|
+
option :force, type: :boolean, aliases: '-f'
|
102
110
|
option :log, type: :boolean, default: true
|
103
111
|
option :submit, type: :boolean, default: true
|
104
112
|
def test_all(mesa_dir)
|
@@ -131,12 +139,21 @@ class MesaTest < Thor
|
|
131
139
|
|
132
140
|
desc 'submit_one MESA_DIR TEST_CASE', 'submit one completed test case'
|
133
141
|
long_desc <<-LONGDESC
|
134
|
-
Load complete test case data from existing YAML file and submit to MESA
|
142
|
+
Load complete test case data from existing YAML file and submit to MESA.
|
143
|
+
TEST_CASE can also be an integer corresponding to the line number of the test
|
144
|
+
name in its do1_test_source file (or a concatenated version of that file if
|
145
|
+
no module is specified). Modules are searched/concatenated in this order:
|
146
|
+
|
147
|
+
#{MesaTestCase.modules.map { |mod| ' ' + mod.to_s }.join(", ") }
|
135
148
|
|
136
149
|
With --force option, skip confirmation of computer details, assuming values
|
137
150
|
in ~/.mesa_test.yml are correct.
|
151
|
+
|
152
|
+
With --module option, select which module to search through, with the default
|
153
|
+
being "all". Example: --module=star.
|
138
154
|
LONGDESC
|
139
|
-
option :force, type: :boolean
|
155
|
+
option :force, type: :boolean, aliases: '-f'
|
156
|
+
option :module, type: :string, aliases: '-m', default: 'all'
|
140
157
|
def submit_one(mesa_dir, test_case_name)
|
141
158
|
s = MesaTestSubmitter.new_from_config
|
142
159
|
unless options[:force]
|
@@ -156,7 +173,8 @@ class MesaTest < Thor
|
|
156
173
|
m.load_test_source_data
|
157
174
|
|
158
175
|
# make sure the test case is valid
|
159
|
-
t = m.find_test_case
|
176
|
+
t = m.find_test_case(test_case_name: test_case_name,
|
177
|
+
mod: options[:module].downcase.to_sym)
|
160
178
|
if t.nil?
|
161
179
|
msg = "No such test case, #{test_case_name} found in any of "
|
162
180
|
msg << MesaTestCase.modules.map do |mod|
|
@@ -184,7 +202,7 @@ class MesaTest < Thor
|
|
184
202
|
With --force option, skip confirmation of computer details, assuming values
|
185
203
|
in ~/.mesa_test.yml are correct.
|
186
204
|
LONGDESC
|
187
|
-
option :force, type: :boolean
|
205
|
+
option :force, type: :boolean, aliases: '-f'
|
188
206
|
def submit_all(mesa_dir)
|
189
207
|
s = MesaTestSubmitter.new_from_config
|
190
208
|
unless options[:force]
|
@@ -249,7 +267,7 @@ class MesaTest < Thor
|
|
249
267
|
read from ~/.mesa_test.yml.
|
250
268
|
LONGDESC
|
251
269
|
option :destroy, type: :boolean
|
252
|
-
option :force, type: :boolean
|
270
|
+
option :force, type: :boolean, aliase: '-f'
|
253
271
|
def install_and_test_all(version, mesa_dir)
|
254
272
|
s = MesaTestSubmitter.new_from_config
|
255
273
|
unless options[:force]
|
data/lib/mesa_test.rb
CHANGED
@@ -8,9 +8,9 @@ require 'net/https'
|
|
8
8
|
require 'thor'
|
9
9
|
require 'json'
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
MesaDirError = Class.new(StandardError)
|
12
|
+
TestCaseDirError = Class.new(StandardError)
|
13
|
+
InvalidDataType = Class.new(StandardError)
|
14
14
|
|
15
15
|
class MesaTestSubmitter
|
16
16
|
# set up config file for computer
|
@@ -379,16 +379,15 @@ class Mesa
|
|
379
379
|
## TEST SUITE METHODS
|
380
380
|
|
381
381
|
def check_mod(mod)
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
end
|
382
|
+
return if MesaTestCase.modules.include? mod
|
383
|
+
raise TestCaseDirError, "Invalid module: #{mod}. Must be one of: " +
|
384
|
+
MesaTestCase.modules.join(', ')
|
386
385
|
end
|
387
386
|
|
388
387
|
def test_suite_dir(mod: nil)
|
389
388
|
check_mod mod
|
390
389
|
File.join(mesa_dir, mod.to_s, 'test_suite')
|
391
|
-
end
|
390
|
+
end
|
392
391
|
|
393
392
|
# load data from the `do1_test_source` file that gets used in a lot of
|
394
393
|
# testing
|
@@ -401,8 +400,9 @@ class Mesa
|
|
401
400
|
else
|
402
401
|
check_mod mod
|
403
402
|
# load data from the source file
|
404
|
-
source_lines = IO.readlines(
|
405
|
-
'do1_test_source')
|
403
|
+
source_lines = IO.readlines(
|
404
|
+
File.join(test_suite_dir(mod: mod), 'do1_test_source')
|
405
|
+
)
|
406
406
|
|
407
407
|
# initialize data hash to empty hash and name array to empty array
|
408
408
|
@test_data[mod] = {}
|
@@ -412,22 +412,22 @@ class Mesa
|
|
412
412
|
# read through each line and find four data, name, success string, final
|
413
413
|
# model name, and photo. Either of model name and photo can be "skip"
|
414
414
|
source_lines.each do |line|
|
415
|
-
no_skip = /^do_one (.+)
|
416
|
-
one_skip = /^do_one (.+)
|
417
|
-
two_skip = /^do_one (.+)
|
415
|
+
no_skip = /^do_one (.+)\s+"([^"]*)"\s+"([^"]+)"\s+(x?\d+)/
|
416
|
+
one_skip = /^do_one (.+)\s+"([^"]*)"\s+"([^"]+)"\s+skip/
|
417
|
+
two_skip = /^do_one (.+)\s+"([^"]*)"\s+skip\s+skip/
|
418
418
|
found_test = false
|
419
419
|
if line =~ no_skip
|
420
420
|
found_test = true
|
421
|
-
@test_data[mod][$1] = {success_string: $2, final_model: $3,
|
422
|
-
|
421
|
+
@test_data[mod][$1] = { success_string: $2, final_model: $3,
|
422
|
+
photo: $4}
|
423
423
|
elsif line =~ one_skip
|
424
424
|
found_test = true
|
425
|
-
@test_data[mod][$1] = {success_string: $2, final_model: $3,
|
426
|
-
|
425
|
+
@test_data[mod][$1] = { success_string: $2, final_model: $3,
|
426
|
+
photo: nil }
|
427
427
|
elsif line =~ two_skip
|
428
428
|
found_test = true
|
429
|
-
@test_data[mod][$1] = {success_string: $2, final_model: nil,
|
430
|
-
|
429
|
+
@test_data[mod][$1] = { success_string: $2, final_model: nil,
|
430
|
+
photo: nil }
|
431
431
|
end
|
432
432
|
|
433
433
|
if found_test
|
@@ -445,22 +445,12 @@ class Mesa
|
|
445
445
|
end
|
446
446
|
end
|
447
447
|
|
448
|
+
# can accept a number (in string form) as a name for indexed access
|
448
449
|
def find_test_case(test_case_name: nil, mod: :all)
|
449
|
-
if
|
450
|
-
|
451
|
-
# FIRST found (assuming no name duplication across modules)
|
452
|
-
@test_names.each do |this_mod, mod_names|
|
453
|
-
if mod_names.include? test_case_name
|
454
|
-
return @test_cases[this_mod][test_case_name]
|
455
|
-
end
|
456
|
-
end
|
457
|
-
# didn't find any matches, return nil
|
458
|
-
return nil
|
450
|
+
if /\A[0-9]+\z/ =~ test_case_name
|
451
|
+
find_test_case_by_number(test_number: test_case_name.to_i, mod: mod)
|
459
452
|
else
|
460
|
-
|
461
|
-
# if the test case doesn't exist)
|
462
|
-
check_mod mod
|
463
|
-
@test_cases[mod][test_case_name]
|
453
|
+
find_test_case_by_name(test_case_name: test_case_name, mod: mod)
|
464
454
|
end
|
465
455
|
end
|
466
456
|
|
@@ -505,12 +495,6 @@ class Mesa
|
|
505
495
|
end
|
506
496
|
end
|
507
497
|
|
508
|
-
# note that this only changes MESA_DIR for subprocesses launched from ruby
|
509
|
-
# the old value of MESA_DIR will persist after the ruby process ends
|
510
|
-
def set_mesa_dir
|
511
|
-
ENV['MESA_DIR'] = mesa_dir
|
512
|
-
end
|
513
|
-
|
514
498
|
def installed?
|
515
499
|
check_mesa_dir
|
516
500
|
end
|
@@ -538,13 +522,13 @@ class Mesa
|
|
538
522
|
test_names[mod].each do |test_name|
|
539
523
|
test_case = test_cases[mod][test_name]
|
540
524
|
res << {
|
541
|
-
test_name
|
542
|
-
outcome
|
543
|
-
failure_type
|
544
|
-
success_type
|
545
|
-
runtime_seconds
|
546
|
-
omp_num_threads
|
547
|
-
mesa_version
|
525
|
+
'test_name' => test_case.test_name,
|
526
|
+
'outcome' => test_case.outcome,
|
527
|
+
'failure_type' => test_case.failure_type,
|
528
|
+
'success_type' => test_case.success_type,
|
529
|
+
'runtime_seconds' => test_case.runtime_seconds,
|
530
|
+
'omp_num_threads' => test_case.test_omp_num_threads,
|
531
|
+
'mesa_version' => test_case.mesa_version
|
548
532
|
}
|
549
533
|
end
|
550
534
|
summary_file = File.join(test_suite_dir(mod: mod), 'test_summary.yml')
|
@@ -553,21 +537,81 @@ class Mesa
|
|
553
537
|
end
|
554
538
|
end
|
555
539
|
end
|
540
|
+
|
541
|
+
def find_test_case_by_name(test_case_name: nil, mod: :all)
|
542
|
+
if mod == :all
|
543
|
+
# look through all loaded modules for desired test case name, return
|
544
|
+
# FIRST found (assuming no name duplication across modules)
|
545
|
+
@test_names.each do |this_mod, mod_names|
|
546
|
+
if mod_names.include? test_case_name
|
547
|
+
return @test_cases[this_mod][test_case_name]
|
548
|
+
end
|
549
|
+
end
|
550
|
+
# didn't find any matches, return nil
|
551
|
+
nil
|
552
|
+
else
|
553
|
+
# module specified; check it and return the proper test case (may be nil
|
554
|
+
# if the test case doesn't exist)
|
555
|
+
check_mod mod
|
556
|
+
@test_cases[mod][test_case_name]
|
557
|
+
end
|
558
|
+
end
|
559
|
+
|
560
|
+
def find_test_case_by_number(test_number: nil, mod: :all)
|
561
|
+
# this will be the index in the name array of the proper module of
|
562
|
+
# the desired test case
|
563
|
+
# input numbers are 1-indexed, but we'll fix that later
|
564
|
+
return nil if test_number < 1
|
565
|
+
i = test_number
|
566
|
+
|
567
|
+
if mod == :all
|
568
|
+
# search through each module in order
|
569
|
+
MesaTestCase.modules.each do |this_mod|
|
570
|
+
# if i is a valid index for names of this module, extract the proper
|
571
|
+
# test case taking into account that the given i is 1-indexed
|
572
|
+
if i <= @test_names[this_mod].length
|
573
|
+
# puts "i = #{i} <= #{@test_names[this_mod].length}"
|
574
|
+
# @test_names[this_mod].each_with_index do |test_name, i|
|
575
|
+
# puts sprintf("%-4d", i + 1) + test_name
|
576
|
+
# end
|
577
|
+
return find_test_case_by_name(
|
578
|
+
test_case_name: @test_names[this_mod][i - 1],
|
579
|
+
mod: this_mod
|
580
|
+
)
|
581
|
+
end
|
582
|
+
# index lies outside possible range for this module, move on to
|
583
|
+
# next module and decrement index by the number of test cases in this
|
584
|
+
# module
|
585
|
+
i -= @test_names[this_mod].length
|
586
|
+
end
|
587
|
+
# return nil if we never broke out of the loop
|
588
|
+
nil
|
589
|
+
else
|
590
|
+
# module was specified, so just hope things work out for the number
|
591
|
+
# should probably add a check that the index is actually in the array,
|
592
|
+
# but if you're using this feature, you probably know what you're doing,
|
593
|
+
# right? Right?
|
594
|
+
return find_test_case_by_name(
|
595
|
+
test_case_name: @test_names[mod][i - 1],
|
596
|
+
mod: mod
|
597
|
+
)
|
598
|
+
end
|
599
|
+
end
|
556
600
|
end
|
557
601
|
|
558
602
|
class MesaTestCase
|
559
603
|
attr_reader :test_name, :mesa_dir, :mesa, :success_string, :final_model,
|
560
|
-
|
561
|
-
|
604
|
+
:failure_msg, :success_msg, :photo, :runtime_seconds,
|
605
|
+
:test_omp_num_threads, :mesa_version, :shell
|
562
606
|
attr_accessor :data_names, :data_types, :failure_type, :success_type,
|
563
|
-
|
607
|
+
:outcome
|
564
608
|
|
565
609
|
def self.modules
|
566
|
-
[
|
610
|
+
%i[star binary]
|
567
611
|
end
|
568
612
|
|
569
|
-
def initialize(test: nil, mesa: nil, success_string: '',
|
570
|
-
|
613
|
+
def initialize(test: nil, mesa: nil, success_string: '',
|
614
|
+
final_model: 'final.mod', photo: nil, mod: nil)
|
571
615
|
@test_name = test
|
572
616
|
@mesa_dir = mesa.mesa_dir
|
573
617
|
@mesa = mesa
|
@@ -582,31 +626,30 @@ class MesaTestCase
|
|
582
626
|
@test_omp_num_threads = 1
|
583
627
|
unless MesaTestCase.modules.include? mod
|
584
628
|
raise TestCaseDirError, "Invalid module: #{mod}. Must be one of: " +
|
585
|
-
|
586
|
-
end
|
629
|
+
MesaTestCase.modules.join(', ')
|
630
|
+
end
|
587
631
|
@mod = mod
|
588
632
|
@failure_msg = {
|
589
633
|
run_test_string: "#{test_name} failed: does not match test string",
|
590
|
-
run_checksum: "#{test_name} run failed: checksum for #{final_model} "
|
591
|
-
|
592
|
-
run_diff: "#{test_name} run failed: diff #{final_model} "
|
593
|
-
|
634
|
+
run_checksum: "#{test_name} run failed: checksum for #{final_model} " \
|
635
|
+
'does not match after ./rn',
|
636
|
+
run_diff: "#{test_name} run failed: diff #{final_model} " \
|
637
|
+
'final_check.mod after ./rn',
|
594
638
|
photo_file: "#{test_name} restart failed: #{photo} does not exist",
|
595
|
-
photo_checksum: "#{test_name} restart failed: checksum for "
|
639
|
+
photo_checksum: "#{test_name} restart failed: checksum for " \
|
596
640
|
"#{final_model} does not match after ./re",
|
597
|
-
photo_diff: "#{test_name} restart failed: diff #{final_model} "
|
598
|
-
|
641
|
+
photo_diff: "#{test_name} restart failed: diff #{final_model} " \
|
642
|
+
'final_check.mod after ./re'
|
599
643
|
}
|
600
644
|
@success_msg = {
|
601
|
-
run_test_string: "#{test_name} run: found test string: "
|
645
|
+
run_test_string: "#{test_name} run: found test string: " \
|
602
646
|
"'#{success_string}'",
|
603
|
-
run_checksum: "#{test_name} run: checksum for #{final_model} matches "
|
604
|
-
|
605
|
-
photo_checksum: "#{test_name} restart: checksum for #{final_model} "
|
606
|
-
|
647
|
+
run_checksum: "#{test_name} run: checksum for #{final_model} matches " \
|
648
|
+
'after ./rn',
|
649
|
+
photo_checksum: "#{test_name} restart: checksum for #{final_model} " \
|
650
|
+
'matches after ./re #{photo}'
|
607
651
|
}
|
608
652
|
|
609
|
-
|
610
653
|
# validate stuff
|
611
654
|
check_mesa_dir
|
612
655
|
check_test_case
|
@@ -624,8 +667,8 @@ class MesaTestCase
|
|
624
667
|
elsif @outcome == :fail
|
625
668
|
false
|
626
669
|
else
|
627
|
-
raise TestCaseDirError,
|
628
|
-
|
670
|
+
raise TestCaseDirError, 'Cannot determine pass/fail status of ' \
|
671
|
+
'#{test_name} yet.'
|
629
672
|
end
|
630
673
|
end
|
631
674
|
|
@@ -640,14 +683,14 @@ class MesaTestCase
|
|
640
683
|
def add_datum(datum_name, datum_type)
|
641
684
|
unless data_types.include? datum_type.to_sym
|
642
685
|
raise InvalidDataType, "Invalid data type: #{datum_type}. Must be one "\
|
643
|
-
'of ' + data_types.join(', ') + '.'
|
686
|
+
'of ' + data_types.join(', ') + '.'
|
644
687
|
end
|
645
688
|
@data[datum_name] = datum_type
|
646
689
|
@data_names << datum_name
|
647
690
|
end
|
648
691
|
|
649
692
|
def omp_num_threads
|
650
|
-
|
693
|
+
ENV['OMP_NUM_THREADS'].to_i || 1
|
651
694
|
end
|
652
695
|
|
653
696
|
# based on $MESA_DIR/star/test_suite/each_test_clean, revision 10000
|
@@ -657,13 +700,13 @@ class MesaTestCase
|
|
657
700
|
check_mesa_dir
|
658
701
|
check_test_case
|
659
702
|
in_dir do
|
660
|
-
puts
|
703
|
+
puts './clean'
|
661
704
|
unless system('./clean')
|
662
|
-
raise TestCaseDirError,
|
705
|
+
raise TestCaseDirError, 'Encountered an error while running ./clean ' \
|
663
706
|
"in #{Dir.getwd}."
|
664
707
|
end
|
665
|
-
shell.say
|
666
|
-
|
708
|
+
shell.say 'Removing all files from LOGS, LOGS1, LOGS2, photos, ' \
|
709
|
+
'photos1, and photos2', color = :blue
|
667
710
|
FileUtils.rm_f Dir.glob('LOGS/*')
|
668
711
|
FileUtils.rm_f Dir.glob('LOGS1/*')
|
669
712
|
FileUtils.rm_f Dir.glob('LOGS2/*')
|
@@ -671,21 +714,21 @@ class MesaTestCase
|
|
671
714
|
FileUtils.rm_f Dir.glob('photos1/*')
|
672
715
|
FileUtils.rm_f Dir.glob('photos2/*')
|
673
716
|
|
674
|
-
shell.say
|
675
|
-
|
717
|
+
shell.say 'Removing files binary_history.data, out.txt, and ' \
|
718
|
+
'test_results.yml', color = :blue
|
676
719
|
FileUtils.rm_f 'binary_history.data'
|
677
720
|
FileUtils.rm_f 'out.txt'
|
678
|
-
if File.directory? File.join('star_history','history_out')
|
721
|
+
if File.directory? File.join('star_history', 'history_out')
|
679
722
|
shell.say 'Removing all files of the form history_out* from ' \
|
680
723
|
'star_history', :blue
|
681
724
|
FileUtils.rm_f Dir.glob(File.join('star_history', 'history_out', '*'))
|
682
725
|
end
|
683
726
|
if File.directory? File.join('star_profile', 'profiles_out')
|
684
|
-
shell.say
|
685
|
-
|
727
|
+
shell.say 'Removing all files of the form profiles_out* from ' \
|
728
|
+
'star_profile', color = :blue
|
686
729
|
FileUtils.rm_f Dir.glob(File.join('star_profile', 'profiles_out', '*'))
|
687
730
|
end
|
688
|
-
shell.say
|
731
|
+
shell.say 'Removing .running', color = :blue
|
689
732
|
FileUtils.rm_f '.running'
|
690
733
|
end
|
691
734
|
end
|
@@ -707,42 +750,39 @@ class MesaTestCase
|
|
707
750
|
# gets all parameters that would be submitted as well as computer
|
708
751
|
# information and dumps to a yml file in the test case directory
|
709
752
|
save_file = File.join(test_case_dir, 'test_results.yml')
|
710
|
-
shell.say "Logging test results to #{save_file}...",
|
753
|
+
shell.say "Logging test results to #{save_file}...", :blue
|
711
754
|
res = {
|
712
|
-
test_case
|
713
|
-
runtime_seconds
|
714
|
-
mesa_version
|
715
|
-
outcome
|
716
|
-
omp_num_threads
|
717
|
-
success_type
|
718
|
-
failure_type
|
755
|
+
'test_case' => test_name,
|
756
|
+
'runtime_seconds' => runtime_seconds,
|
757
|
+
'mesa_version' => mesa_version,
|
758
|
+
'outcome' => outcome,
|
759
|
+
'omp_num_threads' => test_omp_num_threads,
|
760
|
+
'success_type' => success_type,
|
761
|
+
'failure_type' => failure_type
|
719
762
|
}
|
720
|
-
File.open(save_file, 'w') { |f| f.write(YAML
|
721
|
-
shell.say "Successfully saved results to file #{save_file}
|
722
|
-
color = :green
|
723
|
-
puts ''
|
763
|
+
File.open(save_file, 'w') { |f| f.write(YAML.dump(res)) }
|
764
|
+
shell.say "Successfully saved results to file #{save_file}.\n", :green
|
724
765
|
end
|
725
766
|
|
726
767
|
def load_results
|
727
768
|
# loads all parameters from a previous test run, likely for submission
|
728
769
|
# purposes
|
729
770
|
load_file = File.join(test_case_dir, 'test_results.yml')
|
730
|
-
shell.say "Loading data from #{load_file}...",
|
731
|
-
data = YAML
|
732
|
-
@runtime_seconds = data[
|
733
|
-
@mesa_version = data[
|
734
|
-
@outcome = data[
|
735
|
-
@test_omp_num_threads = data[
|
736
|
-
@success_type = data[
|
737
|
-
@failure_type = data[
|
738
|
-
shell.say "Done loading data from #{load_file}
|
739
|
-
puts ''
|
771
|
+
shell.say "Loading data from #{load_file}...", :blue
|
772
|
+
data = YAML.safe_load(File.read(load_file), [Symbol])
|
773
|
+
@runtime_seconds = data['runtime_seconds']
|
774
|
+
@mesa_version = data['mesa_version']
|
775
|
+
@outcome = data['outcome'].to_sym
|
776
|
+
@test_omp_num_threads = data['omp_num_threads']
|
777
|
+
@success_type = data['success_type']
|
778
|
+
@failure_type = data['failure_type']
|
779
|
+
shell.say "Done loading data from #{load_file}.\n", :green
|
740
780
|
end
|
741
781
|
|
742
782
|
private
|
743
783
|
|
744
784
|
def data_types
|
745
|
-
|
785
|
+
%i[float integer string boolean]
|
746
786
|
end
|
747
787
|
|
748
788
|
# cd into the test case directory, do something in a block, then cd back
|
@@ -754,33 +794,32 @@ class MesaTestCase
|
|
754
794
|
# make sure that we can get to the test case directory. Throw an exception
|
755
795
|
# if we cannot
|
756
796
|
def check_test_case
|
757
|
-
|
758
|
-
|
759
|
-
end
|
797
|
+
return if File.directory? test_case_dir
|
798
|
+
raise TestCaseDirError, "No such test case: #{test_case_dir}."
|
760
799
|
end
|
761
800
|
|
762
801
|
# verify that mesa_dir is valid by checking for version number and test_suite
|
763
802
|
# directory
|
764
803
|
def check_mesa_dir
|
765
|
-
is_valid = File.exist?(File.join(mesa_dir, 'data', 'version_number'))
|
766
|
-
|
804
|
+
is_valid = File.exist?(File.join(mesa_dir, 'data', 'version_number')) &&
|
805
|
+
File.directory?(test_suite_dir)
|
767
806
|
raise MesaDirError, "Invalid MESA dir: #{mesa_dir}" unless is_valid
|
768
807
|
end
|
769
808
|
|
770
809
|
# append message to log file
|
771
810
|
def log_message(msg, color = nil, log_file = 'out.txt')
|
772
811
|
if color.nil?
|
773
|
-
shell.say
|
812
|
+
shell.say(msg)
|
774
813
|
else
|
775
|
-
shell.say
|
814
|
+
shell.say(msg, color)
|
776
815
|
end
|
777
|
-
File.open(
|
816
|
+
File.open(log_file, 'a') { |f| f.puts(msg) }
|
778
817
|
end
|
779
818
|
|
780
819
|
# write failure message to log file
|
781
820
|
def write_failure_message
|
782
|
-
msg = "******************** #{failure_msg[@failure_type]} "
|
783
|
-
|
821
|
+
msg = "******************** #{failure_msg[@failure_type]} " \
|
822
|
+
'********************'
|
784
823
|
log_message(msg, :red)
|
785
824
|
end
|
786
825
|
|
@@ -796,7 +835,7 @@ class MesaTestCase
|
|
796
835
|
@failure_type = failure_type
|
797
836
|
@outcome = :fail
|
798
837
|
write_failure_message
|
799
|
-
|
838
|
+
false
|
800
839
|
end
|
801
840
|
|
802
841
|
# used as return value for run or photo test. Logs data to text file, and
|
@@ -805,7 +844,7 @@ class MesaTestCase
|
|
805
844
|
@success_type = success_type
|
806
845
|
@outcome = :pass
|
807
846
|
write_success_msg(success_type)
|
808
|
-
|
847
|
+
true
|
809
848
|
end
|
810
849
|
|
811
850
|
def check_run
|
@@ -820,50 +859,41 @@ class MesaTestCase
|
|
820
859
|
run_finish = Time.now
|
821
860
|
@runtime_seconds = (run_finish - run_start).to_i
|
822
861
|
shell.say("Finished with ./rn; runtime = #{@runtime_seconds} seconds.",
|
823
|
-
|
862
|
+
:blue)
|
824
863
|
append_and_rm_err
|
825
864
|
|
826
|
-
|
827
865
|
# look for success text
|
828
866
|
success = true
|
829
867
|
File.open('out.txt', 'r') do |f|
|
830
868
|
success = !f.read.downcase.scan(success_string.downcase).empty?
|
831
869
|
end
|
832
870
|
# bail if there was no test string found
|
833
|
-
unless success
|
834
|
-
|
835
|
-
|
871
|
+
return fail_test(:run_test_string) unless success
|
872
|
+
|
873
|
+
# no final model to check, and we already found the test string, so pass
|
874
|
+
return succeed(:run_test_string) unless final_model
|
836
875
|
|
837
876
|
# additional checks for final model, if it is specified
|
838
|
-
|
839
|
-
|
840
|
-
|
841
|
-
|
842
|
-
|
843
|
-
|
844
|
-
|
845
|
-
|
846
|
-
|
847
|
-
end
|
877
|
+
# update checks after new run (Bill W. doesn't know what this does)
|
878
|
+
# (is this supposed to mark things as passed? The original function
|
879
|
+
# just has a standard "return" statement, which I interpret as passing)
|
880
|
+
if ENV.include? 'UPDATE_CHECKS'
|
881
|
+
system("md5sum \"#{final_model}\" > checks.md5")
|
882
|
+
puts "md5sum \"#{final_model}\" > checks.md5"
|
883
|
+
FileUtils.cp final_model 'final_check.mod'
|
884
|
+
return true
|
885
|
+
end
|
848
886
|
|
849
|
-
|
850
|
-
|
851
|
-
|
852
|
-
# check that final model matches
|
853
|
-
puts './ck >& final_check_diff.txt'
|
854
|
-
if not system('./ck >& final_check_diff.txt')
|
855
|
-
return fail_test(:run_checksum)
|
856
|
-
elsif File.exist? 'final_check_diff.txt' and
|
857
|
-
not File.read('final_check_diff.txt').empty?
|
858
|
-
return fail_test(:run_diff)
|
859
|
-
elsif File.exist? final_model
|
860
|
-
return succeed(:run_checksum)
|
861
|
-
end
|
887
|
+
# display runtime message
|
888
|
+
puts IO.readlines('out.txt').select { |line| line.scan(/runtime/i) }[-1]
|
862
889
|
|
863
|
-
#
|
864
|
-
|
865
|
-
|
866
|
-
|
890
|
+
# check that final model matches
|
891
|
+
puts './ck >& final_check_diff.txt'
|
892
|
+
return fail_test(:run_checksum) unless
|
893
|
+
system('./ck >& final_check_diff.txt')
|
894
|
+
return fail_test(:run_diff) if File.exist?('final_check_diff.txt') &&
|
895
|
+
!File.read('final_check_diff.txt').empty?
|
896
|
+
return succeed(:run_checksum) if File.exist? final_model
|
867
897
|
end
|
868
898
|
|
869
899
|
# prepare for and do restart, check results, and return pass/fail status
|
@@ -872,8 +902,8 @@ class MesaTestCase
|
|
872
902
|
return unless photo
|
873
903
|
|
874
904
|
# check that photo file actually exists
|
875
|
-
unless File.exist?(File.join('photos', photo))
|
876
|
-
|
905
|
+
unless File.exist?(File.join('photos', photo)) ||
|
906
|
+
File.exist?(File.join('photos1', photo))
|
877
907
|
return fail_test(:photo_file)
|
878
908
|
end
|
879
909
|
|
@@ -886,15 +916,13 @@ class MesaTestCase
|
|
886
916
|
append_and_rm_err
|
887
917
|
|
888
918
|
# check that final model matches
|
889
|
-
puts
|
890
|
-
|
891
|
-
|
892
|
-
|
893
|
-
File.
|
894
|
-
|
895
|
-
|
896
|
-
return succeed(:photo_checksum)
|
897
|
-
end
|
919
|
+
puts './ck >& final_check_diff.txt'
|
920
|
+
return fail_test(:photo_checksum) unless
|
921
|
+
system('./ck >& final_check_diff.txt')
|
922
|
+
return fail_test(:photo_diff) if
|
923
|
+
File.exist?('final_check_diff.txt') &&
|
924
|
+
!File.read('final_check_diff.txt').empty?
|
925
|
+
succeed(:photo_checksum)
|
898
926
|
end
|
899
927
|
|
900
928
|
def build_and_run
|
@@ -923,29 +951,29 @@ class MesaTestCase
|
|
923
951
|
end
|
924
952
|
|
925
953
|
def display_errors(err_contents)
|
926
|
-
return
|
954
|
+
return if err_contents.strip.empty?
|
927
955
|
shell.say("\nERRORS", :red)
|
928
956
|
puts err_contents
|
929
|
-
shell.say(
|
957
|
+
shell.say('END OF ERRORS', :red)
|
930
958
|
end
|
931
959
|
|
932
960
|
def log_errors(err_contents, outfile)
|
961
|
+
return if err_contents.strip.empty?
|
933
962
|
File.open(outfile, 'a') { |f_out| f_out.write(err_contents) }
|
934
|
-
shell.say("appended to #{outfile}
|
963
|
+
shell.say("appended to #{outfile}\n", :red)
|
935
964
|
end
|
936
965
|
|
937
966
|
def simple_clean
|
938
967
|
puts './clean'
|
939
|
-
|
940
|
-
|
941
|
-
|
942
|
-
end
|
968
|
+
return if system('./clean')
|
969
|
+
raise TestCaseDirError, 'Encountered an error when running `clean` in ' \
|
970
|
+
"#{Dir.getwd} for test case #{test_name}."
|
943
971
|
end
|
944
972
|
|
945
973
|
def mk
|
946
974
|
puts './mk > mk.txt'
|
947
975
|
unless system('./mk > mk.txt')
|
948
|
-
raise TestCaseDirError, 'Encountered an error when running `mk` in '
|
976
|
+
raise TestCaseDirError, 'Encountered an error when running `mk` in ' \
|
949
977
|
"#{Dir.getwd} for test case #{test_name}."
|
950
978
|
end
|
951
979
|
FileUtils.rm 'mk.txt'
|
@@ -985,13 +1013,11 @@ end
|
|
985
1013
|
# directory
|
986
1014
|
def visit_dir(new_dir)
|
987
1015
|
cwd = Dir.getwd
|
988
|
-
shell.say "Leaving #{cwd}", :blue
|
989
|
-
puts ""
|
1016
|
+
shell.say "Leaving #{cwd}\n", :blue
|
990
1017
|
shell.say "Entering #{new_dir}.", :blue
|
991
1018
|
Dir.chdir(new_dir)
|
992
1019
|
yield if block_given?
|
993
|
-
shell.say "Leaving #{new_dir}", :blue
|
994
|
-
puts ""
|
1020
|
+
shell.say "Leaving #{new_dir}\n", :blue
|
995
1021
|
shell.say "Entering #{cwd}.", :blue
|
996
1022
|
Dir.chdir(cwd)
|
997
1023
|
end
|
@@ -1004,18 +1030,17 @@ def generate_seeds_rb(mesa_dir, outfile)
|
|
1004
1030
|
f.puts 'test_cases = TestCase.create!('
|
1005
1031
|
f.puts ' ['
|
1006
1032
|
m.test_names.each do |test_case_name|
|
1007
|
-
f.puts
|
1033
|
+
f.puts ' {'
|
1008
1034
|
f.puts " name: '#{test_case_name}',"
|
1009
1035
|
f.puts " version_added: #{m.version_number},"
|
1010
1036
|
# no comma on last one
|
1011
1037
|
if test_case_name == m.test_names[-1]
|
1012
1038
|
f.puts(' }')
|
1013
1039
|
else
|
1014
|
-
f.puts(' }')
|
1040
|
+
f.puts(' },')
|
1015
1041
|
end
|
1016
1042
|
end
|
1017
1043
|
f.puts ' ]'
|
1018
1044
|
f.puts ')'
|
1019
1045
|
end
|
1020
1046
|
end
|
1021
|
-
|