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.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +28 -0
  3. data/README.md +28 -19
  4. data/docs/API.md +88 -0
  5. data/docs/MIGRATION.md +15 -0
  6. data/lib/expect/cleanup.rb +33 -0
  7. data/lib/expect/configuration.rb +87 -66
  8. data/lib/expect/interaction.rb +226 -209
  9. data/lib/expect/logging.rb +157 -156
  10. data/lib/expect/matcher.rb +30 -29
  11. data/lib/expect/pattern.rb +8 -2
  12. data/lib/expect/pattern_list.rb +35 -5
  13. data/lib/expect/redactor.rb +11 -4
  14. data/lib/expect/relay.rb +97 -73
  15. data/lib/expect/relay_writer.rb +2 -1
  16. data/lib/expect/result.rb +32 -8
  17. data/lib/expect/session.rb +508 -0
  18. data/lib/expect/session_resources.rb +10 -2
  19. data/lib/expect/terminal.rb +78 -78
  20. data/lib/expect/version.rb +1 -1
  21. data/lib/expect.rb +333 -520
  22. data/sig/expect.rbs +355 -0
  23. metadata +13 -106
  24. data/.rubocop.yml +0 -66
  25. data/CONTRIBUTING.md +0 -29
  26. data/Gemfile +0 -28
  27. data/Rakefile +0 -38
  28. data/benchmark/matching.rb +0 -98
  29. data/benchmark/redactor.rb +0 -64
  30. data/benchmark/relay.rb +0 -48
  31. data/benchmark/scaling.rb +0 -70
  32. data/benchmark/send_slow.rb +0 -41
  33. data/benchmark/support.rb +0 -114
  34. data/docs/COMPATIBILITY.md +0 -98
  35. data/docs/INTERNAL_CONTRACTS.md +0 -154
  36. data/docs/PERFORMANCE.md +0 -165
  37. data/docs/RELEASING.md +0 -84
  38. data/docs/VERIFICATION.md +0 -456
  39. data/examples/dialogue.rb +0 -30
  40. data/examples/kibitz/README.md +0 -81
  41. data/examples/kibitz/kibitz.rb +0 -142
  42. data/examples/kibitz/test_kibitz.rb +0 -37
  43. data/examples/ssh_auto.rb +0 -94
  44. data/examples/ssh_interact.rb +0 -159
  45. data/examples/ssh_login.rb +0 -64
  46. data/expect-pty.gemspec +0 -33
  47. data/script/ci +0 -121
  48. data/script/release.rb +0 -319
  49. data/test/buffer_accounting_test.rb +0 -83
  50. data/test/cleanup_test.rb +0 -251
  51. data/test/compare_upstream.rb +0 -157
  52. data/test/configuration_test.rb +0 -133
  53. data/test/deadline_test.rb +0 -237
  54. data/test/diagnostics_test.rb +0 -353
  55. data/test/edge_case_test.rb +0 -262
  56. data/test/fixtures/ssh_scripts/01_identity.sh +0 -4
  57. data/test/fixtures/ssh_scripts/02_output.sh +0 -5
  58. data/test/fixtures/ssh_scripts/03_delayed.sh +0 -6
  59. data/test/fixtures/ssh_scripts/04_failure.sh +0 -2
  60. data/test/fixtures/ssh_scripts/05_recovery.sh +0 -3
  61. data/test/initialization_failure_test.rb +0 -92
  62. data/test/integration/README.md +0 -109
  63. data/test/integration/ssh_scripts.rb +0 -94
  64. data/test/interact_test.rb +0 -253
  65. data/test/interconnect_test.rb +0 -425
  66. data/test/io_test.rb +0 -321
  67. data/test/kibitz_test.rb +0 -45
  68. data/test/lifecycle_contract_test.rb +0 -71
  69. data/test/literal_scan_test.rb +0 -97
  70. data/test/matching_test.rb +0 -211
  71. data/test/multi_session_test.rb +0 -66
  72. data/test/ownership_sequence_test.rb +0 -208
  73. data/test/pattern_offset_test.rb +0 -43
  74. data/test/process_interruption_test.rb +0 -296
  75. data/test/process_test.rb +0 -291
  76. data/test/redactor_test.rb +0 -183
  77. data/test/relay_recovery_test.rb +0 -451
  78. data/test/relay_reentrancy_test.rb +0 -159
  79. data/test/release_test.rb +0 -375
  80. data/test/ruby_api_test.rb +0 -515
  81. data/test/scan_reuse_test.rb +0 -109
  82. data/test/script_logging_test.rb +0 -124
  83. data/test/support/interact_probe.rb +0 -125
  84. data/test/support/kibitz_probe.rb +0 -177
  85. data/test/support/script_probe.rb +0 -158
  86. data/test/terminal_cleanup_test.rb +0 -349
  87. data/test/test_helper.rb +0 -58
  88. data/test/timeout_test.rb +0 -289
  89. data/test/write_contract_test.rb +0 -105
@@ -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