mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Update to ruby/spec@2d89e48
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66645 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
2eee74ef54
commit
7f54f1b554
5 changed files with 138 additions and 119 deletions
|
@ -28,12 +28,22 @@ ruby/spec is known to be tested in these implementations for every commit:
|
|||
* [TruffleRuby](https://github.com/oracle/truffleruby/tree/master/spec/ruby)
|
||||
* [Opal](https://github.com/opal/opal/tree/master/spec)
|
||||
|
||||
The specs are synchronized both ways around once a month by @eregon between ruby/spec, MRI, JRuby and TruffleRuby.
|
||||
Each of these repositories has a full copy of the files to ease editing specs.
|
||||
|
||||
ruby/spec describes the behavior of Ruby 2.3 and more recent Ruby versions.
|
||||
More precisely, every latest stable MRI release [passes](https://rubyci.org/) all specs of ruby/spec
|
||||
(2.3.x, 2.4.x, 2.5.x, etc).
|
||||
More precisely, every latest stable MRI release should [pass](https://travis-ci.org/ruby/spec) all specs of ruby/spec (2.3.x, 2.4.x, 2.5.x, 2.6.x, etc), and those are tested in TravisCI.
|
||||
|
||||
The specs are synchronized both ways around once a month by @eregon between ruby/spec, MRI, JRuby and TruffleRuby.
|
||||
Each of these repositories has a full copy of the specs under `spec/ruby` to ease editing specs.
|
||||
Any of these repositories can be used to add or edit specs, use what is most convenient for you.
|
||||
|
||||
For *testing* a Ruby implementation, one should always test against the implementation's copy of the specs under `spec/ruby`, as that's what the Ruby implementation tests against in their CI.
|
||||
Also, this repository doesn't always contain the latest spec changes from MRI (it's synchronized monthly), and does not contain tags (specs marked as failing on that Ruby implementation).
|
||||
Running specs in a Ruby implementation can be done with:
|
||||
|
||||
```
|
||||
$ cd ruby_implementation/spec/ruby
|
||||
# Add ../ruby_implementation/bin in PATH, or pass -t /path/to/bin/ruby
|
||||
$ ../mspec/bin/mspec
|
||||
```
|
||||
|
||||
For older specs try these commits:
|
||||
* Ruby 2.0.0-p647 - [Suite](https://github.com/ruby/spec/commit/245862558761d5abc676843ef74f86c9bcc8ea8d) using [MSpec](https://github.com/ruby/mspec/commit/f90efa068791064f955de7a843e96e2d7d3041c2) (may encounter 2 failures)
|
||||
|
@ -63,7 +73,7 @@ This will execute all the specs using the executable named `ruby` on your curren
|
|||
### Running Specs with a Specific Ruby Implementation
|
||||
|
||||
Use the `-t` option to specify the Ruby implementation with which to run the specs.
|
||||
The argument may be a full path to the Ruby binary.
|
||||
The argument is either a full path to the Ruby binary, or an executable in `$PATH`.
|
||||
|
||||
$ ../mspec/bin/mspec -t /path/to/some/bin/ruby
|
||||
|
||||
|
|
|
@ -2,27 +2,40 @@ require_relative '../../spec_helper'
|
|||
require_relative 'fixtures/common'
|
||||
|
||||
describe "Dir.home" do
|
||||
it "returns the current user's home directory as a string if called without arguments" do
|
||||
home_directory = ENV['HOME']
|
||||
platform_is :windows do
|
||||
unless home_directory
|
||||
home_directory = ENV['HOMEDRIVE'] + ENV['HOMEPATH']
|
||||
before :each do
|
||||
@home = ENV['HOME']
|
||||
ENV['HOME'] = "/rubyspec_home"
|
||||
end
|
||||
|
||||
after :each do
|
||||
ENV['HOME'] = @home
|
||||
end
|
||||
|
||||
describe "when called without arguments" do
|
||||
it "returns the current user's home directory, reading $HOME first" do
|
||||
Dir.home.should == "/rubyspec_home"
|
||||
end
|
||||
|
||||
it "returns a non-frozen string" do
|
||||
Dir.home.frozen?.should == false
|
||||
end
|
||||
end
|
||||
|
||||
describe "when called with the current user name" do
|
||||
platform_is :solaris do
|
||||
it "returns the named user's home directory from the user database" do
|
||||
Dir.home(ENV['USER']).should == `getent passwd #{ENV['USER']}|cut -d: -f6`.chomp
|
||||
end
|
||||
home_directory = home_directory.tr('\\', '/').chomp('/')
|
||||
end
|
||||
|
||||
Dir.home.should == home_directory
|
||||
end
|
||||
|
||||
platform_is :solaris do
|
||||
it "returns the named user's home directory, from the user database, as a string if called with an argument" do
|
||||
Dir.home(ENV['USER']).should == `getent passwd #{ENV['USER']}|cut -d: -f6`.chomp
|
||||
platform_is_not :windows, :solaris do
|
||||
it "returns the named user's home directory, from the user database" do
|
||||
Dir.home(ENV['USER']).should == `echo ~#{ENV['USER']}`.chomp
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
platform_is_not :windows, :solaris do
|
||||
it "returns the named user's home directory, from the user database, as a string if called with an argument" do
|
||||
Dir.home(ENV['USER']).should == `echo ~#{ENV['USER']}`.chomp
|
||||
it "returns a non-frozen string" do
|
||||
Dir.home(ENV['USER']).frozen?.should == false
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -56,40 +56,10 @@ describe "File.expand_path" do
|
|||
File.expand_path(".", "#{@rootdir}").should == "#{@rootdir}"
|
||||
end
|
||||
|
||||
# FIXME: do not use conditionals like this around #it blocks
|
||||
unless not home = ENV['HOME']
|
||||
platform_is_not :windows do
|
||||
it "converts a pathname to an absolute pathname, using ~ (home) as base" do
|
||||
File.expand_path('~').should == home
|
||||
File.expand_path('~', '/tmp/gumby/ddd').should == home
|
||||
File.expand_path('~/a', '/tmp/gumby/ddd').should == File.join(home, 'a')
|
||||
end
|
||||
|
||||
it "does not return a frozen string" do
|
||||
File.expand_path('~').frozen?.should == false
|
||||
File.expand_path('~', '/tmp/gumby/ddd').frozen?.should == false
|
||||
File.expand_path('~/a', '/tmp/gumby/ddd').frozen?.should == false
|
||||
end
|
||||
end
|
||||
platform_is :windows do
|
||||
it "converts a pathname to an absolute pathname, using ~ (home) as base" do
|
||||
File.expand_path('~').should == home.tr("\\", '/')
|
||||
File.expand_path('~', '/tmp/gumby/ddd').should == home.tr("\\", '/')
|
||||
File.expand_path('~/a', '/tmp/gumby/ddd').should == File.join(home.tr("\\", '/'), 'a')
|
||||
end
|
||||
|
||||
it "does not return a frozen string" do
|
||||
File.expand_path('~').frozen?.should == false
|
||||
File.expand_path('~', '/tmp/gumby/ddd').frozen?.should == false
|
||||
File.expand_path('~/a', '/tmp/gumby/ddd').frozen?.should == false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
platform_is_not :windows do
|
||||
before do
|
||||
@var_home = ENV['HOME'].chomp('/')
|
||||
@db_home = Dir.home
|
||||
@db_home = Dir.home(ENV['USER'])
|
||||
end
|
||||
|
||||
# FIXME: these are insane!
|
||||
|
@ -217,6 +187,32 @@ describe "File.expand_path" do
|
|||
end
|
||||
|
||||
platform_is_not :windows do
|
||||
describe "File.expand_path when HOME is set" do
|
||||
before :each do
|
||||
@home = ENV["HOME"]
|
||||
ENV["HOME"] = "/rubyspec_home"
|
||||
end
|
||||
|
||||
after :each do
|
||||
ENV["HOME"] = @home
|
||||
end
|
||||
|
||||
it "converts a pathname to an absolute pathname, using ~ (home) as base" do
|
||||
home = "/rubyspec_home"
|
||||
File.expand_path('~').should == home
|
||||
File.expand_path('~', '/tmp/gumby/ddd').should == home
|
||||
File.expand_path('~/a', '/tmp/gumby/ddd').should == File.join(home, 'a')
|
||||
end
|
||||
|
||||
it "does not return a frozen string" do
|
||||
home = "/rubyspec_home"
|
||||
File.expand_path('~').frozen?.should == false
|
||||
File.expand_path('~', '/tmp/gumby/ddd').frozen?.should == false
|
||||
File.expand_path('~/a', '/tmp/gumby/ddd').frozen?.should == false
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
describe "File.expand_path when HOME is not set" do
|
||||
before :each do
|
||||
@home = ENV["HOME"]
|
||||
|
|
|
@ -29,28 +29,32 @@ describe "Process.setpriority" do
|
|||
end
|
||||
|
||||
as_superuser do
|
||||
p = Process.getpriority(Process::PRIO_USER, 0)
|
||||
# The nice value is a value in the range -20 to 19.
|
||||
# This test tries to change the nice value to +-1, so it cannot run if p == -20 || p == 19.
|
||||
if -20 < p && p < 19
|
||||
begin
|
||||
# Check if we can lower the nice value or not.
|
||||
#
|
||||
# We are not always able to do it even as a root.
|
||||
# Docker container is not always able to do it depending upon the configuration,
|
||||
# which cannot know from the container itself.
|
||||
Process.setpriority(Process::PRIO_USER, 0, p - 1)
|
||||
Process.setpriority(Process::PRIO_USER, 0, p)
|
||||
|
||||
it "sets the scheduling priority for a specified user" do
|
||||
Process.setpriority(Process::PRIO_USER, 0, p + 1).should == 0
|
||||
Process.getpriority(Process::PRIO_USER, 0).should == (p + 1)
|
||||
Process.setpriority(Process::PRIO_USER, 0, p).should == 0
|
||||
end
|
||||
rescue Errno::EACCES
|
||||
end
|
||||
guard -> {
|
||||
prio = Process.getpriority(Process::PRIO_USER, 0)
|
||||
# The nice value is a value in the range -20 to 19.
|
||||
# This test tries to change the nice value to +-1, so it cannot run if prio == -20 || prio == 19.
|
||||
if -20 < prio && prio < 19
|
||||
begin
|
||||
# Check if we can lower the nice value or not.
|
||||
#
|
||||
# We are not always able to do it even as a root.
|
||||
# Docker container is not always able to do it depending upon the configuration,
|
||||
# which cannot know from the container itself.
|
||||
Process.setpriority(Process::PRIO_USER, 0, prio - 1)
|
||||
Process.setpriority(Process::PRIO_USER, 0, prio)
|
||||
true
|
||||
rescue Errno::EACCES
|
||||
false
|
||||
end
|
||||
end
|
||||
} do
|
||||
it "sets the scheduling priority for a specified user" do
|
||||
prio = Process.getpriority(Process::PRIO_USER, 0)
|
||||
Process.setpriority(Process::PRIO_USER, 0, prio + 1).should == 0
|
||||
Process.getpriority(Process::PRIO_USER, 0).should == (prio + 1)
|
||||
Process.setpriority(Process::PRIO_USER, 0, prio).should == 0
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
@ -7,27 +7,25 @@ platform_is :windows do
|
|||
end
|
||||
|
||||
describe :process_spawn_does_not_close_std_streams, shared: true do
|
||||
platform_is_not :windows do
|
||||
it "does not close STDIN" do
|
||||
code = "STDOUT.puts STDIN.read(0).inspect"
|
||||
cmd = "Process.wait Process.spawn(#{ruby_cmd(code).inspect}, #{@options.inspect})"
|
||||
ruby_exe(cmd, args: "> #{@name}")
|
||||
File.binread(@name).should == %[""#{newline}]
|
||||
end
|
||||
it "does not close STDIN" do
|
||||
code = "STDOUT.puts STDIN.read(0).inspect"
|
||||
cmd = "Process.wait Process.spawn(#{ruby_cmd(code).inspect}, #{@options.inspect})"
|
||||
ruby_exe(cmd, args: "> #{@name}")
|
||||
File.binread(@name).should == %[""#{newline}]
|
||||
end
|
||||
|
||||
it "does not close STDOUT" do
|
||||
code = "STDOUT.puts 'hello'"
|
||||
cmd = "Process.wait Process.spawn(#{ruby_cmd(code).inspect}, #{@options.inspect})"
|
||||
ruby_exe(cmd, args: "> #{@name}")
|
||||
File.binread(@name).should == "hello#{newline}"
|
||||
end
|
||||
it "does not close STDOUT" do
|
||||
code = "STDOUT.puts 'hello'"
|
||||
cmd = "Process.wait Process.spawn(#{ruby_cmd(code).inspect}, #{@options.inspect})"
|
||||
ruby_exe(cmd, args: "> #{@name}")
|
||||
File.binread(@name).should == "hello#{newline}"
|
||||
end
|
||||
|
||||
it "does not close STDERR" do
|
||||
code = "STDERR.puts 'hello'"
|
||||
cmd = "Process.wait Process.spawn(#{ruby_cmd(code).inspect}, #{@options.inspect})"
|
||||
ruby_exe(cmd, args: "2> #{@name}")
|
||||
File.binread(@name).should =~ /hello#{newline}/
|
||||
end
|
||||
it "does not close STDERR" do
|
||||
code = "STDERR.puts 'hello'"
|
||||
cmd = "Process.wait Process.spawn(#{ruby_cmd(code).inspect}, #{@options.inspect})"
|
||||
ruby_exe(cmd, args: "2> #{@name}")
|
||||
File.binread(@name).should =~ /hello#{newline}/
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -532,12 +530,12 @@ describe "Process.spawn" do
|
|||
File.read(@name).should == "glarkbang"
|
||||
end
|
||||
|
||||
context "when passed close_others: true" do
|
||||
before :each do
|
||||
@options = { close_others: true }
|
||||
end
|
||||
platform_is_not :windows do
|
||||
context "when passed close_others: true" do
|
||||
before :each do
|
||||
@options = { close_others: true }
|
||||
end
|
||||
|
||||
platform_is_not :windows do
|
||||
it "closes file descriptors >= 3 in the child process even if fds are set close_on_exec=false" do
|
||||
touch @name
|
||||
IO.pipe do |r, w|
|
||||
|
@ -554,31 +552,29 @@ describe "Process.spawn" do
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
it_should_behave_like :process_spawn_does_not_close_std_streams
|
||||
end
|
||||
|
||||
it_should_behave_like :process_spawn_does_not_close_std_streams
|
||||
end
|
||||
context "when passed close_others: false" do
|
||||
before :each do
|
||||
@options = { close_others: false }
|
||||
end
|
||||
|
||||
context "when passed close_others: false" do
|
||||
before :each do
|
||||
@options = { close_others: false }
|
||||
end
|
||||
|
||||
it "closes file descriptors >= 3 in the child process because they are set close_on_exec by default" do
|
||||
touch @name
|
||||
IO.pipe do |r, w|
|
||||
begin
|
||||
pid = Process.spawn(ruby_cmd("while File.exist? '#{@name}'; sleep 0.1; end"), @options)
|
||||
w.close
|
||||
r.read(1).should == nil
|
||||
ensure
|
||||
rm_r @name
|
||||
Process.wait(pid) if pid
|
||||
it "closes file descriptors >= 3 in the child process because they are set close_on_exec by default" do
|
||||
touch @name
|
||||
IO.pipe do |r, w|
|
||||
begin
|
||||
pid = Process.spawn(ruby_cmd("while File.exist? '#{@name}'; sleep 0.1; end"), @options)
|
||||
w.close
|
||||
r.read(1).should == nil
|
||||
ensure
|
||||
rm_r @name
|
||||
Process.wait(pid) if pid
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
platform_is_not :windows do
|
||||
it "does not close file descriptors >= 3 in the child process if fds are set close_on_exec=false" do
|
||||
IO.pipe do |r, w|
|
||||
r.close_on_exec = false
|
||||
|
@ -594,9 +590,9 @@ describe "Process.spawn" do
|
|||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it_should_behave_like :process_spawn_does_not_close_std_streams
|
||||
it_should_behave_like :process_spawn_does_not_close_std_streams
|
||||
end
|
||||
end
|
||||
|
||||
# error handling
|
||||
|
|
Loading…
Reference in a new issue