aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/test/isolation_test.rb
diff options
context:
space:
mode:
authorYehuda Katz + Carl Lerche <ykatz+clerche@engineyard.com>2009-06-30 12:00:50 -0700
committerYehuda Katz + Carl Lerche <ykatz+clerche@engineyard.com>2009-06-30 12:00:50 -0700
commit575b95ea0bf3d3fff6f47dddad23c754fb294604 (patch)
tree142ef4a20814e41281b385b1684bf5d5f14de035 /activesupport/test/isolation_test.rb
parent9101941c1259627df99c5c13b8e893d5d593265c (diff)
downloadrails-575b95ea0bf3d3fff6f47dddad23c754fb294604.tar.gz
rails-575b95ea0bf3d3fff6f47dddad23c754fb294604.tar.bz2
rails-575b95ea0bf3d3fff6f47dddad23c754fb294604.zip
Created AS::Testing::Isolation which runs each test case in a separate process.
This allows for testing rails bootup (files are required, correct constants are set, etc...). Currently, this is implemented via forking only, but we will add support for jruby and windows shortly.
Diffstat (limited to 'activesupport/test/isolation_test.rb')
-rw-r--r--activesupport/test/isolation_test.rb141
1 files changed, 141 insertions, 0 deletions
diff --git a/activesupport/test/isolation_test.rb b/activesupport/test/isolation_test.rb
new file mode 100644
index 0000000000..4adf49ff62
--- /dev/null
+++ b/activesupport/test/isolation_test.rb
@@ -0,0 +1,141 @@
+require 'abstract_unit'
+
+# Does awesome
+if ENV['CHILD']
+ class ChildIsolationTest < ActiveSupport::TestCase
+ include ActiveSupport::Testing::Isolation
+
+ def setup
+ @instance = "HELLO"
+ end
+
+ def teardown
+ raise if @boom
+ end
+
+ test "runs the test" do
+ assert true
+ end
+
+ test "captures errors" do
+ raise
+ end
+
+ test "captures failures" do
+ assert false
+ end
+
+ test "first runs in isolation" do
+ assert_nil $x
+ $x = 1
+ end
+
+ test "second runs in isolation" do
+ assert_nil $x
+ $x = 2
+ end
+
+ test "runs with slow tests" do
+ sleep 0.3
+ assert true
+ sleep 0.2
+ end
+
+ test "runs setup" do
+ assert "HELLO", @instance
+ end
+
+ test "runs teardown" do
+ @boom = true
+ end
+
+ test "resets requires one" do
+ assert !defined?(Racc)
+ require 'racc/parser'
+ end
+
+ test "resets requires two" do
+ assert !defined?(Racc)
+ require 'racc/parser'
+ end
+ end
+else
+ class ParentIsolationTest < ActiveSupport::TestCase
+
+ ENV["CHILD"] = "1"
+ OUTPUT = `#{Gem.ruby} -I#{File.dirname(__FILE__)} #{File.expand_path(__FILE__)} -v`
+ ENV.delete("CHILD")
+
+ def setup
+ # Extract the results
+ @results = {}
+ OUTPUT[/Started\n\s*(.*)\s*\nFinished/mi, 1].split(/\s*\n\s*/).each do |result|
+ result =~ %r'^(\w+)\(\w+\):\s*(\.|E|F)$'
+ @results[$1] = { 'E' => :error, '.' => :success, 'F' => :failure }[$2]
+ end
+
+ # Extract the backtraces
+ @backtraces = {}
+ OUTPUT.scan(/^\s*\d+\).*?\n\n/m).each do |backtrace|
+ # \n 1) Error:\ntest_captures_errors(ChildIsolationTest):
+ backtrace =~ %r'\s*\d+\)\s*(Error|Failure):\n(\w+)'i
+ @backtraces[$2] = { :type => $1, :output => backtrace }
+ end
+ end
+
+ def assert_failing(name)
+ assert_equal :failure, @results[name.to_s], "Test #{name} did not fail"
+ end
+
+ def assert_passing(name)
+ assert_equal :success, @results[name.to_s], "Test #{name} did not pass"
+ end
+
+ def assert_erroring(name)
+ assert_equal :error, @results[name.to_s], "Test #{name} did not error"
+ end
+
+ test "has all tests" do
+ assert_equal 10, @results.length
+ end
+
+ test "passing tests are still reported" do
+ assert_passing :test_runs_the_test
+ assert_passing :test_runs_with_slow_tests
+ end
+
+ test "resets global variables" do
+ assert_passing :test_first_runs_in_isolation
+ assert_passing :test_second_runs_in_isolation
+ end
+
+ test "resets requires" do
+ assert_passing :test_resets_requires_one
+ assert_passing :test_resets_requires_two
+ end
+
+ test "erroring tests are still reported" do
+ assert_erroring :test_captures_errors
+ end
+
+ test "runs setup and teardown methods" do
+ assert_passing :test_runs_setup
+ assert_erroring :test_runs_teardown
+ end
+
+ test "correct tests fail" do
+ assert_failing :test_captures_failures
+ end
+
+ test "backtrace is printed for errors" do
+ assert_equal 'Error', @backtraces["test_captures_errors"][:type]
+ assert_match %{isolation_test.rb:21:in `test_captures_errors'}, @backtraces["test_captures_errors"][:output]
+ end
+
+ test "backtrace is printed for failures" do
+ assert_equal 'Failure', @backtraces["test_captures_failures"][:type]
+ assert_match %{isolation_test.rb:25:in `test_captures_failures'}, @backtraces["test_captures_failures"][:output]
+ end
+
+ end
+end \ No newline at end of file