mesa_test 1.0.4 → 1.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/bin/mesa_test +10 -3
  3. data/lib/mesa_test.rb +185 -11
  4. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ae698f83ffe3b76ef2a0b053c751ffe69a7122fa656b26ed8e208b4fc71543c4
4
- data.tar.gz: ea75570ccd182d43d362c7c8a58fdd8595854664a3a8ba764d535514fdc00b1e
3
+ metadata.gz: de6aece52d2c391d00f2fc190fc466bbcd65f892e0779857d191b60705aa16aa
4
+ data.tar.gz: 5783cb8940b3ad6d7e8373fec41325c5ffc60f7ba63c912c04c9da78fbf3173e
5
5
  SHA512:
6
- metadata.gz: b24851cee6d1e5fdfbaf5678654269742fd6890608784fbb513a5e7089260dc06a201db031f1c4c1763e4d5b91d052fd03acb96a11840abaf6f4b44ed59e510d
7
- data.tar.gz: 9aa56e5f062faeb96996cf9982cb15ba16f445f3002529ab2d7a341fe3988cb5015fcd70362e776f4916b928b8fa73a1c3199ed1979d601015e6172c88c7b075
6
+ metadata.gz: 2fc8fe1a184c7ac9b9df350236288445f01e5cccbb8ab4c2d684911e268730f65df24479e1afa62bf03bdabefa9a0e7d82cdbfbda44528e8fb38764071f0bc67
7
+ data.tar.gz: 4001cf3f05fd3076f27fae7082aff30f55b1257ee466c38e1a8dee0cc9529f7748357eea6106f6c8adcadaf6f839923f006a73365a198b45d939a425a30531a7
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. Submitting a compilation failure to MESATestHub.', :red
141
+ 'properly. Attempting to submit a compilation failure to '\
142
+ 'MESATestHub.', :red
142
143
  empty = true
143
144
  ensure
144
145
  # submit all tests
@@ -209,8 +210,14 @@ class MesaTest < Thor
209
210
  github_protocol: s.github_protocol
210
211
  )
211
212
  end
212
- m.clean
213
- m.install
213
+ begin
214
+ m.clean
215
+ m.install
216
+ rescue MesaDirError
217
+ shell.say "\nFailed in compiling MESA.", :red
218
+ else
219
+ shell.say "\nSuccessfully compiled MESA commit #{m.sha}.", :green
220
+ end
214
221
  end
215
222
 
216
223
  desc 'install_and_test [SHA]', 'Install, test, and submit an entire commit.'
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,15 @@ 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; contact Josiah Schwab if you "\
55
+ "need a key)? (#{s.logs_token})", :blue
56
+ s.logs_token = response unless response.empty?
57
+
51
58
  # Determine if we'll use ssh or https to access github
52
59
  response = shell.ask 'When accessing GitHub, which protocol do you '\
53
- 'want to use? ', :blue, limited_to: %w[ssh https]
60
+ 'want to use?', :blue, limited_to: %w[ssh https]
54
61
  s.github_protocol = response.strip.downcase.to_sym
55
62
 
56
63
  # Get location of source MESA repo (the mirror)
@@ -110,7 +117,7 @@ e-mail and password will be stored in plain text.'
110
117
 
111
118
  attr_accessor :computer_name, :user_name, :email, :password, :platform,
112
119
  :mesa_mirror, :mesa_work, :platform_version, :processor,
113
- :config_file, :base_uri, :last_tested, :github_protocol
120
+ :config_file, :base_uri, :github_protocol, :logs_token
114
121
 
115
122
  attr_reader :shell
116
123
 
@@ -118,7 +125,7 @@ e-mail and password will be stored in plain text.'
118
125
  def initialize(
119
126
  computer_name: nil, user_name: nil, email: nil, github_protocol: nil,
120
127
  mesa_mirror: nil, platform: nil, platform_version: nil, processor: nil,
121
- config_file: nil, base_uri: nil, last_tested: nil
128
+ config_file: nil, base_uri: nil, logs_token: nil
122
129
  )
123
130
  @computer_name = computer_name || Socket.gethostname.scan(/^[^\.]+\.?/)[0]
124
131
  @computer_name.chomp!('.') if @computer_name
@@ -146,6 +153,7 @@ e-mail and password will be stored in plain text.'
146
153
  @config_file = config_file || File.join(ENV['HOME'], '.mesa_test',
147
154
  'config.yml')
148
155
  @base_uri = base_uri
