| // Copyright 2017 Google 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 apidQuota_test |
| |
| import ( |
| . "github.com/onsi/ginkgo" |
| "bytes" |
| "encoding/json" |
| "github.com/google/uuid" |
| "io/ioutil" |
| "net/http" |
| "time" |
| ) |
| |
| func init() { |
| //testAPIDQuotaURL = "" |
| } |
| |
| var testhttpClient *http.Client = &http.Client{ |
| //setting the timeout to 60 sec for requests to counterService |
| Timeout: time.Duration(60 * time.Second), |
| } |
| |
| const testQuotaAPIURL = "http://localhost:9000/quota" |
| const testValidOrg = "edgexfeb1" |
| |
| var _ = Describe("Api Tests", func() { |
| It("test Synchronous quota - valid test cases", func() { |
| requestData := make(map[string]interface{}) |
| requestData["edgeOrgID"] = testValidOrg |
| requestData["id"] = "testAppID" |
| requestData["interval"] = 1 |
| requestData["timeUnit"] = "HOUR" |
| requestData["type"] = "CALENDAR" |
| requestData["preciseAtSecondsLevel"] = false |
| requestData["startTime"] = time.Now().UTC().AddDate(0, 0, 1).Unix() |
| requestData["maxCount"] = 5 |
| requestData["weight"] = 2 |
| requestData["distributed"] = true |
| requestData["synchronous"] = true |
| requestData["weight"] = 2 |
| |
| reqBytes, err := json.Marshal(requestData) |
| if err != nil { |
| Fail("error converting requestBody into bytes: " + err.Error()) |
| } |
| |
| //valid request body |
| req, err := http.NewRequest("POST", testQuotaAPIURL, ioutil.NopCloser(bytes.NewReader(reqBytes))) |
| if err != nil { |
| Fail("error getting newRequest: " + err.Error()) |
| } |
| |
| res, err := testhttpClient.Do(req) |
| if err != nil { |
| Fail("error calling the api: " + err.Error()) |
| } |
| |
| // Check the status code is 200 OK. |
| if status := res.StatusCode; status != http.StatusOK { |
| respBodyBytes, err := ioutil.ReadAll(res.Body) |
| respBody := make(map[string]interface{}) |
| err = json.Unmarshal(respBodyBytes, &respBody) |
| if err != nil { |
| Fail("error: " + err.Error()) |
| } |
| |
| Fail("wrong status code: " + res.Status) |
| } |
| |
| //TestCase1: valid request - case insensitive - timeUnit, quotaType, bucketType |
| requestData["timeUnit"] = "HoUR" |
| requestData["quotaType"] = "cALEndar" |
| requestData["bucketType"] = "syncHRonous" |
| |
| req, err = http.NewRequest("POST", testQuotaAPIURL, ioutil.NopCloser(bytes.NewReader(reqBytes))) |
| if err != nil { |
| Fail("error getting newRequest: " + err.Error()) |
| } |
| |
| res, err = testhttpClient.Do(req) |
| if err != nil { |
| Fail("error calling the api: " + err.Error()) |
| } |
| |
| // Check the status code is what we expect. |
| if status := res.StatusCode; status != http.StatusOK { |
| Fail("wrong status code: " + res.Status) |
| } |
| |
| //TestCase2: valid request - startTime not sent in request - optional. |
| delete(requestData, "startTime") |
| |
| req, err = http.NewRequest("POST", testQuotaAPIURL, ioutil.NopCloser(bytes.NewReader(reqBytes))) |
| if err != nil { |
| Fail("error getting newRequest: " + err.Error()) |
| } |
| |
| res, err = testhttpClient.Do(req) |
| if err != nil { |
| Fail("error calling the api: " + err.Error()) |
| } |
| |
| // Check the status code is what we expect. |
| if status := res.StatusCode; status != http.StatusOK { |
| respBodyBytes, err := ioutil.ReadAll(res.Body) |
| respBody := make(map[string]interface{}) |
| err = json.Unmarshal(respBodyBytes, &respBody) |
| if err != nil { |
| Fail("error: " + err.Error()) |
| } |
| |
| Fail("wrong status code: " + res.Status) |
| } |
| |
| //TestCase3: quotaType = "RollingWidow" |
| requestData["quotaType"] = "RollingWindow" |
| requestData["startTime"] = time.Now().UTC().AddDate(0, 0, 1).Unix() |
| req, err = http.NewRequest("POST", testQuotaAPIURL, ioutil.NopCloser(bytes.NewReader(reqBytes))) |
| if err != nil { |
| Fail("error getting newRequest: " + err.Error()) |
| } |
| |
| res, err = testhttpClient.Do(req) |
| if err != nil { |
| Fail("error calling the api: " + err.Error()) |
| } |
| |
| // Check the status code is what we expect. |
| if status := res.StatusCode; status != http.StatusOK { |
| Fail("wrong status code: " + res.Status) |
| } |
| |
| }) |
| |
| It("test Synchronous quota - invalidation test cases", func() { |
| requestData := make(map[string]interface{}) |
| uuid, err := uuid.NewUUID() |
| if err != nil { |
| Fail("error getting uuid") |
| } |
| |
| requestData["edgeOrgID"] = "testTenant" |
| requestData["id"] = "testID" + uuid.String() |
| requestData["interval"] = 1 |
| requestData["timeUnit"] = "HOUR" |
| requestData["quotaType"] = "CALENDAR" |
| requestData["preciseAtSecondsLevel"] = false |
| requestData["startTime"] = time.Now().UTC().AddDate(0, 0, 1).Unix() |
| requestData["maxCount"] = 5 |
| requestData["bucketType"] = "Synchronous" |
| requestData["weight"] = 2 |
| |
| //invalid request body - interval not string |
| requestData["interval"] = "test" |
| |
| reqBytes, err := json.Marshal(requestData) |
| if err != nil { |
| Fail("error converting requestBody into bytes: " + err.Error()) |
| } |
| |
| req, err := http.NewRequest("POST", testQuotaAPIURL, ioutil.NopCloser(bytes.NewReader(reqBytes))) |
| if err != nil { |
| Fail("error getting newRequest: " + err.Error()) |
| } |
| |
| res, err := testhttpClient.Do(req) |
| if err != nil { |
| Fail("error calling the api: " + err.Error()) |
| } |
| |
| // Check the status code is what we expect. |
| if status := res.StatusCode; status != http.StatusBadRequest { |
| respBodyBytes, err := ioutil.ReadAll(res.Body) |
| respBody := make(map[string]interface{}) |
| err = json.Unmarshal(respBodyBytes, &respBody) |
| if err != nil { |
| Fail("error: " + err.Error()) |
| } |
| |
| Fail("wrong status code: " + res.Status) |
| } |
| |
| //invalid request - timeUnit invalid |
| requestData["interval"] = 1 |
| requestData["timeUnit"] = "invalidTimeUnit" |
| reqBytes, err = json.Marshal(requestData) |
| if err != nil { |
| Fail("error converting requestBody into bytes: " + err.Error()) |
| } |
| |
| req, err = http.NewRequest("POST", testQuotaAPIURL, ioutil.NopCloser(bytes.NewReader(reqBytes))) |
| if err != nil { |
| Fail("error getting newRequest: " + err.Error()) |
| } |
| |
| res, err = testhttpClient.Do(req) |
| if err != nil { |
| Fail("error calling the api: " + err.Error()) |
| } |
| |
| // Check the status code is what we expect. |
| if status := res.StatusCode; status != http.StatusBadRequest { |
| Fail("wrong status code: " + res.Status) |
| } |
| |
| }) |
| |
| }) |