blob: 08b580cc73864e87eed92bb51733c3431432dcb7 [file] [log] [blame]
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))
})
})