156
+ @logs_token = logs_token || ENV['MESA_LOGS_TOKEN']
149
157
 
150
158
  # set up thor-proof way to get responses from user. Thor hijacks the
151
159
  # gets command, so we have to use its built-in "ask" method, which is
@@ -166,6 +174,7 @@ e-mail and password will be stored in plain text.'
166
174
  puts "Computer Name #{computer_name}"
167
175
  puts "User email #{email}"
168
176
  puts 'Password ***********'
177
+ puts "logs API token #{logs_token}"
169
178
  puts "GitHub Protocol #{github_protocol}"
170
179
  puts "MESA Mirror Location #{mesa_mirror}"
171
180
  puts "MESA Work Location #{mesa_work}"
@@ -188,6 +197,7 @@ e-mail and password will be stored in plain text.'
188
197
  'computer_name' => computer_name,
189
198
  'email' => email,
190
199
  'password' => password,
200
+ 'logs_token' => logs_token,
191
201
  'github_protocol' => github_protocol,
192
202
  'mesa_mirror' => mesa_mirror,
193
203
  'mesa_work' => mesa_work,
@@ -206,6 +216,7 @@ e-mail and password will be stored in plain text.'
206
216
  @computer_name = data_hash['computer_name']
207
217
  @email = data_hash['email']
208
218
  @password = data_hash['password']
219
+ @logs_token = data_hash['logs_token']
209
220
  @github_protocol = data_hash['github_protocol'].to_sym
210
221
  @mesa_mirror = data_hash['mesa_mirror']
211
222
  @mesa_work = data_hash['mesa_work']
@@ -273,6 +284,28 @@ e-mail and password will be stored in plain text.'
273
284
  res
274
285
  end
275
286
 
287
+ # Parameters for reporting a failed compilation to the logs server
288
+ def build_log_params(mesa)
289
+ {
290
+ 'computer_name' => computer_name,
291
+ 'commit' => mesa.sha,
292
+ 'build.log' => mesa.build_log_64
293
+ }
294
+ end
295
+
296
+ # Parameters for reporting a failed test to the logs server
297
+ def test_log_params(test_case)
298
+ res = {
299
+ 'computer_name' => computer_name,
300
+ 'commit' => test_case.mesa.sha,
301
+ 'test_case' => test_case.test_name
302
+ }
303
+ res['mk.txt'] = test_case.mk_64 unless test_case.mk_64.empty?
304
+ res['out.txt'] = test_case.out_64 unless test_case.out_64.empty?
305
+ res['err.txt'] = test_case.err_64 unless test_case.err_64.empty?
306
+ res
307
+ end
308
+
276
309
  # Parameters for a single test case. +mesa+ is an instance of +Mesa+, and
277
310
  # +test_case+ is an instance of MesaTestCase representing the test case to
278
311
  # be submitted
@@ -319,7 +352,9 @@ e-mail and password will be stored in plain text.'
319
352
  #
320
353
  # if we have an empty submission, then it is necessarily not entire.
321
354
  # Similarly, a non-empty submission is necessarily entire (otherwise one
322
- # would use +submit_instance+)
355
+ # would use +submit_instance+). Also, make a "nonempty" submission be
356
+ # empty if there was an overall build error
357
+ empty ||= !mesa.installed?
323
358
  request_data = {submitter: submitter_params,
324
359
  commit: commit_params(mesa, empty: empty, entire: !empty)}
325
360
  # don't need test instances if it's an empty submission or if compilation
@@ -338,7 +373,29 @@ e-mail and password will be stored in plain text.'
338
373
  false
339
374
  else
340
375
  shell.say "\nSuccessfully submitted commit #{mesa.sha}.", :green
341
- true
376
+ # commit submitted to testhub, now submit build log if compilation failed
377
+ # and exit
378
+ unless mesa.installed?
379
+ return submit_build_log(mesa)
380
+ end
381
+
382
+ # compilation succeded, so submit any logs for failing tests
383
+ res = true
384
+ unless empty
385
+ mesa.test_cases.each do |mod, test_case_hash|
386
+ test_case_hash.each do |tc_name, test_case|
387
+ # get at each individual test case, see if it failed, and if it
388
+ # did, submit its log files
389
+ unless test_case.passed?
390
+ res &&= submit_test_log(test_case)
391
+ end
392
+ end
393
+ end
394
+ end
395
+
396
+ # a true return value means that any and all log submission were
397
+ # successful
398
+ res
342
399
  end
