Refactor and add more tests
diff --git a/api.go b/api.go index 50d340f..f72ec1b 100644 --- a/api.go +++ b/api.go
@@ -3,15 +3,18 @@ import ( "encoding/json" "github.com/30x/apid-core" + "github.com/30x/apidQuota/constants" + "github.com/30x/apidQuota/globalVariables" "github.com/30x/apidQuota/quotaBucket" + "github.com/30x/apidQuota/util" "io/ioutil" "net/http" "strconv" ) func InitAPI(services apid.Services) { - Log.Debug("initialized API's exposed by apidQuota plugin") - quotaBasePath := Config.GetString(ConfigQuotaBasePath) + globalVariables.Log.Debug("initialized API's exposed by apidQuota plugin") + quotaBasePath := globalVariables.Config.GetString(constants.ConfigQuotaBasePath) services.API().HandleFunc(quotaBasePath, getAllQuotaValues).Methods("GET") //yet to implement. services.API().HandleFunc(quotaBasePath+"/{quotaItentifier}", incrementAndCheckQuotaLimit).Methods("POST") @@ -30,27 +33,27 @@ bodyBytes, err := ioutil.ReadAll(req.Body) defer req.Body.Close() if err != nil { - WriteErrorResponse(http.StatusBadRequest, UnableToParseBody, "unable to read request body: "+err.Error(), res, req) + util.WriteErrorResponse(http.StatusBadRequest, constants.UnableToParseBody, "unable to read request body: "+err.Error(), res, req) return } quotaBucketMap := make(map[string]interface{}, 0) if err := json.Unmarshal(bodyBytes, "aBucketMap); err != nil { - WriteErrorResponse(http.StatusBadRequest, UnMarshalJSONError, "unable to convert request body to an object: "+err.Error(), res, req) + util.WriteErrorResponse(http.StatusBadRequest, constants.UnMarshalJSONError, "unable to convert request body to an object: "+err.Error(), res, req) return } - Log.Println("quotaBucketMap from request: ", quotaBucketMap) + globalVariables.Log.Println("quotaBucketMap from request: ", quotaBucketMap) // parse the request body into the Event struct qBucket := new(quotaBucket.QuotaBucket) if err = qBucket.FromAPIRequest(quotaBucketMap); err != nil { - WriteErrorResponse(http.StatusBadRequest, ErrorConvertReqBodyToEntity, err.Error(), res, req) + util.WriteErrorResponse(http.StatusBadRequest, constants.ErrorConvertReqBodyToEntity, err.Error(), res, req) return } quotaCount, err := qBucket.GetQuotaCount() if err != nil { - WriteErrorResponse(http.StatusBadRequest, UnMarshalJSONError, "error retrieving count for the give identifier "+err.Error(), res, req) + util.WriteErrorResponse(http.StatusBadRequest, constants.UnMarshalJSONError, "error retrieving count for the give identifier "+err.Error(), res, req) return }
diff --git a/api_test.go b/api_test.go index 8a83c8f..9d6452c 100644 --- a/api_test.go +++ b/api_test.go
@@ -2,8 +2,16 @@ import ( . "github.com/onsi/ginkgo" + //"net/http" ) -var _ = Describe("Api", func() { +func init() { + //testAPIDQuotaURL = "" +} +var _ = Describe("Api", func() { + It("test Synchronous quota", func() { + + //req, err := http.NewRequest("POST", ) + }) })
diff --git a/constants.go b/constants.go deleted file mode 100644 index 588b808..0000000 --- a/constants.go +++ /dev/null
@@ -1,9 +0,0 @@ -package apidQuota - -const ( - UnableToParseBody = "unable_to_parse_body" - UnMarshalJSONError = "unmarshal_json_error" - ErrorConvertReqBodyToEntity = "error_convert_reqBody_to_entity" - ConfigQuotaBasePath = "quota_base_path" - quotaBasePathDefault = "/quota" -)
diff --git a/constants/constants.go b/constants/constants.go new file mode 100644 index 0000000..9ced04b --- /dev/null +++ b/constants/constants.go
@@ -0,0 +1,14 @@ +package constants + +const ( + UnableToParseBody = "unable_to_parse_body" + UnMarshalJSONError = "unmarshal_json_error" + ErrorConvertReqBodyToEntity = "error_convert_reqBody_to_entity" + ConfigQuotaBasePath = "quota_base_path" + QuotaBasePathDefault = "/quota" + + ConfigCounterServiceBasePath = "counterService_base_path" + URLCounterServiceNotSet = "url_counter_service_not_set" + URLCounterServiceInvalid = "url_counter_service_invalid" + MarshalJSONError = "marshal_JSON_error" +)
diff --git a/globalVariables/globalVariables.go b/globalVariables/globalVariables.go new file mode 100644 index 0000000..50a4df0 --- /dev/null +++ b/globalVariables/globalVariables.go
@@ -0,0 +1,9 @@ +package globalVariables + +import "github.com/30x/apid-core" + +var ( + Log apid.LogService + Config apid.ConfigService + CounterServiceURL string +)
diff --git a/init.go b/init.go index 93e1c1b..66e0a40 100644 --- a/init.go +++ b/init.go
@@ -2,20 +2,31 @@ import ( "github.com/30x/apid-core" -) - -var ( - Log apid.LogService - Config apid.ConfigService + "github.com/30x/apidQuota/constants" + "github.com/30x/apidQuota/globalVariables" ) func init() { apid.RegisterPlugin(initPlugin) + initCounterService() +} + +// set config for counter service. +func initCounterService() { + //counterBasePath := globalVariables.Config.Get(constants.ConfigCounterServiceBasePath) + //fmt.Println("counterBasePath: ", counterBasePath , "//") + /*if counterBasePath != nil { + if reflect.TypeOf(counterBasePath).Kind() != reflect.String{ + globalVariables.Log.Fatal("value of: " + constants.ConfigCounterServiceBasePath + " in the config should be string") + } + globalVariables.CounterServiceURL = counterBasePath.(string) + }*/ + globalVariables.CounterServiceURL = "http://54.86.114.219:8989/increment" } func initPlugin(services apid.Services) (apid.PluginData, error) { - Log = services.Log().ForModule("apidQuota") - Log.Debug("start init") + globalVariables.Log = services.Log().ForModule("apidQuota") + globalVariables.Log.Debug("start init") setConfig(services) InitAPI(services) @@ -25,8 +36,8 @@ func setConfig(services apid.Services) { // set configuration - Config = services.Config() + globalVariables.Config = services.Config() // set plugin config defaults - Config.SetDefault(ConfigQuotaBasePath, quotaBasePathDefault) + globalVariables.Config.SetDefault(constants.ConfigQuotaBasePath, constants.QuotaBasePathDefault) }
diff --git a/quotaBucket/apiUtil.go b/quotaBucket/apiUtil.go index 155a24d..c29e427 100644 --- a/quotaBucket/apiUtil.go +++ b/quotaBucket/apiUtil.go
@@ -90,56 +90,6 @@ startTime = int64(startTimeFloat) //fmt.Println("startTime: ", startTime) - quotaPeriod := QuotaPeriod{} - value, ok = quotaBucketMap["period"] - //if period is not sent in the request, it is calculated based in the startTime, quotaType and interval. - if ok { - var inStartInt, startInt, endInt int64 - - isPeriodMap := reflect.TypeOf(value) - if isPeriodMap.Kind() != reflect.Map { - return errors.New(`invalid type : 'period' should be a Map`) - } - periodMap := value.(map[string]interface{}) - - inStartTimeValue, ok := periodMap["inputStartTime"] - if !ok { - //set period.inputStart time from qBucket.startTime - inStartInt = startTime - } else { - if inStartType := reflect.TypeOf(inStartTimeValue); inStartType.Kind() != reflect.Float64 { - return errors.New(`invalid type : 'inputStartTime' in 'period' should be UNIX timestamp`) - } - inStartFloat := inStartTimeValue.(float64) - inStartInt = int64(inStartFloat) - if startTime != inStartInt { - return errors.New(`invalid value : 'inputStartTime' in 'period' should be same as 'startTime'' in request`) - } - } - - startTimeValue, ok := periodMap["startTime"] - if !ok { - return errors.New(`missing field : 'startTime' in 'period' cannot be empty`) - } - if periodStartType := reflect.TypeOf(startTimeValue); periodStartType.Kind() != reflect.Float64 { - return errors.New(`invalid type : 'startTime' in 'period' should be UNIX timestamp`) - } - periodStartFloat := startTimeValue.(float64) - startInt = int64(periodStartFloat) - - periodEndValue, ok := periodMap["endTime"] - if !ok { - return errors.New(`missing field : 'endTime' in 'period' cannot be empty`) - } - if periodEndType := reflect.TypeOf(periodEndValue); periodEndType.Kind() != reflect.Float64 { - return errors.New(`invalid type : 'endTime' in 'period' should be UNIX timestamp`) - } - periodEndFloat := periodEndValue.(float64) - endInt = int64(periodEndFloat) - - quotaPeriod = NewQuotaPeriod(inStartInt, startInt, endInt) - } - value, ok = quotaBucketMap["maxCount"] if !ok { return errors.New(`missing field: 'maxCount' is required`) @@ -162,7 +112,12 @@ bucketType = value.(string) //fmt.Println("bucketType: ", bucketType) - newQBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, quotaPeriod, startTime, maxCount, bucketType) + newQBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + if err != nil { + return errors.New("error creating newquotaBucket: " + err.Error()) + + } + qBucket.quotaBucketData = newQBucket.quotaBucketData if err := qBucket.Validate(); err != nil {
diff --git a/quotaBucket/quotaBucket.go b/quotaBucket/quotaBucket.go index 99bc6ba..119482b 100644 --- a/quotaBucket/quotaBucket.go +++ b/quotaBucket/quotaBucket.go
@@ -3,6 +3,8 @@ import ( "errors" "fmt" + "github.com/30x/apidQuota/services" + "strings" "time" ) @@ -22,9 +24,10 @@ //todo: Add other accepted bucketTypes //errors - InvalidQuotaTimeUnitType = "invalidQuotaTimeUnitType" - InvalidQuotaBucketType = "invalidQuotaBucketType" - InvalidQuotaPeriod = "invalidQuotaPeriod" + InvalidQuotaTimeUnitType = "invalidQuotaTimeUnitType" + InvalidQuotaDescriptorType = "invalidQuotaTimeUnitType" + InvalidQuotaBucketType = "invalidQuotaBucketType" + InvalidQuotaPeriod = "invalidQuotaPeriod" ) var ( @@ -85,7 +88,7 @@ ID string Interval int TimeUnit string //TimeUnit {SECOND, MINUTE, HOUR, DAY, WEEK, MONTH} - QuotaType string //Type {CALENDAR, FLEXI, ROLLING_WINDOW} + QuotaDescriptorType string //Type {CALENDAR, FLEXI, ROLLING_WINDOW} PreciseAtSecondsLevel bool Period QuotaPeriod StartTime time.Time @@ -98,18 +101,18 @@ } func NewQuotaBucket(edgeOrgID string, id string, interval int, - timeUnit string, quotaType string, preciseAtSecondsLevel bool, period QuotaPeriod, - startTime int64, maxCount int, bucketType string) *QuotaBucket { + timeUnit string, quotaType string, preciseAtSecondsLevel bool, + startTime int64, maxCount int, bucketType string) (*QuotaBucket, error) { fromUNIXTime := time.Unix(startTime, 0) + quotaBucketDataStruct := "aBucketData{ EdgeOrgID: edgeOrgID, ID: id, Interval: interval, TimeUnit: timeUnit, - QuotaType: quotaType, + QuotaDescriptorType: quotaType, PreciseAtSecondsLevel: preciseAtSecondsLevel, - Period: period, StartTime: fromUNIXTime, MaxCount: maxCount, BucketType: bucketType, @@ -119,13 +122,28 @@ quotaBucketData: *quotaBucketDataStruct, } - return quotaBucket + err := quotaBucket.setCurrentPeriod() + if err != nil { + return nil, err + } + return quotaBucket, nil } func (q *QuotaBucket) Validate() error { + + //check valid quotaTimeUnit + if ok := IsValidTimeUnit(strings.ToLower(q.GetTimeUnit())); !ok { + return errors.New(InvalidQuotaTimeUnitType) + } + + //check valid quotaBucketType + if ok := IsValidQuotaBucketType(strings.ToLower(q.GetBucketType())); !ok { + return errors.New(InvalidQuotaBucketType) + } + //check if the period is valid - period,err := q.GetQuotaBucketPeriod() + period, err := q.GetQuotaBucketPeriod() if err != nil { return err } @@ -133,16 +151,6 @@ return errors.New("invalid Period: " + err.Error()) } - //check valid quotaTimeUnit - if ok := IsValidTimeUnit(q.GetTimeUnit()); !ok { - return errors.New(InvalidQuotaTimeUnitType) - } - - //check valid quotaBucketType - if ok := IsValidQuotaBucketType(q.GetBucketType()); !ok { - return errors.New(InvalidQuotaBucketType) - } - return nil } @@ -167,16 +175,16 @@ } func (q *QuotaBucket) GetQuotaType() string { - return q.quotaBucketData.QuotaType + return q.quotaBucketData.QuotaDescriptorType } func (q *QuotaBucket) GetPreciseAtSecondsLevel() bool { return q.quotaBucketData.PreciseAtSecondsLevel } -//Calls setCurrentPeriod if QuotaType is rollingWindow or period.endTime is before now. +//Calls setCurrentPeriod if QuotaDescriptorType is rollingWindow or period.endTime is before now. func (q *QuotaBucket) GetPeriod() (*QuotaPeriod, error) { - if q.quotaBucketData.QuotaType == QuotaTypeRollingWindow { + if q.quotaBucketData.QuotaDescriptorType == QuotaTypeRollingWindow { qRWType := RollingWindowQuotaDescriptorType{} err := qRWType.SetCurrentPeriod(q) if err != nil { @@ -184,12 +192,12 @@ } } - period,err := q.GetQuotaBucketPeriod() + period, err := q.GetQuotaBucketPeriod() if err != nil { - return nil,err + return nil, err } //setCurrentPeriod if endTime > time.now() - if period.endTime.Before(time.Now()) || period.endTime.Equal(time.Now()){ + if period.endTime.Before(time.Now().UTC()) || period.endTime.Equal(time.Now().UTC()) { if err := q.setCurrentPeriod(); err != nil { return nil, err } @@ -199,19 +207,17 @@ } //setCurrentPeriod only for rolling window else just return the value of QuotaPeriod -func (q *QuotaBucket) GetQuotaBucketPeriod() (*QuotaPeriod,error) { - if q.quotaBucketData.QuotaType == QuotaTypeRollingWindow { +func (q *QuotaBucket) GetQuotaBucketPeriod() (*QuotaPeriod, error) { + if q.quotaBucketData.QuotaDescriptorType == QuotaTypeRollingWindow { qRWType := RollingWindowQuotaDescriptorType{} err := qRWType.SetCurrentPeriod(q) if err != nil { return nil, err } } - return &q.quotaBucketData.Period,nil + return &q.quotaBucketData.Period, nil } - - func (q *QuotaBucket) GetMaxCount() int { return q.quotaBucketData.MaxCount } @@ -230,7 +236,7 @@ func (q *QuotaBucket) setCurrentPeriod() error { - qDescriptorType, err := GetQuotaTypeHandler(q.GetQuotaType()) + qDescriptorType, err := GetQuotaDescriptorTypeHandler(q.GetQuotaType()) if err != nil { return err } @@ -241,15 +247,15 @@ func (period *QuotaPeriod) IsCurrentPeriod(qBucket *QuotaBucket) bool { if qBucket != nil && qBucket.GetBucketType() != "" { if qBucket.GetQuotaType() == QuotaTypeRollingWindow { - return (period.inputStartTime.Equal(time.Now()) || period.inputStartTime.Before(time.Now()) ) + return (period.inputStartTime.Equal(time.Now().UTC()) || period.inputStartTime.Before(time.Now().UTC())) } - return (period.inputStartTime.Equal(time.Now()) || period.inputStartTime.Before(time.Now())) && + return (period.inputStartTime.Equal(time.Now().UTC()) || period.inputStartTime.Before(time.Now().UTC())) && period.startTime.String() != "" && period.endTime.String() != "" && period.startTime.Before(period.endTime) && - (period.startTime.Equal(time.Now()) || period.startTime.Before(time.Now()))&& - (period.endTime.Equal(time.Now()) || period.endTime.After(time.Now())) + (period.startTime.Equal(time.Now().UTC()) || period.startTime.Before(time.Now().UTC())) && + (period.endTime.Equal(time.Now().UTC()) || period.endTime.After(time.Now().UTC())) } return false } @@ -265,9 +271,12 @@ } fmt.Println("period set: ", period) - //todo API call to counter service using Period start end and keyspace. + resp, err := services.IncrementAndGetCount(q.GetEdgeOrgID(), q.GetID(), 0) + if err != nil { + return 0, err + } - return 10, nil + return resp, nil } func (q *QuotaBucket) IncrementQuota() (int, error) {
diff --git a/quotaBucket/quotaBucketType_test.go b/quotaBucket/quotaBucketType_test.go index 70ee53d..d6ac8c0 100644 --- a/quotaBucket/quotaBucketType_test.go +++ b/quotaBucket/quotaBucketType_test.go
@@ -5,5 +5,7 @@ ) var _ = Describe("QuotaBucketType", func() { - + It("test QuotaBucketType", func() { + //fmt.Println("inside QuotaBucketType") + }) })
diff --git a/quotaBucket/quotaBucket_suite_test.go b/quotaBucket/quotaBucket_suite_test.go index b05019b..43fa8cb 100644 --- a/quotaBucket/quotaBucket_suite_test.go +++ b/quotaBucket/quotaBucket_suite_test.go
@@ -3,7 +3,6 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" - "fmt" "testing" ) @@ -12,11 +11,11 @@ RunSpecs(t, "QuotaBucket Suite") } -var _ = BeforeSuite(func() { - fmt.Println("before suite") - -}) - -var _ = AfterSuite(func() { - fmt.Println("after suite") -}) +//var _ = BeforeSuite(func() { +// fmt.Println("before suite") +// +//}) +// +//var _ = AfterSuite(func() { +// fmt.Println("after suite") +//})
diff --git a/quotaBucket/quotaBucket_test.go b/quotaBucket/quotaBucket_test.go index df50e82..4d1e166 100644 --- a/quotaBucket/quotaBucket_test.go +++ b/quotaBucket/quotaBucket_test.go
@@ -11,49 +11,59 @@ var _ = Describe("Test QuotaPeriod", func() { It("Valid NewQuotaPeriod", func() { //startTime before endTime - period := NewQuotaPeriod(1492324596, 1490047028, 1492725428) + period := NewQuotaPeriod(time.Now().UTC().AddDate(0, -1, 0).Unix(), + time.Now().UTC().AddDate(0, 0, -1).Unix(), + time.Now().UTC().AddDate(0, 1, 0).Unix()) isValid, err := period.Validate() - if !isValid || err != nil { - Fail("expected isValid: true and error: nil for NewQuotaPeriod") + if !isValid { + Fail("expected isValid true but got false") + } + if err != nil { + Fail("expected error <nil> but got " + err.Error()) } }) It("Invalid NewQuotaPeriod", func() { //startTime after endTime - period := NewQuotaPeriod(1492324596, 1492725428, 1490047028) + period := NewQuotaPeriod(time.Now().UTC().AddDate(0, -1, 0).Unix(), + time.Now().UTC().AddDate(0, 1, 0).Unix(), + time.Now().UTC().AddDate(0, 0, -1).Unix()) isValid, err := period.Validate() - if err == nil || isValid { - Fail("Expected isValid: false and error: <notNil> for invalid NewQuotaPeriod. startTime should be before endTime") + if isValid { + Fail("Expected isValid false but got true") + } + + if err == nil { + Fail(" Expected error but got <nil>") } }) - }) var _ = Describe("Test AcceptedQuotaTimeUnitTypes", func() { It("testTimeUnit", func() { if !IsValidTimeUnit("second") { - Fail("second is a valid TimeUnit") + Fail("Expected true: second is a valid TimeUnit") } if !IsValidTimeUnit("minute") { - Fail("minute is a valid TimeUnit") + Fail("Expected true: minute is a valid TimeUnit") } if !IsValidTimeUnit("hour") { - Fail("hour is a valid TimeUnit") + Fail("Expected true: hour is a valid TimeUnit") } if !IsValidTimeUnit("day") { - Fail("day is a valid TimeUnit") + Fail("Expected true: day is a valid TimeUnit") } if !IsValidTimeUnit("week") { - Fail("week is a valid TimeUnit") + Fail("Expected true: week is a valid TimeUnit") } if !IsValidTimeUnit("month") { - Fail("month is a valid TimeUnit") + Fail("Expected true: month is a valid TimeUnit") } //invalid type if IsValidTimeUnit("invalidType") { - Fail("invalidType is a invalid TimeUnit") + Fail("Expected false: invalidType is not a valid TimeUnit") } }) }) @@ -61,18 +71,18 @@ var _ = Describe("Test AcceptedQuotaBucketTypes", func() { It("testTimeUnit", func() { if !IsValidQuotaBucketType("synchronous") { - Fail("synchronous is a valid quotaBucket") + Fail("Expected true: synchronous is a valid quotaBucket") } if !IsValidQuotaBucketType("asynchronous") { - Fail("asynchronous is a valid quotaBucket") + Fail("Expected true: asynchronous is a valid quotaBucket") } if !IsValidQuotaBucketType("nonDistributed") { - Fail("nonDistributed is a valid quotaBucket") + Fail("Expected true: nonDistributed is a valid quotaBucket") } //invalid type if IsValidQuotaBucketType("invalidType") { - Fail("invalidType is a invalid quotaBucket") + Fail("Expected false: invalidType is a invalid quotaBucket") } }) }) @@ -87,15 +97,13 @@ interval := 1 maxCount := 10 preciseAtSecondsLevel := true - period := NewQuotaPeriod(time.Now().AddDate(0,-1,0).Unix(), - time.Now().AddDate(0,0,-1).Unix(), - time.Now().AddDate(0,1,0).Unix()) - startTime := int64(1492324596) + startTime := time.Now().UTC().AddDate(0, -1, 0).Unix() - quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType) - err := quotaBucket.Validate() + quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) Expect(err).NotTo(HaveOccurred()) + err = quotaBucket.Validate() + Expect(err).NotTo(HaveOccurred()) //also check if all the fields are set as expected sTime := time.Unix(startTime, 0) @@ -110,10 +118,13 @@ Expect(preciseAtSecondsLevel).To(Equal(quotaBucket.GetPreciseAtSecondsLevel())) getPeriod, err := quotaBucket.GetPeriod() Expect(err).NotTo(HaveOccurred()) - Expect(period).To(Equal(*getPeriod)) + Expect(getPeriod.GetPeriodInputStartTime().String()).ShouldNot(BeEmpty()) + Expect(getPeriod.GetPeriodStartTime().String()).ShouldNot(BeEmpty()) + Expect(getPeriod.GetPeriodEndTime().String()).ShouldNot(BeEmpty()) }) + //end before start It("Test invalid quotaPeriod", func() { edgeOrgID := "sampleOrg" id := "sampleID" @@ -123,11 +134,13 @@ interval := 1 maxCount := 10 preciseAtSecondsLevel := true - period := NewQuotaPeriod(1492324596, 1492725428, 1490047028) - startTime := int64(1492324596) + startTime := time.Now().UTC().AddDate(0, -1, 0).Unix() - quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType) - err := quotaBucket.Validate() + quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).NotTo(HaveOccurred()) + + quotaBucket.SetPeriod(time.Now().UTC().UTC().AddDate(0, 1, 0), time.Now().AddDate(0, 0, -1)) + err = quotaBucket.Validate() if err == nil { Fail("error expected but got <nil>") } @@ -146,18 +159,15 @@ interval := 1 maxCount := 10 preciseAtSecondsLevel := true - period := NewQuotaPeriod(time.Now().AddDate(0,-1,0).Unix(), - time.Now().AddDate(0,0,-1).Unix(), - time.Now().AddDate(0,1,0).Unix()) - startTime := int64(1492324596) + startTime := time.Now().UTC().AddDate(0, -1, 0).Unix() + quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).To(HaveOccurred()) - quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType) - err := quotaBucket.Validate() - if err == nil { - Fail("error expected but got <nil>") + if !strings.Contains(err.Error(), InvalidQuotaTimeUnitType) { + Fail("expected: " + InvalidQuotaTimeUnitType + "but got: " + err.Error()) } - if err.Error() != InvalidQuotaTimeUnitType { - Fail("expected: " + InvalidQuotaBucketType + "but got: " + err.Error()) + if quotaBucket != nil { + Fail("quotaBucket returned should be nil.") } }) @@ -171,28 +181,23 @@ interval := 1 maxCount := 10 preciseAtSecondsLevel := true - period := NewQuotaPeriod(time.Now().AddDate(0,-1,0).Unix(), - time.Now().AddDate(0,0,-1).Unix(), - time.Now().AddDate(0,1,0).Unix()) - startTime := time.Now().AddDate(0,-1,0).Unix() + startTime := time.Now().UTC().AddDate(0, -1, 0).Unix() - quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType) - err := quotaBucket.Validate() + quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).NotTo(HaveOccurred()) + + err = quotaBucket.Validate() if err == nil { Fail("error expected but got <nil>") } - if err.Error() != InvalidQuotaBucketType { - Fail("expected: " + InvalidQuotaBucketType + "but got: " + err.Error()) + if !strings.Contains(err.Error(), InvalidQuotaBucketType) { + Fail("expected: " + InvalidQuotaBucketType + " in the error message but got: " + err.Error()) } - }) }) - - - -var _ = Describe("IsCurrentPeriod", func(){ +var _ = Describe("IsCurrentPeriod", func() { It("Test RollingType Window Valid TestCase", func() { edgeOrgID := "sampleOrg" @@ -204,30 +209,34 @@ maxCount := 10 preciseAtSecondsLevel := true //InputStart time is before now - period := NewQuotaPeriod(time.Now().AddDate(0, -1,0).Unix(), - time.Now().AddDate(0,0, -1).Unix(), - time.Now().AddDate(0,1,0).Unix()) - startTime := time.Now().AddDate(0,-1,0).Unix() + startTime := time.Now().UTC().AddDate(0, -1, 0).Unix() - quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType) - err := quotaBucket.Validate() + quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) Expect(err).NotTo(HaveOccurred()) - if ok := period.IsCurrentPeriod(quotaBucket); !ok{ + err = quotaBucket.Validate() + Expect(err).NotTo(HaveOccurred()) + + period, err := quotaBucket.GetPeriod() + if err != nil { + Fail("no error expected") + } + if ok := period.IsCurrentPeriod(quotaBucket); !ok { Fail("Exprected true, returned: false") } //InputStart time is now - period = NewQuotaPeriod(time.Now().Unix(), - time.Now().AddDate(0,0,-1).Unix(), - time.Now().AddDate(0,1,0).Unix()) - startTime = time.Now().Unix() - quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType) + startTime = time.Now().UTC().Unix() + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).NotTo(HaveOccurred()) err = quotaBucket.Validate() Expect(err).NotTo(HaveOccurred()) - + period, err = quotaBucket.GetPeriod() + if err != nil { + Fail("no error expected") + } period.IsCurrentPeriod(quotaBucket) - if ok := period.IsCurrentPeriod(quotaBucket); !ok{ + if ok := period.IsCurrentPeriod(quotaBucket); !ok { Fail("Exprected true, returned: false") } }) @@ -243,30 +252,33 @@ maxCount := 10 preciseAtSecondsLevel := true //InputStart time is after now. - period := NewQuotaPeriod(time.Now().AddDate(0,1,0).Unix(), - time.Now().AddDate(0,1,0).Unix(), time.Now().AddDate(0,0,1).Unix()) - startTime := time.Now().AddDate(0,1,0).Unix() + startTime := time.Now().UTC().AddDate(0, 1, 0).Unix() - quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType) - err := quotaBucket.Validate() + quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) Expect(err).NotTo(HaveOccurred()) + err = quotaBucket.Validate() + Expect(err).NotTo(HaveOccurred()) - if ok := period.IsCurrentPeriod(quotaBucket); ok{ + quotaBucket.SetPeriod(time.Now().UTC().AddDate(0, -1, 0), time.Now().UTC().AddDate(0, 0, 1)) + period, err := quotaBucket.GetPeriod() + Expect(err).NotTo(HaveOccurred()) + if ok := period.IsCurrentPeriod(quotaBucket); ok { Fail("Exprected true, returned: false") } //endTime before startTime in period - startTime = time.Now().AddDate(0,-1,0).Unix() - quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType) - quotaBucket.SetPeriod(time.Now(), time.Now().AddDate(0,1,0)) - if ok := period.IsCurrentPeriod(quotaBucket); ok{ + startTime = time.Now().UTC().AddDate(0, -1, 0).Unix() + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).NotTo(HaveOccurred()) + + quotaBucket.SetPeriod(time.Now().UTC(), time.Now().UTC().AddDate(0, -1, 0)) + if ok := period.IsCurrentPeriod(quotaBucket); ok { Fail("Exprected false, returned: true") } }) - - It("Test NonRollingType Window Valid TestCases", func() { + It("Test calendarType Window Valid TestCases", func() { edgeOrgID := "sampleOrg" id := "sampleID" @@ -277,61 +289,74 @@ maxCount := 10 preciseAtSecondsLevel := true - //InputStart time is before now - period := NewQuotaPeriod(time.Now().AddDate(0, -1,0).Unix(), - time.Now().AddDate(0,0, -1).Unix(), - time.Now().AddDate(0,1,0).Unix()) - startTime := time.Now().AddDate(0,-1,0).Unix() + startTime := time.Now().UTC().UTC().AddDate(-1, -1, 0).Unix() - quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType) - err := quotaBucket.Validate() + quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) Expect(err).NotTo(HaveOccurred()) - if ok := period.IsCurrentPeriod(quotaBucket); !ok{ - Fail("Exprected true, returned: false") - } - - - //InputStart time is now - period = NewQuotaPeriod(time.Now().Unix(), - time.Now().AddDate(0,0,-1).Unix(), - time.Now().AddDate(0,1,0).Unix()) - startTime = time.Now().Unix() - quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType) err = quotaBucket.Validate() Expect(err).NotTo(HaveOccurred()) + period, err := quotaBucket.GetPeriod() + if err != nil { + Fail("no error expected but returned " + err.Error()) + } + if ok := period.IsCurrentPeriod(quotaBucket); !ok { + Fail("Exprected true, returned: false") + } + + //InputStart time is now + startTime = time.Now().UTC().Unix() + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).NotTo(HaveOccurred()) + + err = quotaBucket.Validate() + Expect(err).NotTo(HaveOccurred()) + + period, err = quotaBucket.GetPeriod() + if err != nil { + Fail("no error expected but returned " + err.Error()) + } period.IsCurrentPeriod(quotaBucket) - if ok := period.IsCurrentPeriod(quotaBucket); !ok{ + if ok := period.IsCurrentPeriod(quotaBucket); !ok { Fail("Exprected true, returned: false") } //start Time in period is before now - startTime = time.Now().Unix() - period = NewQuotaPeriod(time.Now().AddDate(0,-1,0).Unix(), - time.Now().AddDate(0,0,-1).Unix(), - time.Now().AddDate(0,1,0).Unix()) - quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType) + startTime = time.Now().UTC().Unix() + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).NotTo(HaveOccurred()) + err = quotaBucket.Validate() Expect(err).NotTo(HaveOccurred()) + quotaBucket.SetPeriod(time.Now().UTC().AddDate(0, 0, -1), + time.Now().UTC().AddDate(0, 1, 0)) + period, err = quotaBucket.GetPeriod() + if err != nil { + Fail("no error expected but returned " + err.Error()) + } period.IsCurrentPeriod(quotaBucket) - if ok := period.IsCurrentPeriod(quotaBucket); !ok{ + if ok := period.IsCurrentPeriod(quotaBucket); !ok { Fail("Exprected true, returned: false") } //start Time in period is now - startTime = time.Now().Unix() - period = NewQuotaPeriod(time.Now().AddDate(0,-1,0).Unix(), - time.Now().Unix(), - time.Now().AddDate(0,1,0).Unix()) - quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType) - err = quotaBucket.Validate() + startTime = time.Now().UTC().Unix() + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) Expect(err).NotTo(HaveOccurred()) + err = quotaBucket.Validate() + Expect(err).NotTo(HaveOccurred()) + quotaBucket.SetPeriod(time.Now().UTC(), + time.Now().UTC().AddDate(0, 1, 0)) + period, err = quotaBucket.GetPeriod() + if err != nil { + Fail("no error expected but returned " + err.Error()) + } period.IsCurrentPeriod(quotaBucket) - if ok := period.IsCurrentPeriod(quotaBucket); !ok{ + if ok := period.IsCurrentPeriod(quotaBucket); !ok { Fail("Exprected true, returned: false") } @@ -353,30 +378,40 @@ //} //end Time in period is after now - startTime = time.Now().Unix() - period = NewQuotaPeriod(time.Now().AddDate(0,-1,0).Unix(), - time.Now().AddDate(0,0,-1).Unix(), - time.Now().AddDate(0,1,0).Unix()) - quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType) + startTime = time.Now().UTC().Unix() + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).NotTo(HaveOccurred()) + err = quotaBucket.Validate() Expect(err).NotTo(HaveOccurred()) + quotaBucket.SetPeriod(time.Now().UTC().AddDate(0, 0, -1), + time.Now().UTC().AddDate(0, 1, 0)) + period, err = quotaBucket.GetPeriod() + if err != nil { + Fail("no error expected but returned " + err.Error()) + } + period.IsCurrentPeriod(quotaBucket) - if ok := period.IsCurrentPeriod(quotaBucket); !ok{ + if ok := period.IsCurrentPeriod(quotaBucket); !ok { Fail("Exprected true, returned: false") } //start time in period is before end time - startTime = time.Now().Unix() - period = NewQuotaPeriod(time.Now().AddDate(0,-1,0).Unix(), - time.Now().AddDate(0,-1,0).Unix(), - time.Now().AddDate(0,1,0).Unix()) - quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType) - err = quotaBucket.Validate() + startTime = time.Now().UTC().Unix() + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) Expect(err).NotTo(HaveOccurred()) + err = quotaBucket.Validate() + Expect(err).NotTo(HaveOccurred()) + quotaBucket.SetPeriod(time.Now().UTC().AddDate(0, 0, -1), + time.Now().UTC().AddDate(0, 1, 0)) + period, err = quotaBucket.GetPeriod() + if err != nil { + Fail("no error expected but returned " + err.Error()) + } period.IsCurrentPeriod(quotaBucket) - if ok := period.IsCurrentPeriod(quotaBucket); !ok{ + if ok := period.IsCurrentPeriod(quotaBucket); !ok { Fail("Exprected true, returned: false") } @@ -394,49 +429,51 @@ preciseAtSecondsLevel := true //InputStart time is after now. - period := NewQuotaPeriod(time.Now().AddDate(0,1,0).Unix(), - time.Now().AddDate(0,1,0).Unix(), time.Now().AddDate(1,0,1).Unix()) - startTime := time.Now().AddDate(0,1,0).Unix() + period := NewQuotaPeriod(time.Now().UTC().AddDate(0, 1, 0).Unix(), + time.Now().UTC().AddDate(0, 1, 0).Unix(), time.Now().AddDate(1, 0, 1).Unix()) + startTime := time.Now().UTC().AddDate(0, 1, 0).Unix() - quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType) - err := quotaBucket.Validate() + quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) Expect(err).NotTo(HaveOccurred()) - if ok := period.IsCurrentPeriod(quotaBucket); ok{ - Fail("Exprected true, returned: false") - } - - - //endTime is before start time - startTime = time.Now().AddDate(0,-1,0).Unix() - quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType) err = quotaBucket.Validate() Expect(err).NotTo(HaveOccurred()) - quotaBucket.SetPeriod(time.Now(), time.Now().AddDate(0,-1,0)) + if ok := period.IsCurrentPeriod(quotaBucket); ok { + Fail("Exprected true, returned: false") + } - if ok := period.IsCurrentPeriod(quotaBucket); ok{ + //endTime is before start time + startTime = time.Now().UTC().AddDate(0, -1, 0).Unix() + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).NotTo(HaveOccurred()) + + err = quotaBucket.Validate() + Expect(err).NotTo(HaveOccurred()) + + quotaBucket.SetPeriod(time.Now().UTC(), time.Now().UTC().AddDate(0, -1, 0)) + + if ok := period.IsCurrentPeriod(quotaBucket); ok { Fail("Exprected true, returned: false") } //start time in period after now - quotaBucket.SetPeriod(time.Now().AddDate(0,1,0), time.Now().AddDate(1,1,0)) + quotaBucket.SetPeriod(time.Now().AddDate(0, 1, 0), time.Now().AddDate(1, 1, 0)) - if ok := period.IsCurrentPeriod(quotaBucket); ok{ + if ok := period.IsCurrentPeriod(quotaBucket); ok { Fail("Exprected true, returned: false") } //end time in period is before now - quotaBucket.SetPeriod(time.Now().AddDate(-1,-1,0), time.Now().AddDate(0,-1,0)) + quotaBucket.SetPeriod(time.Now().UTC().AddDate(-1, -1, 0), time.Now().UTC().AddDate(0, -1, 0)) - if ok := period.IsCurrentPeriod(quotaBucket); ok{ + if ok := period.IsCurrentPeriod(quotaBucket); ok { Fail("Exprected true, returned: false") } }) }) - var _ = Describe("Test GetPeriod and setCurrentPeriod", func() { It("Valid GetPeriod", func() { edgeOrgID := "sampleOrg" @@ -448,60 +485,58 @@ maxCount := 10 preciseAtSecondsLevel := true //InputStart time is before now - period := NewQuotaPeriod(time.Now().AddDate(0, -1,0).Unix(), - time.Now().AddDate(0,0, -1).Unix(), - time.Now().AddDate(0,1,0).Unix()) - startTime := time.Now().AddDate(0,-1,0).Unix() - quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType) - err := quotaBucket.Validate() + startTime := time.Now().UTC().AddDate(0, -1, 0).Unix() + quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).NotTo(HaveOccurred()) + + quotaBucket.SetPeriod(time.Now().UTC().AddDate(0, 0, -1), time.Now().UTC().AddDate(0, 1, 0)) + err = quotaBucket.Validate() Expect(err).NotTo(HaveOccurred()) qPeriod, err := quotaBucket.GetPeriod() Expect(err).NotTo(HaveOccurred()) // check if the rolling window was set properly Expect(qPeriod.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime())) - if !qPeriod.GetPeriodEndTime().After(qPeriod.GetPeriodStartTime()){ + if !qPeriod.GetPeriodEndTime().After(qPeriod.GetPeriodStartTime()) { Fail("Rolling Window was not set as expected") } intervalDuration := qPeriod.GetPeriodEndTime().Sub(qPeriod.GetPeriodStartTime()) expectedDuration, err := GetIntervalDurtation(quotaBucket) Expect(intervalDuration).Should(Equal(expectedDuration)) - //for non rolling Type window do not setCurrentPeriod as endTime is > time.now. quotaType = "calendar" - pstartTime := time.Now().AddDate(0,-1,0) - pendTime := time.Now().AddDate(0,1,0) - quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType) + pstartTime := time.Now().UTC().AddDate(0, -1, 0) + pendTime := time.Now().UTC().AddDate(0, 1, 0) + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).NotTo(HaveOccurred()) + quotaBucket.SetPeriod(pstartTime, pendTime) qPeriod, err = quotaBucket.GetPeriod() Expect(err).NotTo(HaveOccurred()) // check if the calendar window was set properly Expect(qPeriod.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime())) - if !qPeriod.GetPeriodEndTime().After(qPeriod.GetPeriodStartTime()){ + if !qPeriod.GetPeriodEndTime().After(qPeriod.GetPeriodStartTime()) { Fail("Rolling Window was not set as expected") } //for non rolling Type window setCurrentPeriod as endTime is < time.now. quotaType = "calendar" - pstartTime = time.Now().AddDate(0,-1,0) - pendTime = time.Now().AddDate(0,-1,0) - quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType) + pstartTime = time.Now().UTC().AddDate(0, -1, 0) + pendTime = time.Now().UTC().AddDate(0, -1, 0) + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).NotTo(HaveOccurred()) + quotaBucket.SetPeriod(pstartTime, pendTime) qPeriod, err = quotaBucket.GetPeriod() Expect(err).NotTo(HaveOccurred()) // check if the calendar window was set properly Expect(qPeriod.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime())) - if !qPeriod.GetPeriodEndTime().After(qPeriod.GetPeriodStartTime()){ - Fail("Rolling Window was not set as expected") + if !qPeriod.GetPeriodEndTime().After(qPeriod.GetPeriodStartTime()) { + Fail("period for Non Rolling Window Type was not set as expected") } intervalDuration = qPeriod.GetPeriodEndTime().Sub(qPeriod.GetPeriodStartTime()) expectedDuration, err = GetIntervalDurtation(quotaBucket) Expect(intervalDuration).Should(Equal(expectedDuration)) - - - }) - }) -
diff --git a/quotaBucket/quotaDescriptorType.go b/quotaBucket/quotaDescriptorType.go index c94333c..87e8f0c 100644 --- a/quotaBucket/quotaDescriptorType.go +++ b/quotaBucket/quotaDescriptorType.go
@@ -2,7 +2,6 @@ import ( "errors" - "fmt" "strings" "time" ) @@ -17,7 +16,7 @@ SetCurrentPeriod(bucket *QuotaBucket) error } -func GetQuotaTypeHandler(qType string) (QuotaDescriptorType, error) { +func GetQuotaDescriptorTypeHandler(qType string) (QuotaDescriptorType, error) { var qDescriptor QuotaDescriptorType quotaType := strings.ToLower(strings.TrimSpace(qType)) switch quotaType { @@ -28,7 +27,7 @@ qDescriptor = &RollingWindowQuotaDescriptorType{} return qDescriptor, nil default: - return nil, errors.New("Quota type " + qType + " in the request is not supported") + return nil, errors.New(InvalidQuotaDescriptorType + " Quota type " + qType + " in the request is not supported") } } @@ -37,11 +36,11 @@ func (c CalendarQuotaDescriptorType) SetCurrentPeriod(qbucket *QuotaBucket) error { startTime := qbucket.GetStartTime() - currentPeriod,err := qbucket.GetQuotaBucketPeriod() -if err != nil { - return err -} - if startTime.Before(time.Now()) || startTime.Equal(time.Now()) { + currentPeriod, err := qbucket.GetQuotaBucketPeriod() + if err != nil { + return err + } + if startTime.Before(time.Now().UTC()) || startTime.Equal(time.Now().UTC()) { if currentPeriod != nil { if currentPeriod.IsCurrentPeriod(qbucket) { return nil @@ -60,7 +59,7 @@ } var currentStart, currentEnd time.Time - now := time.Now() + now := time.Now().UTC() timeUnit := strings.ToLower(strings.TrimSpace(qbucket.TimeUnit)) switch timeUnit { case TimeUnitSECOND: @@ -95,19 +94,22 @@ currentStart = time.Date(now.Year(), now.Month(), 0, 0, 0, 0, 0, time.UTC) currentEnd = currentStart.AddDate(0, qbucket.Interval, 0) break + default: + return errors.New(InvalidQuotaTimeUnitType + " : ignoring unrecognized timeUnit : " + timeUnit) + } qbucket.SetPeriod(currentStart, currentEnd) - fmt.Println("inside calendar set period: ", qbucket.quotaBucketData.Period) return nil } type RollingWindowQuotaDescriptorType struct{} func (c RollingWindowQuotaDescriptorType) SetCurrentPeriod(qbucket *QuotaBucket) error { + //yet to implement var currentStart, currentEnd time.Time - currentEnd = time.Now() + currentEnd = time.Now().UTC() interval, err := GetIntervalDurtation(qbucket) if err != nil { return errors.New("error in SetCurrentPeriod: " + err.Error()) @@ -118,6 +120,7 @@ return nil } func GetIntervalDurtation(qb *QuotaBucket) (time.Duration, error) { + timeUnit := strings.ToLower(strings.TrimSpace(qb.TimeUnit)) switch timeUnit { case TimeUnitSECOND: @@ -131,9 +134,9 @@ case TimeUnitWEEK: return time.Duration(int64(qb.Interval*24*7) * time.Hour.Nanoseconds()), nil case TimeUnitMONTH: - now := time.Now() + now := time.Now().UTC() var currentStart, currentEnd time.Time - quotaType := strings.ToLower(strings.TrimSpace(qb.QuotaType)) + quotaType := strings.ToLower(strings.TrimSpace(qb.QuotaDescriptorType)) switch quotaType { case QuotaTypeCalendar: currentStart = time.Date(now.Year(), now.Month(), 0, 0, 0, 0, 0, time.UTC) @@ -144,11 +147,11 @@ currentStart = currentEnd.AddDate(0, -qb.Interval, 0) return currentEnd.Sub(currentStart), nil default: - return time.Duration(0), errors.New("Ignoring unrecognized quotaType : " + quotaType) + return time.Duration(0), errors.New(InvalidQuotaDescriptorType + " : ignoring unrecognized quotaType : " + quotaType) } default: - return time.Duration(0), errors.New("Ignoring unrecognized timeUnit : " + timeUnit) + return time.Duration(0), errors.New(InvalidQuotaTimeUnitType + " : ignoring unrecognized timeUnit : " + timeUnit) }
diff --git a/quotaBucket/quotaDescriptorType_test.go b/quotaBucket/quotaDescriptorType_test.go index 22a4a08..0bd44cf 100644 --- a/quotaBucket/quotaDescriptorType_test.go +++ b/quotaBucket/quotaDescriptorType_test.go
@@ -1,9 +1,411 @@ package quotaBucket_test import ( + . "github.com/30x/apidQuota/quotaBucket" . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "time" + "strings" + "reflect" ) -var _ = Describe("QuotaDescriptorType", func() { +var _ = Describe("Check Descriptor Type ", func() { + It("test Calendar Type descriptor", func() { + descriptorType, err := GetQuotaDescriptorTypeHandler("calendar") + Expect(err).NotTo(HaveOccurred()) + if reflect.TypeOf(descriptorType)!= reflect.TypeOf(&CalendarQuotaDescriptorType{}){ + Fail("Excepted CalendarQuotaDescriptorType, but got: " + reflect.TypeOf(descriptorType).String()) + } + }) + + FIt("test RollingWindow Type descriptor", func() { + descriptorType, err := GetQuotaDescriptorTypeHandler("rollingwindow") + Expect(err).NotTo(HaveOccurred()) + if reflect.TypeOf(descriptorType)!= reflect.TypeOf(&RollingWindowQuotaDescriptorType{}){ + Fail("Excepted RollingWindowQuotaDescriptorType, but got: " + reflect.TypeOf(descriptorType).String()) + } + }) + + FIt("test invalid Type descriptor", func() { + _, err := GetQuotaDescriptorTypeHandler("invalidDescriptorType") + Expect(err).To(HaveOccurred()) + if !strings.Contains(err.Error(), InvalidQuotaDescriptorType) { + Fail("Excepted error to contain: " + InvalidQuotaDescriptorType + " but got: " + err.Error()) + } + }) }) + +var _ = Describe("QuotaDescriptorType", func() { + It("Valid testcases for CalendarType", func() { + + // test set period for timeUnit=second + edgeOrgID := "sampleOrg" + id := "sampleID" + timeUnit := "second" + quotaType := "calendar" + bucketType := "synchronous" + interval := 1 + maxCount := 10 + preciseAtSecondsLevel := true + startTime := time.Now().UTC().UTC().AddDate(0, -1, 0).Unix() + + quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).NotTo(HaveOccurred()) + + err = quotaBucket.Validate() + Expect(err).NotTo(HaveOccurred()) + + period, err := quotaBucket.GetPeriod() + Expect(err).NotTo(HaveOccurred()) + // check if the calendar window was set properly + Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime())) + if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) { + Fail("period for Calendar Type was not set as expected") + } + Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty()) + Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty()) + intervalDuration := period.GetPeriodEndTime().Sub(period.GetPeriodStartTime()) + Expect(intervalDuration).Should(Equal(time.Second)) + + + // test set period for timeUnit=minute + timeUnit = "minute" + + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).NotTo(HaveOccurred()) + + err = quotaBucket.Validate() + Expect(err).NotTo(HaveOccurred()) + + period, err = quotaBucket.GetPeriod() + Expect(err).NotTo(HaveOccurred()) + // check if the calendar window was set properly + Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime())) + if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) { + Fail("period for Calendar Type was not set as expected") + } + Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty()) + Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty()) + intervalDuration = period.GetPeriodEndTime().Sub(period.GetPeriodStartTime()) + Expect(intervalDuration).Should(Equal(time.Minute)) + + // test set period for timeUnit=hour + timeUnit = "hour" + + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).NotTo(HaveOccurred()) + + err = quotaBucket.Validate() + Expect(err).NotTo(HaveOccurred()) + + period, err = quotaBucket.GetPeriod() + Expect(err).NotTo(HaveOccurred()) + // check if the calendar window was set properly + Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime())) + if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) { + Fail("period for Calendar Type was not set as expected") + } + Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty()) + Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty()) + intervalDuration = period.GetPeriodEndTime().Sub(period.GetPeriodStartTime()) + Expect(intervalDuration).Should(Equal(time.Hour)) + + + // test set period for timeUnit=day + timeUnit = "day" + + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).NotTo(HaveOccurred()) + + err = quotaBucket.Validate() + Expect(err).NotTo(HaveOccurred()) + + period, err = quotaBucket.GetPeriod() + Expect(err).NotTo(HaveOccurred()) + // check if the calendar window was set properly + Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime())) + if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) { + Fail("period for Calendar Type was not set as expected") + } + Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty()) + Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty()) + intervalDuration = period.GetPeriodEndTime().Sub(period.GetPeriodStartTime()) + Expect(intervalDuration).Should(Equal(24 * time.Hour)) + + // test set period for timeUnit=week + timeUnit = "week" + + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).NotTo(HaveOccurred()) + + err = quotaBucket.Validate() + Expect(err).NotTo(HaveOccurred()) + + period, err = quotaBucket.GetPeriod() + Expect(err).NotTo(HaveOccurred()) + // check if the calendar window was set properly + Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime())) + if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) { + Fail("period for Calendar Type was not set as expected") + } + Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty()) + Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty()) + intervalDuration = period.GetPeriodEndTime().Sub(period.GetPeriodStartTime()) + Expect(intervalDuration).Should(Equal(7 * 24 * time.Hour)) + + + // test set period for timeUnit=month + timeUnit = "month" + + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).NotTo(HaveOccurred()) + + err = quotaBucket.Validate() + Expect(err).NotTo(HaveOccurred()) + + period, err = quotaBucket.GetPeriod() + Expect(err).NotTo(HaveOccurred()) + // check if the calendar window was set properly + Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime())) + if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) { + Fail("period for Calendar Type was not set as expected") + } + Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty()) + Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty()) + intervalDuration = period.GetPeriodEndTime().Sub(period.GetPeriodStartTime()) + addMonthToStartDate := period.GetPeriodStartTime().AddDate(0,interval*1,0) + actualDuration := addMonthToStartDate.Sub(period.GetPeriodStartTime()) + Expect(intervalDuration).Should(Equal(actualDuration)) + + }) + + It("inValid testcases for CalendarType", func() { + + // test set period for timeUnit=second + edgeOrgID := "sampleOrg" + id := "sampleID" + timeUnit := "second" + quotaType := "calendar" + bucketType := "synchronous" + interval := 1 + maxCount := 10 + preciseAtSecondsLevel := true + startTime := time.Now().UTC().UTC().AddDate(0, -1, 0).Unix() + + quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).NotTo(HaveOccurred()) + + err = quotaBucket.Validate() + Expect(err).NotTo(HaveOccurred()) + + period, err := quotaBucket.GetPeriod() + Expect(err).NotTo(HaveOccurred()) + // check if the calendar window was set properly + Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime())) + if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) { + Fail("period for Calendar Type was not set as expected") + } + Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty()) + Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty()) + intervalDuration := period.GetPeriodEndTime().Sub(period.GetPeriodStartTime()) + Expect(intervalDuration).Should(Equal(time.Second)) + + + // test set period for timeUnit=month + timeUnit = "invalidTimeUnit" + + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).To(HaveOccurred()) + if ok := strings.Contains(err.Error(),InvalidQuotaTimeUnitType); !ok { + Fail("expected error to contain " + InvalidQuotaTimeUnitType + " but got different error message: " + err.Error()) + } + + }) + + It("Valid testcases for RollingWindow Type", func() { + + // test set period for timeUnit=second + edgeOrgID := "sampleOrg" + id := "sampleID" + timeUnit := "second" + quotaType := "rollingWindow" + bucketType := "synchronous" + interval := 1 + maxCount := 10 + preciseAtSecondsLevel := true + startTime := time.Now().UTC().UTC().AddDate(0, -1, 0).Unix() + + quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).NotTo(HaveOccurred()) + + err = quotaBucket.Validate() + Expect(err).NotTo(HaveOccurred()) + + period, err := quotaBucket.GetPeriod() + Expect(err).NotTo(HaveOccurred()) + // check if the calendar window was set properly + Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime())) + if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) { + Fail("period for Rolling Window Type was not set as expected") + } + Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty()) + Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty()) + intervalDuration := period.GetPeriodEndTime().Sub(period.GetPeriodStartTime()) + Expect(intervalDuration).Should(Equal(time.Second)) + + + // test set period for timeUnit=minute + timeUnit = "minute" + + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).NotTo(HaveOccurred()) + + err = quotaBucket.Validate() + Expect(err).NotTo(HaveOccurred()) + + period, err = quotaBucket.GetPeriod() + Expect(err).NotTo(HaveOccurred()) + // check if the calendar window was set properly + Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime())) + if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) { + Fail("period for Rolling Window Type was not set as expected") + } + Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty()) + Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty()) + intervalDuration = period.GetPeriodEndTime().Sub(period.GetPeriodStartTime()) + Expect(intervalDuration).Should(Equal(time.Minute)) + + // test set period for timeUnit=hour + timeUnit = "hour" + + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).NotTo(HaveOccurred()) + + err = quotaBucket.Validate() + Expect(err).NotTo(HaveOccurred()) + + period, err = quotaBucket.GetPeriod() + Expect(err).NotTo(HaveOccurred()) + // check if the calendar window was set properly + Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime())) + if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) { + Fail("period for Rolling Window Type was not set as expected") + } + Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty()) + Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty()) + intervalDuration = period.GetPeriodEndTime().Sub(period.GetPeriodStartTime()) + Expect(intervalDuration).Should(Equal(time.Hour)) + + + // test set period for timeUnit=day + timeUnit = "day" + + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).NotTo(HaveOccurred()) + + err = quotaBucket.Validate() + Expect(err).NotTo(HaveOccurred()) + + period, err = quotaBucket.GetPeriod() + Expect(err).NotTo(HaveOccurred()) + // check if the calendar window was set properly + Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime())) + if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) { + Fail("period for Rolling Window Type was not set as expected") + } + Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty()) + Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty()) + intervalDuration = period.GetPeriodEndTime().Sub(period.GetPeriodStartTime()) + Expect(intervalDuration).Should(Equal(24 * time.Hour)) + + // test set period for timeUnit=week + timeUnit = "week" + + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).NotTo(HaveOccurred()) + + err = quotaBucket.Validate() + Expect(err).NotTo(HaveOccurred()) + + period, err = quotaBucket.GetPeriod() + Expect(err).NotTo(HaveOccurred()) + // check if the calendar window was set properly + Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime())) + if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) { + Fail("period for Rolling Window Type was not set as expected") + } + Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty()) + Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty()) + intervalDuration = period.GetPeriodEndTime().Sub(period.GetPeriodStartTime()) + Expect(intervalDuration).Should(Equal(7 * 24 * time.Hour)) + + + // test set period for timeUnit=month + timeUnit = "month" + + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).NotTo(HaveOccurred()) + + err = quotaBucket.Validate() + Expect(err).NotTo(HaveOccurred()) + + period, err = quotaBucket.GetPeriod() + Expect(err).NotTo(HaveOccurred()) + // check if the calendar window was set properly + Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime())) + if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) { + Fail("period for Rolling Window Type was not set as expected") + } + Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty()) + Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty()) + intervalDuration = period.GetPeriodEndTime().Sub(period.GetPeriodStartTime()) + addMonthToStartDate := period.GetPeriodStartTime().AddDate(0,interval*1,0) + actualDuration := addMonthToStartDate.Sub(period.GetPeriodStartTime()) + Expect(intervalDuration).Should(Equal(actualDuration)) + + }) + + It("inValid testcases for RollingWindow Type", func() { + + // test set period for timeUnit=second + edgeOrgID := "sampleOrg" + id := "sampleID" + timeUnit := "second" + quotaType := "rollingwindow" + bucketType := "synchronous" + interval := 1 + maxCount := 10 + preciseAtSecondsLevel := true + startTime := time.Now().UTC().UTC().AddDate(0, -1, 0).Unix() + + quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).NotTo(HaveOccurred()) + + err = quotaBucket.Validate() + Expect(err).NotTo(HaveOccurred()) + + period, err := quotaBucket.GetPeriod() + Expect(err).NotTo(HaveOccurred()) + // check if the calendar window was set properly + Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime())) + if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) { + Fail("period for Rolling Window Type was not set as expected") + } + Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty()) + Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty()) + intervalDuration := period.GetPeriodEndTime().Sub(period.GetPeriodStartTime()) + Expect(intervalDuration).Should(Equal(time.Second)) + + + // test set period for timeUnit=month + timeUnit = "invalidTimeUnit" + + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType) + Expect(err).To(HaveOccurred()) + if ok := strings.Contains(err.Error(),InvalidQuotaTimeUnitType); !ok { + Fail("expected error to contain " + InvalidQuotaTimeUnitType + " but got different error message: " + err.Error()) + } + + }) +}) \ No newline at end of file
diff --git a/services/counterServiceHelper.go b/services/counterServiceHelper.go new file mode 100644 index 0000000..8568d8d --- /dev/null +++ b/services/counterServiceHelper.go
@@ -0,0 +1,101 @@ +package services + +import ( + "bytes" + "encoding/json" + "errors" + "github.com/30x/apidQuota/constants" + "github.com/30x/apidQuota/globalVariables" + "io/ioutil" + "net/http" + "net/url" + "time" +) + +const ( + edgeOrgID = "orgId" + key = "key" + delta = "delta" +) + +var client *http.Client = &http.Client{ + //setting the timeout to 60 sec for requests to counterService + Timeout: time.Duration(60 * time.Second), +} + +func IncrementAndGetCount(orgID string, quotaKey string, count int) (int, error) { + headers := http.Header{} + headers.Set("Accept", "application/json") + headers.Set("Content-Type", "application/json") + + method := "POST" + + if globalVariables.CounterServiceURL == "" { + return 0, errors.New(constants.URLCounterServiceNotSet) + } + + serviceURL, err := url.Parse(globalVariables.CounterServiceURL) + if err != nil { + return 0, errors.New(constants.URLCounterServiceInvalid) + } + + //'{ "orgId": "test_org", "delta": 1, "key": "fixed-test-key" } ' + reqBody := make(map[string]interface{}) + reqBody[edgeOrgID] = orgID + reqBody[key] = quotaKey + reqBody[delta] = count + + reqBodyBytes, err := json.Marshal(reqBody) + if err != nil { + return 0, errors.New(constants.MarshalJSONError) + } + + contentLength := len(reqBodyBytes) + request := &http.Request{ + Header: headers, + Method: method, + URL: serviceURL, + Body: ioutil.NopCloser(bytes.NewReader(reqBodyBytes)), + ContentLength: int64(contentLength), + } + + resp, err := client.Do(request) + + if err != nil { + return 0, errors.New("error calling CounterService: " + err.Error()) + } + + globalVariables.Log.Debug("response: ", resp) + if resp.StatusCode != http.StatusOK { + if resp.StatusCode == http.StatusNotFound { + return 0, errors.New(err.Error()) + } + respBodyBytes, err := ioutil.ReadAll(resp.Body) + if err != nil { + + } + return 0, errors.New("response from counter service: " + resp.Status + " and response body is: " + string(respBodyBytes)) + + } + + respBodyBytes, err := ioutil.ReadAll(resp.Body) + respBody := make(map[string]interface{}) + err = json.Unmarshal(respBodyBytes, &respBody) + if err != nil { + return 0, errors.New("unable to parse response from counter service, error: " + err.Error()) + } + + respCount, ok := respBody["count"] + if !ok { + return 0, errors.New(`invalid response from counter service. field 'count' not sent in the response`) + } + + globalVariables.Log.Debug("responseCount: ", respCount) + respCountInt, ok := respCount.(int) + if !ok { + return 0, errors.New(`invalid response from counter service. field 'count' sent in the response is not int`) + } + + return respCountInt, nil + +}
diff --git a/util.go b/util/util.go similarity index 96% rename from util.go rename to util/util.go index 696d5bc..5e8d6b6 100644 --- a/util.go +++ b/util/util.go
@@ -1,4 +1,4 @@ -package apidQuota +package util import ( "encoding/json"