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