mesa_test 1.0.5 → 1.1.0
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 +2 -1
- data/lib/mesa_test.rb +175 -5
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2c6b3c8632cb3efbbabbcbd9534f5519a317a0f80d991227dde9c7acc1257946
|
|
4
|
+
data.tar.gz: 81ac0670ba6f3e7799bd3f07ea571f9cee317a8cb2cc230fe8d7b2fa96837622
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f23b4cb696c153072d2890d4c6ec1c412ed6e9ce723568367ae731ca8b4189ada86dfcaca27d04899f14ec175971beafe2e15c91488ac777181200de8bf54f0a
|
|
7
|
+
data.tar.gz: 5d4c7559f31733ad12c88bec794663ac873b36fa2166129ceac9d17cb29ac8db019110f853360b0b60a6067a9ca469b3c26e35e1e44581b16be514df8297a544
|
data/bin/mesa_test
CHANGED
|
@@ -138,7 +138,8 @@ class MesaTest < Thor
|
|
|
138
138
|
m.check_installation
|
|
139
139
|
rescue MesaDirError
|
|
140
140
|
shell.say %q{This MESA installation doesn't seem to be compiled } \
|
|
141
|
-
'properly.
|
|
141
|
+
'properly. Attempting to submit a compilation failure to '\
|
|
142
|
+
'MESATestHub.', :red
|
|
142
143
|
empty = true
|
|
143
144
|
ensure
|
|
144
145
|
# submit all tests
|
data/lib/mesa_test.rb
CHANGED
|
@@ -7,6 +7,7 @@ require 'net/http'
|
|
|
7
7
|
require 'net/https'
|
|
8
8
|
require 'thor'
|
|
9
9
|
require 'json'
|
|
10
|
+
require 'base64'
|
|
10
11
|
|
|
11
12
|
MesaDirError = Class.new(StandardError)
|
|
12
13
|
TestCaseDirError = Class.new(StandardError)
|
|
@@ -48,9 +49,14 @@ e-mail and password will be stored in plain text.'
|
|
|
48
49
|
"#{s.email} (required)? (#{s.password})", :blue
|
|
49
50
|
s.password = response unless response.empty?
|
|
50
51
|
|
|
52
|
+
# Get API key for submitting failure logs
|
|
53
|
+
response = shell.ask 'What is the logs submission API token associated '\
|
|
54
|
+
"with the email #{s.email} (required)? (#{s.logs_token})", :blue
|
|
55
|
+
s.logs_token = response unless response.empty?
|
|
56
|
+
|
|
51
57
|
# Determine if we'll use ssh or https to access github
|
|
52
58
|
response = shell.ask 'When accessing GitHub, which protocol do you '\
|
|
53
|
-
'want to use?
|
|
59
|
+
'want to use?', :blue, limited_to: %w[ssh https]
|
|
54
60
|
s.github_protocol = response.strip.downcase.to_sym
|
|
55
61
|
|
|
56
62
|
# Get location of source MESA repo (the mirror)
|
|
@@ -110,7 +116,7 @@ e-mail and password will be stored in plain text.'
|
|
|
110
116
|
|
|
111
117
|
attr_accessor :computer_name, :user_name, :email, :password, :platform,
|
|
112
118
|
:mesa_mirror, :mesa_work, :platform_version, :processor,
|
|
113
|
-
:config_file, :base_uri, :
|
|
119
|
+
:config_file, :base_uri, :github_protocol, :logs_token
|
|
114
120
|
|
|
115
121
|
attr_reader :shell
|
|
116
122
|
|
|
@@ -118,7 +124,7 @@ e-mail and password will be stored in plain text.'
|
|
|
118
124
|
def initialize(
|
|
119
125
|
computer_name: nil, user_name: nil, email: nil, github_protocol: nil,
|
|
120
126
|
mesa_mirror: nil, platform: nil, platform_version: nil, processor: nil,
|
|
121
|
-
config_file: nil, base_uri: nil,
|
|
127
|
+
config_file: nil, base_uri: nil, logs_token: nil
|
|
122
128
|
)
|
|
123
129
|
@computer_name = computer_name || Socket.gethostname.scan(/^[^\.]+\.?/)[0]
|
|
124
130
|
@computer_name.chomp!('.') if @computer_name
|
|
@@ -146,6 +152,7 @@ e-mail and password will be stored in plain text.'
|
|
|
146
152
|
@config_file = config_file || File.join(ENV['HOME'], '.mesa_test',
|
|
147
153
|
'config.yml')
|
|
148
154
|
@base_uri = base_uri
|
|
155
|
+
@logs_token = logs_token || ENV['MESA_LOGS_TOKEN']
|
|
149
156
|
|
|
150
157
|
# set up thor-proof way to get responses from user. Thor hijacks the
|
|
151
158
|
# gets command, so we have to use its built-in "ask" method, which is
|
|
@@ -166,6 +173,7 @@ e-mail and password will be stored in plain text.'
|
|
|
166
173
|
puts "Computer Name #{computer_name}"
|
|
167
174
|
puts "User email #{email}"
|
|
168
175
|
puts 'Password ***********'
|
|
176
|
+
puts "logs API token #{logs_token}"
|
|
169
177
|
puts "GitHub Protocol #{github_protocol}"
|
|
170
178
|
puts "MESA Mirror Location #{mesa_mirror}"
|
|
171
179
|
puts "MESA Work Location #{mesa_work}"
|
|
@@ -188,6 +196,7 @@ e-mail and password will be stored in plain text.'
|
|
|
188
196
|
'computer_name' => computer_name,
|
|
189
197
|
'email' => email,
|
|
190
198
|
'password' => password,
|
|
199
|
+
'logs_token' => logs_token,
|
|
191
200
|
'github_protocol' => github_protocol,
|
|
192
201
|
'mesa_mirror' => mesa_mirror,
|
|
193
202
|
'mesa_work' => mesa_work,
|
|
@@ -206,6 +215,7 @@ e-mail and password will be stored in plain text.'
|
|
|
206
215
|
@computer_name = data_hash['computer_name']
|
|
207
216
|
@email = data_hash['email']
|
|
208
217
|
@password = data_hash['password']
|
|
218
|
+
@logs_token = data_hash['logs_token']
|
|
209
219
|
@github_protocol = data_hash['github_protocol'].to_sym
|
|
210
220
|
@mesa_mirror = data_hash['mesa_mirror']
|
|
211
221
|
@mesa_work = data_hash['mesa_work']
|
|
@@ -273,6 +283,28 @@ e-mail and password will be stored in plain text.'
|
|
|
273
283
|
res
|
|
274
284
|
end
|
|
275
285
|
|
|
286
|
+
# Parameters for reporting a failed compilation to the logs server
|
|
287
|
+
def build_log_params(mesa)
|
|
288
|
+
{
|
|
289
|
+
'computer_name' => computer_name,
|
|
290
|
+
'commit' => mesa.sha,
|
|
291
|
+
'build.log' => mesa.build_log_64
|
|
292
|
+
}
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
# Parameters for reporting a failed test to the logs server
|
|
296
|
+
def test_log_params(test_case)
|
|
297
|
+
res = {
|
|
298
|
+
'computer_name' => computer_name,
|
|
299
|
+
'commit' => test_case.mesa.sha,
|
|
300
|
+
'test_case' => test_case.test_name
|
|
301
|
+
}
|
|
302
|
+
res['mk.txt'] = test_case.mk_64 unless test_case.mk_64.empty?
|
|
303
|
+
res['out.txt'] = test_case.out_64 unless test_case.out_64.empty?
|
|
304
|
+
res['err.txt'] = test_case.err_64 unless test_case.err_64.empty?
|
|
305
|
+
res
|
|
306
|
+
end
|
|
307
|
+
|
|
276
308
|
# Parameters for a single test case. +mesa+ is an instance of +Mesa+, and
|
|
277
309
|
# +test_case+ is an instance of MesaTestCase representing the test case to
|
|
278
310
|
# be submitted
|
|
@@ -319,7 +351,9 @@ e-mail and password will be stored in plain text.'
|
|
|
319
351
|
#
|
|
320
352
|
# if we have an empty submission, then it is necessarily not entire.
|
|
321
353
|
# Similarly, a non-empty submission is necessarily entire (otherwise one
|
|
322
|
-
# would use +submit_instance+)
|
|
354
|
+
# would use +submit_instance+). Also, make a "nonempty" submission be
|
|
355
|
+
# empty if there was an overall build error
|
|
356
|
+
empty ||= !mesa.installed?
|
|
323
357
|
request_data = {submitter: submitter_params,
|
|
324
358
|
commit: commit_params(mesa, empty: empty, entire: !empty)}
|
|
325
359
|
# don't need test instances if it's an empty submission or if compilation
|
|
@@ -338,7 +372,29 @@ e-mail and password will be stored in plain text.'
|
|
|
338
372
|
false
|
|
339
373
|
else
|
|
340
374
|
shell.say "\nSuccessfully submitted commit #{mesa.sha}.", :green
|
|
341
|
-
|
|
375
|
+
# commit submitted to testhub, now submit build log if compilation failed
|
|
376
|
+
# and exit
|
|
377
|
+
unless mesa.installed?
|
|
378
|
+
return submit_build_log(mesa)
|
|
379
|
+
end
|
|
380
|
+
|
|
381
|
+
# compilation succeded, so submit any logs for failing tests
|
|
382
|
+
res = true
|
|
383
|
+
unless empty
|
|
384
|
+
mesa.test_cases.each do |mod, test_case_hash|
|
|
385
|
+
test_case_hash.each do |tc_name, test_case|
|
|
386
|
+
# get at each individual test case, see if it failed, and if it
|
|
387
|
+
# did, submit its log files
|
|
388
|
+
unless test_case.passed?
|
|
389
|
+
res &&= submit_test_log(test_case)
|
|
390
|
+
end
|
|
391
|
+
end
|
|
392
|
+
end
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
# a true return value means that any and all log submission were
|
|
396
|
+
# successful
|
|
397
|
+
res
|
|
342
398
|
end
|
|
343
399
|
end
|
|
344
400
|
|
|
@@ -378,9 +434,80 @@ e-mail and password will be stored in plain text.'
|
|
|
378
434
|
else
|
|
379
435
|
shell.say "\nSuccessfully submitted instance of #{test_case.test_name} "\
|
|
380
436
|
"for commit #{mesa.sha}.", :green
|
|
437
|
+
# submit logs if test failed
|
|
438
|
+
return submit_test_log(test_case) unless test_case.passed?
|
|
439
|
+
true
|
|
440
|
+
end
|
|
441
|
+
end
|
|
442
|
+
|
|
443
|
+
# make generic request to LOGS server
|
|
444
|
+
# +params+ is a hash of data to be encoded as JSON and sent off
|
|
445
|
+
def submit_logs(params)
|
|
446
|
+
uri = URI('https://logs.mesastar.org/uploads')
|
|
447
|
+
https = Net::HTTP.new(uri.host, uri.port)
|
|
448
|
+
https.use_ssl = true
|
|
449
|
+
req = Net::HTTP::Post.new(uri.path, 'Content-Type' => 'application/json',
|
|
450
|
+
'X-Api-Key' => logs_token)
|
|
451
|
+
req.body = params.to_json
|
|
452
|
+
https.request(req)
|
|
453
|
+
end
|
|
454
|
+
|
|
455
|
+
# send build log to the logs server
|
|
456
|
+
def submit_build_log(mesa)
|
|
457
|
+
# intercept and don't send if mesa was properly installed
|
|
458
|
+
return true if mesa.installed?
|
|
459
|
+
|
|
460
|
+
# don't even try unless we have a logs token set
|
|
461
|
+
unless logs_token
|
|
462
|
+
shell.say 'Cannot submit to logs server; need to set mesa_logs_token '\
|
|
463
|
+
'in the mesa_test config file.'
|
|
464
|
+
return false
|
|
465
|
+
end
|
|
466
|
+
|
|
467
|
+
# do submission
|
|
468
|
+
res = submit_logs(build_log_params(mesa))
|
|
469
|
+
|
|
470
|
+
# report out results
|
|
471
|
+
if !res.is_a? Net::HTTPOK
|
|
472
|
+
shell.say "\nFailed to submit build.log to the LOGS server for commit "\
|
|
473
|
+
"#{mesa.sha}.", :red
|
|
474
|
+
false
|
|
475
|
+
else
|
|
476
|
+
shell.say "\nSuccessfully submitted build.log to the LOGS server for "\
|
|
477
|
+
"#{mesa.sha}.", :green
|
|
381
478
|
true
|
|
382
479
|
end
|
|
383
480
|
end
|
|
481
|
+
|
|
482
|
+
# send build log to the logs server
|
|
483
|
+
def submit_test_log(test_case)
|
|
484
|
+
# skip submission if mesa was never installed or if the test passed
|
|
485
|
+
return true if !test_case.mesa.installed? || test_case.passed?
|
|
486
|
+
|
|
487
|
+
# don't even try unless we have a logs token set
|
|
488
|
+
unless logs_token
|
|
489
|
+
shell.say 'Cannot submit to logs server; need to set mesa_logs_token '\
|
|
490
|
+
'in the mesa_test config file..'
|
|
491
|
+
return false
|
|
492
|
+
end
|
|
493
|
+
|
|
494
|
+
# do submission
|
|
495
|
+
res = submit_logs(test_log_params(test_case))
|
|
496
|
+
|
|
497
|
+
# report out results
|
|
498
|
+
if !res.is_a? Net::HTTPOK
|
|
499
|
+
shell.say "Failed to submit out.txt and mk.txt to the LOGS server for "\
|
|
500
|
+
"test case #{test_case.test_name} in commit "\
|
|
501
|
+
"#{test_case.mesa.sha}.", :red
|
|
502
|
+
false
|
|
503
|
+
else
|
|
504
|
+
shell.say "Successfully submitted out.txt and mk.txt to the LOGS "\
|
|
505
|
+
"server for test case #{test_case.test_name} in commit "\
|
|
506
|
+
"#{test_case.mesa.sha}.", :green
|
|
507
|
+
true
|
|
508
|
+
end
|
|
509
|
+
end
|
|
510
|
+
|
|
384
511
|
end
|
|
385
512
|
|
|
386
513
|
class Mesa
|
|
@@ -562,6 +689,14 @@ class Mesa
|
|
|
562
689
|
'show a successful installation).'
|
|
563
690
|
end
|
|
564
691
|
|
|
692
|
+
# base 64-encoded contents of build.log
|
|
693
|
+
def build_log_64
|
|
694
|
+
build_log = File.join(mesa_dir, 'build.log')
|
|
695
|
+
return '' unless File.exist?(build_log)
|
|
696
|
+
|
|
697
|
+
b64_file(build_log)
|
|
698
|
+
end
|
|
699
|
+
|
|
565
700
|
# sourced from $MESA_DIR/testhub.yml, which should be created after
|
|
566
701
|
# installation
|
|
567
702
|
def compiler_hash
|
|
@@ -857,6 +992,36 @@ class MesaTestCase
|
|
|
857
992
|
YAML.safe_load(File.read(testhub_file), [Symbol])
|
|
858
993
|
end
|
|
859
994
|
|
|
995
|
+
# whether or not a test case has passed; only has meaning
|
|
996
|
+
# if we can load the results hash, though
|
|
997
|
+
def passed?
|
|
998
|
+
results_hash['outcome'] == :pass
|
|
999
|
+
end
|
|
1000
|
+
|
|
1001
|
+
# Base-64 encoded contents of mk.txt file
|
|
1002
|
+
def mk_64
|
|
1003
|
+
mk_file = File.join(test_case_dir, 'mk.txt')
|
|
1004
|
+
return '' unless File.exist?(mk_file)
|
|
1005
|
+
|
|
1006
|
+
b64_file(mk_file)
|
|
1007
|
+
end
|
|
1008
|
+
|
|
1009
|
+
# Base-64 encoded contents of err.txt file
|
|
1010
|
+
def err_64
|
|
1011
|
+
err_file = File.join(test_case_dir, 'err.txt')
|
|
1012
|
+
return '' unless File.exist?(err_file)
|
|
1013
|
+
|
|
1014
|
+
b64_file(err_file)
|
|
1015
|
+
end
|
|
1016
|
+
|
|
1017
|
+
# Base-64 encoded contents of out.txt file
|
|
1018
|
+
def out_64
|
|
1019
|
+
out_file = File.join(test_case_dir, 'out.txt')
|
|
1020
|
+
return '' unless File.exist?(out_file)
|
|
1021
|
+
|
|
1022
|
+
b64_file(out_file)
|
|
1023
|
+
end
|
|
1024
|
+
|
|
860
1025
|
private
|
|
861
1026
|
|
|
862
1027
|
# cd into the test case directory, do something in a block, then cd back
|
|
@@ -955,3 +1120,8 @@ end
|
|
|
955
1120
|
def bashticks(command)
|
|
956
1121
|
`bash -c "#{command}"`.chomp
|
|
957
1122
|
end
|
|
1123
|
+
|
|
1124
|
+
# encode the contents of a file as base-64
|
|
1125
|
+
def b64_file(filename)
|
|
1126
|
+
Base64.encode64(File.open(filename).read)
|
|
1127
|
+
end
|
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: 1.0
|
|
4
|
+
version: 1.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- William Wolf
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2021-
|
|
11
|
+
date: 2021-05-18 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: json
|
|
@@ -81,7 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
81
81
|
- !ruby/object:Gem::Version
|
|
82
82
|
version: '0'
|
|
83
83
|
requirements: []
|
|
84
|
-
rubygems_version: 3.
|
|
84
|
+
rubygems_version: 3.2.3
|
|
85
85
|
signing_key:
|
|
86
86
|
specification_version: 4
|
|
87
87
|
summary: Command line tool for running and reporting the MESA test suites.
|