# Author:: Nicolas Despres . # Copyright:: Copyright (c) 2004 TTK Team. All rights reserved. # License:: Ruby license. # $LastChangedBy: ertai $ # $Id: assert_eval_test.rb 567 2005-04-13 08:00:06Z polrop $ require 'test/unit/ui/yaml/testrunner' require 'ttk' module TTK module Strategies class Strategy class AssertEvalTest < ::Test::Unit::TestCase def setup super @ae = AssertEval.new @readable = TempPath.new @readable.open('w') { |f| f.puts "foo\nbar\nfoo" } @unexistant = TempPath.new @dir = TempPath.new @dir.mkpath end def teardown super [ @readable, @unexistant, @dir ].each { |x| x.clean } end def test_backquote_forbidden assert_raises(NoMethodError) do @ae.run("`rm #@readable`") end assert(@readable.exist?) end def test_open_forbidden assert_raises(NoMethodError) do @ae.run('readable.open("w") { |f| f.puts("oops!") }') do require 'pathname' readable = @readable binding end end end def test_each_line_allowed # ret = @ae.run('readable.each_line { |line| puts line }; true') do # require 'pathname' # readable = @readable # binding # end # assert_equal(true, ret) # assert_equal(@readable.read, @ae.output) end def test_binding_simple # ret = @ae.run('tmp.untaint.directory?', 'tmp' => '/tmp') # assert_equal(true, ret) # assert_equal([], @ae.output) end def test_binding_several # ret = @ae.run('tmp.directory? and dev_null.chardev?', # 'tmp' => '/tmp', 'dev_null' => '/dev/null') # assert_equal(true, ret) # assert_equal([], @ae.output) end def test_binding_inexistant_file # ret = nil # assert_nothing_raised do # ret = @ae.run('unexistant.exist?', 'unexistant' => @unexistant) # end # assert_equal(false, ret) # assert_equal([], @ae.output) end def test_binding_an_array # ret = nil # assert_nothing_raised do # ret = @ae.run('tmp.exist?', 'tmp' => ['/', 'tmp']) # end # assert_equal(true, ret) # assert_equal([], @ae.output) end def test_binding_a_hash # ret = nil # assert_nothing_raised do # ret = @ae.run('tmp.exist?', 'tmp' => { '/' => 'tmp' }) # end # assert_equal(true, ret) # assert_equal([], @ae.output) end def test_binding_an_integer i = 42 assert_raises(NoMethodError) do ret = @ae.run('tmp.exist?', i) end assert_nil(defined? ret) assert_nil(@ae.output) end def test_binding_both_at_the_same_time # ret = nil # assert_nothing_raised do # ret = @ae.run('readable.exist?', 'tmp' => '/tmp') do # require 'pathname' # readable = @readable # binding # end # end # assert_equal(false, ret) # assert_equal([], @ae.output) end def test_rename_forbidden assert_raises(SecurityError) do @ae.run('readable.rename(unexistant)', 'readable' => @readable, 'unexistant' => @unexistant) end end def test_IO_popen_forbidden assert_raises(SecurityError) do @ae.run('IO.popen("date") { |f| puts f.gets }') end end def test_pathname_open_forbidden assert_raises(NoMethodError) do @ae.run('readable.open { |f| f.puts("oops!") }', 'readable' => @readable) end end def test_rmtree_forbidden assert_raises(SecurityError) do @ae.run('dir.rmtree', 'dir' => @dir) end end def test_sysopen_forbidden assert_raises(SecurityError) do @ae.run('readable.sysopen("r")', 'readable' => @readable) end end def test_truncate_forbidden assert_raises(SecurityError) do @ae.run('readable.truncate(42)', 'readable' => @readable) end end def test_delete_forbidden assert_raises(SecurityError) do @ae.run('readable.delete', 'readable' => @readable) end end def test_empty_code i = 42 assert_nothing_raised do ret = @ae.run('', i) end assert_nil(defined? ret) assert_nil(@ae.output) end def test_almost_empty_code i = 42 assert_nothing_raised do ret = @ae.run(' ', i) end assert_nil(defined? ret) assert_nil(@ae.output) end end # class AssertEvalTest end # class Strategy end # module Strategies end # module TTK Test::Unit::UI::Yaml::TestRunner.run(TTK::Strategies::Strategy::AssertEvalTest)