expect-pty 0.5.3 → 0.6.1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +28 -0
- data/README.md +28 -19
- data/docs/API.md +88 -0
- data/docs/MIGRATION.md +15 -0
- data/lib/expect/cleanup.rb +33 -0
- data/lib/expect/configuration.rb +87 -66
- data/lib/expect/interaction.rb +226 -209
- data/lib/expect/logging.rb +157 -156
- data/lib/expect/matcher.rb +30 -29
- data/lib/expect/pattern.rb +8 -2
- data/lib/expect/pattern_list.rb +35 -5
- data/lib/expect/redactor.rb +11 -4
- data/lib/expect/relay.rb +97 -73
- data/lib/expect/relay_writer.rb +2 -1
- data/lib/expect/result.rb +32 -8
- data/lib/expect/session.rb +508 -0
- data/lib/expect/session_resources.rb +10 -2
- data/lib/expect/terminal.rb +78 -78
- data/lib/expect/version.rb +1 -1
- data/lib/expect.rb +333 -520
- data/sig/expect.rbs +355 -0
- metadata +13 -106
- data/.rubocop.yml +0 -66
- data/CONTRIBUTING.md +0 -29
- data/Gemfile +0 -28
- data/Rakefile +0 -38
- data/benchmark/matching.rb +0 -98
- data/benchmark/redactor.rb +0 -64
- data/benchmark/relay.rb +0 -48
- data/benchmark/scaling.rb +0 -70
- data/benchmark/send_slow.rb +0 -41
- data/benchmark/support.rb +0 -114
- data/docs/COMPATIBILITY.md +0 -98
- data/docs/INTERNAL_CONTRACTS.md +0 -154
- data/docs/PERFORMANCE.md +0 -165
- data/docs/RELEASING.md +0 -84
- data/docs/VERIFICATION.md +0 -456
- data/examples/dialogue.rb +0 -30
- data/examples/kibitz/README.md +0 -81
- data/examples/kibitz/kibitz.rb +0 -142
- data/examples/kibitz/test_kibitz.rb +0 -37
- data/examples/ssh_auto.rb +0 -94
- data/examples/ssh_interact.rb +0 -159
- data/examples/ssh_login.rb +0 -64
- data/expect-pty.gemspec +0 -33
- data/script/ci +0 -121
- data/script/release.rb +0 -319
- data/test/buffer_accounting_test.rb +0 -83
- data/test/cleanup_test.rb +0 -251
- data/test/compare_upstream.rb +0 -157
- data/test/configuration_test.rb +0 -133
- data/test/deadline_test.rb +0 -237
- data/test/diagnostics_test.rb +0 -353
- data/test/edge_case_test.rb +0 -262
- data/test/fixtures/ssh_scripts/01_identity.sh +0 -4
- data/test/fixtures/ssh_scripts/02_output.sh +0 -5
- data/test/fixtures/ssh_scripts/03_delayed.sh +0 -6
- data/test/fixtures/ssh_scripts/04_failure.sh +0 -2
- data/test/fixtures/ssh_scripts/05_recovery.sh +0 -3
- data/test/initialization_failure_test.rb +0 -92
- data/test/integration/README.md +0 -109
- data/test/integration/ssh_scripts.rb +0 -94
- data/test/interact_test.rb +0 -253
- data/test/interconnect_test.rb +0 -425
- data/test/io_test.rb +0 -321
- data/test/kibitz_test.rb +0 -45
- data/test/lifecycle_contract_test.rb +0 -71
- data/test/literal_scan_test.rb +0 -97
- data/test/matching_test.rb +0 -211
- data/test/multi_session_test.rb +0 -66
- data/test/ownership_sequence_test.rb +0 -208
- data/test/pattern_offset_test.rb +0 -43
- data/test/process_interruption_test.rb +0 -296
- data/test/process_test.rb +0 -291
- data/test/redactor_test.rb +0 -183
- data/test/relay_recovery_test.rb +0 -451
- data/test/relay_reentrancy_test.rb +0 -159
- data/test/release_test.rb +0 -375
- data/test/ruby_api_test.rb +0 -515
- data/test/scan_reuse_test.rb +0 -109
- data/test/script_logging_test.rb +0 -124
- data/test/support/interact_probe.rb +0 -125
- data/test/support/kibitz_probe.rb +0 -177
- data/test/support/script_probe.rb +0 -158
- data/test/terminal_cleanup_test.rb +0 -349
- data/test/test_helper.rb +0 -58
- data/test/timeout_test.rb +0 -289
- data/test/write_contract_test.rb +0 -105
data/test/write_contract_test.rb
DELETED
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative "test_helper"
|
|
4
|
-
require "minitest/mock"
|
|
5
|
-
|
|
6
|
-
class WriteContractTest < ExpectTest
|
|
7
|
-
def test_invalid_write_counts_fail_on_the_first_attempt
|
|
8
|
-
[0, -1, nil, "3", 4].each do |invalid|
|
|
9
|
-
session, = writable_session
|
|
10
|
-
attempts = 0
|
|
11
|
-
session.writer.stub(:write_nonblock, lambda { |*, **|
|
|
12
|
-
attempts += 1
|
|
13
|
-
invalid
|
|
14
|
-
}) do
|
|
15
|
-
error = assert_raises(IOError) { bounded(0.2) { session.write("abc") } }
|
|
16
|
-
refute_kind_of Expect::WriteTimeout, error
|
|
17
|
-
assert_match(/accepted bytes/, error.message)
|
|
18
|
-
assert_equal 1, attempts
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def test_count_is_checked_against_the_attempted_chunk_not_the_total_input
|
|
24
|
-
session, = writable_session
|
|
25
|
-
session.writer.stub(:write_nonblock, lambda { |chunk, **|
|
|
26
|
-
assert_equal Expect::READ_SIZE, chunk.bytesize
|
|
27
|
-
chunk.bytesize + 1
|
|
28
|
-
}) do
|
|
29
|
-
assert_raises(IOError) { session.write("x" * (Expect::READ_SIZE + 1)) }
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def test_successful_short_writes_can_outlive_the_backpressure_deadline
|
|
34
|
-
session, sink = writable_session(write_timeout: 0.01)
|
|
35
|
-
now = 0.0
|
|
36
|
-
original = session.writer.method(:write_nonblock)
|
|
37
|
-
Expect.stub(:monotonic, -> { now }) do
|
|
38
|
-
session.writer.stub(:write_nonblock, lambda { |chunk, **options|
|
|
39
|
-
count = original.call(chunk.byteslice(0, 1), **options)
|
|
40
|
-
now += 0.02
|
|
41
|
-
count
|
|
42
|
-
}) do
|
|
43
|
-
assert_equal 3, session.write("abc")
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
assert_in_delta 0.06, now
|
|
47
|
-
assert_equal("abc", bounded { sink.read(3) })
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
def test_empty_input_never_attempts_a_write
|
|
51
|
-
session, = writable_session(write_timeout: 0)
|
|
52
|
-
session.writer.stub(:write_nonblock, ->(*, **) { flunk "empty input reached writer" }) do
|
|
53
|
-
assert_equal 0, session.write
|
|
54
|
-
assert_equal 0, session.write("")
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def test_valid_short_writes_and_eintr_preserve_every_byte
|
|
59
|
-
session, sink = writable_session
|
|
60
|
-
original = session.writer.method(:write_nonblock)
|
|
61
|
-
attempts = 0
|
|
62
|
-
session.writer.stub(:write_nonblock, lambda { |chunk, **options|
|
|
63
|
-
attempts += 1
|
|
64
|
-
raise Errno::EINTR if attempts == 2
|
|
65
|
-
|
|
66
|
-
original.call(chunk.byteslice(0, 1), **options)
|
|
67
|
-
}) do
|
|
68
|
-
assert_equal(4, bounded { session.write("a\0\xffb".b) })
|
|
69
|
-
end
|
|
70
|
-
assert_equal 5, attempts
|
|
71
|
-
assert_equal("a\0\xffb".b, bounded { sink.read(4) })
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
def test_backpressure_reports_only_confirmed_progress
|
|
75
|
-
session, sink = writable_session(write_timeout: 0.01)
|
|
76
|
-
original = session.writer.method(:write_nonblock)
|
|
77
|
-
now = 0.0
|
|
78
|
-
attempts = 0
|
|
79
|
-
Expect.stub(:monotonic, -> { now }) do
|
|
80
|
-
session.writer.stub(:write_nonblock, lambda { |chunk, **options|
|
|
81
|
-
attempts += 1
|
|
82
|
-
next :wait_writable if attempts > 1
|
|
83
|
-
|
|
84
|
-
now = 0.02
|
|
85
|
-
original.call(chunk.byteslice(0, 1), **options)
|
|
86
|
-
}) do
|
|
87
|
-
error = assert_raises(Expect::WriteTimeout) { bounded { session.write("abc") } }
|
|
88
|
-
assert_equal 1, error.bytes_written
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
assert_equal 2, attempts
|
|
92
|
-
assert_equal("a", bounded { sink.read(1) })
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
private
|
|
96
|
-
|
|
97
|
-
def writable_session(**)
|
|
98
|
-
reader, producer = IO.pipe
|
|
99
|
-
sink, writer = IO.pipe
|
|
100
|
-
@ios.push(reader, producer, sink, writer)
|
|
101
|
-
session = Expect.open(reader, writer: writer, **)
|
|
102
|
-
@sessions << session
|
|
103
|
-
[session, sink]
|
|
104
|
-
end
|
|
105
|
-
end
|