rlimit 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,68 @@
1
+ require_relative './spec_helper'
2
+ require 'rlimit'
3
+
4
+ describe RLimit do
5
+ context "#get" do
6
+ it "sends back two values for one-arg call" do
7
+ rv = RLimit.get(RLimit::NOFILE)
8
+ expect(rv).to be_an(Array)
9
+ expect(rv[0]).to be_an(Integer)
10
+ expect(rv[1]).to be_an(Integer)
11
+ end
12
+
13
+ it "sends back one arg for a soft-limit request" do
14
+ expect(RLimit.get(RLimit::NOFILE, :soft)).to be_an(Integer)
15
+ end
16
+
17
+ it "sends back one arg for a hard-limit request" do
18
+ expect(RLimit.get(RLimit::NOFILE, :hard)).to be_an(Integer)
19
+ end
20
+
21
+ it "raises ArgumentError on an unknown resource type" do
22
+ expect { RLimit.get("ohai!") }.to raise_error(ArgumentError)
23
+ end
24
+
25
+ it "raises ArgumentError on an unknown limit type" do
26
+ expect { RLimit.get(RLimit::NOFILE, :lolidunno) }.to raise_error(ArgumentError)
27
+ end
28
+
29
+ it "handles an unprefixed string" do
30
+ expect(RLimit.get("NOFILE", :soft)).to eq(RLimit.get(RLimit::NOFILE, :soft))
31
+ end
32
+
33
+ it "handles a prefixed string" do
34
+ expect(RLimit.get("RLIMIT_NOFILE", :soft)).to eq(RLimit.get(RLimit::NOFILE, :soft))
35
+ end
36
+
37
+ it "handles an unprefixed symbol" do
38
+ expect(RLimit.get(:NOFILE, :soft)).to eq(RLimit.get(RLimit::NOFILE, :soft))
39
+ end
40
+
41
+ it "handles a prefixed symbol" do
42
+ expect(RLimit.get(:RLIMIT_NOFILE, :soft)).to eq(RLimit.get(RLimit::NOFILE, :soft))
43
+ end
44
+
45
+ it "sends back :unlimited when getrlimit returns RLIM_INFINITY" do
46
+ expect(RLimit::FFI).
47
+ to receive(:getrlimit).
48
+ # I'm using any_args() here, and then checking the types in the
49
+ # block, because there's a buggy interaction with RSpec (3.1.3,
50
+ # at least) and FFI::MemoryPointer (1.9.3, at least) which causes
51
+ # any ArgumentMatcher to fail to match, because
52
+ # FFI::MemoryPointer#== doesn't like getting compared with
53
+ # something else. I think the bug's in RSpec, but I'm not sure
54
+ # enough to file a bug. So we just work around it, because even
55
+ # if I *did* submit a bug, we'd have to work around it anyway to
56
+ # get the tests to pass.
57
+ with(any_args()) do |resource, rlim_ptr|
58
+ expect(resource).to eq(RLimit::NOFILE)
59
+ expect(rlim_ptr).to be_an(FFI::MemoryPointer)
60
+ rlim = RLimit::FFI::RLimitStruct.new(rlim_ptr)
61
+ rlim[:rlim_cur] = 1024
62
+ rlim[:rlim_max] = RLimit::RLIM_INFINITY
63
+ end.and_return(0)
64
+
65
+ expect(RLimit.get(RLimit::NOFILE, :hard)).to eq(:unlimited)
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,26 @@
1
+ require_relative './spec_helper'
2
+ require 'rlimit'
3
+
4
+ describe RLimit do
5
+ context "#resources" do
6
+ it "has a common RLIMIT constant" do
7
+ expect(RLimit.resources).to include("RLIMIT_NOFILE")
8
+ end
9
+
10
+ it "doesn't have a non-existent RLIMIT constant" do
11
+ expect(RLimit.resources).to_not include("RLIMIT_WTFISTHIS")
12
+ end
13
+
14
+ it "doesn't have RLIM_INFINITY" do
15
+ expect(RLimit.resources).to_not include("RLIMIT_RLIM_INFINITY")
16
+ expect(RLimit.resources).to_not include("RLIM_INFINITY")
17
+ end
18
+
19
+ it "doesn't have our exceptions" do
20
+ expect(RLimit.resources).to_not include("RLIMIT_PermissionDenied")
21
+ expect(RLimit.resources).to_not include("PermissionDenied")
22
+ expect(RLimit.resources).to_not include("RLIMIT_HardLimitExceeded")
23
+ expect(RLimit.resources).to_not include("HardLimitExceeded")
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,139 @@
1
+ require_relative './spec_helper'
2
+ require 'rlimit'
3
+
4
+ describe RLimit do
5
+ context "#set" do
6
+ context "via getrlimit" do
7
+ before :each do
8
+ expect(RLimit::FFI).
9
+ to receive(:getrlimit).
10
+ with(any_args()) do |res, rlim_ptr|
11
+ expect(res).to eq(RLimit::NOFILE)
12
+ expect(rlim_ptr).to be_an(::FFI::MemoryPointer)
13
+ rlim = RLimit::FFI::RLimitStruct.new(rlim_ptr)
14
+ rlim[:rlim_cur] = 1024
15
+ rlim[:rlim_max] = 1048576
16
+ end.and_return(0)
17
+ end
18
+
19
+ it "handles both limits being set" do
20
+ expect(RLimit::FFI).
21
+ to receive(:setrlimit).
22
+ with(any_args()) do |res, rlim_ptr|
23
+ expect(res).to eq(RLimit::NOFILE)
24
+ expect(rlim_ptr).to be_an(::FFI::MemoryPointer)
25
+ rlim = RLimit::FFI::RLimitStruct.new(rlim_ptr)
26
+ expect(rlim[:rlim_cur]).to eq(4096)
27
+ expect(rlim[:rlim_max]).to eq(65536)
28
+ end.and_return(0)
29
+
30
+ expect(RLimit.set(RLimit::NOFILE, 4096, 65536)).to be(true)
31
+ end
32
+
33
+ it "handles just the soft limit changing" do
34
+ expect(RLimit::FFI).
35
+ to receive(:setrlimit).
36
+ with(any_args()) do |res, rlim_ptr|
37
+ expect(res).to eq(RLimit::NOFILE)
38
+ expect(rlim_ptr).to be_an(::FFI::MemoryPointer)
39
+ rlim = RLimit::FFI::RLimitStruct.new(rlim_ptr)
40
+ expect(rlim[:rlim_cur]).to eq(4096)
41
+ expect(rlim[:rlim_max]).to eq(1048576)
42
+ end.and_return(0)
43
+
44
+ expect(RLimit.set(RLimit::NOFILE, 4096)).to be(true)
45
+ end
46
+
47
+ ["NOFILE", "RLIMIT_NOFILE", :NOFILE, :RLIMIT_NOFILE].each do |res|
48
+ it "handles the resource form #{res.inspect}" do
49
+ expect(RLimit::FFI).
50
+ to receive(:setrlimit).
51
+ with(any_args()) do |res, rlim_ptr|
52
+ expect(res).to eq(RLimit::NOFILE)
53
+ expect(rlim_ptr).to be_an(::FFI::MemoryPointer)
54
+ rlim = RLimit::FFI::RLimitStruct.new(rlim_ptr)
55
+ expect(rlim[:rlim_cur]).to eq(4096)
56
+ expect(rlim[:rlim_max]).to eq(1048576)
57
+ end.and_return(0)
58
+
59
+ expect(RLimit.set(res, 4096)).to be(true)
60
+ end
61
+ end
62
+
63
+ it "handles just the hard limit changing" do
64
+ expect(RLimit::FFI).
65
+ to receive(:setrlimit).
66
+ with(any_args()) do |res, rlim_ptr|
67
+ expect(res).to eq(RLimit::NOFILE)
68
+ expect(rlim_ptr).to be_an(::FFI::MemoryPointer)
69
+ rlim = RLimit::FFI::RLimitStruct.new(rlim_ptr)
70
+ expect(rlim[:rlim_cur]).to eq(1024)
71
+ expect(rlim[:rlim_max]).to eq(65536)
72
+ end.and_return(0)
73
+
74
+ expect(RLimit.set(RLimit::NOFILE, nil, 65536)).to be(true)
75
+ end
76
+
77
+ it "handles the limit being :unlimited" do
78
+ expect(RLimit::FFI).
79
+ to receive(:setrlimit).
80
+ with(any_args()) do |res, rlim_ptr|
81
+ expect(res).to eq(RLimit::NOFILE)
82
+ expect(rlim_ptr).to be_an(::FFI::MemoryPointer)
83
+ rlim = RLimit::FFI::RLimitStruct.new(rlim_ptr)
84
+ expect(rlim[:rlim_cur]).to eq(RLimit::RLIM_INFINITY)
85
+ expect(rlim[:rlim_max]).to eq(RLimit::RLIM_INFINITY)
86
+ end.and_return(0)
87
+
88
+ expect(RLimit.set(RLimit::NOFILE, :unlimited, :unlimited)).to be(true)
89
+ end
90
+
91
+ it "freaks out if the soft limit is greater than the existing hard limit" do
92
+ expect { RLimit.set(RLimit::NOFILE, 1048577) }.
93
+ to raise_error(
94
+ RLimit::HardLimitExceeded,
95
+ "You cannot set the soft limit above 1048576"
96
+ )
97
+ end
98
+
99
+ it "freaks out if the soft limit is greater than the hard limit specified" do
100
+ expect { RLimit.set(RLimit::NOFILE, 65536, 4096) }.
101
+ to raise_error(
102
+ RLimit::HardLimitExceeded,
103
+ "You cannot set the soft limit above 4096"
104
+ )
105
+ end
106
+
107
+ it "freaks out when setrlimit sends back EPERM" do
108
+ expect(RLimit::FFI).
109
+ to receive(:setrlimit).
110
+ with(any_args()) do |res, rlim_ptr|
111
+ expect(res).to eq(RLimit::NOFILE)
112
+ expect(rlim_ptr).to be_an(::FFI::MemoryPointer)
113
+ end.and_return(-1)
114
+
115
+ expect(::FFI).to receive(:errno).and_return(Errno::EPERM::Errno)
116
+
117
+ expect { RLimit.set(RLimit::NOFILE, nil, 2000000) }.
118
+ to raise_error(
119
+ RLimit::PermissionDenied,
120
+ "You do not have permission to raise hard limits"
121
+ )
122
+ end
123
+ end
124
+
125
+ context "ArgumentError cases" do
126
+ it "raises ArgumentError on an unknown resource type" do
127
+ expect { RLimit.set("ohai!", 42) }.to raise_error(ArgumentError)
128
+ end
129
+
130
+ it "raises ArgumentError on a non-integer soft limit" do
131
+ expect { RLimit.set(RLimit::NOFILE, :lolidunno) }.to raise_error(ArgumentError)
132
+ end
133
+
134
+ it "raises ArgumentError on a non-integer hard limit" do
135
+ expect { RLimit.set(RLimit::NOFILE, 42, :lolidunno) }.to raise_error(ArgumentError)
136
+ end
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,24 @@
1
+ require_relative './spec_helper'
2
+ require 'rlimit'
3
+
4
+ describe RLimit do
5
+ context "#supports?" do
6
+ [RLimit::NOFILE, "NOFILE", :NOFILE, "RLIMIT_NOFILE", :RLIMIT_NOFILE].each do |res|
7
+ it "OKs #{res.inspect}" do
8
+ expect(RLimit.supports?(res)).to be(true)
9
+ end
10
+ end
11
+
12
+ it "rejects a random symbol" do
13
+ expect(RLimit.supports?(:OHAI)).to be(false)
14
+ end
15
+
16
+ it "rejects a random string" do
17
+ expect(RLimit.supports?("OHAI")).to be(false)
18
+ end
19
+
20
+ it "rejects something really weird" do
21
+ expect(RLimit.supports?(RLimit)).to be(false)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,23 @@
1
+ require 'spork'
2
+
3
+ Spork.prefork do
4
+ require 'bundler'
5
+ Bundler.setup(:default, :test)
6
+ require 'rspec/core'
7
+ require 'rspec/mocks'
8
+
9
+ require 'pry'
10
+
11
+ RSpec.configure do |config|
12
+ config.fail_fast = true
13
+ # config.full_backtrace = true
14
+
15
+ config.expect_with :rspec do |c|
16
+ c.syntax = :expect
17
+ end
18
+ end
19
+ end
20
+
21
+ Spork.each_run do
22
+ # Nothing to do here, specs will load the files they need
23
+ end
metadata ADDED
@@ -0,0 +1,240 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rlimit
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Matt Palmer
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-10-15 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: git-version-bump
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '0.10'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '0.10'
30
+ - !ruby/object:Gem::Dependency
31
+ name: ffi
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '1.9'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '1.9'
46
+ - !ruby/object:Gem::Dependency
47
+ name: bundler
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: github-release
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: guard-spork
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: guard-rspec
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: rb-inotify
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: '0.9'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: '0.9'
126
+ - !ruby/object:Gem::Dependency
127
+ name: pry-debugger
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: rake
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ - !ruby/object:Gem::Dependency
159
+ name: rdoc
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ - !ruby/object:Gem::Dependency
175
+ name: rspec
176
+ requirement: !ruby/object:Gem::Requirement
177
+ none: false
178
+ requirements:
179
+ - - ! '>='
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ type: :development
183
+ prerelease: false
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ! '>='
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ description:
191
+ email:
192
+ executables: []
193
+ extensions: []
194
+ extra_rdoc_files:
195
+ - README.md
196
+ files:
197
+ - .gitignore
198
+ - Gemfile
199
+ - Guardfile
200
+ - LICENCE
201
+ - README.md
202
+ - Rakefile
203
+ - lib/rlimit.rb
204
+ - rlimit.gemspec
205
+ - spec/rlimit_get_spec.rb
206
+ - spec/rlimit_resources_spec.rb
207
+ - spec/rlimit_set_spec.rb
208
+ - spec/rlimit_supports_spec.rb
209
+ - spec/spec_helper.rb
210
+ homepage: http://theshed.hezmatt.org/rlimit
211
+ licenses: []
212
+ post_install_message:
213
+ rdoc_options: []
214
+ require_paths:
215
+ - lib
216
+ required_ruby_version: !ruby/object:Gem::Requirement
217
+ none: false
218
+ requirements:
219
+ - - ! '>='
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
222
+ segments:
223
+ - 0
224
+ hash: -4592700154150996709
225
+ required_rubygems_version: !ruby/object:Gem::Requirement
226
+ none: false
227
+ requirements:
228
+ - - ! '>='
229
+ - !ruby/object:Gem::Version
230
+ version: '0'
231
+ segments:
232
+ - 0
233
+ hash: -4592700154150996709
234
+ requirements: []
235
+ rubyforge_project:
236
+ rubygems_version: 1.8.23
237
+ signing_key:
238
+ specification_version: 3
239
+ summary: Retrieve and adjust rlimits
240
+ test_files: []