curb 1.3.6 → 1.4.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,94 @@
1
+ require File.expand_path('helper', __dir__)
2
+
3
+ class TestCurbRactor < Test::Unit::TestCase
4
+ include TestServerMethods
5
+
6
+ RACTOR_WORKERS = 4
7
+ REQUESTS_PER_WORKER = 3
8
+
9
+ def setup
10
+ super
11
+ server_setup
12
+ end
13
+
14
+ def test_exported_string_constants_are_shareable
15
+ omit('Ractor is unavailable on this Ruby') unless defined?(Ractor)
16
+
17
+ %i[CURB_VERSION VERSION CURL_VERSION LONG_VERSION CURL_LONG_VERSION].each do |name|
18
+ value = Curl.const_get(name)
19
+ assert_predicate value, :frozen?, "Curl::#{name} should be frozen"
20
+ assert Ractor.shareable?(value), "Curl::#{name} should be Ractor-shareable"
21
+ end
22
+ end
23
+
24
+ def test_independent_ractors_can_perform_requests_concurrently
25
+ original_timeout = Curl::Multi.default_timeout
26
+ original_autoclose = Curl::Multi.autoclose
27
+ omit_unless_curb_ractor_safe
28
+
29
+ url = TestServlet.url
30
+
31
+ workers = RACTOR_WORKERS.times.map do |worker_id|
32
+ Ractor.new(url, worker_id, REQUESTS_PER_WORKER) do |target, id, request_count|
33
+ Curl.safe! { |config| config.protocols = [:http] }
34
+ Curl::Multi.default_timeout = 25 + id
35
+ Curl::Multi.autoclose = true
36
+
37
+ responses = request_count.times.map do
38
+ chunks = 0
39
+ easy = Curl::Easy.new(target)
40
+ easy.on_body do |data|
41
+ chunks += 1
42
+ data.bytesize
43
+ end
44
+ easy.perform
45
+ [easy.response_code, chunks]
46
+ end
47
+
48
+ {
49
+ responses: responses,
50
+ timeout: Curl::Multi.default_timeout,
51
+ autoclose: Curl::Multi.autoclose,
52
+ deferred_closes: Curl::Easy.deferred_multi_closes.length,
53
+ version: Curl::VERSION,
54
+ }
55
+ end
56
+ end
57
+
58
+ results = workers.map { |worker| ractor_value(worker) }
59
+
60
+ results.each_with_index do |result, worker_id|
61
+ assert_equal REQUESTS_PER_WORKER, result[:responses].length
62
+ result[:responses].each do |status, chunks|
63
+ assert_equal 200, status
64
+ assert_operator chunks, :>=, 1
65
+ end
66
+ assert_equal 25 + worker_id, result[:timeout]
67
+ assert_equal true, result[:autoclose]
68
+ assert_equal 0, result[:deferred_closes]
69
+ assert_equal Curl::VERSION, result[:version]
70
+ end
71
+
72
+ assert_equal original_timeout, Curl::Multi.default_timeout
73
+ assert_equal original_autoclose, Curl::Multi.autoclose
74
+ ensure
75
+ Curl::Multi.default_timeout = original_timeout if defined?(original_timeout)
76
+ Curl::Multi.autoclose = original_autoclose if defined?(original_autoclose)
77
+ end
78
+
79
+ private
80
+
81
+ def omit_unless_curb_ractor_safe
82
+ omit('Ractor is unavailable on this Ruby') unless defined?(Ractor)
83
+ omit('This build does not advertise Ractor-safe native support') unless
84
+ Curl.const_defined?(:RACTOR_SAFE) && Curl::RACTOR_SAFE
85
+ end
86
+
87
+ def ractor_value(ractor)
88
+ if ractor.respond_to?(:value)
89
+ ractor.value
90
+ else
91
+ ractor.take
92
+ end
93
+ end
94
+ end
@@ -107,4 +107,19 @@ class TestServerMethodsLockHandling < Test::Unit::TestCase
107
107
  assert_equal false, File.exist?(locked_file)
108
108
  assert_equal false, server_responding?(@__port)
109
109
  end
110
+
111
+ def test_server_setup_reuses_the_process_server
112
+ server_setup(@__port)
113
+ first_server = @server
114
+
115
+ other = Object.new
116
+ other.extend(TestServerMethods)
117
+ lock_path = locked_file
118
+ other.define_singleton_method(:locked_file) { lock_path }
119
+ other.server_setup(@__port)
120
+
121
+ assert_same first_server, other.instance_variable_get(:@server)
122
+ ensure
123
+ other.stop_test_server if defined?(other) && other
124
+ end
110
125
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: curb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.6
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ross Bamford
8
8
  - Todd A. Fisher
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-06-17 00:00:00.000000000 Z
11
+ date: 2026-09-27 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Curb (probably CUrl-RuBy or something) provides Ruby-language bindings
14
14
  for the libcurl(3), a fully-featured client-side URL transfer library. cURL and
@@ -64,6 +64,7 @@ files:
64
64
  - tests/bug_require_last_or_segfault.rb
65
65
  - tests/bugtests.rb
66
66
  - tests/helper.rb
67
+ - tests/io_select_less_scheduler_probe.rb
67
68
  - tests/leak_trace.rb
68
69
  - tests/mem_check.rb
69
70
  - tests/require_last_or_segfault_script.rb
@@ -77,6 +78,8 @@ files:
77
78
  - tests/tc_curl_easy_setopt.rb
78
79
  - tests/tc_curl_maxfilesize.rb
79
80
  - tests/tc_curl_multi.rb
81
+ - tests/tc_curl_multi_poll.rb
82
+ - tests/tc_curl_multi_socket_poller.rb
80
83
  - tests/tc_curl_native_coverage.rb
81
84
  - tests/tc_curl_network_policy.rb
82
85
  - tests/tc_curl_postfield.rb
@@ -84,6 +87,7 @@ files:
84
87
  - tests/tc_fiber_scheduler.rb
85
88
  - tests/tc_ftp_options.rb
86
89
  - tests/tc_gc_compact.rb
90
+ - tests/tc_ractor.rb
87
91
  - tests/tc_test_server_methods.rb
88
92
  - tests/timeout.rb
89
93
  - tests/timeout_server.rb
@@ -133,6 +137,7 @@ test_files:
133
137
  - tests/bug_require_last_or_segfault.rb
134
138
  - tests/bugtests.rb
135
139
  - tests/helper.rb
140
+ - tests/io_select_less_scheduler_probe.rb
136
141
  - tests/leak_trace.rb
137
142
  - tests/mem_check.rb
138
143
  - tests/require_last_or_segfault_script.rb
@@ -146,6 +151,8 @@ test_files:
146
151
  - tests/tc_curl_easy_setopt.rb
147
152
  - tests/tc_curl_maxfilesize.rb
148
153
  - tests/tc_curl_multi.rb
154
+ - tests/tc_curl_multi_poll.rb
155
+ - tests/tc_curl_multi_socket_poller.rb
149
156
  - tests/tc_curl_native_coverage.rb
150
157
  - tests/tc_curl_network_policy.rb
151
158
  - tests/tc_curl_postfield.rb
@@ -153,6 +160,7 @@ test_files:
153
160
  - tests/tc_fiber_scheduler.rb
154
161
  - tests/tc_ftp_options.rb
155
162
  - tests/tc_gc_compact.rb
163
+ - tests/tc_ractor.rb
156
164
  - tests/tc_test_server_methods.rb
157
165
  - tests/timeout.rb
158
166
  - tests/timeout_server.rb