Class: Mesa

Inherits:
Object
  • Object
show all
Defined in:
lib/mesa_test.rb

Constant Summary collapse

SVN_URI =
'svn://svn.code.sf.net/p/mesa/code/trunk'.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(mesa_dir: , use_svn: true) ⇒ Mesa

Returns a new instance of Mesa.



513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
# File 'lib/mesa_test.rb', line 513

def initialize(mesa_dir: ENV['MESA_DIR'], use_svn: true)
  @mesa_dir = mesa_dir
  @use_svn = use_svn
  @update_checksums = false

  # these get populated by calling #load_test_data
  @test_data = {}
  @test_names = {}
  @test_cases = {}

  # way to output colored text
  @shell = Thor::Shell::Color.new

  # these can be populated by calling load_svn_data
  @svn_version = nil
  @svn_author = nil
  @svn_log = nil
  load_svn_data if use_svn?
end

Instance Attribute Details

#mesa_dirObject (readonly)

Returns the value of attribute mesa_dir.



450
451
452
# File 'lib/mesa_test.rb', line 450

def mesa_dir
  @mesa_dir
end

#shellObject (readonly)

Returns the value of attribute shell.



450
451
452
# File 'lib/mesa_test.rb', line 450

def shell
  @shell
end

#svn_authorObject (readonly)

Returns the value of attribute svn_author.



450
451
452
# File 'lib/mesa_test.rb', line 450

def svn_author
  @svn_author
end

#svn_logObject (readonly)

Returns the value of attribute svn_log.



450
451
452
# File 'lib/mesa_test.rb', line 450

def svn_log
  @svn_log
end

#svn_versionObject (readonly)

Returns the value of attribute svn_version.



450
451
452
# File 'lib/mesa_test.rb', line 450

def svn_version
  @svn_version
end

#test_casesObject (readonly)

Returns the value of attribute test_cases.



450
451
452
# File 'lib/mesa_test.rb', line 450

def test_cases
  @test_cases
end

#test_dataObject (readonly)

Returns the value of attribute test_data.



450
451
452
# File 'lib/mesa_test.rb', line 450

def test_data
  @test_data
end

#test_namesObject (readonly)

Returns the value of attribute test_names.



450
451
452
# File 'lib/mesa_test.rb', line 450

def test_names
  @test_names
end

#update_checksumsObject

Returns the value of attribute update_checksums.



452
453
454
# File 'lib/mesa_test.rb', line 452

def update_checksums
  @update_checksums
end

Class Method Details

.add_commit(commits, revision, author) ⇒ Object



476
477
478
479
480
481
# File 'lib/mesa_test.rb', line 476

def self.add_commit(commits, revision, author)
  commits << Commit.new
  commits.last.revision = revision.to_i
  commits.last.author = author
  commits.last.message = []
end

.commits_since(last_tested = DEFAULT_REVISION) ⇒ Object

all commits since the given version number



499
500
501
502
503
# File 'lib/mesa_test.rb', line 499

def self.commits_since(last_tested = DEFAULT_REVISION)
  commits = []
  log_lines_since(last_tested).each { |line| process_line(commits, line) }
  commits.sort_by(&:revision).reverse
end

.download(version_number: nil, new_mesa_dir: nil, use_svn: true) ⇒ Object



454
455
456
457
458
459
460
461
462
463
464
465
# File 'lib/mesa_test.rb', line 454

def self.download(version_number: nil, new_mesa_dir: nil, use_svn: true)
  new_mesa_dir ||= File.join(ENV['HOME'], 'mesa-test-r' + version_number.to_s)
  success = bash_execute(
    "svn co -r #{version_number} " \
    "svn://svn.code.sf.net/p/mesa/code/trunk #{new_mesa_dir}"
  )
  unless success
    raise MesaDirError, 'Encountered a problem in download mesa ' \
                        "revision #{version_number}."
  end
  Mesa.new(mesa_dir: new_mesa_dir, use_svn: use_svn)
end

.last_non_paxton_revision(last_tested = DEFAULT_REVISION) ⇒ Object



505
506
507
508
509
510
511
# File 'lib/mesa_test.rb', line 505

def self.last_non_paxton_revision(last_tested = DEFAULT_REVISION)
  commits_since(last_tested).each do |commit|
    return commit.revision unless commit.author == 'bill_paxton'
  end
  # give out garbage if no valid commit is found
  nil
end

.log_lines_since(last_tested = DEFAULT_REVISION) ⇒ Object



