[前][次][番号順一覧][スレッド一覧]

ruby-changes:70220

From: Rohit <ko1@a...>
Date: Wed, 15 Dec 2021 15:04:57 +0900 (JST)
Subject: [ruby-changes:70220] e071ac8b3d (master): Add Ractor tests for ENV

https://git.ruby-lang.org/ruby.git/commit/?id=e071ac8b3d

From e071ac8b3db80901566882ae82a9ba75106995da Mon Sep 17 00:00:00 2001
From: Rohit Menon <rohitmenon@v...>
Date: Wed, 7 Jul 2021 11:17:26 -0400
Subject: Add Ractor tests for ENV

---
 test/ruby/test_env.rb | 855 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 855 insertions(+)

diff --git a/test/ruby/test_env.rb b/test/ruby/test_env.rb
index 5bc974d6b25..be1cdf0b396 100644
--- a/test/ruby/test_env.rb
+++ b/test/ruby/test_env.rb
@@ -578,6 +578,861 @@ class TestEnv < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_env.rb#L578
     assert_nil(e1, bug12475)
   end
 
+  def ignore_case_str
+    IGNORE_CASE ? "true" : "false"
+  end
+
+  def str_for_yielding_exception_class(code_str, exception_var: "raised_exception")
+    <<-"end;"
+      #{exception_var} = nil
+      begin
+        #{code_str}
+      rescue Exception => e
+        #{exception_var} = e
+      end
+      Ractor.yield #{exception_var}.class
+    end;
+  end
+
+  def str_for_assert_raise_on_yielded_exception_class(expected_error_class, ractor_var)
+    <<-"end;"
+      error_class = #{ractor_var}.take
+      assert_raise(#{expected_error_class}) do
+        if error_class < Exception
+          raise error_class
+        end
+      end
+    end;
+  end
+
+  def str_to_yield_invalid_envvar_errors(var_name, code_str)
+    <<-"end;"
+      envvars_to_check = [
+        "foo\0bar",
+        "#{'\xa1\xa1'}".force_encoding(Encoding::UTF_16LE),
+        "foo".force_encoding(Encoding::ISO_2022_JP),
+      ]
+      envvars_to_check.each do |#{var_name}|
+        #{str_for_yielding_exception_class(code_str)}
+      end
+    end;
+  end
+  
+  def str_to_receive_invalid_envvar_errors(ractor_var)
+    <<-"end;"
+      3.times do
+        #{str_for_assert_raise_on_yielded_exception_class(ArgumentError, ractor_var)}
+      end
+    end;
+  end
+
+  STR_DEFINITION_FOR_CHECK = %Q{
+      def check(as, bs)
+        if #{IGNORE_CASE ? "true" : "false"}
+          as = as.map {|k, v| [k.upcase, v] }
+          bs = bs.map {|k, v| [k.upcase, v] }
+        end
+        assert_equal(as.sort, bs.sort)
+      end
+  }
+
+  def test_bracket_in_ractor
+    assert_ractor(<<-"end;")
+      r = Ractor.new do
+        Ractor.yield ENV['test']
+        Ractor.yield ENV['TEST']
+        ENV['test'] = 'foo'
+        Ractor.yield ENV['test']
+        Ractor.yield ENV['TEST']
+        ENV['TEST'] = 'bar'
+        Ractor.yield ENV['TEST']
+        Ractor.yield ENV['test']
+        #{str_for_yielding_exception_class("ENV[1]")}
+        #{str_for_yielding_exception_class("ENV[1] = 'foo'")}
+        #{str_for_yielding_exception_class("ENV['test'] = 0")}
+      end
+      assert_nil(r.take)
+      assert_nil(r.take)
+      assert_equal('foo', r.take)
+      if #{ignore_case_str}
+        assert_equal('foo', r.take)
+      else
+        assert_nil(r.take)
+      end
+      assert_equal('bar', r.take)
+      if #{ignore_case_str}
+        assert_equal('bar', r.take)
+      else
+        assert_equal('foo', r.take)
+      end
+      3.times do
+        #{str_for_assert_raise_on_yielded_exception_class(TypeError, "r")}
+      end
+    end;
+  end
+
+  def test_dup_in_ractor
+    assert_ractor(<<-"end;")
+      r = Ractor.new do 
+        #{str_for_yielding_exception_class("ENV.dup")}
+      end
+      #{str_for_assert_raise_on_yielded_exception_class(TypeError, "r")}
+    end;
+  end
+
+  def test_clone_in_ractor
+    assert_ractor(<<-"end;")
+      r = Ractor.new do
+        original_warning_state = Warning[:deprecated]
+        Warning[:deprecated] = false
+
+        begin
+          Ractor.yield ENV.clone.object_id
+          Ractor.yield ENV.clone(freeze: false).object_id
+          Ractor.yield ENV.clone(freeze: nil).object_id
+
+          #{str_for_yielding_exception_class("ENV.clone(freeze: true)")}
+          #{str_for_yielding_exception_class("ENV.clone(freeze: 1)")}
+          #{str_for_yielding_exception_class("ENV.clone(foo: false)")}
+          #{str_for_yielding_exception_class("ENV.clone(1)")}
+          #{str_for_yielding_exception_class("ENV.clone(1, foo: false)")}
+
+        ensure
+          Warning[:deprecated] = original_warning_state
+        end
+      end
+      assert_equal(ENV.object_id, r.take)
+      assert_equal(ENV.object_id, r.take)
+      assert_equal(ENV.object_id, r.take)
+      #{str_for_assert_raise_on_yielded_exception_class(TypeError, "r")}
+      4.times do
+        #{str_for_assert_raise_on_yielded_exception_class(ArgumentError, "r")}
+      end
+    end;
+  end
+
+  def test_has_value_in_ractor
+    assert_ractor(<<-"end;")
+      r = Ractor.new do 
+        val = 'a'
+        val.succ! while ENV.has_value?(val) || ENV.has_value?(val.upcase)
+        ENV['test'] = val[0...-1]
+        Ractor.yield(ENV.has_value?(val))
+        Ractor.yield(ENV.has_value?(val.upcase))
+        ENV['test'] = val
+        Ractor.yield(ENV.has_value?(val))
+        Ractor.yield(ENV.has_value?(val.upcase))
+        ENV['test'] = val.upcase
+        Ractor.yield ENV.has_value?(val)
+        Ractor.yield ENV.has_value?(val.upcase)
+      end
+      assert_equal(false, r.take)
+      assert_equal(false, r.take)
+      assert_equal(true, r.take)
+      assert_equal(false, r.take)
+      assert_equal(false, r.take)
+      assert_equal(true, r.take)
+    end;
+  end
+
+  def test_key_in_ractor
+    assert_ractor(<<-"end;")
+      r = Ractor.new do
+        val = 'a'
+        val.succ! while ENV.has_value?(val) || ENV.has_value?(val.upcase)
+        ENV['test'] = val[0...-1]
+        Ractor.yield ENV.key(val)
+        Ractor.yield ENV.key(val.upcase)
+        ENV['test'] = val
+        Ractor.yield ENV.key(val)
+        Ractor.yield ENV.key(val.upcase)
+        ENV['test'] = val.upcase
+        Ractor.yield ENV.key(val)
+        Ractor.yield ENV.key(val.upcase)
+      end
+      assert_nil(r.take)
+      assert_nil(r.take)
+      if #{ignore_case_str}
+        assert_equal('TEST', r.take.upcase)
+      else
+        assert_equal('test', r.take)
+      end
+      assert_nil(r.take)
+      assert_nil(r.take)
+      if #{ignore_case_str}
+        assert_equal('TEST', r.take.upcase)
+      else
+        assert_equal('test', r.take)
+      end
+    end;
+
+  end
+
+  def test_delete_in_ractor
+    assert_ractor(<<-"end;")
+      r = Ractor.new do
+        #{str_to_yield_invalid_envvar_errors("v", "ENV.delete(v)")}
+        Ractor.yield ENV.delete("TEST")
+        #{str_for_yielding_exception_class("ENV.delete('#{PATH_ENV}')")}
+        Ractor.yield(ENV.delete("TEST"){|name| "NO "+name})
+      end
+      #{str_to_receive_invalid_envvar_errors("r")}
+      assert_nil(r.take)
+      exception_class = r.take
+      assert_equal(NilClass, exception_class)
+      assert_equal("NO TEST", r.take)
+    end;
+  end
+
+  def test_getenv_in_ractor
+    assert_ractor(<<-"end;")
+      r = Ractor.new do
+        #{str_to_yield_invalid_envvar_errors("v", "ENV[v]")}
+        ENV["#{PATH_ENV}"] = ""
+        Ractor.yield ENV["#{PATH_ENV}"]
+        Ractor.yield ENV[""]
+      end
+      #{str_to_receive_invalid_envvar_errors("r")}
+      assert_equal("", r.take)
+      assert_nil(r.take)
+    end;
+  end
+
+  def test_fetch_in_ractor
+    assert_ractor(<<-"end;")
+      r = Ractor.new do
+        ENV["test"] = "foo"
+        Ractor.yield ENV.fetch("test")
+        ENV.delete("test")
+        #{str_for_yielding_exception_class("ENV.fetch('test')", exception_var: "ex")}
+        Ractor.yield ex.receiver.object_id
+        Ractor.yield ex.key
+        Ractor.yield ENV.fetch("test", "foo")
+        Ractor.yield(ENV.fetch("test"){"bar"})
+        #{str_to_yield_invalid_envvar_errors("v", "ENV.fetch(v)")}
+        #{str_for_yielding_exception_class("ENV.fetch('#{PATH_ENV}', 'foo')")}
+        ENV['#{PATH_ENV}'] = ""
+        Ractor.yield ENV.fetch('#{PATH_ENV}')
+      end
+      assert_equal("foo", r.take)
+      #{str_for_assert_raise_on_yielded_exception_class(KeyError, "r")}
+      assert_equal(ENV.object_id, r.take)
+      assert_equal("test", r.take)
+      assert_equal("foo", r.take)
+      assert_equal("bar", r.take)
+      #{str_to_receive_invalid_envvar_errors("r")}
+      exception_class = r.take
+      assert_equal(NilClass, exception_class)
+      assert_equal("", r.take)
+    end;
+  end
+
+  def test_aset_in_ractor
+    assert_ractor(<<-"end;")
+      r = Ractor.new do
+        #{str_for_yielding_exception_class("ENV['test'] = nil")}
+        ENV["test"] = nil
+        Ractor.yield ENV["test"]
+        #{str_to_yield_invalid_envvar_errors("v", "ENV[v] = 'test'")}
+        #{str_to_yield_invalid_envvar_errors("v", "ENV['test'] = v")}
+      end
+      exception_class = r.take
+      assert_equal(NilClass, exception_class)
+      assert_nil(r.take)
+      #{str_to_receive_invalid_envvar_errors("r")}
+      #{str_to_receive_invalid_envvar_errors("r")}
+    end;
+  end
+
+  def test_keys_in_ractor
+    assert_ractor(<<-"end;")
+      r = Ractor.new do
+        a = ENV.keys
+        Ractor.yield a
+      end
+      a = r.take
+      assert_kind_of(Array, a)
+      a.each {|k| assert_kind_of(String, k) }
+    end;
+
+  end
+
+  def test_each_key_in_ractor
+    assert_ractor(<<-"end;")
+      r = Ractor.new do
+        ENV.each_key {|k| Ractor.yield(k)}
+        Ractor.yield "finished"
+      end
+      while((x=r.take) != "finished")
+        assert_kind_of(String, x) 
+      end
+    end;
+  end
+
+  def test_values_in_ractor
+    assert_ractor(<<-"end;")
+      r = Ractor.new do
+        a = ENV.values
+        Ractor.yield a
+      end
+      a = r.take
+      assert_kind_of(Array, a)
+      a.each {|k| assert_kind_of(String, k) }
+    end;
+  end
+
+  def test_each_value_in_ractor
+    assert_ractor(<<-"end;")
+      r = Ractor.new do
+        ENV.each_value {|k| Ractor.yield(k)}
+        Ractor.yield "finished"
+      end
+      while((x=r.take) != "finished")
+        assert_kind_of(String, x) 
+      end
+    end;
+  end
+
+  def test_eac (... truncated)

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]