forked from TrueCloudLab/frostfs-http-gw
[#191] Update integration tests
Signed-off-by: Denis Kirillov <d.kirillov@yadro.com>
This commit is contained in:
parent
f3f0091aee
commit
138d9ec1a8
1 changed files with 104 additions and 15 deletions
|
@ -20,9 +20,11 @@ import (
|
||||||
|
|
||||||
containerv2 "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/api/container"
|
containerv2 "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/api/container"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/bearer"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/bearer"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/acl"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/acl"
|
||||||
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
||||||
|
cidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id/test"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/eacl"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/eacl"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/netmap"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/netmap"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
|
||||||
|
@ -99,6 +101,7 @@ func TestIntegration(t *testing.T) {
|
||||||
t.Run("get by attribute "+version, func(t *testing.T) { getByAttr(ctx, t, clientPool, ownerID, CID) })
|
t.Run("get by attribute "+version, func(t *testing.T) { getByAttr(ctx, t, clientPool, ownerID, CID) })
|
||||||
t.Run("get zip "+version, func(t *testing.T) { getZip(ctx, t, clientPool, ownerID, CID) })
|
t.Run("get zip "+version, func(t *testing.T) { getZip(ctx, t, clientPool, ownerID, CID) })
|
||||||
t.Run("test namespaces "+version, func(t *testing.T) { checkNamespaces(ctx, t, clientPool, ownerID, CID) })
|
t.Run("test namespaces "+version, func(t *testing.T) { checkNamespaces(ctx, t, clientPool, ownerID, CID) })
|
||||||
|
t.Run("test status codes "+version, func(t *testing.T) { checkStatusCodes(ctx, t, clientPool, ownerID, version) })
|
||||||
|
|
||||||
cancel()
|
cancel()
|
||||||
server.Wait()
|
server.Wait()
|
||||||
|
@ -267,7 +270,7 @@ func putWithDuplicateKeys(t *testing.T, CID cid.ID) {
|
||||||
|
|
||||||
body, err := io.ReadAll(resp.Body)
|
body, err := io.ReadAll(resp.Body)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, "key duplication error: "+attr+"\n", string(body))
|
require.Contains(t, string(body), "key duplication error: "+attr+"\n")
|
||||||
require.Equal(t, http.StatusBadRequest, resp.StatusCode)
|
require.Equal(t, http.StatusBadRequest, resp.StatusCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -436,7 +439,80 @@ func checkNamespaces(ctx context.Context, t *testing.T, clientPool *pool.Pool, o
|
||||||
resp, err = http.DefaultClient.Do(req)
|
resp, err = http.DefaultClient.Do(req)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, http.StatusNotFound, resp.StatusCode)
|
require.Equal(t, http.StatusNotFound, resp.StatusCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkStatusCodes(ctx context.Context, t *testing.T, clientPool *pool.Pool, ownerID user.ID, version string) {
|
||||||
|
cli := http.Client{Timeout: 30 * time.Second}
|
||||||
|
|
||||||
|
t.Run("container not found by name", func(t *testing.T) {
|
||||||
|
resp, err := cli.Get(testHost + "/get/unknown/object")
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, http.StatusNotFound, resp.StatusCode)
|
||||||
|
requireBodyContains(t, resp, "container not found")
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("container not found by cid", func(t *testing.T) {
|
||||||
|
cnrIDTest := cidtest.ID()
|
||||||
|
resp, err := cli.Get(testHost + "/get/" + cnrIDTest.EncodeToString() + "/object")
|
||||||
|
require.NoError(t, err)
|
||||||
|
requireBodyContains(t, resp, "container not found")
|
||||||
|
require.Equal(t, http.StatusNotFound, resp.StatusCode)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("object not found in storage", func(t *testing.T) {
|
||||||
|
resp, err := cli.Get(testHost + "/get_by_attribute/" + testContainerName + "/FilePath/object2")
|
||||||
|
require.NoError(t, err)
|
||||||
|
requireBodyContains(t, resp, "object not found")
|
||||||
|
require.Equal(t, http.StatusNotFound, resp.StatusCode)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("access denied", func(t *testing.T) {
|
||||||
|
basicACL := acl.Private
|
||||||
|
var recs []*eacl.Record
|
||||||
|
if version == "1.2.7" {
|
||||||
|
basicACL = acl.PublicRWExtended
|
||||||
|
rec := eacl.NewRecord()
|
||||||
|
rec.SetAction(eacl.ActionDeny)
|
||||||
|
rec.SetOperation(eacl.OperationGet)
|
||||||
|
recs = append(recs, rec)
|
||||||
|
}
|
||||||
|
|
||||||
|
cnrID, err := createContainerBase(ctx, t, clientPool, ownerID, basicACL, "")
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
key, err := keys.NewPrivateKey()
|
||||||
|
require.NoError(t, err)
|
||||||
|
jsonToken, _ := makeBearerTokens(t, key, ownerID, version, recs...)
|
||||||
|
|
||||||
|
t.Run("get", func(t *testing.T) {
|
||||||
|
request, err := http.NewRequest(http.MethodGet, testHost+"/get/"+cnrID.EncodeToString()+"/object", nil)
|
||||||
|
require.NoError(t, err)
|
||||||
|
request.Header.Set("Authorization", "Bearer "+jsonToken)
|
||||||
|
|
||||||
|
resp, err := cli.Do(request)
|
||||||
|
require.NoError(t, err)
|
||||||
|
requireBodyContains(t, resp, "access denied")
|
||||||
|
require.Equal(t, http.StatusForbidden, resp.StatusCode)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("upload", func(t *testing.T) {
|
||||||
|
request, _, _ := makePutRequest(t, testHost+"/upload/"+cnrID.EncodeToString())
|
||||||
|
request.Header.Set("Authorization", "Bearer "+jsonToken)
|
||||||
|
|
||||||
|
resp, err := cli.Do(request)
|
||||||
|
require.NoError(t, err)
|
||||||
|
requireBodyContains(t, resp, "access denied")
|
||||||
|
require.Equal(t, http.StatusForbidden, resp.StatusCode)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func requireBodyContains(t *testing.T, resp *http.Response, msg string) {
|
||||||
|
data, err := io.ReadAll(resp.Body)
|
||||||
|
require.NoError(t, err)
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
require.Contains(t, strings.ToLower(string(data)), strings.ToLower(msg))
|
||||||
}
|
}
|
||||||
|
|
||||||
func createDockerContainer(ctx context.Context, t *testing.T, image string) testcontainers.Container {
|
func createDockerContainer(ctx context.Context, t *testing.T, image string) testcontainers.Container {
|
||||||
|
@ -485,6 +561,10 @@ func getPool(ctx context.Context, t *testing.T, key *keys.PrivateKey) *pool.Pool
|
||||||
}
|
}
|
||||||
|
|
||||||
func createContainer(ctx context.Context, t *testing.T, clientPool *pool.Pool, ownerID user.ID, name string) (cid.ID, error) {
|
func createContainer(ctx context.Context, t *testing.T, clientPool *pool.Pool, ownerID user.ID, name string) (cid.ID, error) {
|
||||||
|
return createContainerBase(ctx, t, clientPool, ownerID, acl.PublicRWExtended, name)
|
||||||
|
}
|
||||||
|
|
||||||
|
func createContainerBase(ctx context.Context, t *testing.T, clientPool *pool.Pool, ownerID user.ID, basicACL acl.Basic, name string) (cid.ID, error) {
|
||||||
var policy netmap.PlacementPolicy
|
var policy netmap.PlacementPolicy
|
||||||
err := policy.DecodeString("REP 1")
|
err := policy.DecodeString("REP 1")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
@ -492,24 +572,28 @@ func createContainer(ctx context.Context, t *testing.T, clientPool *pool.Pool, o
|
||||||
var cnr container.Container
|
var cnr container.Container
|
||||||
cnr.Init()
|
cnr.Init()
|
||||||
cnr.SetPlacementPolicy(policy)
|
cnr.SetPlacementPolicy(policy)
|
||||||
cnr.SetBasicACL(acl.PublicRWExtended)
|
cnr.SetBasicACL(basicACL)
|
||||||
cnr.SetOwner(ownerID)
|
cnr.SetOwner(ownerID)
|
||||||
|
|
||||||
container.SetCreationTime(&cnr, time.Now())
|
container.SetCreationTime(&cnr, time.Now())
|
||||||
|
|
||||||
var domain container.Domain
|
if name != "" {
|
||||||
domain.SetName(name)
|
var domain container.Domain
|
||||||
|
domain.SetName(name)
|
||||||
|
|
||||||
cnr.SetAttribute(containerv2.SysAttributeName, domain.Name())
|
cnr.SetAttribute(containerv2.SysAttributeName, domain.Name())
|
||||||
cnr.SetAttribute(containerv2.SysAttributeZone, domain.Zone())
|
cnr.SetAttribute(containerv2.SysAttributeZone, domain.Zone())
|
||||||
|
}
|
||||||
|
|
||||||
var waitPrm pool.WaitParams
|
prm := pool.PrmContainerPut{
|
||||||
waitPrm.SetTimeout(15 * time.Second)
|
ClientParams: client.PrmContainerPut{
|
||||||
waitPrm.SetPollInterval(3 * time.Second)
|
Container: &cnr,
|
||||||
|
},
|
||||||
var prm pool.PrmContainerPut
|
WaitParams: &pool.WaitParams{
|
||||||
prm.SetContainer(cnr)
|
Timeout: 15 * time.Second,
|
||||||
prm.SetWaitParams(waitPrm)
|
PollInterval: 3 * time.Second,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
CID, err := clientPool.PutContainer(ctx, prm)
|
CID, err := clientPool.PutContainer(ctx, prm)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -556,13 +640,18 @@ func registerUser(t *testing.T, ctx context.Context, aioContainer testcontainers
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeBearerTokens(t *testing.T, key *keys.PrivateKey, ownerID user.ID, version string) (jsonTokenBase64, binaryTokenBase64 string) {
|
func makeBearerTokens(t *testing.T, key *keys.PrivateKey, ownerID user.ID, version string, records ...*eacl.Record) (jsonTokenBase64, binaryTokenBase64 string) {
|
||||||
tkn := new(bearer.Token)
|
tkn := new(bearer.Token)
|
||||||
tkn.ForUser(ownerID)
|
tkn.ForUser(ownerID)
|
||||||
tkn.SetExp(10000)
|
tkn.SetExp(10000)
|
||||||
|
|
||||||
if version == "1.2.7" {
|
if version == "1.2.7" {
|
||||||
tkn.SetEACLTable(*eacl.NewTable())
|
table := eacl.NewTable()
|
||||||
|
for i := range records {
|
||||||
|
table.AddRecord(records[i])
|
||||||
|
}
|
||||||
|
|
||||||
|
tkn.SetEACLTable(*table)
|
||||||
} else {
|
} else {
|
||||||
tkn.SetImpersonate(true)
|
tkn.SetImpersonate(true)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue