Torsten Rüger
6547b1608d
also making command configurable as they seem different on ubuntu (16?) than fedora 30 (and who knows where else)
76 lines
1.9 KiB
Ruby
76 lines
1.9 KiB
Ruby
require_relative 'helper'
|
|
require 'net/ssh'
|
|
require 'net/scp'
|
|
|
|
module Mains
|
|
class TestArm < MiniTest::Test
|
|
@Qemu = "qemu-arm"
|
|
@Linker = "arm-linux-gnuabi-ld"
|
|
def self.Linker
|
|
@Linker
|
|
end
|
|
def self.Qemu
|
|
@Qemu
|
|
end
|
|
DEBUG = false
|
|
|
|
# runnable_methods is called by minitest to determine which tests to run
|
|
def self.runnable_methods
|
|
all = Dir["test/mains/source/*_*.rb"]
|
|
tests =[]
|
|
return tests unless has_qemu
|
|
all.each do |file_name|
|
|
fullname = file_name.split("/").last.split(".").first
|
|
name , stdout , exit_code = fullname.split("_")
|
|
method_name = "test_#{name}"
|
|
input = File.read(file_name)
|
|
tests << method_name
|
|
self.send(:define_method, method_name ) do
|
|
out , code = run_code(input , name)
|
|
assert_equal stdout , out , "Wrong stdout #{name}"
|
|
assert_equal exit_code , code.to_s , "Wrong exit code #{name}"
|
|
end
|
|
break
|
|
end
|
|
tests
|
|
end
|
|
|
|
def self.has_qemu
|
|
if `uname -a`.include?("torsten")
|
|
qemu = "qemu-arm"
|
|
@Linker = "arm-linux-gnu-ld"
|
|
#return false
|
|
end
|
|
begin
|
|
`#{@Qemu} -version`
|
|
`#{@Linker} -v`
|
|
rescue => e
|
|
puts e
|
|
return false
|
|
end
|
|
true
|
|
end
|
|
|
|
def run_code(input , name )
|
|
puts "Compiling #{name}.o" if DEBUG
|
|
|
|
linker = ::RubyX::RubyXCompiler.new({}).ruby_to_binary( input , :arm )
|
|
writer = Elf::ObjectWriter.new(linker)
|
|
|
|
writer.save "mains.o"
|
|
|
|
puts "Linking #{name}" if DEBUG
|
|
|
|
`#{TestArm.Linker} -N mains.o`
|
|
assert_equal 0 , $?.exitstatus , "Linking #{name} failed #{$?}"
|
|
|
|
puts "Running #{name}" if DEBUG
|
|
stdout = `#{TestArm.Qemu} ./a.out`
|
|
exit_code = $?.exitstatus
|
|
puts "Result #{stdout} #{exit_code}" if DEBUG
|
|
return stdout , exit_code
|
|
end
|
|
|
|
end
|
|
end
|