fixed tests, added apigeesync_token header for counter service
diff --git a/api_test.go b/api_test.go
index 226b3d3..ff3acbb 100644
--- a/api_test.go
+++ b/api_test.go
@@ -2,10 +2,8 @@
import (
. "github.com/onsi/ginkgo"
- //"net/http"
"bytes"
"encoding/json"
- "fmt"
"github.com/google/uuid"
"io/ioutil"
"net/http"
@@ -61,10 +59,9 @@
respBody := make(map[string]interface{})
err = json.Unmarshal(respBodyBytes, &respBody)
if err != nil {
- fmt.Println("error: ", err)
+ Fail("error: " + err.Error())
}
- fmt.Println(respBody)
Fail("wrong status code: " + res.Status)
}
@@ -107,7 +104,7 @@
respBody := make(map[string]interface{})
err = json.Unmarshal(respBodyBytes, &respBody)
if err != nil {
- fmt.Println("error: ", err)
+ Fail("error: " + err.Error())
}
Fail("wrong status code: " + res.Status)
@@ -175,7 +172,7 @@
respBody := make(map[string]interface{})
err = json.Unmarshal(respBodyBytes, &respBody)
if err != nil {
- fmt.Println("error: ", err)
+ Fail("error: " + err.Error())
}
Fail("wrong status code: " + res.Status)
diff --git a/constants/constants.go b/constants/constants.go
index 6a15ea1..2b640ac 100644
--- a/constants/constants.go
+++ b/constants/constants.go
@@ -3,6 +3,9 @@
import "time"
const (
+ //config variables.
+ ApigeeSyncBearerToken = "apigeesync_bearer_token"
+ ConfigCounterServiceBasePath = "apidquota_counterService_base_path"
//add to acceptedTimeUnitList in init() if case any other new timeUnit is added
TimeUnitSECOND = "second"
@@ -14,9 +17,9 @@
//errors
InvalidQuotaTimeUnitType = "invalidQuotaTimeUnitType"
- InvalidQuotaBucketType = "invalidQuotaType"
- InvalidQuotaType = "invalidQUotaType"
+ InvalidQuotaType = "invalidQuotaType"
InvalidQuotaPeriod = "invalidQuotaPeriod"
+ AsyncQuotaBucketEmpty = "AsyncDetails_for_quotaBucket_are_empty"
QuotaTypeCalendar = "calendar" // after start time
QuotaTypeRollingWindow = "rollingwindow" // in the past "window" time
@@ -33,7 +36,6 @@
ErrorCheckingQuotaLimit = "error_checking_quota_limit"
QuotaBasePathDefault = "/quota"
- ConfigCounterServiceBasePath = "counterService_base_path"
URLCounterServiceNotSet = "url_counter_service_not_set"
URLCounterServiceInvalid = "url_counter_service_invalid"
MarshalJSONError = "marshal_JSON_error"
diff --git a/quotaBucket/apiUtil.go b/quotaBucket/apiUtil.go
index 6a13039..600ef01 100644
--- a/quotaBucket/apiUtil.go
+++ b/quotaBucket/apiUtil.go
@@ -244,6 +244,7 @@
return nil
}
+ //for non distributed quotaBucket
//retrieveFromCache.
newQBucket, ok = getFromCache(cacheKey, weight)
diff --git a/quotaBucket/quotaBucket.go b/quotaBucket/quotaBucket.go
index f67137c..c23f428 100644
--- a/quotaBucket/quotaBucket.go
+++ b/quotaBucket/quotaBucket.go
@@ -31,16 +31,16 @@
endTime time.Time
}
-func (qp *quotaPeriod) GetPeriodStartTime() time.Time {
-
- return qp.startTime
-}
-
func (qp *quotaPeriod) GetPeriodInputStartTime() time.Time {
return qp.inputStartTime
}
+func (qp *quotaPeriod) GetPeriodStartTime() time.Time {
+
+ return qp.startTime
+}
+
func (qp *quotaPeriod) GetPeriodEndTime() time.Time {
return qp.endTime
@@ -65,44 +65,12 @@
qTicker *time.Ticker
}
-func (qAsync *aSyncQuotaBucket) getAsyncGlobalCount() (int64, error) {
-
- if qAsync != nil {
- return qAsync.asyncGLobalCount, nil
- }
- return 0, errors.New("aSyncDetails for QuotaBucket are empty.")
-}
-
-func (qAsync *aSyncQuotaBucket) getAsyncQTicker() (*time.Ticker, error) {
-
- if qAsync != nil {
- return qAsync.qTicker, nil
- }
- return nil, errors.New("AsyncDetails for QuotaBucket are empty.")
-}
-
-func (qAsync *aSyncQuotaBucket) addToAsyncLocalMessageCount(count int64) error {
-
- if qAsync != nil {
- atomic.AddInt64(&qAsync.asyncLocalMessageCount, count)
- }
- return errors.New("AsyncDetails for QuotaBucket are empty. ")
-}
-
-func (qAsync *aSyncQuotaBucket) getAsyncLocalMessageCount() (int64, error) {
-
- if qAsync != nil {
- return qAsync.asyncLocalMessageCount, nil
- }
- return 0, errors.New("AsyncDetails for QuotaBucket are empty. ")
-}
-
func (qAsync *aSyncQuotaBucket) getAsyncSyncTime() (int64, error) {
if qAsync != nil {
return qAsync.syncTimeInSec, nil
}
- return 0, errors.New("AsyncDetails for QuotaBucket are empty. ")
+ return 0, errors.New(constants.AsyncQuotaBucketEmpty)
}
func (qAsync *aSyncQuotaBucket) getAsyncSyncMessageCount() (int64, error) {
@@ -110,7 +78,31 @@
if qAsync != nil {
return qAsync.syncMessageCount, nil
}
- return 0, errors.New("AsyncDetails for QuotaBucket are empty. ")
+ return 0, errors.New(constants.AsyncQuotaBucketEmpty)
+}
+
+func (qAsync *aSyncQuotaBucket) getAsyncLocalMessageCount() (int64, error) {
+
+ if qAsync != nil {
+ return qAsync.asyncLocalMessageCount, nil
+ }
+ return 0, errors.New(constants.AsyncQuotaBucketEmpty)
+}
+
+func (qAsync *aSyncQuotaBucket) addToAsyncLocalMessageCount(count int64) error {
+
+ if qAsync != nil {
+ atomic.AddInt64(&qAsync.asyncLocalMessageCount, count)
+ }
+ return errors.New(constants.AsyncQuotaBucketEmpty)
+}
+
+func (qAsync *aSyncQuotaBucket) getAsyncGlobalCount() (int64, error) {
+
+ if qAsync != nil {
+ return qAsync.asyncGLobalCount, nil
+ }
+ return 0, errors.New(constants.AsyncQuotaBucketEmpty)
}
func (qAsync *aSyncQuotaBucket) getAsyncIsInitialized() (bool, error) {
@@ -118,7 +110,33 @@
if qAsync != nil {
return qAsync.initialized, nil
}
- return false, errors.New("AsyncDetails for QuotaBucket are empty. ")
+ return false, errors.New(constants.AsyncQuotaBucketEmpty)
+}
+
+func (qAsync *aSyncQuotaBucket) getAsyncQTicker() (*time.Ticker, error) {
+
+ if qAsync != nil {
+ return qAsync.qTicker, nil
+ }
+ return nil, errors.New(constants.AsyncQuotaBucketEmpty)
+}
+
+func (qAsync *aSyncQuotaBucket) getAsyncCounter() (*[]int64, error) {
+
+ if qAsync != nil {
+ return qAsync.asyncCounter, nil
+ }
+ return nil, errors.New(constants.AsyncQuotaBucketEmpty)
+}
+
+func (aSyncbucket *aSyncQuotaBucket) addToCounter(weight int64) error {
+
+ if aSyncbucket == nil {
+ return errors.New(constants.AsyncQuotaBucketEmpty)
+ }
+
+ *aSyncbucket.asyncCounter = append(*aSyncbucket.asyncCounter, weight)
+ return nil
}
func (aSyncbucket *aSyncQuotaBucket) getCount(q *QuotaBucket, period *quotaPeriod) (int64, error) {
@@ -137,16 +155,6 @@
return aSyncbucket.asyncGLobalCount + aSyncbucket.asyncLocalMessageCount, nil
}
-func (aSyncbucket *aSyncQuotaBucket) addToCounter(weight int64) error {
-
- if aSyncbucket == nil {
- return errors.New("AsyncDetails for QuotaBucket are empty. ")
- }
-
- *aSyncbucket.asyncCounter = append(*aSyncbucket.asyncCounter, weight)
- return nil
-}
-
type quotaBucketData struct {
EdgeOrgID string
ID string
@@ -191,9 +199,18 @@
quotaBucketData: quotaBucketDataStruct,
}
+ if !quotaBucket.IsDistrubuted() {
+ if quotaBucket.IsSynchronous(){
+ return nil, errors.New("quota bucket cannot be both nonDistributed and synchronous.")
+ }
+ }
//for async set AsyncQuotaDetails and start the NewTicker
if distributed && !synchronous {
var quotaTicker int64
+ //ensure just one of syncTimeInSec and syncMessageCount is set.
+ if syncTimeInSec > -1 && syncMessageCount > -1 {
+ return nil,errors.New("both syncTimeInSec and syncMessageCount canot be set. only one of them should be set.")
+ }
//set default syncTime for AsyncQuotaBucket.
//for aSyncQuotaBucket with 'syncMessageCount' the ticker is invoked with DefaultQuotaSyncTime
quotaTicker = constants.DefaultQuotaSyncTime
@@ -260,7 +277,7 @@
}
if ok := IsValidType(strings.ToLower(q.GetType())); !ok {
- return errors.New(constants.InvalidQuotaBucketType)
+ return errors.New(constants.InvalidQuotaType)
}
//check if the period is valid
diff --git a/quotaBucket/quotaBucketType.go b/quotaBucket/quotaBucketType.go
index 5b3cbbc..cb3c1b7 100644
--- a/quotaBucket/quotaBucketType.go
+++ b/quotaBucket/quotaBucketType.go
@@ -3,6 +3,7 @@
import (
"errors"
"github.com/30x/apidQuota/services"
+ "github.com/30x/apidQuota/constants"
)
type QuotaBucketType interface {
@@ -89,6 +90,9 @@
return nil, errors.New("error getting period: " + err.Error())
}
aSyncBucket := q.GetAsyncQuotaBucket()
+ if aSyncBucket == nil {
+ return nil, errors.New(constants.AsyncQuotaBucketEmpty + " : aSyncQuotaBucket to increment cannot be empty.")
+ }
currentCount, err := aSyncBucket.getCount(q, period)
if err != nil {
return nil, err
@@ -114,13 +118,22 @@
}
- if aSyncBucket.syncMessageCount > 0 &&
- aSyncBucket.asyncLocalMessageCount >= aSyncBucket.syncMessageCount {
+ asyncMessageCount, err := aSyncBucket.getAsyncSyncMessageCount()
+ if err != nil {
+ return nil, err
+ }
+
+ asyncLocalMsgCount,err := aSyncBucket.getAsyncLocalMessageCount()
+ if err != nil {
+ return nil, err
+ }
+
+ if asyncMessageCount > 0 &&
+ asyncLocalMsgCount >= asyncMessageCount {
err = internalRefresh(q, period)
if err != nil {
return nil, err
}
-
}
} else {
exceeded = true
@@ -147,11 +160,18 @@
func internalRefresh(q *QuotaBucket, period *quotaPeriod) error {
var err error
aSyncBucket := q.GetAsyncQuotaBucket()
+ if aSyncBucket == nil {
+ return errors.New(constants.AsyncQuotaBucketEmpty)
+ }
+
weight := int64(0)
countFromCounterService := int64(0)
- globalCount := aSyncBucket.asyncGLobalCount
- maxCount := q.GetMaxCount()
+ globalCount,err := aSyncBucket.getAsyncGlobalCount()
+ if err != nil {
+ return err
+ }
+ maxCount := q.GetMaxCount()
for _, counterEle := range *aSyncBucket.asyncCounter {
weight += counterEle
diff --git a/quotaBucket/quotaBucket_test.go b/quotaBucket/quotaBucket_test.go
index 2de6335..cba72c4 100644
--- a/quotaBucket/quotaBucket_test.go
+++ b/quotaBucket/quotaBucket_test.go
@@ -1,596 +1,623 @@
package quotaBucket_test
-//
-//import (
-// "github.com/30x/apidQuota/constants"
-// . "github.com/30x/apidQuota/quotaBucket"
-// . "github.com/onsi/ginkgo"
-// . "github.com/onsi/gomega"
-// "strings"
-// "time"
-//)
-//
-//var _ = Describe("Test QuotaPeriod", func() {
-// It("Valid NewQuotaPeriod", func() {
-// //startTime before endTime
-// 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 {
-// 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(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 isValid {
-// Fail("Expected isValid false but got true")
-// }
-//
-// if err == nil {
-// Fail(" Expected error but got <nil>")
-// }
-//
-// //startTime same as endTime
-// period = NewQuotaPeriod(time.Now().UTC().AddDate(0, -1, 0).Unix(),
-// time.Now().UTC().AddDate(0, 1, 0).Unix(),
-// time.Now().UTC().AddDate(0, 1, 0).Unix())
-// isValid, err = period.Validate()
-// 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("Expected true: second is a valid TimeUnit")
-// }
-// if !IsValidTimeUnit("minute") {
-// Fail("Expected true: minute is a valid TimeUnit")
-// }
-// if !IsValidTimeUnit("hour") {
-// Fail("Expected true: hour is a valid TimeUnit")
-// }
-// if !IsValidTimeUnit("day") {
-// Fail("Expected true: day is a valid TimeUnit")
-// }
-// if !IsValidTimeUnit("week") {
-// Fail("Expected true: week is a valid TimeUnit")
-// }
-// if !IsValidTimeUnit("month") {
-// Fail("Expected true: month is a valid TimeUnit")
-// }
-//
-// //invalid type
-// if IsValidTimeUnit("invalidType") {
-// Fail("Expected false: invalidType is not a valid TimeUnit")
-// }
-// })
-//})
-//
-////Tests for QuotaBucket
-//var _ = Describe("QuotaBucket", func() {
-// It("Create with NewQuotaBucket", func() {
-// edgeOrgID := "sampleOrg"
-// id := "sampleID"
-// interval := 1
-// timeUnit := "hour"
-// quotaType := "calendar"
-// preciseAtSecondsLevel := true
-// maxCount := int64(10)
-// weight := int64(1)
-// distributed := true
-// synchronous := true
-// syncTimeInSec := int64(-1)
-// syncMessageCount := int64(-1)
-//
-// //start time before now()
-// startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
-//
-// quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
-// quotaType, preciseAtSecondsLevel, startTime, maxCount,
-// weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
-// Expect(err).NotTo(HaveOccurred())
-// now := time.Now().UTC()
-// currentHour := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, time.UTC)
-// err = quotaBucket.Validate()
-// Expect(err).NotTo(HaveOccurred())
-//
-// //also check if all the fields are set as expected
-// sTime := time.Unix(startTime, 0)
-// Expect(sTime).To(Equal(quotaBucket.GetStartTime()))
-// Expect(edgeOrgID).To(Equal(quotaBucket.GetEdgeOrgID()))
-// Expect(id).To(Equal(quotaBucket.GetID()))
-// Expect(timeUnit).To(Equal(quotaBucket.GetTimeUnit()))
-// Expect(quotaType).To(Equal(quotaBucket.GetType()))
-// Expect(interval).To(Equal(quotaBucket.GetInterval()))
-// Expect(maxCount).To(Equal(quotaBucket.GetMaxCount()))
-// Expect(preciseAtSecondsLevel).To(Equal(quotaBucket.GetIsPreciseAtSecondsLevel()))
-// getPeriod, err := quotaBucket.GetPeriod()
-// Expect(err).NotTo(HaveOccurred())
-// Expect(getPeriod.GetPeriodInputStartTime().String()).ShouldNot(BeEmpty())
-// Expect(getPeriod.GetPeriodStartTime().String()).ShouldNot(BeEmpty())
-// Expect(getPeriod.GetPeriodEndTime().String()).ShouldNot(BeEmpty())
-// Expect(getPeriod.GetPeriodStartTime().String()).Should(Equal(currentHour.String()))
-// Expect(getPeriod.GetPeriodEndTime().String()).Should(Equal(currentHour.Add(time.Hour).String()))
-//
-// //start time is after now() -> should still set period.
-// startTime = time.Now().UTC().AddDate(0, 1, 0).Unix()
-// quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
-// quotaType, preciseAtSecondsLevel, startTime, maxCount,
-// weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
-// Expect(err).NotTo(HaveOccurred())
-//
-// now = time.Now().UTC()
-// currentHour = time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, time.UTC)
-//
-// err = quotaBucket.Validate()
-// Expect(err).NotTo(HaveOccurred())
-//
-// getPeriod, err = quotaBucket.GetPeriod()
-// Expect(err).NotTo(HaveOccurred())
-// Expect(getPeriod.GetPeriodInputStartTime().String()).ShouldNot(BeEmpty())
-// Expect(getPeriod.GetPeriodStartTime().String()).ShouldNot(BeEmpty())
-// Expect(getPeriod.GetPeriodEndTime().String()).ShouldNot(BeEmpty())
-// Expect(getPeriod.GetPeriodStartTime().String()).Should(Equal(currentHour.String()))
-// Expect(getPeriod.GetPeriodEndTime().String()).Should(Equal(currentHour.Add(time.Hour).String()))
-//
-// })
-//
-// //end before start
-// It("Test invalid quotaPeriod", func() {
-// edgeOrgID := "sampleOrg"
-// id := "sampleID"
-// timeUnit := "hour"
-// quotaType := "calendar"
-// interval := 1
-// maxCount := int64(10)
-// weight := int64(1)
-// preciseAtSecondsLevel := true
-// startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
-// distributed := true
-// synchronous := true
-// syncTimeInSec := int64(-1)
-// syncMessageCount := int64(-1)
-//
-// quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
-// quotaType, preciseAtSecondsLevel, startTime, maxCount,
-// weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
-// Expect(err).NotTo(HaveOccurred())
-//
-// quotaBucket.SetPeriod(time.Now().UTC().AddDate(0, 1, 0), time.Now().UTC().AddDate(0, 0, -1))
-// err = quotaBucket.Validate()
-// if err == nil {
-// Fail("error expected but got <nil>")
-// }
-// if !strings.Contains(err.Error(), constants.InvalidQuotaPeriod) {
-// Fail("expected: " + constants.InvalidQuotaPeriod + " in the error but got: " + err.Error())
-// }
-//
-// })
-//
-// It("Test invalid timeUnitType", func() {
-// edgeOrgID := "sampleOrg"
-// id := "sampleID"
-// timeUnit := "invalidTimeUnit"
-// quotaType := "calendar"
-// interval := 1
-// maxCount := int64(10)
-// weight := int64(1)
-// preciseAtSecondsLevel := true
-// startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
-// distributed := true
-// synchronous := true
-// syncTimeInSec := int64(-1)
-// syncMessageCount := int64(-1)
-//
-// quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
-// quotaType, preciseAtSecondsLevel, startTime, maxCount,
-// weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
-// Expect(err).To(HaveOccurred())
-//
-// if !strings.Contains(err.Error(), constants.InvalidQuotaTimeUnitType) {
-// Fail("expected: " + constants.InvalidQuotaTimeUnitType + "but got: " + err.Error())
-// }
-// if quotaBucket != nil {
-// Fail("quotaBucket returned should be nil.")
-// }
-//
-// })
-//
-//})
-//
-//var _ = Describe("IsCurrentPeriod", func() {
-// It("Test IsCurrentPeriod for RollingType Window - Valid TestCase", func() {
-//
-// edgeOrgID := "sampleOrg"
-// id := "sampleID"
-// timeUnit := "hour"
-// quotaType := "rollingwindow"
-// interval := 1
-// maxCount := int64(10)
-// weight := int64(1)
-// preciseAtSecondsLevel := true
-// distributed := true
-// synchronous := true
-// syncTimeInSec := int64(-1)
-// syncMessageCount := int64(-1)
-//
-// //InputStart time is before now
-// startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
-//
-// quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
-// quotaType, preciseAtSecondsLevel, startTime, maxCount,
-// weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
-// Expect(err).NotTo(HaveOccurred())
-// 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
-// startTime = time.Now().UTC().Unix()
-// quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
-// quotaType, preciseAtSecondsLevel, startTime, maxCount,
-// weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
-// 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 {
-// Fail("Exprected true, returned: false")
-// }
-// })
-//
-// It("Test IsCurrentPeriod for RollingType Window - InValid TestCase", func() {
-//
-// edgeOrgID := "sampleOrg"
-// id := "sampleID"
-// timeUnit := "hour"
-// quotaType := "rollingwindow"
-// interval := 1
-// maxCount := int64(10)
-// weight := int64(1)
-// preciseAtSecondsLevel := true
-// //InputStart time is after now.
-// startTime := time.Now().UTC().AddDate(0, 1, 0).Unix()
-// distributed := true
-// synchronous := true
-// syncTimeInSec := int64(-1)
-// syncMessageCount := int64(-1)
-//
-// quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
-// quotaType, preciseAtSecondsLevel, startTime, maxCount,
-// weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
-// Expect(err).NotTo(HaveOccurred())
-//
-// err = quotaBucket.Validate()
-// Expect(err).NotTo(HaveOccurred())
-//
-// 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().UTC().AddDate(0, -1, 0).Unix()
-// quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
-// quotaType, preciseAtSecondsLevel, startTime, maxCount,
-// weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
-// 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 IsCurrentPeriod for calendarType Window - Valid TestCases", func() {
-//
-// edgeOrgID := "sampleOrg"
-// id := "sampleID"
-// timeUnit := "hour"
-// quotaType := "calendar"
-// interval := 1
-// maxCount := int64(10)
-// weight := int64(1)
-// preciseAtSecondsLevel := true
-// distributed := true
-// synchronous := true
-// syncTimeInSec := int64(-1)
-// syncMessageCount := int64(-1)
-//
-// //InputStart time is before now
-// startTime := time.Now().UTC().UTC().AddDate(-1, -1, 0).Unix()
-//
-// quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
-// quotaType, preciseAtSecondsLevel, startTime, maxCount,
-// weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
-// 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())
-// }
-// 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,
-// weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
-// 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 {
-// Fail("Exprected true, returned: false")
-// }
-//
-// //start Time in period is before now
-// startTime = time.Now().UTC().Unix()
-// quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
-// quotaType, preciseAtSecondsLevel, startTime, maxCount,
-// weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
-// 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 {
-// Fail("Exprected true, returned: false")
-// }
-//
-// //start Time in period is now
-// startTime = time.Now().UTC().Unix()
-// quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
-// quotaType, preciseAtSecondsLevel, startTime, maxCount,
-// weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
-// 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 {
-// Fail("Exprected true, returned: false")
-// }
-//
-// //end Time in period is after now
-// startTime = time.Now().UTC().Unix()
-// quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
-// quotaType, preciseAtSecondsLevel, startTime, maxCount,
-// weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
-// 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 {
-// Fail("Exprected true, returned: false")
-// }
-//
-// //start time in period is before end time
-// startTime = time.Now().UTC().Unix()
-// quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
-// quotaType, preciseAtSecondsLevel, startTime, maxCount,
-// weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
-// 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 {
-// Fail("Exprected true, returned: false")
-// }
-//
-// })
-//
-// It("Test IsCurrentPeriod for calendarType Window InValid TestCase", func() {
-//
-// edgeOrgID := "sampleOrg"
-// id := "sampleID"
-// timeUnit := "hour"
-// quotaType := "calendar"
-// interval := 1
-// maxCount := int64(10)
-// weight := int64(1)
-// preciseAtSecondsLevel := true
-// distributed := true
-// synchronous := true
-// syncTimeInSec := int64(-1)
-// syncMessageCount := int64(-1)
-//
-// //InputStart time is after now.
-// 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, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
-// quotaType, preciseAtSecondsLevel, startTime, maxCount,
-// weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
-// Expect(err).NotTo(HaveOccurred())
-//
-// err = quotaBucket.Validate()
-// Expect(err).NotTo(HaveOccurred())
-//
-// if ok := period.IsCurrentPeriod(quotaBucket); ok {
-// Fail("Exprected true, returned: false")
-// }
-//
-// //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,
-// weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
-// 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().UTC().AddDate(0, 1, 0), time.Now().UTC().AddDate(1, 1, 0))
-//
-// if ok := period.IsCurrentPeriod(quotaBucket); ok {
-// Fail("Exprected true, returned: false")
-// }
-//
-// //end time in period is before now
-// quotaBucket.SetPeriod(time.Now().UTC().AddDate(-1, -1, 0), time.Now().UTC().AddDate(0, -1, 0))
-//
-// if ok := period.IsCurrentPeriod(quotaBucket); ok {
-// Fail("Exprected true, returned: false")
-// }
-//
-// })
-//})
-//
-//var _ = Describe("Test GetPeriod and setCurrentPeriod", func() {
-// It("Valid GetPeriod", func() {
-// edgeOrgID := "sampleOrg"
-// id := "sampleID"
-// timeUnit := "hour"
-// quotaType := "rollingwindow"
-// interval := 1
-// maxCount := int64(10)
-// weight := int64(1)
-// preciseAtSecondsLevel := true
-// distributed := true
-// synchronous := true
-// syncTimeInSec := int64(-1)
-// syncMessageCount := int64(-1)
-//
-// //InputStart time is before now
-// startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
-// quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
-// quotaType, preciseAtSecondsLevel, startTime, maxCount,
-// weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
-// 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()) {
-// 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().UTC().AddDate(0, -1, 0)
-// pendTime := time.Now().UTC().AddDate(0, 1, 0)
-// quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
-// quotaType, preciseAtSecondsLevel, startTime, maxCount,
-// weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
-// 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")
-// }
-//
-// //for non rolling Type window setCurrentPeriod as endTime is < time.now.
-// quotaType = "calendar"
-// 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,
-// weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
-// 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("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))
-// })
-//})
+
+import (
+ "github.com/30x/apidQuota/constants"
+ . "github.com/30x/apidQuota/quotaBucket"
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+ "strings"
+ "time"
+)
+
+var _ = Describe("Test AcceptedQuotaTimeUnitTypes", func() {
+ It("testTimeUnit", func() {
+ if !IsValidTimeUnit("second") {
+ Fail("Expected true: second is a valid TimeUnit")
+ }
+ if !IsValidTimeUnit("minute") {
+ Fail("Expected true: minute is a valid TimeUnit")
+ }
+ if !IsValidTimeUnit("hour") {
+ Fail("Expected true: hour is a valid TimeUnit")
+ }
+ if !IsValidTimeUnit("day") {
+ Fail("Expected true: day is a valid TimeUnit")
+ }
+ if !IsValidTimeUnit("week") {
+ Fail("Expected true: week is a valid TimeUnit")
+ }
+ if !IsValidTimeUnit("month") {
+ Fail("Expected true: month is a valid TimeUnit")
+ }
+
+ //invalid type
+ if IsValidTimeUnit("invalidType") {
+ Fail("Expected false: invalidType is not a valid TimeUnit")
+ }
+ })
+})
+
+
+var _ = Describe("Test AcceptedQuotaTypes", func() {
+ It("testTimeUnit", func() {
+ if !IsValidType("calendar") {
+ Fail("Expected true: calendar is a valid quotaType")
+ }
+ if !IsValidType("rollingwindow") {
+ Fail("Expected true: rollingwindow is a valid quotaType")
+ }
+ if IsValidType("invalidType") {
+ Fail("Expected false: invalidType is not a valid quotaType")
+ }
+ })
+})
+
+//Tests for QuotaBucket
+var _ = Describe("QuotaBucket", func() {
+
+ //validate all fields set as expected.
+ //validate period set as expected.
+ //validate async QuotaBucket is empty.
+ It("Create with NewQuotaBucket with all valid fields", func() {
+ edgeOrgID := "sampleOrg"
+ id := "sampleID"
+ interval := 1
+ timeUnit := "hour"
+ quotaType := "calendar"
+ preciseAtSecondsLevel := true
+ maxCount := int64(10)
+ weight := int64(1)
+ distributed := true
+ synchronous := true
+ syncTimeInSec := int64(-1)
+ syncMessageCount := int64(-1)
+
+ //start time before now()
+ startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
+
+ quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
+ quotaType, preciseAtSecondsLevel, startTime, maxCount,
+ weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
+ Expect(err).NotTo(HaveOccurred())
+ now := time.Now().UTC()
+ currentHour := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, time.UTC)
+ err = quotaBucket.Validate()
+ Expect(err).NotTo(HaveOccurred())
+
+ //also check if all the fields are set as expected
+ getPeriod, err := quotaBucket.GetPeriod()
+ Expect(err).NotTo(HaveOccurred())
+ Expect(getPeriod.GetPeriodInputStartTime().String()).ShouldNot(BeEmpty())
+ Expect(getPeriod.GetPeriodStartTime().String()).ShouldNot(BeEmpty())
+ Expect(getPeriod.GetPeriodEndTime().String()).ShouldNot(BeEmpty())
+ Expect(getPeriod.GetPeriodStartTime().String()).Should(Equal(currentHour.String()))
+ Expect(getPeriod.GetPeriodEndTime().String()).Should(Equal(currentHour.Add(time.Hour).String()))
+
+ //check if isDistributed and isSynchronous are true.
+ if !quotaBucket.IsDistrubuted(){
+ Fail("expected true, returned true.")
+ }
+ if !quotaBucket.IsSynchronous(){
+ Fail("expected true, returned true.")
+ }
+
+ asyncBucket := quotaBucket.GetAsyncQuotaBucket()
+ if asyncBucket != nil{
+ Fail("asyncBucket should be nil for synchronous request.")
+ }
+
+ //testCase2: synchronous := true and (syncTimeInSec and syncMessageCount) > -1 -> aSyncQuotaBucket is nil.
+ syncTimeInSec = int64(10)
+ syncMessageCount = int64(10)
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
+ quotaType, preciseAtSecondsLevel, startTime, maxCount,
+ weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
+ Expect(err).NotTo(HaveOccurred())
+ now = time.Now().UTC()
+ currentHour = time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, time.UTC)
+ err = quotaBucket.Validate()
+ Expect(err).NotTo(HaveOccurred())
+ //check if isDistributed and isSynchronous are true.
+ if !quotaBucket.IsDistrubuted(){
+ Fail("expected true, returned true.")
+ }
+ if !quotaBucket.IsSynchronous(){
+ Fail("expected true, returned true.")
+ }
+
+ asyncBucket = quotaBucket.GetAsyncQuotaBucket()
+ if asyncBucket != nil{
+ Fail("asyncBucket should be nil for synchronous request.")
+ }
+
+
+ })
+
+ //startTime for quotaBucket after time.Now()
+ It("Create with NewQuotaBucket with start time after now()", func() {
+ edgeOrgID := "sampleOrg"
+ id := "sampleID"
+ interval := 1
+ timeUnit := "hour"
+ quotaType := "calendar"
+ preciseAtSecondsLevel := true
+ maxCount := int64(10)
+ weight := int64(1)
+ distributed := true
+ synchronous := true
+ syncTimeInSec := int64(-1)
+ syncMessageCount := int64(-1)
+ //start time is after now() -> should still set period.
+ startTime := time.Now().UTC().AddDate(0, 1, 0).Unix()
+ quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
+ quotaType, preciseAtSecondsLevel, startTime, maxCount,
+ weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
+ Expect(err).NotTo(HaveOccurred())
+ now := time.Now().UTC()
+ currentHour := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, time.UTC)
+ err = quotaBucket.Validate()
+ Expect(err).NotTo(HaveOccurred())
+
+ getPeriod, err := quotaBucket.GetPeriod()
+ Expect(err).NotTo(HaveOccurred())
+ Expect(getPeriod.GetPeriodInputStartTime().String()).ShouldNot(BeEmpty())
+ Expect(getPeriod.GetPeriodStartTime().String()).ShouldNot(BeEmpty())
+ Expect(getPeriod.GetPeriodEndTime().String()).ShouldNot(BeEmpty())
+ Expect(getPeriod.GetPeriodStartTime().String()).Should(Equal(currentHour.String()))
+ Expect(getPeriod.GetPeriodEndTime().String()).Should(Equal(currentHour.Add(time.Hour).String()))
+
+ //check if isDistributed and isSynchronous are true.
+ if !quotaBucket.IsDistrubuted(){
+ Fail("expected true, returned false.")
+ }
+ if !quotaBucket.IsSynchronous(){
+ Fail("expected true, returned false.")
+ }
+
+ asyncBucket := quotaBucket.GetAsyncQuotaBucket()
+ if asyncBucket != nil{
+ Fail("asyncBucket should be nil for synchronous request.")
+ }
+ })
+
+ //Testcase1 : with syncTimeInSec
+ //Testcase2 : with syncMessageCount
+ //Testcase3 : InvalidTestCase - with syncTimeInSec and syncMessageCount
+ It("Create with NewQuotaBucket for aSyncQuotBucket", func() {
+ edgeOrgID := "sampleOrg"
+ id := "sampleID"
+ interval := 1
+ timeUnit := "hour"
+ quotaType := "calendar"
+ preciseAtSecondsLevel := true
+ maxCount := int64(10)
+ weight := int64(1)
+ distributed := true
+ synchronous := false
+
+ //Testcase1 : with syncTimeInSec
+ syncTimeInSec := int64(10)
+ syncMessageCount := int64(-1)
+ //start time is after now() -> should still set period.
+ startTime := time.Now().UTC().AddDate(0, 1, 0).Unix()
+ quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
+ quotaType, preciseAtSecondsLevel, startTime, maxCount,
+ weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
+ Expect(err).NotTo(HaveOccurred())
+ now := time.Now().UTC()
+ currentHour := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, time.UTC)
+ err = quotaBucket.Validate()
+ Expect(err).NotTo(HaveOccurred())
+
+ getPeriod, err := quotaBucket.GetPeriod()
+ Expect(err).NotTo(HaveOccurred())
+ Expect(getPeriod.GetPeriodInputStartTime().String()).ShouldNot(BeEmpty())
+ Expect(getPeriod.GetPeriodStartTime().String()).ShouldNot(BeEmpty())
+ Expect(getPeriod.GetPeriodEndTime().String()).ShouldNot(BeEmpty())
+ Expect(getPeriod.GetPeriodStartTime().String()).Should(Equal(currentHour.String()))
+ Expect(getPeriod.GetPeriodEndTime().String()).Should(Equal(currentHour.Add(time.Hour).String()))
+
+ //check if isDistributed is true and isSynchronous is false.
+ if !quotaBucket.IsDistrubuted(){
+ Fail("expected true, returned false.")
+ }
+ if quotaBucket.IsSynchronous(){
+ Fail("expected false, returned true.")
+ }
+
+ asyncBucket := quotaBucket.GetAsyncQuotaBucket()
+ if asyncBucket == nil{
+ Fail("asyncBucket should be nil for synchronous request.")
+ }
+
+ //Testcase2 : with syncMessageCount
+ syncTimeInSec = int64(-1)
+ syncMessageCount = int64(10)
+ //start time is after now() -> should still set period.
+ startTime = time.Now().UTC().AddDate(0, 1, 0).Unix()
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
+ quotaType, preciseAtSecondsLevel, startTime, maxCount,
+ weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
+ Expect(err).NotTo(HaveOccurred())
+ now = time.Now().UTC()
+ currentHour = time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, time.UTC)
+ err = quotaBucket.Validate()
+ Expect(err).NotTo(HaveOccurred())
+
+ getPeriod, err = quotaBucket.GetPeriod()
+ Expect(err).NotTo(HaveOccurred())
+ Expect(getPeriod.GetPeriodInputStartTime().String()).ShouldNot(BeEmpty())
+ Expect(getPeriod.GetPeriodStartTime().String()).ShouldNot(BeEmpty())
+ Expect(getPeriod.GetPeriodEndTime().String()).ShouldNot(BeEmpty())
+ Expect(getPeriod.GetPeriodStartTime().String()).Should(Equal(currentHour.String()))
+ Expect(getPeriod.GetPeriodEndTime().String()).Should(Equal(currentHour.Add(time.Hour).String()))
+
+ //check if isDistributed is true and isSynchronous is false.
+ if !quotaBucket.IsDistrubuted(){
+ Fail("expected true, returned false.")
+ }
+ if quotaBucket.IsSynchronous(){
+ Fail("expected false, returned true.")
+ }
+
+ asyncBucket = quotaBucket.GetAsyncQuotaBucket()
+ if asyncBucket == nil{
+ Fail("asyncBucket should be nil for synchronous request.")
+ }
+
+ //Testcase3 : InvalidTestCase - with syncTimeInSec and syncMessageCount
+ syncTimeInSec = int64(10)
+ syncMessageCount = int64(10)
+ //start time is after now() -> should still set period.
+ startTime = time.Now().UTC().AddDate(0, 1, 0).Unix()
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
+ quotaType, preciseAtSecondsLevel, startTime, maxCount,
+ weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
+ Expect(err).To(HaveOccurred())
+
+ })
+
+ It("Create with NonDistributed QuotaBucket", func() {
+ edgeOrgID := "sampleOrg"
+ id := "sampleID"
+ interval := 1
+ timeUnit := "hour"
+ quotaType := "calendar"
+ preciseAtSecondsLevel := true
+ maxCount := int64(10)
+ weight := int64(1)
+ distributed := false
+ synchronous := false
+ syncTimeInSec := int64(-1)
+ syncMessageCount := int64(-1)
+
+ //start time before now()
+ startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
+
+ quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
+ quotaType, preciseAtSecondsLevel, startTime, maxCount,
+ weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
+ Expect(err).NotTo(HaveOccurred())
+ now := time.Now().UTC()
+ currentHour := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, time.UTC)
+ err = quotaBucket.Validate()
+ Expect(err).NotTo(HaveOccurred())
+ Expect(quotaBucket.IsSynchronous()).Should(BeFalse())
+
+ //also check if all the fields are set as expected
+ getPeriod, err := quotaBucket.GetPeriod()
+ Expect(err).NotTo(HaveOccurred())
+ Expect(getPeriod.GetPeriodInputStartTime().String()).ShouldNot(BeEmpty())
+ Expect(getPeriod.GetPeriodStartTime().String()).ShouldNot(BeEmpty())
+ Expect(getPeriod.GetPeriodEndTime().String()).ShouldNot(BeEmpty())
+ Expect(getPeriod.GetPeriodStartTime().String()).Should(Equal(currentHour.String()))
+ Expect(getPeriod.GetPeriodEndTime().String()).Should(Equal(currentHour.Add(time.Hour).String()))
+
+ //check if isDistributed is false and isSynchronous is false.
+ if quotaBucket.IsDistrubuted(){
+ Fail("expected false, returned true.")
+ }
+ if quotaBucket.IsSynchronous(){
+ Fail("expected false, returned true.")
+ }
+
+ asyncBucket := quotaBucket.GetAsyncQuotaBucket()
+ if asyncBucket != nil {
+ Fail("asyncBucket should be nil for synchronous request.")
+ }
+
+ synchronous = true
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
+ quotaType, preciseAtSecondsLevel, startTime, maxCount,
+ weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
+ Expect(err).To(HaveOccurred())
+ })
+
+
+
+ It("Test invalid timeUnitType", func() {
+ edgeOrgID := "sampleOrg"
+ id := "sampleID"
+ timeUnit := "invalidTimeUnit"
+ quotaType := "calendar"
+ interval := 1
+ maxCount := int64(10)
+ weight := int64(1)
+ preciseAtSecondsLevel := true
+ startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
+ distributed := true
+ synchronous := true
+ syncTimeInSec := int64(-1)
+ syncMessageCount := int64(-1)
+
+ quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
+ quotaType, preciseAtSecondsLevel, startTime, maxCount,
+ weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
+ err = quotaBucket.Validate()
+ Expect(err).To(HaveOccurred())
+
+ if !strings.Contains(err.Error(), constants.InvalidQuotaTimeUnitType) {
+ Fail("expected: " + constants.InvalidQuotaTimeUnitType + "but got: " + err.Error())
+ }
+
+ })
+
+ It("Test invalid quotaType", func() {
+ edgeOrgID := "sampleOrg"
+ id := "sampleID"
+ timeUnit := "hour"
+ quotaType := "invalidTimeUnit"
+ interval := 1
+ maxCount := int64(10)
+ weight := int64(1)
+ preciseAtSecondsLevel := true
+ startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
+ distributed := true
+ synchronous := true
+ syncTimeInSec := int64(-1)
+ syncMessageCount := int64(-1)
+
+ quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
+ quotaType, preciseAtSecondsLevel, startTime, maxCount,
+ weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
+ err = quotaBucket.Validate()
+ Expect(err).To(HaveOccurred())
+
+ if !strings.Contains(err.Error(), constants.InvalidQuotaType) {
+ Fail("expected: " + constants.InvalidQuotaType + "but got: " + err.Error())
+ }
+ })
+})
+
+var _ = Describe("IsCurrentPeriod", func() {
+ It("Test IsCurrentPeriod for RollingType Window - Valid TestCase", func() {
+
+ edgeOrgID := "sampleOrg"
+ id := "sampleID"
+ timeUnit := "hour"
+ quotaType := "rollingwindow"
+ interval := 1
+ maxCount := int64(10)
+ weight := int64(1)
+ preciseAtSecondsLevel := true
+ distributed := true
+ synchronous := true
+ syncTimeInSec := int64(-1)
+ syncMessageCount := int64(-1)
+
+ //InputStart time is before now
+ startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
+
+ quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
+ quotaType, preciseAtSecondsLevel, startTime, maxCount,
+ weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
+ Expect(err).NotTo(HaveOccurred())
+ 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
+ startTime = time.Now().UTC().Unix()
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
+ quotaType, preciseAtSecondsLevel, startTime, maxCount,
+ weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
+ 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 {
+ Fail("Exprected true, returned: false")
+ }
+ })
+
+ It("Test IsCurrentPeriod for RollingType Window - InValid TestCase", func() {
+
+ edgeOrgID := "sampleOrg"
+ id := "sampleID"
+ timeUnit := "hour"
+ quotaType := "rollingwindow"
+ interval := 1
+ maxCount := int64(10)
+ weight := int64(1)
+ preciseAtSecondsLevel := true
+ //InputStart time is after now.
+ startTime := time.Now().UTC().AddDate(0, 1, 0).Unix()
+ distributed := true
+ synchronous := true
+ syncTimeInSec := int64(-1)
+ syncMessageCount := int64(-1)
+
+ quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
+ quotaType, preciseAtSecondsLevel, startTime, maxCount,
+ weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
+ Expect(err).NotTo(HaveOccurred())
+
+ err = quotaBucket.Validate()
+ Expect(err).NotTo(HaveOccurred())
+
+ period, err := quotaBucket.GetPeriod()
+ Expect(err).NotTo(HaveOccurred())
+ if ok := period.IsCurrentPeriod(quotaBucket); ok {
+ Fail("Exprected false, returned: true")
+ }
+
+ })
+
+ It("Test IsCurrentPeriod for calendarType Window - Valid TestCases", func() {
+
+ edgeOrgID := "sampleOrg"
+ id := "sampleID"
+ timeUnit := "hour"
+ quotaType := "calendar"
+ interval := 1
+ maxCount := int64(10)
+ weight := int64(1)
+ preciseAtSecondsLevel := true
+ distributed := true
+ synchronous := true
+ syncTimeInSec := int64(-1)
+ syncMessageCount := int64(-1)
+
+ //InputStart time is before now
+ startTime := time.Now().UTC().UTC().AddDate(-1, -1, 0).Unix()
+
+ quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
+ quotaType, preciseAtSecondsLevel, startTime, maxCount,
+ weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
+ 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())
+ }
+ 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,
+ weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
+ 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 {
+ Fail("Exprected true, returned: false")
+ }
+
+ })
+
+ It("Test IsCurrentPeriod for calendarType Window InValid TestCase", func() {
+
+ edgeOrgID := "sampleOrg"
+ id := "sampleID"
+ timeUnit := "hour"
+ quotaType := "calendar"
+ interval := 1
+ maxCount := int64(10)
+ weight := int64(1)
+ preciseAtSecondsLevel := true
+ distributed := true
+ synchronous := true
+ syncTimeInSec := int64(-1)
+ syncMessageCount := int64(-1)
+
+ //InputStart time is after now.
+ startTime := time.Now().UTC().AddDate(0, 1, 0).Unix()
+
+ quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
+ quotaType, preciseAtSecondsLevel, startTime, maxCount,
+ weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
+ Expect(err).NotTo(HaveOccurred())
+
+ err = quotaBucket.Validate()
+ Expect(err).NotTo(HaveOccurred())
+
+ period, err := quotaBucket.GetPeriod()
+ Expect(err).NotTo(HaveOccurred())
+
+ if ok := period.IsCurrentPeriod(quotaBucket); ok {
+ Fail("Exprected false, returned: true")
+ }
+ })
+})
+
+var _ = Describe("Test GetPeriod and the timeInterval in period set as expected", func() {
+ It("Valid GetPeriod", func() {
+ edgeOrgID := "sampleOrg"
+ id := "sampleID"
+ timeUnit := "hour"
+ quotaType := "rollingwindow"
+ interval := 1
+ maxCount := int64(10)
+ weight := int64(1)
+ preciseAtSecondsLevel := true
+ distributed := true
+ synchronous := true
+ syncTimeInSec := int64(-1)
+ syncMessageCount := int64(-1)
+
+ //InputStart time is before now
+ startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
+ quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
+ quotaType, preciseAtSecondsLevel, startTime, maxCount,
+ weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
+ Expect(err).NotTo(HaveOccurred())
+
+ 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()) {
+ 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 setCurrentPeriod as endTime is < time.now.
+ quotaType = "calendar"
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit,
+ quotaType, preciseAtSecondsLevel, startTime, maxCount,
+ weight, distributed, synchronous, syncTimeInSec, syncMessageCount)
+ Expect(err).NotTo(HaveOccurred())
+
+ 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("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/quotaCache.go b/quotaBucket/quotaCache.go
index 6dbc04a..4afae81 100644
--- a/quotaBucket/quotaCache.go
+++ b/quotaBucket/quotaCache.go
@@ -4,6 +4,7 @@
"github.com/30x/apidQuota/constants"
"sync"
"time"
+ "errors"
)
var quotaCachelock = sync.RWMutex{}
@@ -53,6 +54,9 @@
if qBucketCache.qBucket.Distributed && !qBucketCache.qBucket.IsSynchronous() {
aSyncBucket := qBucketCache.qBucket.GetAsyncQuotaBucket()
+ if aSyncBucket == nil {
+ return errors.New(constants.AsyncQuotaBucketEmpty + " : aSyncQuotaBucket to increment cannot be empty.")
+ }
qticker, err := aSyncBucket.getAsyncQTicker()
if err != nil {
return err
diff --git a/quotaBucket/quotaDescriptorType.go b/quotaBucket/quotaDescriptorType.go
index d910c0e..c436286 100644
--- a/quotaBucket/quotaDescriptorType.go
+++ b/quotaBucket/quotaDescriptorType.go
@@ -124,7 +124,7 @@
currentStart = currentEnd.AddDate(0, (-1)*qb.Interval, 0)
return currentEnd.Sub(currentStart), nil
default:
- return time.Duration(0), errors.New(constants.InvalidQuotaBucketType + " : ignoring unrecognized quotaType : " + quotaType)
+ return time.Duration(0), errors.New(constants.InvalidQuotaType + " : ignoring unrecognized quotaType : " + quotaType)
}
default:
diff --git a/services/counterServiceHelper.go b/services/counterServiceHelper.go
index 21fea87..5a21ce8 100644
--- a/services/counterServiceHelper.go
+++ b/services/counterServiceHelper.go
@@ -25,6 +25,13 @@
Timeout: time.Duration(60 * time.Second),
}
+var token string
+
+func addApigeeSyncTokenToHeader(req *http.Request) {
+ token = globalVariables.Config.GetString(constants.ApigeeSyncBearerToken)
+ req.Header.Set("Authorization", "Bearer "+token)
+}
+
func GetCount(orgID string, quotaKey string, startTimeInt int64, endTimeInt int64) (int64, error) {
return IncrementAndGetCount(orgID, quotaKey, 0, startTimeInt, endTimeInt)
@@ -34,7 +41,6 @@
headers := http.Header{}
headers.Set("Accept", "application/json")
headers.Set("Content-Type", "application/json")
-
method := "POST"
if globalVariables.CounterServiceURL == "" {
@@ -67,6 +73,7 @@
Body: ioutil.NopCloser(bytes.NewReader(reqBodyBytes)),
ContentLength: int64(contentLength),
}
+ addApigeeSyncTokenToHeader(request)
resp, err := client.Do(request)