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
532
533
# File 'lib/mesa_test.rb', line 513

def initialize(mesa_dir: ENV['MESA_DIR'], use_svn: true)
  # absolute_path ensures that it doesn't matter where commands are executed
  # from
  @mesa_dir = File.absolute_path(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:



606
607
608
609
610
# File 'lib/mesa_test.rb', line 606

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

#cleanObject



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

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



568
569
570
571
572
573
574
# File 'lib/mesa_test.rb', line 568

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



600
601
602
# File 'lib/mesa_test.rb', line 600

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



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

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



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

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



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

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



675
676
677
678
679
680
681
# File 'lib/mesa_test.rb', line 675

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



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

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)


724
725
726
# File 'lib/mesa_test.rb', line 724

def installed?
  check_mesa_dir
end

#load_svn_dataObject



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

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



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
671
672
# File 'lib/mesa_test.rb', line 619

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



546
547
548
# File 'lib/mesa_test.rb', line 546

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

#svn_version_numberObject

get version number from svn (preferred method)



561
562
563
564
565
# File 'lib/mesa_test.rb', line 561

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

#test_suite_dir(mod: nil) ⇒ Object



612
613
614
615
# File 'lib/mesa_test.rb', line 612

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

#use_svn?Boolean

Returns:

  • (Boolean)


535
536
537
# File 'lib/mesa_test.rb', line 535

def use_svn?
  @use_svn
end

#version_numberObject



539
540
541
542
543
544
# File 'lib/mesa_test.rb', line 539

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