1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/spec/ruby
normal 6a65f2b1e4 io + socket: make pipes and sockets nonblocking by default
All normal Ruby IO methods (IO#read, IO#gets, IO#write, ...) are
all capable of appearing to be "blocking" when presented with a
file description with the O_NONBLOCK flag set; so there is
little risk of incompatibility within Ruby-using programs.

The biggest compatibility risk is when spawning external
programs.  As a result, stdin, stdout, and stderr are now always
made blocking before exec-family calls.

This change will make an event-oriented MJIT usable if it is
waiting on pipes on POSIX_like platforms.

It is ALSO necessary to take advantage of (proposed lightweight
concurrency (aka "auto-Fiber") or any similar proposal for
network concurrency: https://bugs.ruby-lang.org/issues/13618

Named-pipe (FIFO) are NOT yet non-blocking by default since
they are rarely-used and may introduce compatibility problems
and extra syscall overhead for a common path.

Please revert this commit if there are problems and if I am afk
since I am afk a lot, lately.

[ruby-core:89950] [Bug #14968]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65922 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-11-22 08:46:51 +00:00
..
command_line use should include. 2018-10-09 06:18:28 +00:00
core io + socket: make pipes and sockets nonblocking by default 2018-11-22 08:46:51 +00:00
fixtures Update to ruby/spec@9be7c7e 2018-08-03 16:19:40 +00:00
language Update to ruby/spec@8b743a3 2018-10-27 10:48:40 +00:00
library io + socket: make pipes and sockets nonblocking by default 2018-11-22 08:46:51 +00:00
optional/capi Update to ruby/spec@8b743a3 2018-10-27 10:48:40 +00:00
security Update to ruby/spec@8b743a3 2018-10-27 10:48:40 +00:00
shared Update to ruby/spec@8b743a3 2018-10-27 10:48:40 +00:00
.gitignore
.rubocop.yml Update to ruby/spec@6fd9472 2018-08-28 09:41:26 +00:00
.rubocop_todo.yml Update to ruby/spec@09fa86c 2018-08-27 14:25:00 +00:00
.travis.yml Update to ruby/spec@8b743a3 2018-10-27 10:48:40 +00:00
appveyor.yml Update to ruby/spec@4bc7a2b 2018-06-13 21:41:45 +00:00
CHANGES.before-2008-05-10
CONTRIBUTING.md Update to ruby/spec@cbe855c 2018-02-27 20:21:25 +00:00
default.mspec Update to ruby/spec@09fa86c 2018-08-27 14:25:00 +00:00
LICENSE
README.md Update to ruby/spec@9be7c7e 2018-08-03 16:19:40 +00:00
spec_helper.rb Update to ruby/spec@bacedc5 2017-12-01 15:41:50 +00:00
TODO

The Ruby Spec Suite

Build Status Build Status Gitter

The Ruby Spec Suite is a test suite for the behavior of the Ruby programming language.

It is not a standardized specification like the ISO one, and does not aim to become one. Instead, it is a practical tool to describe and test the behavior of Ruby with code.

Every example code has a textual description, which presents several advantages:

  • It is easier to understand the intent of the author
  • It documents how recent versions of Ruby should behave
  • It helps Ruby implementations to agree on a common behavior

The specs are written with syntax similar to RSpec 2. They are run with MSpec, the purpose-built framework for running the Ruby Spec Suite. For more information, see the MSpec project.

The specs describe the language syntax, the core library, the standard library, the C API for extensions and the command line flags. The language specs are grouped by keyword while the core and standard library specs are grouped by class and method.

ruby/spec is known to be tested in these implementations for every commit:

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 all specs of ruby/spec (2.3.x, 2.4.x, 2.5.x, etc).

For older specs try these commits:

Running the specs

First, clone this repository:

$ git clone https://github.com/ruby/spec.git

Then move to it:

$ cd spec

Clone MSpec:

$ git clone https://github.com/ruby/mspec.git ../mspec

And run the spec suite:

$ ../mspec/bin/mspec

This will execute all the specs using the executable named ruby on your current PATH.

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.

$ ../mspec/bin/mspec -t /path/to/some/bin/ruby

Running Selected Specs

To run a single spec file, pass the filename to mspec:

$ ../mspec/bin/mspec core/kernel/kind_of_spec.rb

You can also pass a directory, in which case all specs in that directories will be run:

$ ../mspec/bin/mspec core/kernel

Finally, you can also run them per group as defined in default.mspec. The following command will run all language specs:

$ ../mspec/bin/mspec :language

In similar fashion, the following commands run the respective specs:

$ ../mspec/bin/mspec :core
$ ../mspec/bin/mspec :library
$ ../mspec/bin/mspec :capi

Contributing

See CONTRIBUTING.md.

Socket specs from rubysl-socket

Most specs under library/socket were imported from the rubysl-socket project. The 3 copyright holders of rubysl-socket, Yorick Peterse, Chuck Remes and Brian Shirai, agreed to relicense those specs under the MIT license in ruby/spec.

History and RubySpec

This project was originally born from Rubinius tests being converted to the spec style. These specs were later extracted to their own project, RubySpec, with a specific vision and principles. At the end of 2014, Brian Shirai, the creator of RubySpec, decided to end RubySpec. A couple months later, the different repositories were merged and the project was revived. On 12 January 2016, the name was changed to "The Ruby Spec Suite" for clarity and to let the RubySpec ideology rest in peace.