5748: Basic tests to check for bufferpool resource leaks
authorPeter Amstutz <peter.amstutz@curoverse.com>
Thu, 14 May 2015 21:01:13 +0000 (17:01 -0400)
committerPeter Amstutz <peter.amstutz@curoverse.com>
Thu, 14 May 2015 21:01:26 +0000 (17:01 -0400)
services/keepstore/handler_test.go

index 6823ad0fc68f9b86b78a298648d204086aa3b95c..7855769721baf0575a14cfb35100fb5a43db74be 100644 (file)
@@ -803,3 +803,66 @@ func ExpectBody(
                        testname, expected_body, response)
        }
 }
+
+// Invoke the PutBlockHandler a bunch of times to test for bufferpool resource
+// leak.
+func TestPutHandlerNoBufferleak(t *testing.T) {
+       defer teardown()
+
+       // Prepare two test Keep volumes.
+       KeepVM = MakeTestVolumeManager(2)
+       defer KeepVM.Close()
+
+       // Unfortunately this will just hang if the bug is present, because
+       // bufferPool.Get() blocks forever.  To make this actually fail we need
+       // some kind of watchdog timer that kills the test after a while.
+
+       for i := 0; i < maxBuffers+1; i += 1 {
+               // Unauthenticated request, no server key
+               // => OK (unsigned response)
+               unsigned_locator := "/" + TEST_HASH
+               response := IssueRequest(
+                       &RequestTester{
+                               method:       "PUT",
+                               uri:          unsigned_locator,
+                               request_body: TEST_BLOCK,
+                       })
+               ExpectStatusCode(t,
+                       "TestPutHandlerBufferleak", http.StatusOK, response)
+               ExpectBody(t,
+                       "TestPutHandlerBufferleak",
+                       TEST_HASH_PUT_RESPONSE, response)
+       }
+}
+
+// Invoke the GetBlockHandler a bunch of times to test for bufferpool resource
+// leak.
+func TestGetHandlerNoBufferleak(t *testing.T) {
+       defer teardown()
+
+       // Prepare two test Keep volumes. Our block is stored on the second volume.
+       KeepVM = MakeTestVolumeManager(2)
+       defer KeepVM.Close()
+
+       vols := KeepVM.AllWritable()
+       if err := vols[0].Put(TEST_HASH, TEST_BLOCK); err != nil {
+               t.Error(err)
+       }
+
+       for i := 0; i < maxBuffers+1; i += 1 {
+               // Unauthenticated request, unsigned locator
+               // => OK
+               unsigned_locator := "/" + TEST_HASH
+               response := IssueRequest(
+                       &RequestTester{
+                               method: "GET",
+                               uri:    unsigned_locator,
+                       })
+               ExpectStatusCode(t,
+                       "Unauthenticated request, unsigned locator", http.StatusOK, response)
+               ExpectBody(t,
+                       "Unauthenticated request, unsigned locator",
+                       string(TEST_BLOCK),
+                       response)
+       }
+}