cli_test 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,23 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'autotest/restart'
4
+
5
+ # Autotest.add_hook :initialize do |at|
6
+ # at.extra_files << "../some/external/dependency.rb"
7
+ #
8
+ # at.libs << ":../some/external"
9
+ #
10
+ # at.add_exception 'vendor'
11
+ #
12
+ # at.add_mapping(/dependency.rb/) do |f, _|
13
+ # at.files_matching(/test_.*rb$/)
14
+ # end
15
+ #
16
+ # %w(TestA TestB).each do |klass|
17
+ # at.extra_class_map[klass] = "test/test_misc.rb"
18
+ # end
19
+ # end
20
+
21
+ # Autotest.add_hook :run_command do |at|
22
+ # system "rake build"
23
+ # end
File without changes
@@ -0,0 +1,6 @@
1
+ === 1.0.0 / 2011-06-24
2
+
3
+ * 1 major enhancement
4
+
5
+ * Birthday!
6
+
@@ -0,0 +1,7 @@
1
+ .autotest
2
+ History.txt
3
+ Manifest.txt
4
+ README.rdoc
5
+ Rakefile
6
+ lib/cli_test.rb
7
+ test/test_cli_test.rb
@@ -0,0 +1,51 @@
1
+ = cli_test
2
+
3
+ * http://github.com/julik/cli_test
4
+
5
+ == DESCRIPTION:
6
+
7
+ Assists in testing commandline applications (run an application qucikly, read out stderr, stdout and status, check option combinations)
8
+
9
+ == FEATURES/PROBLEMS:
10
+
11
+ Uses in-process loading on non-forking architectures
12
+
13
+ == SYNOPSIS:
14
+
15
+ @app = CLITest.new("/usr/local/bin/ruby")
16
+ status, out, err = @app.run("--version")
17
+ out #=> "ruby 1.9.2p180 (2011-02-18 revision 30909) [i386-darwin9.8.0]\n"
18
+ assert_match /revision/, out, "Should output revision information"
19
+
20
+ == REQUIREMENTS:
21
+
22
+ * FIX (list of requirements)
23
+
24
+ == INSTALL:
25
+
26
+ * FIX (sudo gem install, anything else)
27
+
28
+ == LICENSE:
29
+
30
+ (The MIT License)
31
+
32
+ Copyright (c) 2011 FIX
33
+
34
+ Permission is hereby granted, free of charge, to any person obtaining
35
+ a copy of this software and associated documentation files (the
36
+ 'Software'), to deal in the Software without restriction, including
37
+ without limitation the rights to use, copy, modify, merge, publish,
38
+ distribute, sublicense, and/or sell copies of the Software, and to
39
+ permit persons to whom the Software is furnished to do so, subject to
40
+ the following conditions:
41
+
42
+ The above copyright notice and this permission notice shall be
43
+ included in all copies or substantial portions of the Software.
44
+
45
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
46
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
47
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
48
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
49
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
50
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
51
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,11 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+
6
+ Hoe.spec 'cli_test' do | s |
7
+ s.developer('Julik Tarkhanov', 'me@julik.nl')
8
+ s.readme_file = 'README.rdoc'
9
+ end
10
+
11
+ # vim: syntax=ruby
@@ -0,0 +1,80 @@
1
+ require "stringio"
2
+
3
+ begin
4
+ require "open3"
5
+ rescue LoadError
6
+ end
7
+
8
+ class CLITest
9
+ VERSION = '1.0.0'
10
+
11
+ def initialize(binary_path)
12
+ @binary_path = File.expand_path(binary_path)
13
+ end
14
+
15
+ def run(commandline_arguments)
16
+ arguments_as_argv = cli_arguments_to_argv(commandline_arguments)
17
+ (not_unix? || !ruby19?) ? in_process(arguments_as_argv) : in_fork(arguments_as_argv)
18
+ end
19
+
20
+ def not_unix?
21
+ RUBY_PLATFORM =~ /mswin|jruby/
22
+ end
23
+
24
+
25
+ def ruby19?
26
+ !(RUBY_VERSION < "1.9")
27
+ end
28
+
29
+ # Run the binary under test with passed options, and return [exit_code, stdout_content, stderr_content]
30
+ # There is a limitation however: your app should be using $stdout and $stdeer and NOT their constant
31
+ # equivalents.
32
+ def in_process(commandline_arguments)
33
+ old_stdout, old_stderr, old_argv = $stdout, $stderr, ARGV.dup
34
+ os, es = StringIO.new, StringIO.new
35
+ begin
36
+ $stdout, $stderr, verbosity = os, es, $VERBOSE
37
+ ARGV.replace(commandline_arguments)
38
+ $VERBOSE = false
39
+
40
+ load(@binary_path)
41
+
42
+ return [0, os.string, es.string]
43
+ rescue SystemExit => boom # The binary uses exit(), we use that to preserve the output code
44
+ return [boom.status, os.string, es.string]
45
+ ensure
46
+ $VERBOSE = verbosity
47
+ ARGV.replace(old_argv)
48
+ $stdout, $stderr = old_stdout, old_stderr
49
+ end
50
+ end
51
+
52
+ def cli_arguments_to_argv(arguments_string_or_array)
53
+ return arguments_string_or_array if arguments_string_or_array.is_a?(Array)
54
+ arguments_string_or_array.split
55
+ end
56
+
57
+ # Run the binary under test with passed options, and return [exit_code, stdout_content, stderr_content]
58
+ # There is a limitation however: your app should be using $stdout and $stdeer and NOT their constant
59
+ # equivalents.
60
+ def in_fork(args)
61
+ args.unshift(@binary_path)
62
+
63
+ if ruby19?
64
+ Open3.popen3(ENV, args.join(' ')) do |stdin, stdout, stderr, wait_thr|
65
+ # Process::Status object returned in Ruby 1.9
66
+ [make_signed(wait_thr.value.exitstatus), stdout.read, stderr.read]
67
+ end
68
+ else
69
+ Open3.popen3(args.join(' ')) do |stdin, stdout, stderr|
70
+ [make_signed($?.to_i), stdout.read, stderr.read]
71
+ end
72
+ end
73
+ end
74
+
75
+ # yuck!
76
+ def make_signed(retcode)
77
+ ((retcode > 128)) && ((retcode = retcode - 256))
78
+ retcode
79
+ end
80
+ end
@@ -0,0 +1,111 @@
1
+ require "test/unit"
2
+ require File.expand_path(File.dirname(__FILE__)) + "/../lib/cli_test"
3
+ require "tempfile"
4
+
5
+ class TestCliTest < Test::Unit::TestCase
6
+ class InProcess < CLITest
7
+
8
+ def not_unix?
9
+ true
10
+ end
11
+ end
12
+
13
+ def setup
14
+ @tfs = []
15
+ end
16
+
17
+ def make_tempfile
18
+ tf = Tempfile.new("experiment")
19
+ @tfs.push(tf)
20
+ tf
21
+ end
22
+
23
+ def teardown
24
+ @tfs.each{|tf| tf.close! }
25
+ end
26
+
27
+ def test_cli_passes_ARGV
28
+ f = make_tempfile
29
+ f.puts('#!/usr/bin/env ruby')
30
+ f.puts("print ARGV.inspect")
31
+ f.chmod(0x777)
32
+ f.flush
33
+
34
+ @app = CLITest.new(f.path)
35
+ s, o, e = @app.run("--help")
36
+ assert_equal %w( --help ).inspect, o, "Should be the same STDOUT"
37
+ assert_equal "", e, "Should be the same STDERR"
38
+ end
39
+
40
+ def test_cli_returns_stderr
41
+ f = make_tempfile
42
+ f.puts('#!/usr/bin/env ruby')
43
+ f.puts("$stderr.write ARGV.inspect")
44
+ f.chmod(0x777)
45
+ f.flush
46
+
47
+ @app = CLITest.new(f.path)
48
+ s, o, e = @app.run("--help")
49
+ assert_equal %w( --help ).inspect, e, "Should be the same STDERR"
50
+ end
51
+
52
+ def test_cli_passes_exit_status
53
+ f = Tempfile.new("experiment")
54
+ f.puts('#!/usr/bin/env ruby')
55
+ f.puts("exit(12)")
56
+ f.chmod(0x777)
57
+ f.flush
58
+
59
+ @app = CLITest.new(f.path)
60
+ s, o, e = @app.run("")
61
+ assert_equal 12, s, "Should pass the proper exit status"
62
+ end
63
+
64
+ def test_cli_passes_exit_status_with_inprocess
65
+ f = Tempfile.new("experiment")
66
+ f.puts('#!/usr/bin/env ruby')
67
+ f.puts("exit(12)")
68
+ f.chmod(0x777)
69
+ f.flush
70
+
71
+ @app = InProcess.new(f.path)
72
+ s, o, e = @app.run("")
73
+ assert_equal 12, s, "Should pass the proper exit status"
74
+ end
75
+
76
+ def test_cli_returns_stderr_with_inprocess
77
+ f = make_tempfile
78
+ f.puts('#!/usr/bin/env ruby')
79
+ f.puts("$stderr.write ARGV.inspect")
80
+ f.chmod(0x777)
81
+ f.flush
82
+
83
+ @app = InProcess.new(f.path)
84
+ s, o, e = @app.run("--help")
85
+ assert_equal %w( --help ).inspect, e, "Should be the same STDERR"
86
+ end
87
+
88
+ def test_cli_returns_stdout_with_inprocess
89
+ f = make_tempfile
90
+ f.puts('#!/usr/bin/env ruby')
91
+ f.puts("$stdout.write ARGV.inspect")
92
+ f.chmod(0x777)
93
+ f.flush
94
+
95
+ @app = InProcess.new(f.path)
96
+ s, o, e = @app.run("--help")
97
+ assert_equal %w( --help ).inspect, o, "Should be the same STDOUT"
98
+ end
99
+
100
+ def test_cli_passes_negative_exit_status
101
+ f = Tempfile.new("experiment")
102
+ f.puts('#!/usr/bin/env ruby')
103
+ f.puts("exit(-12)")
104
+ f.chmod(0x777)
105
+ f.flush
106
+
107
+ @app = CLITest.new(f.path)
108
+ s, o, e = @app.run("")
109
+ assert_equal -12, s, "Should pass the proper exit status"
110
+ end
111
+ end
metadata ADDED
@@ -0,0 +1,74 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cli_test
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 1.0.0
6
+ platform: ruby
7
+ authors:
8
+ - Julik Tarkhanov
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-06-24 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: hoe
17
+ prerelease: false
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 2.9.4
24
+ type: :development
25
+ version_requirements: *id001
26
+ description: Assists in testing commandline applications (run an application qucikly, read out stderr, stdout and status, check option combinations)
27
+ email:
28
+ - me@julik.nl
29
+ executables: []
30
+
31
+ extensions: []
32
+
33
+ extra_rdoc_files:
34
+ - History.txt
35
+ - Manifest.txt
36
+ files:
37
+ - .autotest
38
+ - History.txt
39
+ - Manifest.txt
40
+ - README.rdoc
41
+ - Rakefile
42
+ - lib/cli_test.rb
43
+ - test/test_cli_test.rb
44
+ - .gemtest
45
+ homepage: http://github.com/julik/cli_test
46
+ licenses: []
47
+
48
+ post_install_message:
49
+ rdoc_options:
50
+ - --main
51
+ - README.rdoc
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: "0"
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ version: "0"
66
+ requirements: []
67
+
68
+ rubyforge_project: cli_test
69
+ rubygems_version: 1.8.5
70
+ signing_key:
71
+ specification_version: 3
72
+ summary: Assists in testing commandline applications (run an application qucikly, read out stderr, stdout and status, check option combinations)
73
+ test_files:
74
+ - test/test_cli_test.rb