2015-12-16 00:07:31 -05:00
|
|
|
# frozen_string_literal: false
|
2009-09-09 02:46:31 -04:00
|
|
|
require 'test/unit'
|
2011-08-31 04:28:19 -04:00
|
|
|
require 'tempfile'
|
|
|
|
require 'thread'
|
2009-09-09 02:46:31 -04:00
|
|
|
|
|
|
|
class TestAutoload < Test::Unit::TestCase
|
|
|
|
def test_autoload_so
|
2014-11-26 08:31:23 -05:00
|
|
|
# Date is always available, unless excluded intentionally.
|
2009-09-09 02:46:31 -04:00
|
|
|
assert_in_out_err([], <<-INPUT, [], [])
|
2014-11-26 08:31:23 -05:00
|
|
|
autoload :Date, "date"
|
|
|
|
begin Date; rescue LoadError; end
|
2009-09-09 02:46:31 -04:00
|
|
|
INPUT
|
|
|
|
end
|
2011-02-04 20:09:39 -05:00
|
|
|
|
|
|
|
def test_non_realpath_in_loadpath
|
|
|
|
require 'tmpdir'
|
|
|
|
tmpdir = Dir.mktmpdir('autoload')
|
|
|
|
tmpdirs = [tmpdir]
|
|
|
|
tmpdirs.unshift(tmpdir + '/foo')
|
|
|
|
Dir.mkdir(tmpdirs[0])
|
|
|
|
tmpfiles = [tmpdir + '/foo.rb', tmpdir + '/foo/bar.rb']
|
|
|
|
open(tmpfiles[0] , 'w') do |f|
|
|
|
|
f.puts <<-INPUT
|
|
|
|
$:.unshift(File.expand_path('..', __FILE__)+'/./foo')
|
|
|
|
module Foo
|
|
|
|
autoload :Bar, 'bar'
|
|
|
|
end
|
2011-02-05 08:48:45 -05:00
|
|
|
p Foo::Bar
|
2011-02-04 20:09:39 -05:00
|
|
|
INPUT
|
|
|
|
end
|
|
|
|
open(tmpfiles[1], 'w') do |f|
|
|
|
|
f.puts 'class Foo::Bar; end'
|
|
|
|
end
|
2011-02-05 08:48:45 -05:00
|
|
|
assert_in_out_err([tmpfiles[0]], "", ["Foo::Bar"], [])
|
2011-02-04 20:09:39 -05:00
|
|
|
ensure
|
|
|
|
File.unlink(*tmpfiles) rescue nil if tmpfiles
|
|
|
|
tmpdirs.each {|dir| Dir.rmdir(dir)}
|
|
|
|
end
|
2011-04-14 08:23:32 -04:00
|
|
|
|
|
|
|
def test_autoload_p
|
|
|
|
bug4565 = '[ruby-core:35679]'
|
|
|
|
|
|
|
|
require 'tmpdir'
|
2011-06-14 06:51:25 -04:00
|
|
|
Dir.mktmpdir('autoload') {|tmpdir|
|
|
|
|
tmpfile = tmpdir + '/foo.rb'
|
|
|
|
a = Module.new do
|
|
|
|
autoload :X, tmpfile
|
|
|
|
end
|
|
|
|
b = Module.new do
|
|
|
|
include a
|
|
|
|
end
|
|
|
|
assert_equal(true, a.const_defined?(:X))
|
|
|
|
assert_equal(true, b.const_defined?(:X))
|
|
|
|
assert_equal(tmpfile, a.autoload?(:X), bug4565)
|
|
|
|
assert_equal(tmpfile, b.autoload?(:X), bug4565)
|
|
|
|
}
|
2011-04-14 08:23:32 -04:00
|
|
|
end
|
2011-08-31 04:28:19 -04:00
|
|
|
|
2015-05-16 15:02:38 -04:00
|
|
|
def test_autoload_with_unqualified_file_name # [ruby-core:69206]
|
|
|
|
lp = $LOAD_PATH.dup
|
|
|
|
lf = $LOADED_FEATURES.dup
|
|
|
|
|
|
|
|
Dir.mktmpdir('autoload') { |tmpdir|
|
|
|
|
$LOAD_PATH << tmpdir
|
|
|
|
|
|
|
|
Dir.chdir(tmpdir) do
|
|
|
|
eval <<-END
|
|
|
|
class ::Object
|
|
|
|
module A
|
|
|
|
autoload :C, 'b'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
END
|
|
|
|
|
|
|
|
File.open('b.rb', 'w') {|file| file.puts 'module A; class C; end; end'}
|
|
|
|
assert_kind_of Class, ::A::C
|
|
|
|
end
|
|
|
|
}
|
|
|
|
ensure
|
|
|
|
$LOAD_PATH.replace lp
|
|
|
|
$LOADED_FEATURES.replace lf
|
|
|
|
Object.send(:remove_const, :A) if Object.const_defined?(:A)
|
|
|
|
end
|
|
|
|
|
2011-08-31 04:28:19 -04:00
|
|
|
def test_require_explicit
|
* test/csv/test_features.rb, test/logger/test_logger.rb
test/mkmf/test_have_macro.rb, test/net/http/test_http.rb,
test/openssl/test_config.rb, test/psych/test_encoding.rb,
test/psych/test_exception.rb, test/psych/test_psych.rb,
test/psych/test_tainted.rb, test/readline/test_readline.rb,
test/rexml/test_contrib.rb, test/ruby/test_autoload.rb,
test/ruby/test_beginendblock.rb, test/ruby/test_exception.rb,
test/ruby/test_file.rb, test/ruby/test_io.rb,
test/ruby/test_marshal.rb, test/ruby/test_process.rb,
test/ruby/test_require.rb, test/ruby/test_rubyoptions.rb,
test/syslog/test_syslog_logger.rb, test/webrick/test_httpauth.rb,
test/zlib/test_zlib.rb: Use Tempfile.create.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40400 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-04-20 19:03:52 -04:00
|
|
|
Tempfile.create(['autoload', '.rb']) {|file|
|
|
|
|
file.puts 'class Object; AutoloadTest = 1; end'
|
|
|
|
file.close
|
|
|
|
add_autoload(file.path)
|
|
|
|
begin
|
|
|
|
assert_nothing_raised do
|
|
|
|
assert(require file.path)
|
|
|
|
assert_equal(1, ::AutoloadTest)
|
|
|
|
end
|
|
|
|
ensure
|
|
|
|
remove_autoload_constant
|
2011-08-31 04:28:19 -04:00
|
|
|
end
|
* test/csv/test_features.rb, test/logger/test_logger.rb
test/mkmf/test_have_macro.rb, test/net/http/test_http.rb,
test/openssl/test_config.rb, test/psych/test_encoding.rb,
test/psych/test_exception.rb, test/psych/test_psych.rb,
test/psych/test_tainted.rb, test/readline/test_readline.rb,
test/rexml/test_contrib.rb, test/ruby/test_autoload.rb,
test/ruby/test_beginendblock.rb, test/ruby/test_exception.rb,
test/ruby/test_file.rb, test/ruby/test_io.rb,
test/ruby/test_marshal.rb, test/ruby/test_process.rb,
test/ruby/test_require.rb, test/ruby/test_rubyoptions.rb,
test/syslog/test_syslog_logger.rb, test/webrick/test_httpauth.rb,
test/zlib/test_zlib.rb: Use Tempfile.create.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40400 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-04-20 19:03:52 -04:00
|
|
|
}
|
2011-08-31 04:28:19 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_threaded_accessing_constant
|
2014-06-01 11:25:12 -04:00
|
|
|
# Suppress "warning: loading in progress, circular require considered harmful"
|
2014-06-01 18:31:30 -04:00
|
|
|
EnvUtil.default_warning {
|
2014-06-01 11:41:42 -04:00
|
|
|
Tempfile.create(['autoload', '.rb']) {|file|
|
|
|
|
file.puts 'sleep 0.5; class AutoloadTest; X = 1; end'
|
|
|
|
file.close
|
|
|
|
add_autoload(file.path)
|
|
|
|
begin
|
|
|
|
assert_nothing_raised do
|
|
|
|
t1 = Thread.new { ::AutoloadTest::X }
|
|
|
|
t2 = Thread.new { ::AutoloadTest::X }
|
|
|
|
[t1, t2].each(&:join)
|
|
|
|
end
|
|
|
|
ensure
|
|
|
|
remove_autoload_constant
|
* test/csv/test_features.rb, test/logger/test_logger.rb
test/mkmf/test_have_macro.rb, test/net/http/test_http.rb,
test/openssl/test_config.rb, test/psych/test_encoding.rb,
test/psych/test_exception.rb, test/psych/test_psych.rb,
test/psych/test_tainted.rb, test/readline/test_readline.rb,
test/rexml/test_contrib.rb, test/ruby/test_autoload.rb,
test/ruby/test_beginendblock.rb, test/ruby/test_exception.rb,
test/ruby/test_file.rb, test/ruby/test_io.rb,
test/ruby/test_marshal.rb, test/ruby/test_process.rb,
test/ruby/test_require.rb, test/ruby/test_rubyoptions.rb,
test/syslog/test_syslog_logger.rb, test/webrick/test_httpauth.rb,
test/zlib/test_zlib.rb: Use Tempfile.create.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40400 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-04-20 19:03:52 -04:00
|
|
|
end
|
2014-06-01 11:41:42 -04:00
|
|
|
}
|
* test/csv/test_features.rb, test/logger/test_logger.rb
test/mkmf/test_have_macro.rb, test/net/http/test_http.rb,
test/openssl/test_config.rb, test/psych/test_encoding.rb,
test/psych/test_exception.rb, test/psych/test_psych.rb,
test/psych/test_tainted.rb, test/readline/test_readline.rb,
test/rexml/test_contrib.rb, test/ruby/test_autoload.rb,
test/ruby/test_beginendblock.rb, test/ruby/test_exception.rb,
test/ruby/test_file.rb, test/ruby/test_io.rb,
test/ruby/test_marshal.rb, test/ruby/test_process.rb,
test/ruby/test_require.rb, test/ruby/test_rubyoptions.rb,
test/syslog/test_syslog_logger.rb, test/webrick/test_httpauth.rb,
test/zlib/test_zlib.rb: Use Tempfile.create.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40400 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-04-20 19:03:52 -04:00
|
|
|
}
|
2011-08-31 04:28:19 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_threaded_accessing_inner_constant
|
2014-06-01 08:09:08 -04:00
|
|
|
# Suppress "warning: loading in progress, circular require considered harmful"
|
2014-06-01 18:31:30 -04:00
|
|
|
EnvUtil.default_warning {
|
2014-06-01 11:41:42 -04:00
|
|
|
Tempfile.create(['autoload', '.rb']) {|file|
|
|
|
|
file.puts 'class AutoloadTest; sleep 0.5; X = 1; end'
|
|
|
|
file.close
|
|
|
|
add_autoload(file.path)
|
|
|
|
begin
|
|
|
|
assert_nothing_raised do
|
|
|
|
t1 = Thread.new { ::AutoloadTest::X }
|
|
|
|
t2 = Thread.new { ::AutoloadTest::X }
|
|
|
|
[t1, t2].each(&:join)
|
|
|
|
end
|
|
|
|
ensure
|
|
|
|
remove_autoload_constant
|
* test/csv/test_features.rb, test/logger/test_logger.rb
test/mkmf/test_have_macro.rb, test/net/http/test_http.rb,
test/openssl/test_config.rb, test/psych/test_encoding.rb,
test/psych/test_exception.rb, test/psych/test_psych.rb,
test/psych/test_tainted.rb, test/readline/test_readline.rb,
test/rexml/test_contrib.rb, test/ruby/test_autoload.rb,
test/ruby/test_beginendblock.rb, test/ruby/test_exception.rb,
test/ruby/test_file.rb, test/ruby/test_io.rb,
test/ruby/test_marshal.rb, test/ruby/test_process.rb,
test/ruby/test_require.rb, test/ruby/test_rubyoptions.rb,
test/syslog/test_syslog_logger.rb, test/webrick/test_httpauth.rb,
test/zlib/test_zlib.rb: Use Tempfile.create.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40400 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-04-20 19:03:52 -04:00
|
|
|
end
|
2014-06-01 11:41:42 -04:00
|
|
|
}
|
* test/csv/test_features.rb, test/logger/test_logger.rb
test/mkmf/test_have_macro.rb, test/net/http/test_http.rb,
test/openssl/test_config.rb, test/psych/test_encoding.rb,
test/psych/test_exception.rb, test/psych/test_psych.rb,
test/psych/test_tainted.rb, test/readline/test_readline.rb,
test/rexml/test_contrib.rb, test/ruby/test_autoload.rb,
test/ruby/test_beginendblock.rb, test/ruby/test_exception.rb,
test/ruby/test_file.rb, test/ruby/test_io.rb,
test/ruby/test_marshal.rb, test/ruby/test_process.rb,
test/ruby/test_require.rb, test/ruby/test_rubyoptions.rb,
test/syslog/test_syslog_logger.rb, test/webrick/test_httpauth.rb,
test/zlib/test_zlib.rb: Use Tempfile.create.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40400 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-04-20 19:03:52 -04:00
|
|
|
}
|
2011-08-31 04:28:19 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_nameerror_when_autoload_did_not_define_the_constant
|
* test/csv/test_features.rb, test/logger/test_logger.rb
test/mkmf/test_have_macro.rb, test/net/http/test_http.rb,
test/openssl/test_config.rb, test/psych/test_encoding.rb,
test/psych/test_exception.rb, test/psych/test_psych.rb,
test/psych/test_tainted.rb, test/readline/test_readline.rb,
test/rexml/test_contrib.rb, test/ruby/test_autoload.rb,
test/ruby/test_beginendblock.rb, test/ruby/test_exception.rb,
test/ruby/test_file.rb, test/ruby/test_io.rb,
test/ruby/test_marshal.rb, test/ruby/test_process.rb,
test/ruby/test_require.rb, test/ruby/test_rubyoptions.rb,
test/syslog/test_syslog_logger.rb, test/webrick/test_httpauth.rb,
test/zlib/test_zlib.rb: Use Tempfile.create.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40400 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-04-20 19:03:52 -04:00
|
|
|
Tempfile.create(['autoload', '.rb']) {|file|
|
|
|
|
file.puts ''
|
|
|
|
file.close
|
|
|
|
add_autoload(file.path)
|
|
|
|
begin
|
|
|
|
assert_raise(NameError) do
|
|
|
|
AutoloadTest
|
|
|
|
end
|
|
|
|
ensure
|
|
|
|
remove_autoload_constant
|
2011-08-31 04:28:19 -04:00
|
|
|
end
|
* test/csv/test_features.rb, test/logger/test_logger.rb
test/mkmf/test_have_macro.rb, test/net/http/test_http.rb,
test/openssl/test_config.rb, test/psych/test_encoding.rb,
test/psych/test_exception.rb, test/psych/test_psych.rb,
test/psych/test_tainted.rb, test/readline/test_readline.rb,
test/rexml/test_contrib.rb, test/ruby/test_autoload.rb,
test/ruby/test_beginendblock.rb, test/ruby/test_exception.rb,
test/ruby/test_file.rb, test/ruby/test_io.rb,
test/ruby/test_marshal.rb, test/ruby/test_process.rb,
test/ruby/test_require.rb, test/ruby/test_rubyoptions.rb,
test/syslog/test_syslog_logger.rb, test/webrick/test_httpauth.rb,
test/zlib/test_zlib.rb: Use Tempfile.create.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40400 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-04-20 19:03:52 -04:00
|
|
|
}
|
2011-08-31 04:28:19 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_override_autoload
|
* test/csv/test_features.rb, test/logger/test_logger.rb
test/mkmf/test_have_macro.rb, test/net/http/test_http.rb,
test/openssl/test_config.rb, test/psych/test_encoding.rb,
test/psych/test_exception.rb, test/psych/test_psych.rb,
test/psych/test_tainted.rb, test/readline/test_readline.rb,
test/rexml/test_contrib.rb, test/ruby/test_autoload.rb,
test/ruby/test_beginendblock.rb, test/ruby/test_exception.rb,
test/ruby/test_file.rb, test/ruby/test_io.rb,
test/ruby/test_marshal.rb, test/ruby/test_process.rb,
test/ruby/test_require.rb, test/ruby/test_rubyoptions.rb,
test/syslog/test_syslog_logger.rb, test/webrick/test_httpauth.rb,
test/zlib/test_zlib.rb: Use Tempfile.create.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40400 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-04-20 19:03:52 -04:00
|
|
|
Tempfile.create(['autoload', '.rb']) {|file|
|
|
|
|
file.puts ''
|
|
|
|
file.close
|
|
|
|
add_autoload(file.path)
|
|
|
|
begin
|
|
|
|
eval %q(class AutoloadTest; end)
|
|
|
|
assert_equal(Class, AutoloadTest.class)
|
|
|
|
ensure
|
|
|
|
remove_autoload_constant
|
|
|
|
end
|
|
|
|
}
|
2011-08-31 04:28:19 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_override_while_autoloading
|
* test/csv/test_features.rb, test/logger/test_logger.rb
test/mkmf/test_have_macro.rb, test/net/http/test_http.rb,
test/openssl/test_config.rb, test/psych/test_encoding.rb,
test/psych/test_exception.rb, test/psych/test_psych.rb,
test/psych/test_tainted.rb, test/readline/test_readline.rb,
test/rexml/test_contrib.rb, test/ruby/test_autoload.rb,
test/ruby/test_beginendblock.rb, test/ruby/test_exception.rb,
test/ruby/test_file.rb, test/ruby/test_io.rb,
test/ruby/test_marshal.rb, test/ruby/test_process.rb,
test/ruby/test_require.rb, test/ruby/test_rubyoptions.rb,
test/syslog/test_syslog_logger.rb, test/webrick/test_httpauth.rb,
test/zlib/test_zlib.rb: Use Tempfile.create.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40400 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-04-20 19:03:52 -04:00
|
|
|
Tempfile.create(['autoload', '.rb']) {|file|
|
|
|
|
file.puts 'class AutoloadTest; sleep 0.5; end'
|
|
|
|
file.close
|
|
|
|
add_autoload(file.path)
|
|
|
|
begin
|
|
|
|
# while autoloading...
|
|
|
|
t = Thread.new { AutoloadTest }
|
|
|
|
sleep 0.1
|
|
|
|
# override it
|
|
|
|
EnvUtil.suppress_warning {
|
|
|
|
eval %q(AutoloadTest = 1)
|
|
|
|
}
|
|
|
|
t.join
|
|
|
|
assert_equal(1, AutoloadTest)
|
|
|
|
ensure
|
|
|
|
remove_autoload_constant
|
|
|
|
end
|
|
|
|
}
|
2011-08-31 04:28:19 -04:00
|
|
|
end
|
|
|
|
|
2015-11-05 17:05:06 -05:00
|
|
|
def ruby_impl_require
|
2015-05-14 17:57:33 -04:00
|
|
|
Kernel.module_eval do; alias :old_require :require; end
|
|
|
|
called_with = []
|
|
|
|
Kernel.send :define_method, :require do |path|
|
|
|
|
called_with << path
|
|
|
|
old_require path
|
|
|
|
end
|
2015-11-05 17:05:06 -05:00
|
|
|
yield called_with
|
2015-05-14 17:57:33 -04:00
|
|
|
ensure
|
|
|
|
Kernel.module_eval do; alias :require :old_require; undef :old_require; end
|
|
|
|
end
|
|
|
|
|
2015-11-05 17:05:06 -05:00
|
|
|
def test_require_implemented_in_ruby_is_called
|
|
|
|
ruby_impl_require do |called_with|
|
|
|
|
Tempfile.create(['autoload', '.rb']) {|file|
|
|
|
|
file.puts 'class AutoloadTest; end'
|
|
|
|
file.close
|
|
|
|
add_autoload(file.path)
|
|
|
|
begin
|
|
|
|
assert(Object::AutoloadTest)
|
|
|
|
ensure
|
|
|
|
remove_autoload_constant
|
|
|
|
end
|
|
|
|
assert_equal [file.path], called_with
|
|
|
|
}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-11-09 16:18:42 -05:00
|
|
|
def test_autoload_while_autoloading
|
|
|
|
ruby_impl_require do |called_with|
|
|
|
|
Tempfile.create(%w(a .rb)) do |a|
|
|
|
|
Tempfile.create(%w(b .rb)) do |b|
|
|
|
|
a.puts "require '#{b.path}'; class AutoloadTest; end"
|
|
|
|
b.puts "class AutoloadTest; module B; end; end"
|
|
|
|
[a, b].each(&:flush)
|
|
|
|
add_autoload(a.path)
|
|
|
|
begin
|
|
|
|
assert(Object::AutoloadTest)
|
|
|
|
ensure
|
|
|
|
remove_autoload_constant
|
|
|
|
end
|
|
|
|
assert_equal [a.path, b.path], called_with
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2011-08-31 04:28:19 -04:00
|
|
|
def add_autoload(path)
|
2012-04-12 03:16:14 -04:00
|
|
|
(@autoload_paths ||= []) << path
|
2015-05-18 05:41:21 -04:00
|
|
|
::Object.class_eval {autoload(:AutoloadTest, path)}
|
2011-08-31 04:28:19 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def remove_autoload_constant
|
2012-04-12 03:16:14 -04:00
|
|
|
$".replace($" - @autoload_paths)
|
2015-05-18 05:41:21 -04:00
|
|
|
::Object.class_eval {remove_const(:AutoloadTest)}
|
2011-08-31 04:28:19 -04:00
|
|
|
end
|
2009-09-09 02:46:31 -04:00
|
|
|
end
|