cf 0.6.1.rc4 → 0.6.1.rc5

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.
@@ -1,167 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe SpeckerRunner, :ruby19 => true do
4
- def asset(file)
5
- File.expand_path("../../assets/specker_runner/#{file}", __FILE__)
6
- end
7
-
8
- let(:timeout) { 1 }
9
-
10
- describe "running a command" do
11
- let(:file) do
12
- file = Tempfile.new('test-specker-runner')
13
- sleep 1 # wait one second to make sure touching the file does something measurable
14
- file
15
- end
16
-
17
- after { file.unlink }
18
-
19
- it "runs a command" do
20
- run("touch -a #{file.path}") do |runner|
21
- runner.wait_for_exit
22
- file.stat.atime.should > file.stat.mtime
23
- end
24
- end
25
- end
26
-
27
- describe "#expect" do
28
- context "when the expected output shows up" do
29
- it "returns a truthy value" do
30
- run("echo -n foo") do |runner|
31
- expect(runner.expect('foo')).to be_true
32
- end
33
- end
34
- end
35
-
36
- context "when the expected output never shows up" do
37
- it "returns nil" do
38
- run("echo the spanish inquisition") do |runner|
39
- expect(runner.expect("something else", 0.5)).to be_nil
40
- end
41
- end
42
- end
43
-
44
- context "when the output eventually shows up" do
45
- it "returns a truthy value" do
46
- run("ruby #{asset("specker_runner_pause.rb")}") do |runner|
47
- expect(runner.expect("finished")).to be_true
48
- end
49
- end
50
- end
51
-
52
- context "backspace" do
53
- it "respects the backspace character" do
54
- run("ruby -e 'puts \"foo a\\bbar\"'") do |runner|
55
- expect(runner.expect("foo bar")).to be_true
56
- end
57
- end
58
-
59
- it "does not go beyond the beginning of the line" do
60
- run("ruby -e 'print \"foo abc\nx\\b\\bd\"'") do |runner|
61
- expect(runner.expect("foo abc\nd")).to be_true
62
- end
63
- end
64
-
65
- it "does not go beyond the beginning of the string" do
66
- run("ruby -e 'print \"f\\b\\bbar\"'") do |runner|
67
- expect(runner.expect("bar")).to be_true
68
- end
69
- end
70
-
71
- it "leaves backspaced characters in the buffer until they're overwritten" do
72
- run("ruby -e 'print \"foo abc\\b\\bd\"'") do |runner|
73
- expect(runner.expect("foo adc")).to be_true
74
- end
75
- end
76
- end
77
-
78
- context "ansi escape sequences" do
79
- it "filters ansi color sequences" do
80
- run("ruby -e 'puts \"\\e[36mblue\\e[0m thing\"'") do |runner|
81
- expect(runner.expect("blue thing")).to be_true
82
- end
83
- end
84
- end
85
-
86
- context "expecting multiple branches" do
87
- context "and one of them matches" do
88
- it "can be passed a hash of values with callbacks, and returns the matched key" do
89
- run("echo 1 3") do |runner|
90
- branches = {
91
- "1" => proc { 1 },
92
- "2" => proc { 2 },
93
- "3" => proc { 3 }
94
- }
95
-
96
- expect(runner.expect(branches)).to eq "1"
97
- expect(runner.expect(branches)).to eq "3"
98
- end
99
- end
100
-
101
- it "calls the matched callback" do
102
- callback = mock!
103
- run("echo 1 3") do |runner|
104
- branches = {
105
- "1" => proc { callback }
106
- }
107
- runner.expect(branches)
108
- end
109
- end
110
- end
111
-
112
- context "and none of them match" do
113
- it "returns nil when none of the branches match" do
114
- run("echo not_a_number") do |runner|
115
- expect(runner.expect({"1" => proc { 1 }}, timeout)).to be_nil
116
- end
117
- end
118
- end
119
- end
120
- end
121
-
122
- describe "#output" do
123
- it "makes the entire command output (so far) available" do
124
- run("echo 0 1 2 3") do |runner|
125
- runner.expect("1")
126
- runner.expect("3")
127
- expect(runner.output).to eq "0 1 2 3"
128
- end
129
-
130
- end
131
- end
132
-
133
- describe "#send_keys" do
134
- it "sends input and expects more output afterward" do
135
- run("ruby #{asset("specker_runner_input.rb")}") do |runner|
136
- expect(runner.expect("started")).to be_true
137
- runner.send_keys("foo")
138
- expect(runner.expect("foo")).to be_true
139
- end
140
- end
141
- end
142
-
143
- context "#exit_code" do
144
- it "returns the exit code" do
145
- run("ruby -e 'exit 42'") do |runner|
146
- runner.wait_for_exit
147
- expect(runner.exit_code).to eq(42)
148
- end
149
- end
150
-
151
- context "when the command is still running" do
152
- it "waits for the command to exit" do
153
- run("sleep 0.5") do |runner|
154
- expect(runner.exit_code).to eq(0)
155
- end
156
- end
157
- end
158
- end
159
-
160
- context "#exited?" do
161
- it "returns false if the command is still running" do
162
- run("sleep 10") do |runner|
163
- expect(runner.exited?).to eq false
164
- end
165
- end
166
- end
167
- end
@@ -1,86 +0,0 @@
1
- module ConsoleAppSpeckerMatchers
2
- class InvalidInputError < StandardError; end
3
-
4
- class ExpectOutputMatcher
5
- attr_reader :timeout
6
-
7
- def initialize(expected_output, timeout = 30)
8
- @expected_output = expected_output
9
- @timeout = timeout
10
- end
11
-
12
- def matches?(runner)
13
- raise InvalidInputError unless runner.respond_to?(:expect)
14
- @matched = runner.expect(@expected_output, @timeout)
15
- @full_output = runner.output
16
- !!@matched
17
- end
18
-
19
- def failure_message
20
- if @expected_output.is_a?(Hash)
21
- expected_keys = @expected_output.keys.map{|key| "'#{key}'"}.join(', ')
22
- "expected one of #{expected_keys} to be printed, but it wasn't. full output:\n#@full_output"
23
- else
24
- "expected '#{@expected_output}' to be printed, but it wasn't. full output:\n#@full_output"
25
- end
26
- end
27
-
28
- def negative_failure_message
29
- if @expected_output.is_a?(Hash)
30
- match = @matched
31
- else
32
- match = @expected_output
33
- end
34
-
35
- "expected '#{match}' to not be printed, but it was. full output:\n#@full_output"
36
- end
37
- end
38
-
39
-
40
- class ExitCodeMatcher
41
- def initialize(expected_code)
42
- @expected_code = expected_code
43
- end
44
-
45
- def matches?(runner)
46
- raise InvalidInputError unless runner.respond_to?(:exit_code)
47
-
48
- begin
49
- Timeout.timeout(5) do
50
- @actual_code = runner.exit_code
51
- end
52
-
53
- @actual_code == @expected_code
54
- rescue Timeout::Error
55
- @timed_out = true
56
- false
57
- end
58
- end
59
-
60
- def failure_message
61
- if @timed_out
62
- "expected process to exit with status #@expected_code, but it did not exit within 5 seconds"
63
- else
64
- "expected process to exit with status #{@expected_code}, but it exited with status #{@actual_code}"
65
- end
66
- end
67
-
68
- def negative_failure_message
69
- if @timed_out
70
- "expected process to exit with status #@expected_code, but it did not exit within 5 seconds"
71
- else
72
- "expected process to not exit with status #{@expected_code}, but it did"
73
- end
74
- end
75
- end
76
-
77
- def say(expected_output, timeout = 30)
78
- ExpectOutputMatcher.new(expected_output, timeout)
79
- end
80
-
81
- def have_exited_with(expected_code)
82
- ExitCodeMatcher.new(expected_code)
83
- end
84
-
85
- alias :exit_with :have_exited_with
86
- end
@@ -1,6 +0,0 @@
1
- shared_examples_for "a_command_that_populates_organization" do
2
- it "calls the organization populator" do
3
- mock(CF::Populators::Organization).new(instance_of(Mothership::Inputs)) { mock!.populate_and_save! }
4
- subject
5
- end
6
- end
@@ -1,80 +0,0 @@
1
- require "pty"
2
-
3
- class SpeckerRunner
4
- def initialize(*args)
5
- @stdout, slave = PTY.open
6
- system("stty raw", :in => slave)
7
- read, @stdin = IO.pipe
8
-
9
- @pid = spawn(*(args.push(:in => read, :out => slave, :err => slave)))
10
-
11
- @expector = TrackingExpector.new(@stdout, ENV["DEBUG_BACON"])
12
-
13
- yield self
14
- end
15
-
16
- def expect(matcher, timeout = 30)
17
- case matcher
18
- when Hash
19
- expect_branches(matcher, timeout)
20
- else
21
- @expector.expect(matcher, timeout)
22
- end
23
- end
24
-
25
- def send_keys(text_to_send)
26
- @stdin.puts(text_to_send)
27
- end
28
-
29
- def exit_code
30
- return @status if @status
31
-
32
- status = nil
33
- Timeout.timeout(5) do
34
- _, status = Process.waitpid2(@pid)
35
- end
36
-
37
- @status = numeric_exit_code(status)
38
- end
39
-
40
- alias_method :wait_for_exit, :exit_code
41
-
42
- def exited?
43
- !running?
44
- end
45
-
46
- def running?
47
- !!Process.getpgid(@pid)
48
- end
49
-
50
- def output
51
- @expector.output
52
- end
53
-
54
- def debug
55
- @expector.debug
56
- end
57
-
58
- def debug=(x)
59
- @expector.debug = x
60
- end
61
-
62
- private
63
-
64
- def expect_branches(branches, timeout)
65
- branch_names = /#{branches.keys.collect { |k| Regexp.quote(k) }.join("|")}/
66
- expected = @expector.expect(branch_names, timeout)
67
- return unless expected
68
-
69
- data = expected.first.match(/(#{branch_names})$/)
70
- matched = data[1]
71
- branches[matched].call
72
- matched
73
- end
74
-
75
- def numeric_exit_code(status)
76
- status.exitstatus
77
- rescue NoMethodError
78
- status
79
- end
80
- end
@@ -1,71 +0,0 @@
1
- class TrackingExpector
2
- attr_reader :output
3
-
4
- def initialize(out, debug = false)
5
- @out = out
6
- @debug = debug
7
- @unused = ""
8
- @output = ""
9
- end
10
-
11
- def expect(pattern, timeout = 5)
12
- buffer = ''
13
-
14
- case pattern
15
- when String
16
- pattern = Regexp.new(Regexp.quote(pattern))
17
- when Regexp
18
- else
19
- raise TypeError, "unsupported pattern class: #{pattern.class}"
20
- end
21
-
22
- result = nil
23
- position = 0
24
- @unused ||= ""
25
-
26
- while true
27
- if !@unused.empty?
28
- c = @unused.slice!(0).chr
29
- elsif output_ended?(timeout)
30
- @unused = buffer
31
- break
32
- else
33
- c = @out.getc.chr
34
- end
35
-
36
- STDOUT.putc c if @debug
37
-
38
- # wear your flip flops
39
- unless (c == "\e") .. (c == "m")
40
- if c == "\b"
41
- if position > 0 && buffer[position - 1] && buffer[position - 1].chr != "\n"
42
- position -= 1
43
- end
44
- else
45
- if buffer.size > position
46
- buffer[position] = c
47
- else
48
- buffer << c
49
- end
50
-
51
- position += 1
52
- end
53
- end
54
-
55
- if matches = pattern.match(buffer)
56
- result = [buffer, *matches.to_a[1..-1]]
57
- break
58
- end
59
- end
60
-
61
- @output << buffer
62
-
63
- result
64
- end
65
-
66
- private
67
-
68
- def output_ended?(timeout)
69
- (@out.is_a?(IO) && !IO.select([@out], nil, nil, timeout)) || @out.eof?
70
- end
71
- end