fakeConnection.WhenLimitingDisk = func(handle string, limits warden.DiskLimits) (warden.DiskLimits, error) { return warden.DiskLimits{}, disaster } }) It("returns the error", func() { err := container.LimitDisk(warden.DiskLimits{}) Ω(err).Should(Equal(disaster)) }) }) }) Describe("LimitMemory", func() { It("sends a limit bandwidth request", func() { err := container.LimitMemory(warden.MemoryLimits{ LimitInBytes: 1, }) Ω(err).ShouldNot(HaveOccurred()) Ω(fakeConnection.LimitedMemory("some-handle")).Should(ContainElement( warden.MemoryLimits{ LimitInBytes: 1, }, )) }) Context("when the request fails", func() { disaster := errors.New("oh no!") BeforeEach(func() { fakeConnection.WhenLimitingMemory = func(handle string, limits warden.MemoryLimits) (warden.MemoryLimits, error) {
go streamNumbersTo(receivedNumbers, stream) lastNum := 0 for num := range receivedNumbers { Expect(num).To(BeNumerically(">", lastNum)) lastNum = num } close(done) }, 10.0) }) }) Describe("a memory limit", func() { It("is still enforced", func() { err := container.LimitMemory(warden.MemoryLimits{32 * 1024 * 1024}) Expect(err).ToNot(HaveOccurred()) restartServer() _, stream, err := container.Run(warden.ProcessSpec{ Script: "exec ruby -e '$stdout.sync = true; puts :hello; puts (\"x\" * 64 * 1024 * 1024).size; puts :goodbye; exit 42'", }) Expect(err).ToNot(HaveOccurred()) // cgroups OOM killer seems to leave no trace of the process; // there's no exit status indicator, so just assert that the one // we tried to exit with after over-allocating is not seen stdout, _, exitStatus := readUntilExit(stream) Expect(stdout).To(Equal("hello\n"))