# Performing $SAFE checks with test-unit

**URL:** <https://www.ruby-forum.com/t/performing-safe-checks-with-test-unit/107420>\
**Category:** Ruby\
**Created:** [June 21, 2007, 5:45pm UTC](https://www.ruby-forum.com/t/performing-safe-checks-with-test-unit/107420 "2007-06-21T17:45:54Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![danielb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/c57346/32.png) [@danielb](https://www.ruby-forum.com/u/danielb)\
**Post date:** [June 21, 2007, 5:45pm UTC](https://www.ruby-forum.com/t/performing-safe-checks-with-test-unit/107420/1 "2007-06-21T17:45:54Z")

</div>

Hi all,

Is there a way to perform $SAFE checks with test-unit? I tried this  
with Ruby 1.8.6:

require ‘test/unit’

class TC\_Hash\_Replace \< Test::Unit::TestCase  
def setup  
$SAFE = 0  
end

def test\_replace\_in\_safe\_mode  
$SAFE = 4  
assert\_raise(SecurityError){ {1,2,3,4}.replace({‘a’, ‘b’}) }  
end

def teardown  
$SAFE = 0  
end  
end

Running that causes this error:

/usr/local/lib/ruby/1.8/test/unit/testcase.rb:136:in `add_error': Insecure: can't modify instance variable (SecurityError) from /usr/local/lib/ruby/1.8/test/unit/testcase.rb:91:in`run’  
from /usr/local/lib/ruby/1.8/test/unit/testsuite.rb:34:in  
`run' from /usr/local/lib/ruby/1.8/test/unit/testsuite.rb:33:in`each’  
from /usr/local/lib/ruby/1.8/test/unit/testsuite.rb:33:in  
`run' from /usr/local/lib/ruby/1.8/test/unit/testsuite.rb:34:in`run’  
from /usr/local/lib/ruby/1.8/test/unit/testsuite.rb:33:in  
`each' from /usr/local/lib/ruby/1.8/test/unit/testsuite.rb:33:in`run’  
from /usr/local/lib/ruby/1.8/test/unit/ui/  
testrunnermediator.rb:46:in `run_suite' from /usr/local/lib/ruby/1.8/test/unit/ui/console/ testrunner.rb:67:in`start\_mediator’  
from /usr/local/lib/ruby/1.8/test/unit/ui/console/  
testrunner.rb:41:in `start' from /usr/local/lib/ruby/1.8/test/unit/ui/ testrunnerutilities.rb:29:in`run’  
from /usr/local/lib/ruby/1.8/test/unit/autorunner.rb:216:in  
`run' from /usr/local/lib/ruby/1.8/test/unit/autorunner.rb:12:in`run’  
from /usr/local/lib/ruby/1.8/test/unit.rb:278

If it’s not possible, consider it a feature request. I’ve no idea how  
to implement it, however. Perhaps run it in a Sandbox? Dunno.

I haven’t tried rspec yet to see what it does.

Thanks,

Dan

---

<div class="post-metadata">

**Author:** ![danielb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/c57346/32.png) [@danielb](https://www.ruby-forum.com/u/danielb)\
**Post date:** [June 21, 2007, 10:51pm UTC](https://www.ruby-forum.com/t/performing-safe-checks-with-test-unit/107420/2 "2007-06-21T22:51:43Z")

</div>

Hi,

At Fri, 22 Jun 2007 00:44:37 +0900,  
Daniel B. wrote in [ruby-talk:256413]:

> Is there a way to perform $SAFE checks with test-unit? I tried this  
> with Ruby 1.8.6:

```
def test_replace_in_safe_mode
   o = {1,2,3,4}
   assert_raise(SecurityError) do
     proc do
       $SAFE = 4
       o.replace({'a', 'b'})
     end.call
  end
end
```

---

<div class="post-metadata">

**Author:** ![danielb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/c57346/32.png) [@danielb](https://www.ruby-forum.com/u/danielb)\
**Post date:** [June 21, 2007, 11:01pm UTC](https://www.ruby-forum.com/t/performing-safe-checks-with-test-unit/107420/3 "2007-06-21T23:01:45Z")

</div>

On Jun 21, 2:50 pm, Nobuyoshi N. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> ```
> assert_raise(SecurityError) do
> proc do
> $SAFE = 4
> o.replace({'a', 'b'})
> end.call
> end
> end
> 
> ```

Nice, thanks Nobu. Perhaps all assertions should run in anonymous  
blocks? It’s probably slower, but then I’ve never cared about the  
speed of my unit tests.

Or is there some other downside to doing that?

Regards,

Dan
