Sha256: 6d6e6f2c6eb5dce1a3803e56ac53129808e2d48a41126a22437a5c7c4e0e50f3

Contents?: true

Size: 1.54 KB

Versions: 5

Compression:

Stored size: 1.54 KB

Contents

require 'bait'
require 'bait/build'
require 'git'
require 'pty'

module Bait
  class Tester
    attr_reader :passed

    def initialize build
      @build = build
    end

    def bait_dir
      File.join(clone_path, ".bait")
    end

    def script
      File.join(bait_dir, "test.sh")
    end

    def test!
      begin
        begin
          PTY.spawn(script) do |r, w, pid|
            r.each { |line| @build.output << line }
            @build.passed = PTY.check(pid).exitstatus == 0
          end
        rescue PTY::ChildExited => e
          @build.output << e
          @build.passed = false
        end
        @build.tested = true
      rescue Errno::ENOENT => ex
        @build.output << "A test script was expected but missing.\nError: #{ex.message}"
      ensure
        @build.save
      end
    end

    def clone_path
      File.join(sandbox_directory, @build.name)
    end

    def clone!
      unless cloned?
        begin
          Git.clone(@build.clone_url, @build.name, :path => sandbox_directory)
        rescue => ex
          msg = "Failed to clone #{@build.clone_url}"
          puts msg
          @build.stderr = "#{msg}\n\n#{ex.message}\n\n#{ex.backtrace}"
          @build.save
        end
      end
    end

    def cloned?
      Dir.exists? File.join(clone_path, ".git/")
    end

    def cleanup!
      FileUtils.rm_rf sandbox_directory
    end

    def sandbox_directory
      @sandbox_directory ||= begin
        dir = File.join Bait.storage_dir, "build_tester", @build.id
        FileUtils.mkdir_p(dir) && dir
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
bait-0.3.2 lib/bait/tester.rb
bait-0.3.1 lib/bait/tester.rb
bait-0.3.0 lib/bait/tester.rb
bait-0.2.1 lib/bait/tester.rb
bait-0.2.0 lib/bait/tester.rb