rubyx/test/mains/test_arm.rb

77 lines
2.1 KiB
Ruby
Raw Normal View History

2018-06-24 16:10:39 +02:00
require_relative 'helper'
# set environment TEST_ARM to true to have these tests run
# They need qemu and arm cross linker to be installed
# Also they are too slow to include in normal runs, so only by request and on travis
# set TEST_ARM to DEBUG to get extra output
2018-06-24 16:10:39 +02:00
module Mains
class TestArm < MiniTest::Test
@Qemu = "qemu-arm"
2019-08-18 14:40:40 +02:00
@Linker = "arm-linux-gnueabi-ld"
def self.Linker
@Linker
end
def self.Qemu
@Qemu
end
2018-06-24 16:10:39 +02:00
# runnable_methods is called by minitest to determine which tests to run
def self.runnable_methods
all = Dir["test/mains/source/*_*.rb"]
2018-06-24 16:10:39 +02:00
tests =[]
return tests unless has_qemu
2018-06-24 16:10:39 +02:00
all.each do |file_name|
fullname = file_name.split("/").last.split(".").first
order , name , stdout , exit_code = fullname.split("_")
method_name = "test_#{order}_#{name}"
2018-06-24 16:10:39 +02:00
input = File.read(file_name)
tests << method_name
2018-06-24 16:10:39 +02:00
self.send(:define_method, method_name ) do
out , code = run_code(input , "#{order}_#{name}")
2018-06-24 16:10:39 +02:00
assert_equal stdout , out , "Wrong stdout #{name}"
assert_equal exit_code , code.to_s , "Wrong exit code #{name}"
end
end
tests
end
def self.has_qemu
if `uname -a`.include?("torsten")
@Linker = "arm-linux-gnu-ld" #on fedora
end
return false unless ENV["TEST_ARM"]
begin
`#{@Qemu} -version`
`#{@Linker} -v`
rescue => e
puts e
return false
end
true
2018-06-24 16:10:39 +02:00
end
def run_code(input , name )
puts "Compiling #{name}.o" if ENV["TEST_ARM"] == "DEBUG"
linker = ::RubyX::RubyXCompiler.new({}).ruby_to_binary( input , :arm )
writer = Elf::ObjectWriter.new(linker)
writer.save "mains.o"
puts "Linking #{name}" if ENV["TEST_ARM"] == "DEBUG"
`#{TestArm.Linker} -N mains.o`
assert_equal 0 , $?.exitstatus , "Linking #{name} failed #{$?}"
puts "Running #{name}" if ENV["TEST_ARM"] == "DEBUG"
stdout = `#{TestArm.Qemu} ./a.out`
exit_code = $?.exitstatus
puts "Result #{stdout} #{exit_code}" if ENV["TEST_ARM"] == "DEBUG"
return stdout , exit_code
2018-06-24 16:10:39 +02:00
end
end
end