From fc880f9b23926762b3b3527ee11da183fde4f374 Mon Sep 17 00:00:00 2001 From: Anis Elleuch Date: Tue, 24 Jan 2017 17:08:36 +0100 Subject: [PATCH] admin: Enhance set credentials test (#3619) Add more test cases and ignore access and secret keys set from the env --- cmd/admin-handlers_test.go | 102 +++++++++++++++++++++++++++++-------- 1 file changed, 82 insertions(+), 20 deletions(-) diff --git a/cmd/admin-handlers_test.go b/cmd/admin-handlers_test.go index 250c144ca..22c406d1e 100644 --- a/cmd/admin-handlers_test.go +++ b/cmd/admin-handlers_test.go @@ -187,7 +187,7 @@ func getServiceCmdRequest(cmd cmdType, cred credential, body []byte) (*http.Requ // testServicesCmdHandler - parametrizes service subcommand tests on // cmdType value. -func testServicesCmdHandler(cmd cmdType, args map[string]interface{}, t *testing.T) { +func testServicesCmdHandler(cmd cmdType, t *testing.T) { adminTestBed, err := prepareAdminXLTestBed() if err != nil { t.Fatal("Failed to initialize a single node XL backend for admin handler tests.") @@ -214,10 +214,6 @@ func testServicesCmdHandler(cmd cmdType, args map[string]interface{}, t *testing credentials := serverConfig.GetCredential() var body []byte - if cmd == setCreds { - body, _ = xml.Marshal(setCredsReq{Username: args["username"].(string), Password: args["password"].(string)}) - } - req, err := getServiceCmdRequest(cmd, credentials, body) if err != nil { t.Fatalf("Failed to build service status request %v", err) @@ -240,18 +236,6 @@ func testServicesCmdHandler(cmd cmdType, args map[string]interface{}, t *testing } } - if cmd == setCreds { - // Check if new credentials are set - cred := serverConfig.GetCredential() - if cred.AccessKey != args["username"].(string) { - t.Errorf("Wrong access key, expected = %s, found = %s", args["username"].(string), cred.AccessKey) - } - if cred.SecretKey != args["password"].(string) { - t.Errorf("Wrong secret key, expected = %s, found = %s", args["password"].(string), cred.SecretKey) - } - - } - if rec.Code != http.StatusOK { resp, _ := ioutil.ReadAll(rec.Body) t.Errorf("Expected to receive %d status code but received %d. Body (%s)", @@ -261,16 +245,94 @@ func testServicesCmdHandler(cmd cmdType, args map[string]interface{}, t *testing // Test for service status management REST API. func TestServiceStatusHandler(t *testing.T) { - testServicesCmdHandler(statusCmd, nil, t) + testServicesCmdHandler(statusCmd, t) } // Test for service restart management REST API. func TestServiceRestartHandler(t *testing.T) { - testServicesCmdHandler(restartCmd, nil, t) + testServicesCmdHandler(restartCmd, t) } +// Test for service set creds management REST API. func TestServiceSetCreds(t *testing.T) { - testServicesCmdHandler(setCreds, map[string]interface{}{"username": "minio", "password": "minio123"}, t) + adminTestBed, err := prepareAdminXLTestBed() + if err != nil { + t.Fatal("Failed to initialize a single node XL backend for admin handler tests.") + } + defer adminTestBed.TearDown() + + // Initialize admin peers to make admin RPC calls. Note: In a + // single node setup, this degenerates to a simple function + // call under the hood. + eps, err := parseStorageEndpoints([]string{"http://localhost"}) + if err != nil { + t.Fatalf("Failed to parse storage end point - %v", err) + } + + // Set globalMinioAddr to be able to distinguish local endpoints from remote. + globalMinioAddr = eps[0].Host + initGlobalAdminPeers(eps) + + credentials := serverConfig.GetCredential() + var body []byte + + testCases := []struct { + Username string + Password string + EnvKeysSet bool + ExpectedStatusCode int + }{ + // Bad secret key + {"minio", "minio", false, http.StatusBadRequest}, + // Bad secret key set from the env + {"minio", "minio", true, http.StatusMethodNotAllowed}, + // Good keys set from the env + {"minio", "minio123", true, http.StatusMethodNotAllowed}, + // Successful operation should be the last one to do not change server credentials during tests. + {"minio", "minio123", false, http.StatusOK}, + } + for i, testCase := range testCases { + // Set or unset environement keys + if !testCase.EnvKeysSet { + globalEnvAccessKey = "" + globalEnvSecretKey = "" + } else { + globalEnvAccessKey = testCase.Username + globalEnvSecretKey = testCase.Password + } + + // Construct setCreds request body + body, _ = xml.Marshal(setCredsReq{Username: testCase.Username, Password: testCase.Password}) + // Construct setCreds request + req, err := getServiceCmdRequest(setCreds, credentials, body) + if err != nil { + t.Fatalf("Failed to build service status request %v", err) + } + + rec := httptest.NewRecorder() + + // Execute request + adminTestBed.mux.ServeHTTP(rec, req) + + // Check if the http code response is expected + if rec.Code != testCase.ExpectedStatusCode { + t.Errorf("Test %d: Wrong status code, expected = %d, found = %d", i+1, testCase.ExpectedStatusCode, rec.Code) + resp, _ := ioutil.ReadAll(rec.Body) + t.Errorf("Expected to receive %d status code but received %d. Body (%s)", + http.StatusOK, rec.Code, string(resp)) + } + + // If we got 200 OK, check if new credentials are really set + if rec.Code == http.StatusOK { + cred := serverConfig.GetCredential() + if cred.AccessKey != testCase.Username { + t.Errorf("Test %d: Wrong access key, expected = %s, found = %s", i+1, testCase.Username, cred.AccessKey) + } + if cred.SecretKey != testCase.Password { + t.Errorf("Test %d: Wrong secret key, expected = %s, found = %s", i+1, testCase.Password, cred.SecretKey) + } + } + } } // mkLockQueryVal - helper function to build lock query param.