343
400
  end
344
401
 
@@ -378,9 +435,79 @@ e-mail and password will be stored in plain text.'
378
435
  else
379
436
  shell.say "\nSuccessfully submitted instance of #{test_case.test_name} "\
380
437
  "for commit #{mesa.sha}.", :green
438
+ # submit logs if test failed
439
+ return submit_test_log(test_case) unless test_case.passed?
381
440
  true
382
441
  end
383
442
  end
443
+
444
+ # make generic request to LOGS server
445
+ # +params+ is a hash of data to be encoded as JSON and sent off
446
+ def submit_logs(params)
447
+ uri = URI('https://logs.mesastar.org/uploads')
448
+ https = Net::HTTP.new(uri.host, uri.port)
449
+ https.use_ssl = true
450
+ req = Net::HTTP::Post.new(uri.path, 'Content-Type' => 'application/json',
451
+ 'X-Api-Key' => logs_token)
452
+ req.body = params.to_json
453
+ https.request(req)
454
+ end
455
+
456
+ # send build log to the logs server
457
+ def submit_build_log(mesa)
458
+ # intercept and don't send if mesa was properly installed
459
+ return true if mesa.installed?
460
+
461
+ # don't even try unless we have a logs token set
462
+ unless logs_token
463
+ shell.say 'Cannot submit to logs server; need to set mesa_logs_token '\
464
+ 'in the mesa_test config file.'
465
+ return false
466
+ end
467
+
468
+ # do submission
469
+ res = submit_logs(build_log_params(mesa))
470
+
471
+ # report out results
472
+ if !res.is_a? Net::HTTPOK
473
+ shell.say "\nFailed to submit build.log to the LOGS server for commit "\
474
+ "#{mesa.sha}.", :red
475
+ false
476
+ else
477
+ shell.say "\nSuccessfully submitted build.log to the LOGS server for "\
478
+ "#{mesa.sha}.", :green
479
+ true
480
+ end
481
+ end
482
+
483
+ # send build log to the logs server
484
+ def submit_test_log(test_case)
485
+ # skip submission if mesa was never installed or if the test passed
486
+ return true if !test_case.mesa.installed? || test_case.passed?
487
+
488
+ # don't even try unless we have a logs token set
489
+ unless logs_token
490
+ shell.say 'Cannot submit to logs server; need to set mesa_logs_token '\
491
+ 'in the mesa_test config file..'
492
+ return false
493
+ end
494
+
495
+ # do submission
496
+ res = submit_logs(test_log_params(test_case))
497
+
498
+ # report out results
499
+ if !res.is_a? Net::HTTPOK
500
+ shell.say "Failed to submit logs for test case #{test_case.test_name} "\
501
+ "in commit #{test_case.mesa.sha}.", :red
502
+ false
503
+ else
504
+ shell.say "Successfully submitted logs for test case "\
505
+ "#{test_case.test_name} in commit #{test_case.mesa.sha}.",
506
+ :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
@@ -614,12 +749,16 @@ class Mesa
614
749
  num, tc_name = line.strip.split
615
750
  @names_to_numbers[mod][tc_name.strip] = num.to_i
616
751
  @test_case_names[mod] << tc_name.strip
617
- @test_cases[mod][tc_name.strip] = MesaTestCase.new(
618
- test: tc_name.strip,
619
- mod: mod,
620
- position: num.to_i,
621
- mesa: self
622
- )
752
+ begin
753
+ @test_cases[mod][tc_name.strip] = MesaTestCase.new(
754
+ test: tc_name.strip,
755
+ mod: mod,
756
+ position: num.to_i,
757
+ mesa: self
758
+ )
759
+ rescue TestCaseDirError
760
+ shell.say "No such test case #{tc_name.strip}. Skipping loading it.", :red
761
+ end
623
762
  end
624
763
  end
625
764
  end
@@ -853,6 +992,36 @@ class MesaTestCase
853
992
  YAML.safe_load(File.read(testhub_file), [Symbol])
854
993
  end
855
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
+
856
1025
  private
857
1026
 
858
1027
  # cd into the test case directory, do something in a block, then cd back
@@ -951,3 +1120,8 @@ end
951
1120
  def bashticks(command)
952
1121
  `bash -c "#{command}"`.chomp
953
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
4
+ version: 1.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - William Wolf
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-22 00:00:00.000000000 Z
11
+ date: 2021-05-20 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.0.4
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.