472
473
474
# File 'lib/mesa_test.rb', line 472

def self.log_lines_since(last_tested = DEFAULT_REVISION)
  log_since(last_tested).split("\n").reject(&:empty?)
end

.log_since(last_tested = DEFAULT_REVISION) ⇒ Object



467
468
469
470
# File 'lib/mesa_test.rb', line 467

def self.log_since(last_tested = DEFAULT_REVISION)
  # svn commit log back to, but excluding, the last revision tested
  `svn log #{SVN_URI} -r #{last_tested + 1}:HEAD`
end

.process_line(commits, line) ⇒ Object



483
484
485
486
487
488
489
490
491
492
493
494
495
496
# File 'lib/mesa_test.rb', line 483

def self.process_line(commits, line)
  last = commits.last
  if line =~ /^-+$/
    # dashed lines separate commits
    # Done with last commit (if it exists), so clean up message
    last.message = last.message.join("\n") unless last.nil?
  elsif line =~ /^r(\d+) \| (\w+) \| .* \| \d+ lines?$/
    # first line of a commit, scrape data and make new commit
    add_commit(commits, $1, $2)
  else
    # add lines to the message (will concatenate later to single String)
    last.message << line.strip
  end
end

Instance Method Details

#check_mod(mod) ⇒ Object

TEST SUITE METHODS

Raises:



604
605
606
607
608
# File 'lib/mesa_test.rb', line 604

def check_mod(mod)
  return if MesaTestCase.modules.include? mod
  raise TestCaseDirError, "Invalid module: #{mod}. Must be one of: " +
                          MesaTestCase.modules.join(', ')
end

#cleanObject



574
575
576
577
578
579
580
581
582
583
584
# File 'lib/mesa_test.rb', line 574

def clean
  with_mesa_dir do
    visit_and_check mesa_dir, MesaDirError, 'E\countered a problem in ' \
                              "running `clean` in #{mesa_dir}." do
      puts 'MESA_DIR = ' + ENV['MESA_DIR']
      puts './clean'
      bash_execute('./clean')
    end
  end
  self
end

#data_version_numberObject

read version number from $MESA_DIR/data/version_number



566
567
568
569
570
571
572
# File 'lib/mesa_test.rb', line 566

def data_version_number
  contents = ''
  File.open(File.join(mesa_dir, 'data', 'version_number'), 'r') do |f|
    contents = f.read
  end
  contents.strip.to_i
end

#destroyObject



598
599
600
# File 'lib/mesa_test.rb', line 598

def destroy
  FileUtils.rm_rf mesa_dir
end

#each_test_clean(mod: :all) ⇒ Object

based off of ‘$MESA_DIR/star/test_suite/each_test_run_and_diff` from revision 10000



683
684
685
686
687
688
689
690
691
692
# File 'lib/mesa_test.rb', line 683

def each_test_clean(mod: :all)
  if mod == :all
    MesaTestCase.modules.each { |this_mod| each_test_clean mod: this_mod }
  else
    check_mod mod
    test_names[mod].each do |test_name|
      test_cases[mod][test_name].clean
    end
  end
end

#each_test_load_results(mod: :all) ⇒ Object



710
711
712
713
714
715
716
717
718
719
720
# File 'lib/mesa_test.rb', line 710

def each_test_load_results(mod: :all)
  if mod == :all
    MesaTestCase.modules.each do |this_mod|
      each_test_load_results(mod: this_mod)
    end
  else
    test_names[mod].each do |test_name|
      test_cases[mod][test_name].load_results
    end
  end
end

#each_test_run_and_diff(mod: :all, log_results: false) ⇒ Object



694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
# File 'lib/mesa_test.rb', line 694

def each_test_run_and_diff(mod: :all, log_results: false)
  each_test_clean(mod: mod)

  if mod == :all
    MesaTestCase.modules.each do |this_mod|
      each_test_run_and_diff(mod: this_mod, log_results: log_results)
    end
  else
    test_names[mod].each do |test_name|
      test_cases[mod][test_name].do_one
      test_cases[mod][test_name].log_results if log_results
    end
    log_summary(mod: mod) if log_results
  end
end

#find_test_case(test_case_name: nil, mod: :all) ⇒ Object

can accept a number (in string form) as a name for indexed access



673
674
675
676
677
678
679
# File 'lib/mesa_test.rb', line 673

def find_test_case(test_case_name: nil, mod: :all)
  if /\A[0-9]+\z/ =~ test_case_name
    find_test_case_by_number(test_number: test_case_name.to_i, mod: mod)
  else
    find_test_case_by_name(test_case_name: test_case_name, mod: mod)
  end
end

#installObject



586
587
588
589
590
591
592
593
594
595
596
# File 'lib/mesa_test.rb', line 586

def install
  with_mesa_dir do
    visit_and_check mesa_dir, MesaDirError, 'Encountered a problem in ' \
                              "running `install` in #{mesa_dir}." do
      puts 'MESA_DIR = ' + ENV['MESA_DIR']
      puts './install'
      bash_execute('./install')
    end
  end
  self
end

#installed?Boolean

Returns:

  • (Boolean)


722
723
724
# File 'lib/mesa_test.rb', line 722

def installed?
  check_mesa_dir
end

#load_svn_dataObject



548
549
550
551
552
553
554
555
556
# File 'lib/mesa_test.rb', line 548

def load_svn_data
  # if this number is bad, #version_number will use fallback method
  @svn_version = svn_version_number
  lines = log_entry.split("\n").reject { |line| line =~ /^-+$/ or line.empty?}
  data_line = lines.shift
  revision, author, date, length = data_line.split('|')
  @svn_author = author.strip
  @svn_log = lines.join("\n").strip
end

#load_test_source_data(mod: :all) ⇒ Object

load data from the ‘do1_test_source` file that gets used in a lot of testing



617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
# File 'lib/mesa_test.rb', line 617

def load_test_source_data(mod: :all)
  # allow for brainless loading of all module data
  if mod == :all
    MesaTestCase.modules.each do |this_mod|
      load_test_source_data(mod: this_mod)
    end
  else
    check_mod mod
    # load data from the source file
    source_lines = IO.readlines(
      File.join(test_suite_dir(mod: mod), 'do1_test_source')
    )

    # initialize data hash to empty hash and name array to empty array
    @test_data[mod] = {}
    @test_names[mod] = []
    @test_cases[mod] = {}

    # read through each line and find four data, name, success string, final
    # model name, and photo. Either of model name and photo can be "skip"
    source_lines.each do |line|
      no_skip = /^do_one (.+)\s+"([^"]*)"\s+"([^"]+)"\s+(x?\d+)/
      one_skip = /^do_one (.+)\s+"([^"]*)"\s+"([^"]+)"\s+skip/
      two_skip = /^do_one (.+)\s+"([^"]*)"\s+skip\s+skip/
      found_test = false
      if line =~ no_skip
        found_test = true
        @test_data[mod][$1] = { success_string: $2, final_model: $3,
                                photo: $4}
      elsif line =~ one_skip
        found_test = true
        @test_data[mod][$1] = { success_string: $2, final_model: $3,
                                photo: nil }
      elsif line =~ two_skip
        found_test = true
        @test_data[mod][$1] = { success_string: $2, final_model: nil,
                                photo: nil }
      end

      if found_test
        @test_names[mod] << $1 unless @test_names[mod].include? $1
      end
    end

    # make MesaTestCase objects accessible by name
    @test_names[mod].each do |test_name|
      data = @test_data[mod][test_name]
      @test_cases[mod][test_name] = MesaTestCase.new(
        test: test_name, mesa: self, success_string: data[:success_string],
        mod: mod, final_model: data[:final_model], photo: data[:photo]
      )
    end
  end
end

#log_entryObject



544
545
546
# File 'lib/mesa_test.rb', line 544

def log_entry
  `svn log #{SVN_URI} -r #{version_number}`
end

#svn_version_numberObject

get version number from svn (preferred method)



559
560
561
562
563
# File 'lib/mesa_test.rb', line 559

def svn_version_number
  return `svnversion #{mesa_dir}`.strip.to_i
rescue Errno::ENOENT
  return 0
end

#test_suite_dir(mod: nil) ⇒ Object



610
611
612
613
# File 'lib/mesa_test.rb', line 610

def test_suite_dir(mod: nil)
  check_mod mod
  File.join(mesa_dir, mod.to_s, 'test_suite')
end

#use_svn?Boolean

Returns:

  • (Boolean)


533
534
535
# File 'lib/mesa_test.rb', line 533

def use_svn?
  @use_svn
end

#version_numberObject



537
538
539
540
541
542
# File 'lib/mesa_test.rb', line 537

def version_number
  version = @svn_version || 0
  # fall back to MESA_DIR/data's version number svn didn't work
  version = data_version_number unless version > 0
  version
end