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))
//	})
//})
