Add tests for storage rpc handlers (#3262)
parent
398421b9f5
commit
7abcededf2
@ -0,0 +1,226 @@ |
|||||||
|
/* |
||||||
|
* Minio Cloud Storage, (C) 2016 Minio, Inc. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package cmd |
||||||
|
|
||||||
|
import ( |
||||||
|
"net/url" |
||||||
|
"testing" |
||||||
|
"time" |
||||||
|
|
||||||
|
"github.com/minio/minio/pkg/disk" |
||||||
|
) |
||||||
|
|
||||||
|
const invalidToken = "invalidToken" |
||||||
|
|
||||||
|
type testStorageRPCServer struct { |
||||||
|
configDir string |
||||||
|
token string |
||||||
|
diskDirs []string |
||||||
|
stServer *storageServer |
||||||
|
endpoints []*url.URL |
||||||
|
} |
||||||
|
|
||||||
|
func createTestStorageServer(t *testing.T) *testStorageRPCServer { |
||||||
|
testPath, err := newTestConfig("us-east-1") |
||||||
|
if err != nil { |
||||||
|
t.Fatalf("unable initialize config file, %s", err) |
||||||
|
} |
||||||
|
|
||||||
|
jwt, err := newJWT(defaultInterNodeJWTExpiry) |
||||||
|
if err != nil { |
||||||
|
t.Fatalf("unable to get new JWT, %s", err) |
||||||
|
} |
||||||
|
|
||||||
|
err = jwt.Authenticate(serverConfig.GetCredential().AccessKeyID, serverConfig.GetCredential().SecretAccessKey) |
||||||
|
if err != nil { |
||||||
|
t.Fatalf("unable for JWT to authenticate, %s", err) |
||||||
|
} |
||||||
|
|
||||||
|
token, err := jwt.GenerateToken(serverConfig.GetCredential().AccessKeyID) |
||||||
|
if err != nil { |
||||||
|
t.Fatalf("unable for JWT to generate token, %s", err) |
||||||
|
} |
||||||
|
|
||||||
|
fsDirs, err := getRandomDisks(1) |
||||||
|
if err != nil { |
||||||
|
t.Fatalf("unable to create FS backend, %s", err) |
||||||
|
} |
||||||
|
|
||||||
|
endpoints, err := parseStorageEndpoints(fsDirs) |
||||||
|
if err != nil { |
||||||
|
t.Fatalf("unable to parse storage endpoints, %s", err) |
||||||
|
} |
||||||
|
|
||||||
|
storageDisks, err := initStorageDisks(endpoints) |
||||||
|
if err != nil { |
||||||
|
t.Fatalf("unable to initialize storage disks, %s", err) |
||||||
|
} |
||||||
|
stServer := &storageServer{ |
||||||
|
storage: storageDisks[0], |
||||||
|
path: "/disk1", |
||||||
|
timestamp: time.Now().UTC(), |
||||||
|
} |
||||||
|
return &testStorageRPCServer{ |
||||||
|
token: token, |
||||||
|
configDir: testPath, |
||||||
|
diskDirs: fsDirs, |
||||||
|
endpoints: endpoints, |
||||||
|
stServer: stServer, |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func errorIfInvalidToken(t *testing.T, err error) { |
||||||
|
realErr := errorCause(err) |
||||||
|
if realErr != errInvalidToken { |
||||||
|
t.Errorf("Expected to fail with %s but failed with %s", errInvalidToken, realErr) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func TestStorageRPCTryInitHandler(t *testing.T) { |
||||||
|
st := createTestStorageServer(t) |
||||||
|
defer removeRoots(st.diskDirs) |
||||||
|
defer removeAll(st.configDir) |
||||||
|
storageRPC := st.stServer |
||||||
|
timestamp := time.Now().UTC() |
||||||
|
tryArgs := &GenericArgs{ |
||||||
|
Token: st.token, |
||||||
|
Timestamp: timestamp, |
||||||
|
} |
||||||
|
tryReply := &GenericReply{} |
||||||
|
err := storageRPC.TryInitHandler(tryArgs, tryReply) |
||||||
|
if err != nil { |
||||||
|
t.Errorf("TryInitHandler failed with %s", err) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func TestStorageRPCInvalidToken(t *testing.T) { |
||||||
|
st := createTestStorageServer(t) |
||||||
|
defer removeRoots(st.diskDirs) |
||||||
|
defer removeAll(st.configDir) |
||||||
|
|
||||||
|
storageRPC := st.stServer |
||||||
|
timestamp := time.Now().UTC() |
||||||
|
ga := GenericArgs{ |
||||||
|
Token: st.token, |
||||||
|
Timestamp: timestamp, |
||||||
|
} |
||||||
|
// Construct an invalid token.
|
||||||
|
badga := ga |
||||||
|
badga.Token = "invalidToken" |
||||||
|
|
||||||
|
// Following test cases are meant to exercise the invalid
|
||||||
|
// token code path of the storage RPC methods.
|
||||||
|
|
||||||
|
var err error |
||||||
|
gva := GenericVolArgs{ |
||||||
|
GenericArgs: badga, |
||||||
|
Vol: "myvol", |
||||||
|
} |
||||||
|
// 1. DiskInfoHandler
|
||||||
|
diskInfoReply := &disk.Info{} |
||||||
|
err = storageRPC.DiskInfoHandler(&badga, diskInfoReply) |
||||||
|
errorIfInvalidToken(t, err) |
||||||
|
|
||||||
|
// 2. MakeVolHandler
|
||||||
|
makeVolArgs := &gva |
||||||
|
makeVolReply := &GenericReply{} |
||||||
|
err = storageRPC.MakeVolHandler(makeVolArgs, makeVolReply) |
||||||
|
errorIfInvalidToken(t, err) |
||||||
|
|
||||||
|
// 3. ListVolsHandler
|
||||||
|
listVolReply := &ListVolsReply{} |
||||||
|
err = storageRPC.ListVolsHandler(&badga, listVolReply) |
||||||
|
errorIfInvalidToken(t, err) |
||||||
|
|
||||||
|
// 4. StatVolHandler
|
||||||
|
statVolReply := &VolInfo{} |
||||||
|
statVolArgs := &gva |
||||||
|
err = storageRPC.StatVolHandler(statVolArgs, statVolReply) |
||||||
|
errorIfInvalidToken(t, err) |
||||||
|
|
||||||
|
// 5. DeleteVolHandler
|
||||||
|
deleteVolArgs := &gva |
||||||
|
deleteVolReply := &GenericReply{} |
||||||
|
err = storageRPC.DeleteVolHandler(deleteVolArgs, deleteVolReply) |
||||||
|
errorIfInvalidToken(t, err) |
||||||
|
|
||||||
|
// 6. StatFileHandler
|
||||||
|
statFileArgs := &StatFileArgs{ |
||||||
|
GenericArgs: badga, |
||||||
|
} |
||||||
|
statReply := &FileInfo{} |
||||||
|
err = storageRPC.StatFileHandler(statFileArgs, statReply) |
||||||
|
errorIfInvalidToken(t, err) |
||||||
|
|
||||||
|
// 7. ListDirHandler
|
||||||
|
listDirArgs := &ListDirArgs{ |
||||||
|
GenericArgs: badga, |
||||||
|
} |
||||||
|
listDirReply := &[]string{} |
||||||
|
err = storageRPC.ListDirHandler(listDirArgs, listDirReply) |
||||||
|
errorIfInvalidToken(t, err) |
||||||
|
|
||||||
|
// 8. ReadAllHandler
|
||||||
|
readFileArgs := &ReadFileArgs{ |
||||||
|
GenericArgs: badga, |
||||||
|
} |
||||||
|
readFileReply := &[]byte{} |
||||||
|
err = storageRPC.ReadAllHandler(readFileArgs, readFileReply) |
||||||
|
errorIfInvalidToken(t, err) |
||||||
|
|
||||||
|
// 9. ReadFileHandler
|
||||||
|
err = storageRPC.ReadFileHandler(readFileArgs, readFileReply) |
||||||
|
errorIfInvalidToken(t, err) |
||||||
|
|
||||||
|
// 10. PrepareFileHandler
|
||||||
|
prepFileArgs := &PrepareFileArgs{ |
||||||
|
GenericArgs: badga, |
||||||
|
} |
||||||
|
prepFileReply := &GenericReply{} |
||||||
|
err = storageRPC.PrepareFileHandler(prepFileArgs, prepFileReply) |
||||||
|
errorIfInvalidToken(t, err) |
||||||
|
|
||||||
|
// 11. AppendFileHandler
|
||||||
|
appendArgs := &AppendFileArgs{ |
||||||
|
GenericArgs: badga, |
||||||
|
} |
||||||
|
appendReply := &GenericReply{} |
||||||
|
err = storageRPC.AppendFileHandler(appendArgs, appendReply) |
||||||
|
errorIfInvalidToken(t, err) |
||||||
|
|
||||||
|
// 12. DeleteFileHandler
|
||||||
|
delFileArgs := &DeleteFileArgs{ |
||||||
|
GenericArgs: badga, |
||||||
|
} |
||||||
|
delFileRely := &GenericReply{} |
||||||
|
err = storageRPC.DeleteFileHandler(delFileArgs, delFileRely) |
||||||
|
errorIfInvalidToken(t, err) |
||||||
|
|
||||||
|
// 13. RenameFileHandler
|
||||||
|
renameArgs := &RenameFileArgs{ |
||||||
|
GenericArgs: badga, |
||||||
|
} |
||||||
|
renameReply := &GenericReply{} |
||||||
|
err = storageRPC.RenameFileHandler(renameArgs, renameReply) |
||||||
|
errorIfInvalidToken(t, err) |
||||||
|
|
||||||
|
// 14. TryInitHandler
|
||||||
|
tryArgs := &badga |
||||||
|
tryReply := &GenericReply{} |
||||||
|
err = storageRPC.TryInitHandler(tryArgs, tryReply) |
||||||
|
errorIfInvalidToken(t, err) |
||||||
|
} |
Loading…
Reference in new issue