forked from TrueCloudLab/frostfs-s3-gw
[#239] Update test for check goroutines leak
Signed-off-by: Denis Kirillov <d.kirillov@yadro.com>
This commit is contained in:
parent
122af0b5a7
commit
b169c5e6c3
2 changed files with 23 additions and 21 deletions
|
@ -4,16 +4,13 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"crypto/md5"
|
"crypto/md5"
|
||||||
"crypto/rand"
|
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
|
||||||
"io"
|
"io"
|
||||||
"mime/multipart"
|
"mime/multipart"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
"runtime"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
@ -179,24 +176,6 @@ func TestPutObjectWithStreamBodyError(t *testing.T) {
|
||||||
checkNotFound(t, tc, bktName, objName, emptyVersion)
|
checkNotFound(t, tc, bktName, objName, emptyVersion)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPutObjectWithWrapReaderDiscardOnError(t *testing.T) {
|
|
||||||
tc := prepareHandlerContext(t)
|
|
||||||
|
|
||||||
bktName, objName := "bucket-for-put", "object-for-put"
|
|
||||||
createTestBucket(tc, bktName)
|
|
||||||
|
|
||||||
content := make([]byte, 128*1024)
|
|
||||||
_, err := rand.Read(content)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
w, r := prepareTestPayloadRequest(tc, bktName, objName, bytes.NewReader(content))
|
|
||||||
tc.tp.SetObjectPutError(objName, errors.New("some error"))
|
|
||||||
numGoroutineBefore := runtime.NumGoroutine()
|
|
||||||
tc.Handler().PutObjectHandler(w, r)
|
|
||||||
numGoroutineAfter := runtime.NumGoroutine()
|
|
||||||
require.Equal(t, numGoroutineBefore, numGoroutineAfter, "goroutines shouldn't leak during put object")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestPutObjectWithInvalidContentMD5(t *testing.T) {
|
func TestPutObjectWithInvalidContentMD5(t *testing.T) {
|
||||||
tc := prepareHandlerContext(t)
|
tc := prepareHandlerContext(t)
|
||||||
tc.config.md5Enabled = true
|
tc.config.md5Enabled = true
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
@ -27,3 +28,25 @@ func TestWrapReader(t *testing.T) {
|
||||||
require.Equal(t, src, dst)
|
require.Equal(t, src, dst)
|
||||||
require.Equal(t, h[:], streamHash.Sum(nil))
|
require.Equal(t, h[:], streamHash.Sum(nil))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGoroutinesDontLeakInPutAndHash(t *testing.T) {
|
||||||
|
tc := prepareContext(t)
|
||||||
|
l, ok := tc.layer.(*layer)
|
||||||
|
require.True(t, ok)
|
||||||
|
|
||||||
|
content := make([]byte, 128*1024)
|
||||||
|
_, err := rand.Read(content)
|
||||||
|
require.NoError(t, err)
|
||||||
|
payload := bytes.NewReader(content)
|
||||||
|
|
||||||
|
prm := PrmObjectCreate{
|
||||||
|
Filepath: tc.obj,
|
||||||
|
Payload: payload,
|
||||||
|
}
|
||||||
|
|
||||||
|
expErr := errors.New("some error")
|
||||||
|
tc.testFrostFS.SetObjectPutError(tc.obj, expErr)
|
||||||
|
_, _, _, _, err = l.objectPutAndHash(tc.ctx, prm, tc.bktInfo)
|
||||||
|
require.ErrorIs(t, err, expErr)
|
||||||
|
require.Empty(t, payload.Len(), "body must be read out otherwise goroutines can leak in wrapReader")
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue