class Kitchen::Verifier::Tox

Public Instance Methods

call(state) click to toggle source
# File lib/kitchen/verifier/tox.rb, line 29
def call(state)
  info("[#{name}] Verify on instance #{instance.name} with state=#{state}")
  root_path = (config[:windows] ? '%TEMP%\\kitchen' : '/tmp/kitchen')
  if ENV['KITCHEN_TESTS']
    ENV['KITCHEN_TESTS'].split(' ').each{|test| config[:tests].push(test)}
  end
  toxenv = instance.suite.name
  if config[:pytest]
    toxenv = "#{toxenv}-pytest"
    tests = config[:tests].join(' ')
  else
    toxenv = "#{toxenv}-runtests"
    tests = config[:tests].collect{|test| "-n #{test}"}.join(' ')
  end
  if config[:coverage]
    toxenv = "#{toxenv}-coverage"
  end

  if config[:enable_filenames] and ENV['CHANGE_TARGET'] and ENV['BRANCH_NAME']
    require 'git'
    repo = Git.open(Dir.pwd)
    config[:from_filenames] = repo.diff("origin/#{ENV['CHANGE_TARGET']}",
                                        "origin/#{ENV['BRANCH_NAME']}").name_status.keys.select{|file| file.end_with?('.py')}
  end

  if config[:junitxml]
    junitxml = File.join(root_path, config[:testingdir], 'artifacts', 'xml-unittests-output')
    if config[:pytest]
      junitxml = "--junitxml=#{File.join(junitxml, 'test-results.xml')}"
    else
      junitxml = "--xml=#{junitxml}"
    end
  end

  # Be sure to copy the remote artifacts directory to the local machine
  save = {
    "#{File.join(root_path, config[:testingdir], 'artifacts')}" => "#{Dir.pwd}/"
  }
  # Hash insert order matters, that's why we define a new one and merge
  # the one from config
  save.merge!(config[:save])

  command = [
    'tox -c',
    File.join(root_path, config[:testingdir], 'tox.ini'),
    "-e #{toxenv}",
    '--',
    "--output-columns=#{config[:output_columns]}",
    (config[:sysinfo] ? '--sysinfo' : ''),
    (config[:junitxml] ? junitxml : ''),
    (config[:windows] ? "--names-file=#{root_path}\\testing\\tests\\whitelist.txt" : ''),
    (config[:transport] ? "--transport=#{config[:transport]}" : ''),
    (config[:verbose] ? '-vv' : '-v'),
    (config[:run_destructive] ? "--run-destructive" : ''),
    (config[:ssh_tests] ? "--ssh-tests" : ''),
    (config[:proxy_tests] ? "--proxy-tests" : ''),
    config[:passthrough_opts].join(' '),
    (config[:from_filenames].any? ? "--from-filenames=#{config[:from_filenames].join(',')}" : ''),
    tests,
    '2>&1',
  ].join(' ')
  if config[:windows]
     command = "cmd.exe /c \"#{command}\" 2>&1"
  end
  info("Running Command: #{command}")
  instance.transport.connection(state) do |conn|
    begin
      if config[:windows]
        conn.execute('$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")')
        conn.execute("$env:PythonPath = [Environment]::ExpandEnvironmentVariables(\"#{root_path}\\testing\")")
      else
        begin
          conn.execute(sudo("chown -R $USER #{root_path}"))
        rescue => e
          error("Failed to chown #{root_path} :: #{e}")
        end
      end
      begin
        conn.execute(sudo(command))
      rescue => e
        info("Verify command failed :: #{e}")
      end
    ensure
      save.each do |remote, local|
        unless config[:windows]
          begin
            conn.execute(sudo("chmod -R +r #{remote}"))
          rescue => e
            error("Failed to chown #{remote} :: #{e}")
          end
        end
        begin
          info("Copying #{remote} to #{local}")
          conn.download(remote, local)
        rescue => e
          error("Failed to copy #{remote} to #{local} :: #{e}")
        end
      end
    end
  end
  debug("[#{name}] Verify completed.")
end