1require_relative '../../spec_helper'
2
3platform_is_not :windows do
4  describe "Process.setrlimit" do
5    context "when passed an Object" do
6      before do
7        @resource = Process::RLIMIT_CORE
8        @limit, @max = Process.getrlimit @resource
9      end
10
11      it "calls #to_int to convert resource to an Integer" do
12        Process.setrlimit(mock_int(@resource), @limit, @max).should be_nil
13      end
14
15      it "raises a TypeError if #to_int for resource does not return an Integer" do
16        obj = mock("process getrlimit integer")
17        obj.should_receive(:to_int).and_return(nil)
18
19        lambda { Process.setrlimit(obj, @limit, @max) }.should raise_error(TypeError)
20      end
21
22      it "calls #to_int to convert the soft limit to an Integer" do
23        Process.setrlimit(@resource, mock_int(@limit), @max).should be_nil
24      end
25
26      it "raises a TypeError if #to_int for resource does not return an Integer" do
27        obj = mock("process getrlimit integer")
28        obj.should_receive(:to_int).and_return(nil)
29
30        lambda { Process.setrlimit(@resource, obj, @max) }.should raise_error(TypeError)
31      end
32
33      it "calls #to_int to convert the hard limit to an Integer" do
34        Process.setrlimit(@resource, @limit, mock_int(@max)).should be_nil
35      end
36
37      it "raises a TypeError if #to_int for resource does not return an Integer" do
38        obj = mock("process getrlimit integer")
39        obj.should_receive(:to_int).and_return(nil)
40
41        lambda { Process.setrlimit(@resource, @limit, obj) }.should raise_error(TypeError)
42      end
43    end
44
45    context "when passed a Symbol" do
46      platform_is_not :openbsd do
47        it "coerces :AS into RLIMIT_AS" do
48          Process.setrlimit(:AS, *Process.getrlimit(Process::RLIMIT_AS)).should be_nil
49        end
50      end
51
52      it "coerces :CORE into RLIMIT_CORE" do
53        Process.setrlimit(:CORE, *Process.getrlimit(Process::RLIMIT_CORE)).should be_nil
54      end
55
56      it "coerces :CPU into RLIMIT_CPU" do
57        Process.setrlimit(:CPU, *Process.getrlimit(Process::RLIMIT_CPU)).should be_nil
58      end
59
60      it "coerces :DATA into RLIMIT_DATA" do
61        Process.setrlimit(:DATA, *Process.getrlimit(Process::RLIMIT_DATA)).should be_nil
62      end
63
64      it "coerces :FSIZE into RLIMIT_FSIZE" do
65        Process.setrlimit(:FSIZE, *Process.getrlimit(Process::RLIMIT_FSIZE)).should be_nil
66      end
67
68      it "coerces :NOFILE into RLIMIT_NOFILE" do
69        Process.setrlimit(:NOFILE, *Process.getrlimit(Process::RLIMIT_NOFILE)).should be_nil
70      end
71
72      it "coerces :STACK into RLIMIT_STACK" do
73        Process.setrlimit(:STACK, *Process.getrlimit(Process::RLIMIT_STACK)).should be_nil
74      end
75
76      platform_is_not :solaris, :aix do
77        it "coerces :MEMLOCK into RLIMIT_MEMLOCK" do
78          Process.setrlimit(:MEMLOCK, *Process.getrlimit(Process::RLIMIT_MEMLOCK)).should be_nil
79        end
80      end
81
82      platform_is_not :solaris do
83        it "coerces :NPROC into RLIMIT_NPROC" do
84          Process.setrlimit(:NPROC, *Process.getrlimit(Process::RLIMIT_NPROC)).should be_nil
85        end
86
87        it "coerces :RSS into RLIMIT_RSS" do
88          Process.setrlimit(:RSS, *Process.getrlimit(Process::RLIMIT_RSS)).should be_nil
89        end
90      end
91
92      platform_is :netbsd, :freebsd do
93        it "coerces :SBSIZE into RLIMIT_SBSIZE" do
94          Process.setrlimit(:SBSIZE, *Process.getrlimit(Process::RLIMIT_SBSIZE)).should be_nil
95        end
96      end
97
98      platform_is :linux do
99        it "coerces :RTPRIO into RLIMIT_RTPRIO" do
100          Process.setrlimit(:RTPRIO, *Process.getrlimit(Process::RLIMIT_RTPRIO)).should be_nil
101        end
102
103        guard -> { defined?(Process::RLIMIT_RTTIME) } do
104          it "coerces :RTTIME into RLIMIT_RTTIME" do
105            Process.setrlimit(:RTTIME, *Process.getrlimit(Process::RLIMIT_RTTIME)).should be_nil
106          end
107        end
108
109        it "coerces :SIGPENDING into RLIMIT_SIGPENDING" do
110          Process.setrlimit(:SIGPENDING, *Process.getrlimit(Process::RLIMIT_SIGPENDING)).should be_nil
111        end
112
113        it "coerces :MSGQUEUE into RLIMIT_MSGQUEUE" do
114          Process.setrlimit(:MSGQUEUE, *Process.getrlimit(Process::RLIMIT_MSGQUEUE)).should be_nil
115        end
116
117        it "coerces :NICE into RLIMIT_NICE" do
118          Process.setrlimit(:NICE, *Process.getrlimit(Process::RLIMIT_NICE)).should be_nil
119        end
120      end
121
122      it "raises ArgumentError when passed an unknown resource" do
123        lambda { Process.setrlimit(:FOO, 1, 1) }.should raise_error(ArgumentError)
124      end
125    end
126
127    context "when passed a String" do
128      platform_is_not :openbsd do
129        it "coerces 'AS' into RLIMIT_AS" do
130          Process.setrlimit("AS", *Process.getrlimit(Process::RLIMIT_AS)).should be_nil
131        end
132      end
133
134      it "coerces 'CORE' into RLIMIT_CORE" do
135        Process.setrlimit("CORE", *Process.getrlimit(Process::RLIMIT_CORE)).should be_nil
136      end
137
138      it "coerces 'CPU' into RLIMIT_CPU" do
139        Process.setrlimit("CPU", *Process.getrlimit(Process::RLIMIT_CPU)).should be_nil
140      end
141
142      it "coerces 'DATA' into RLIMIT_DATA" do
143        Process.setrlimit("DATA", *Process.getrlimit(Process::RLIMIT_DATA)).should be_nil
144      end
145
146      it "coerces 'FSIZE' into RLIMIT_FSIZE" do
147        Process.setrlimit("FSIZE", *Process.getrlimit(Process::RLIMIT_FSIZE)).should be_nil
148      end
149
150      it "coerces 'NOFILE' into RLIMIT_NOFILE" do
151        Process.setrlimit("NOFILE", *Process.getrlimit(Process::RLIMIT_NOFILE)).should be_nil
152      end
153
154      it "coerces 'STACK' into RLIMIT_STACK" do
155        Process.setrlimit("STACK", *Process.getrlimit(Process::RLIMIT_STACK)).should be_nil
156      end
157
158      platform_is_not :solaris, :aix do
159        it "coerces 'MEMLOCK' into RLIMIT_MEMLOCK" do
160          Process.setrlimit("MEMLOCK", *Process.getrlimit(Process::RLIMIT_MEMLOCK)).should be_nil
161        end
162      end
163
164      platform_is_not :solaris do
165        it "coerces 'NPROC' into RLIMIT_NPROC" do
166          Process.setrlimit("NPROC", *Process.getrlimit(Process::RLIMIT_NPROC)).should be_nil
167        end
168
169        it "coerces 'RSS' into RLIMIT_RSS" do
170          Process.setrlimit("RSS", *Process.getrlimit(Process::RLIMIT_RSS)).should be_nil
171        end
172      end
173
174      platform_is :netbsd, :freebsd do
175        it "coerces 'SBSIZE' into RLIMIT_SBSIZE" do
176          Process.setrlimit("SBSIZE", *Process.getrlimit(Process::RLIMIT_SBSIZE)).should be_nil
177        end
178      end
179
180      platform_is :linux do
181        it "coerces 'RTPRIO' into RLIMIT_RTPRIO" do
182          Process.setrlimit("RTPRIO", *Process.getrlimit(Process::RLIMIT_RTPRIO)).should be_nil
183        end
184
185        guard -> { defined?(Process::RLIMIT_RTTIME) } do
186          it "coerces 'RTTIME' into RLIMIT_RTTIME" do
187            Process.setrlimit("RTTIME", *Process.getrlimit(Process::RLIMIT_RTTIME)).should be_nil
188          end
189        end
190
191        it "coerces 'SIGPENDING' into RLIMIT_SIGPENDING" do
192          Process.setrlimit("SIGPENDING", *Process.getrlimit(Process::RLIMIT_SIGPENDING)).should be_nil
193        end
194
195        it "coerces 'MSGQUEUE' into RLIMIT_MSGQUEUE" do
196          Process.setrlimit("MSGQUEUE", *Process.getrlimit(Process::RLIMIT_MSGQUEUE)).should be_nil
197        end
198
199        it "coerces 'NICE' into RLIMIT_NICE" do
200          Process.setrlimit("NICE", *Process.getrlimit(Process::RLIMIT_NICE)).should be_nil
201        end
202      end
203
204      it "raises ArgumentError when passed an unknown resource" do
205        lambda { Process.setrlimit("FOO", 1, 1) }.should raise_error(ArgumentError)
206      end
207    end
208
209    context "when passed on Object" do
210      before do
211        @resource = Process::RLIMIT_CORE
212        @limit, @max = Process.getrlimit @resource
213      end
214
215      it "calls #to_str to convert to a String" do
216        obj = mock("process getrlimit string")
217        obj.should_receive(:to_str).and_return("CORE")
218        obj.should_not_receive(:to_int)
219
220        Process.setrlimit(obj, @limit, @max).should be_nil
221      end
222
223      it "calls #to_int if #to_str does not return a String" do
224        obj = mock("process getrlimit string")
225        obj.should_receive(:to_str).and_return(nil)
226        obj.should_receive(:to_int).and_return(@resource)
227
228        Process.setrlimit(obj, @limit, @max).should be_nil
229      end
230    end
231  end
232end
233