Api Validation, CalendarTypeQuotaDescriptor, Tests for QUotaPeriod, QuotaBucket
diff --git a/api_test.go b/api_test.go
new file mode 100644
index 0000000..8a83c8f
--- /dev/null
+++ b/api_test.go
@@ -0,0 +1,9 @@
+package apidQuota_test
+
+import (
+	. "github.com/onsi/ginkgo"
+)
+
+var _ = Describe("Api", func() {
+
+})
diff --git a/apidQuota_suite_test.go b/apidQuota_suite_test.go
new file mode 100644
index 0000000..2c0443d
--- /dev/null
+++ b/apidQuota_suite_test.go
@@ -0,0 +1,12 @@
+package apidQuota_test
+
+import (
+	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/gomega"
+	"testing"
+)
+
+func TestApidQuota(t *testing.T) {
+	RegisterFailHandler(Fail)
+	RunSpecs(t, "ApidQuota Suite")
+}
diff --git a/quotaBucket/QuotaDescriptorType.go b/quotaBucket/QuotaDescriptorType.go
deleted file mode 100644
index 3e15c4a..0000000
--- a/quotaBucket/QuotaDescriptorType.go
+++ /dev/null
@@ -1,119 +0,0 @@
-package quotaBucket
-
-import (
-	"errors"
-	"fmt"
-	"strings"
-	"time"
-)
-
-const (
-	QuotaTypeCalendar      = "calendar"      // after start time
-	QuotaTypeFlexi         = "flexi"         //after first request
-	QuotaTypeRollingWindow = "rollingWindow" // in the past "window" time
-)
-
-type QuotaDescriptorType interface {
-	SetCurrentPeriod(bucket *QuotaBucket) error
-}
-
-func GetQuotaTypeHandler(qType string) (QuotaDescriptorType, error) {
-	var qDescriptor QuotaDescriptorType
-	quotaType := strings.ToLower(strings.TrimSpace(qType))
-	switch quotaType {
-	case QuotaTypeCalendar:
-		qDescriptor = &CanlendarQuotaDescriporType{}
-		return qDescriptor, nil
-	case QuotaTypeFlexi:
-		qDescriptor = &FlexiQuotaDescriptorType{}
-		return qDescriptor, nil
-	case QuotaTypeRollingWindow:
-		qDescriptor = &RollingWindowQuotaDescriptorType{}
-		return qDescriptor, nil
-	default:
-		return nil, errors.New("Ignoring unrecognized quota type in request: " + qType)
-
-	}
-}
-
-type CanlendarQuotaDescriporType struct{}
-
-func (c CanlendarQuotaDescriporType) SetCurrentPeriod(qbucket *QuotaBucket) error {
-	var err error
-	startTime := qbucket.GetStartTime()
-	currentPeriod, err := qbucket.GetPeriod()
-	if err != nil {
-		return err
-	}
-
-	if startTime.Before(time.Now()) || startTime.Equal(time.Now()) {
-		if currentPeriod != nil {
-			if currentPeriod.IsCurrentPeriod(qbucket) {
-				return nil
-			}
-		} else {
-			if currentPeriod.IsCurrentPeriod(qbucket) {
-				return nil
-			} else {
-				qBucketHandler, err := GetQuotaBucketHandler(qbucket.BucketType)
-				if err != nil {
-					return errors.New("error getting QuotaBucketType: " + err.Error())
-				}
-				qBucketHandler.resetCount(qbucket)
-			}
-		}
-	}
-
-	var currentStart, currentEnd time.Time
-	now := time.Now()
-	timeUnit := strings.ToLower(strings.TrimSpace(qbucket.TimeUnit))
-	switch timeUnit {
-	case TimeUnitSECOND:
-		currentStart = time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second(), 0, time.UTC)
-		secInDuration := time.Duration(int64(qbucket.Interval) * time.Second.Nanoseconds())
-		currentEnd = currentStart.Add(secInDuration)
-		break
-	case TimeUnitMINUTE:
-		currentStart = time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), 0, 0, time.UTC)
-		minInDuration := time.Duration(int64(qbucket.Interval) * time.Minute.Nanoseconds())
-		currentEnd = currentStart.Add(minInDuration)
-		break
-	case TimeUnitHOUR:
-		currentStart = time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, time.UTC)
-		hoursInDuration := time.Duration(int64(qbucket.Interval) * time.Hour.Nanoseconds())
-		currentEnd = currentStart.Add(hoursInDuration)
-
-		break
-	case TimeUnitDAY:
-		currentStart = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.UTC)
-		currentEnd = currentStart.AddDate(0, 0, 1*qbucket.Interval)
-		break
-	case TimeUnitWEEK:
-		//todo
-		//currentStart = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.UTC)
-		//currentEnd = currentStart.AddDate(0, 0, 7*qbucket.Interval)
-		break
-	case TimeUnitMONTH:
-		currentStart = time.Date(now.Year(), now.Month(), 0, 0, 0, 0, 0, time.UTC)
-		currentEnd = currentStart.AddDate(0, 1*qbucket.Interval, 0)
-		break
-	}
-
-	qbucket.SetPeriod(currentStart, currentEnd)
-	fmt.Println("inside calendat set period: ", qbucket.quotaBucketData.Period)
-	return nil
-}
-
-type FlexiQuotaDescriptorType struct{}
-
-func (c FlexiQuotaDescriptorType) SetCurrentPeriod(qbucket *QuotaBucket) error {
-	//yet to implement
-	return nil
-}
-
-type RollingWindowQuotaDescriptorType struct{}
-
-func (c RollingWindowQuotaDescriptorType) SetCurrentPeriod(qbucket *QuotaBucket) error {
-	//yet to implement
-	return nil
-}
diff --git a/quotaBucket/apiUtil.go b/quotaBucket/apiUtil.go
index c00a879..155a24d 100644
--- a/quotaBucket/apiUtil.go
+++ b/quotaBucket/apiUtil.go
@@ -162,12 +162,13 @@
 	bucketType = value.(string)
 	//fmt.Println("bucketType: ", bucketType)
 
-	newQBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, quotaPeriod, startTime, maxCount, bucketType)
-	if err != nil {
-		return errors.New("unable to Unmarshal periodMap to quotaPeriod: " + err.Error())
-
-	}
+	newQBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, quotaPeriod, startTime, maxCount, bucketType)
 	qBucket.quotaBucketData = newQBucket.quotaBucketData
+
+	if err := qBucket.Validate(); err != nil {
+		return errors.New("failed in Validating the quotaBucket: " + err.Error())
+	}
+
 	return nil
 
 }
diff --git a/quotaBucket/quotaBucket.go b/quotaBucket/quotaBucket.go
index 36c9082..99bc6ba 100644
--- a/quotaBucket/quotaBucket.go
+++ b/quotaBucket/quotaBucket.go
@@ -7,14 +7,41 @@
 )
 
 const (
+	//add to acceptedTimeUnitList in init() if case any other new timeUnit is added
 	TimeUnitSECOND = "second"
 	TimeUnitMINUTE = "minute"
 	TimeUnitHOUR   = "hour"
 	TimeUnitDAY    = "day"
 	TimeUnitWEEK   = "week"
 	TimeUnitMONTH  = "month"
+
+	//add to acceptedBucketTypeList in init() if case any other new bucketType is added
+	QuotaBucketTypeSynchronous    = "synchronous"
+	QuotaBucketTypeAsynchronous   = "asynchronous"
+	QuotaBucketTypeNonDistributed = "nonDistributed"
+	//todo: Add other accepted bucketTypes
+
+	//errors
+	InvalidQuotaTimeUnitType = "invalidQuotaTimeUnitType"
+	InvalidQuotaBucketType   = "invalidQuotaBucketType"
+	InvalidQuotaPeriod       = "invalidQuotaPeriod"
 )
 
+var (
+	acceptedTimeUnitList   map[string]bool
+	acceptedBucketTypeList map[string]bool
+)
+
+func init() {
+
+	acceptedTimeUnitList = map[string]bool{TimeUnitSECOND: true,
+		TimeUnitMINUTE: true, TimeUnitHOUR: true,
+		TimeUnitDAY: true, TimeUnitWEEK: true, TimeUnitMONTH: true}
+	acceptedBucketTypeList = map[string]bool{QuotaBucketTypeSynchronous: true,
+		QuotaBucketTypeAsynchronous: true, QuotaBucketTypeNonDistributed: true} //todo: add other accpeted bucketTypes
+
+}
+
 type QuotaPeriod struct {
 	inputStartTime time.Time
 	startTime      time.Time
@@ -31,6 +58,25 @@
 		endTime:   pEndTime,
 	}
 	return *period
+}
+
+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
+}
+
+func (qp *QuotaPeriod) Validate() (bool, error) {
+	if qp.startTime.Before(qp.endTime) {
+		return true, nil
+	}
+	return false, errors.New(InvalidQuotaPeriod + " : startTime in the period must be before endTime")
 
 }
 
@@ -53,10 +99,9 @@
 
 func NewQuotaBucket(edgeOrgID string, id string, interval int,
 	timeUnit string, quotaType string, preciseAtSecondsLevel bool, period QuotaPeriod,
-	startTime int64, maxCount int, bucketType string) (*QuotaBucket, error) {
+	startTime int64, maxCount int, bucketType string) *QuotaBucket {
 
 	fromUNIXTime := time.Unix(startTime, 0)
-
 	quotaBucketDataStruct := &quotaBucketData{
 		EdgeOrgID:             edgeOrgID,
 		ID:                    id,
@@ -74,10 +119,33 @@
 		quotaBucketData: *quotaBucketDataStruct,
 	}
 
-	return quotaBucket, nil
+	return quotaBucket
 
 }
 
+func (q *QuotaBucket) Validate() error {
+	//check if the period is valid
+	period,err := q.GetQuotaBucketPeriod()
+	if err != nil {
+		return err
+	}
+	if ok, err := period.Validate(); !ok {
+		return errors.New("invalid Period: " + err.Error())
+	}
+
+	//check valid quotaTimeUnit
+	if ok := IsValidTimeUnit(q.GetTimeUnit()); !ok {
+		return errors.New(InvalidQuotaTimeUnitType)
+	}
+
+	//check valid quotaBucketType
+	if ok := IsValidQuotaBucketType(q.GetBucketType()); !ok {
+		return errors.New(InvalidQuotaBucketType)
+	}
+
+	return nil
+}
+
 func (q *QuotaBucket) GetEdgeOrgID() string {
 	return q.quotaBucketData.EdgeOrgID
 }
@@ -90,6 +158,10 @@
 	return q.quotaBucketData.Interval
 }
 
+func (q *QuotaBucket) GetTimeUnit() string {
+	return q.quotaBucketData.TimeUnit
+}
+
 func (q *QuotaBucket) GetStartTime() time.Time {
 	return q.quotaBucketData.StartTime
 }
@@ -98,6 +170,11 @@
 	return q.quotaBucketData.QuotaType
 }
 
+func (q *QuotaBucket) GetPreciseAtSecondsLevel() bool {
+	return q.quotaBucketData.PreciseAtSecondsLevel
+}
+
+//Calls setCurrentPeriod if QuotaType is rollingWindow or period.endTime is before now.
 func (q *QuotaBucket) GetPeriod() (*QuotaPeriod, error) {
 	if q.quotaBucketData.QuotaType == QuotaTypeRollingWindow {
 		qRWType := RollingWindowQuotaDescriptorType{}
@@ -106,9 +183,35 @@
 			return nil, err
 		}
 	}
+
+	period,err := q.GetQuotaBucketPeriod()
+	if err != nil {
+		return nil,err
+	}
+	//setCurrentPeriod if endTime > time.now()
+	if period.endTime.Before(time.Now()) || period.endTime.Equal(time.Now()){
+		if err := q.setCurrentPeriod(); err != nil {
+			return nil, err
+		}
+	}
+
 	return &q.quotaBucketData.Period, nil
 }
 
+//setCurrentPeriod only for rolling window else just return the value of QuotaPeriod
+func (q *QuotaBucket) GetQuotaBucketPeriod() (*QuotaPeriod,error) {
+	if q.quotaBucketData.QuotaType == QuotaTypeRollingWindow {
+		qRWType := RollingWindowQuotaDescriptorType{}
+		err := qRWType.SetCurrentPeriod(q)
+		if err != nil {
+			return nil, err
+		}
+	}
+	return &q.quotaBucketData.Period,nil
+}
+
+
+
 func (q *QuotaBucket) GetMaxCount() int {
 	return q.quotaBucketData.MaxCount
 }
@@ -117,11 +220,12 @@
 	return q.quotaBucketData.BucketType
 }
 
-func (q *quotaBucketData) SetPeriod(startTime time.Time, endTime time.Time) {
-	q.Period = QuotaPeriod{inputStartTime: q.StartTime,
+func (q *QuotaBucket) SetPeriod(startTime time.Time, endTime time.Time) {
+	period := QuotaPeriod{inputStartTime: q.GetStartTime(),
 		startTime: startTime,
 		endTime:   endTime,
 	}
+	q.quotaBucketData.Period = period
 }
 
 func (q *QuotaBucket) setCurrentPeriod() error {
@@ -136,13 +240,16 @@
 
 func (period *QuotaPeriod) IsCurrentPeriod(qBucket *QuotaBucket) bool {
 	if qBucket != nil && qBucket.GetBucketType() != "" {
-		if qBucket.GetBucketType() == QuotaTypeRollingWindow {
-			return (period.inputStartTime.Equal(time.Now()) || period.inputStartTime.Before(time.Now()))
+		if qBucket.GetQuotaType() == QuotaTypeRollingWindow {
+			return (period.inputStartTime.Equal(time.Now()) || period.inputStartTime.Before(time.Now()) )
 		}
-		return ((period.inputStartTime.Equal(time.Now()) || period.inputStartTime.Before(time.Now())) &&
-			period.startTime.String() != "" && period.endTime.String() != "" &&
-			period.startTime.Before(time.Now()) && period.startTime.Equal(time.Now()) &&
-			period.endTime.Before(time.Now()) && period.startTime.Equal(time.Now()))
+
+		return (period.inputStartTime.Equal(time.Now()) || period.inputStartTime.Before(time.Now())) &&
+			period.startTime.String() != "" &&
+			period.endTime.String() != "" &&
+			period.startTime.Before(period.endTime) &&
+			(period.startTime.Equal(time.Now()) || period.startTime.Before(time.Now()))&&
+			(period.endTime.Equal(time.Now()) || period.endTime.After(time.Now()))
 	}
 	return false
 }
@@ -167,3 +274,17 @@
 	//todo
 	return 0, nil
 }
+
+func IsValidTimeUnit(timeUnit string) bool {
+	if _, ok := acceptedTimeUnitList[timeUnit]; ok {
+		return true
+	}
+	return false
+}
+
+func IsValidQuotaBucketType(bucketType string) bool {
+	if _, ok := acceptedBucketTypeList[bucketType]; ok {
+		return true
+	}
+	return false
+}
diff --git a/quotaBucket/quotaBucketType.go b/quotaBucket/quotaBucketType.go
index 843846b..1eb051a 100644
--- a/quotaBucket/quotaBucketType.go
+++ b/quotaBucket/quotaBucketType.go
@@ -5,13 +5,6 @@
 	"strings"
 )
 
-const (
-	QuotaBucketTypeSynchronous    = "synchronous"
-	QuotaBucketTypeAsynchronous   = "asynchronous"
-	QuotaBucketTypeNonDistributed = "nonDistributed"
-	//todo: Add other bucketTypes
-)
-
 type QuotaBucketType interface {
 	resetCount(bucket *QuotaBucket) error
 }
diff --git a/quotaBucket/quotaBucketType_test.go b/quotaBucket/quotaBucketType_test.go
new file mode 100644
index 0000000..70ee53d
--- /dev/null
+++ b/quotaBucket/quotaBucketType_test.go
@@ -0,0 +1,9 @@
+package quotaBucket_test
+
+import (
+	. "github.com/onsi/ginkgo"
+)
+
+var _ = Describe("QuotaBucketType", func() {
+
+})
diff --git a/quotaBucket/quotaBucket_suite_test.go b/quotaBucket/quotaBucket_suite_test.go
new file mode 100644
index 0000000..b05019b
--- /dev/null
+++ b/quotaBucket/quotaBucket_suite_test.go
@@ -0,0 +1,22 @@
+package quotaBucket_test
+
+import (
+	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/gomega"
+	"fmt"
+	"testing"
+)
+
+func TestQuotaBucket(t *testing.T) {
+	RegisterFailHandler(Fail)
+	RunSpecs(t, "QuotaBucket Suite")
+}
+
+var _ = BeforeSuite(func() {
+	fmt.Println("before suite")
+
+})
+
+var _ = AfterSuite(func() {
+	fmt.Println("after suite")
+})
diff --git a/quotaBucket/quotaBucket_test.go b/quotaBucket/quotaBucket_test.go
new file mode 100644
index 0000000..df50e82
--- /dev/null
+++ b/quotaBucket/quotaBucket_test.go
@@ -0,0 +1,507 @@
+package quotaBucket_test
+
+import (
+	. "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(1492324596, 1490047028, 1492725428)
+		isValid, err := period.Validate()
+
+		if !isValid || err != nil {
+			Fail("expected isValid: true and error: nil for NewQuotaPeriod")
+		}
+	})
+
+	It("Invalid NewQuotaPeriod", func() {
+		//startTime after endTime
+		period := NewQuotaPeriod(1492324596, 1492725428, 1490047028)
+		isValid, err := period.Validate()
+		if err == nil || isValid {
+			Fail("Expected isValid: false and error: <notNil> for invalid NewQuotaPeriod. startTime should be before endTime")
+		}
+	})
+
+})
+
+var _ = Describe("Test AcceptedQuotaTimeUnitTypes", func() {
+	It("testTimeUnit", func() {
+		if !IsValidTimeUnit("second") {
+			Fail("second is a valid TimeUnit")
+		}
+		if !IsValidTimeUnit("minute") {
+			Fail("minute is a valid TimeUnit")
+		}
+		if !IsValidTimeUnit("hour") {
+			Fail("hour is a valid TimeUnit")
+		}
+		if !IsValidTimeUnit("day") {
+			Fail("day is a valid TimeUnit")
+		}
+		if !IsValidTimeUnit("week") {
+			Fail("week is a valid TimeUnit")
+		}
+		if !IsValidTimeUnit("month") {
+			Fail("month is a valid TimeUnit")
+		}
+
+		//invalid type
+		if IsValidTimeUnit("invalidType") {
+			Fail("invalidType is a invalid TimeUnit")
+		}
+	})
+})
+
+var _ = Describe("Test AcceptedQuotaBucketTypes", func() {
+	It("testTimeUnit", func() {
+		if !IsValidQuotaBucketType("synchronous") {
+			Fail("synchronous is a valid quotaBucket")
+		}
+		if !IsValidQuotaBucketType("asynchronous") {
+			Fail("asynchronous is a valid quotaBucket")
+		}
+		if !IsValidQuotaBucketType("nonDistributed") {
+			Fail("nonDistributed is a valid quotaBucket")
+		}
+
+		//invalid type
+		if IsValidQuotaBucketType("invalidType") {
+			Fail("invalidType is a invalid quotaBucket")
+		}
+	})
+})
+
+var _ = Describe("QuotaBucket", func() {
+	It("Create with NewQuotaBucket", func() {
+		edgeOrgID := "sampleOrg"
+		id := "sampleID"
+		timeUnit := "hour"
+		quotaType := "calendar"
+		bucketType := "synchronous"
+		interval := 1
+		maxCount := 10
+		preciseAtSecondsLevel := true
+		period := NewQuotaPeriod(time.Now().AddDate(0,-1,0).Unix(),
+			time.Now().AddDate(0,0,-1).Unix(),
+			time.Now().AddDate(0,1,0).Unix())
+		startTime := int64(1492324596)
+
+		quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
+		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.GetQuotaType()))
+		Expect(bucketType).To(Equal(quotaBucket.GetBucketType()))
+		Expect(interval).To(Equal(quotaBucket.GetInterval()))
+		Expect(maxCount).To(Equal(quotaBucket.GetMaxCount()))
+		Expect(preciseAtSecondsLevel).To(Equal(quotaBucket.GetPreciseAtSecondsLevel()))
+		getPeriod, err := quotaBucket.GetPeriod()
+		Expect(err).NotTo(HaveOccurred())
+		Expect(period).To(Equal(*getPeriod))
+
+	})
+
+	It("Test invalid quotaPeriod", func() {
+		edgeOrgID := "sampleOrg"
+		id := "sampleID"
+		timeUnit := "hour"
+		quotaType := "calendar"
+		bucketType := "synchronous"
+		interval := 1
+		maxCount := 10
+		preciseAtSecondsLevel := true
+		period := NewQuotaPeriod(1492324596, 1492725428, 1490047028)
+		startTime := int64(1492324596)
+
+		quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
+		err := quotaBucket.Validate()
+		if err == nil {
+			Fail("error expected but got <nil>")
+		}
+		if !strings.Contains(err.Error(), InvalidQuotaPeriod) {
+			Fail("expected: " + InvalidQuotaPeriod + " in the error but got: " + err.Error())
+		}
+
+	})
+
+	It("Test invalid timeUnitType", func() {
+		edgeOrgID := "sampleOrg"
+		id := "sampleID"
+		timeUnit := "invalidTimeUnit"
+		quotaType := "calendar"
+		bucketType := "synchronous"
+		interval := 1
+		maxCount := 10
+		preciseAtSecondsLevel := true
+		period := NewQuotaPeriod(time.Now().AddDate(0,-1,0).Unix(),
+			time.Now().AddDate(0,0,-1).Unix(),
+			time.Now().AddDate(0,1,0).Unix())
+		startTime := int64(1492324596)
+
+		quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
+		err := quotaBucket.Validate()
+		if err == nil {
+			Fail("error expected but got <nil>")
+		}
+		if err.Error() != InvalidQuotaTimeUnitType {
+			Fail("expected: " + InvalidQuotaBucketType + "but got: " + err.Error())
+		}
+
+	})
+
+	It("Test invalid quotaBucketType", func() {
+		edgeOrgID := "sampleOrg"
+		id := "sampleID"
+		timeUnit := "hour"
+		quotaType := "calendar"
+		bucketType := "invalidQuotaBucket"
+		interval := 1
+		maxCount := 10
+		preciseAtSecondsLevel := true
+		period := NewQuotaPeriod(time.Now().AddDate(0,-1,0).Unix(),
+			time.Now().AddDate(0,0,-1).Unix(),
+			time.Now().AddDate(0,1,0).Unix())
+		startTime := time.Now().AddDate(0,-1,0).Unix()
+
+		quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
+		err := quotaBucket.Validate()
+		if err == nil {
+			Fail("error expected but got <nil>")
+		}
+		if err.Error() != InvalidQuotaBucketType {
+			Fail("expected: " + InvalidQuotaBucketType + "but got: " + err.Error())
+		}
+
+	})
+
+})
+
+
+
+
+var _ = Describe("IsCurrentPeriod", func(){
+	It("Test RollingType Window Valid TestCase", func() {
+
+		edgeOrgID := "sampleOrg"
+		id := "sampleID"
+		timeUnit := "hour"
+		quotaType := "rollingwindow"
+		bucketType := "synchronous"
+		interval := 1
+		maxCount := 10
+		preciseAtSecondsLevel := true
+		//InputStart time is before now
+		period := NewQuotaPeriod(time.Now().AddDate(0, -1,0).Unix(),
+			time.Now().AddDate(0,0, -1).Unix(),
+			time.Now().AddDate(0,1,0).Unix())
+		startTime := time.Now().AddDate(0,-1,0).Unix()
+
+		quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
+		err := quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+		if ok := period.IsCurrentPeriod(quotaBucket); !ok{
+			Fail("Exprected true, returned: false")
+		}
+
+		//InputStart time is now
+		period = NewQuotaPeriod(time.Now().Unix(),
+			time.Now().AddDate(0,0,-1).Unix(),
+			time.Now().AddDate(0,1,0).Unix())
+		startTime = time.Now().Unix()
+		quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+
+		period.IsCurrentPeriod(quotaBucket)
+		if ok := period.IsCurrentPeriod(quotaBucket); !ok{
+			Fail("Exprected true, returned: false")
+		}
+	})
+
+	It("Test RollingType Window InValid TestCase", func() {
+
+		edgeOrgID := "sampleOrg"
+		id := "sampleID"
+		timeUnit := "hour"
+		quotaType := "rollingwindow"
+		bucketType := "synchronous"
+		interval := 1
+		maxCount := 10
+		preciseAtSecondsLevel := true
+		//InputStart time is after now.
+		period := NewQuotaPeriod(time.Now().AddDate(0,1,0).Unix(),
+			time.Now().AddDate(0,1,0).Unix(), time.Now().AddDate(0,0,1).Unix())
+		startTime := time.Now().AddDate(0,1,0).Unix()
+
+		quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
+		err := quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+
+		if ok := period.IsCurrentPeriod(quotaBucket); ok{
+			Fail("Exprected true, returned: false")
+		}
+
+		//endTime before startTime in period
+		startTime = time.Now().AddDate(0,-1,0).Unix()
+		quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
+		quotaBucket.SetPeriod(time.Now(), time.Now().AddDate(0,1,0))
+		if ok := period.IsCurrentPeriod(quotaBucket); ok{
+			Fail("Exprected false, returned: true")
+		}
+	})
+
+
+	It("Test NonRollingType Window Valid TestCases", func() {
+
+		edgeOrgID := "sampleOrg"
+		id := "sampleID"
+		timeUnit := "hour"
+		quotaType := "calendar"
+		bucketType := "synchronous"
+		interval := 1
+		maxCount := 10
+		preciseAtSecondsLevel := true
+
+
+		//InputStart time is before now
+		period := NewQuotaPeriod(time.Now().AddDate(0, -1,0).Unix(),
+			time.Now().AddDate(0,0, -1).Unix(),
+			time.Now().AddDate(0,1,0).Unix())
+		startTime := time.Now().AddDate(0,-1,0).Unix()
+
+		quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
+		err := quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+		if ok := period.IsCurrentPeriod(quotaBucket); !ok{
+			Fail("Exprected true, returned: false")
+		}
+
+
+		//InputStart time is now
+		period = NewQuotaPeriod(time.Now().Unix(),
+			time.Now().AddDate(0,0,-1).Unix(),
+			time.Now().AddDate(0,1,0).Unix())
+		startTime = time.Now().Unix()
+		quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+		period.IsCurrentPeriod(quotaBucket)
+		if ok := period.IsCurrentPeriod(quotaBucket); !ok{
+			Fail("Exprected true, returned: false")
+		}
+
+		//start Time in period is before now
+		startTime = time.Now().Unix()
+		period = NewQuotaPeriod(time.Now().AddDate(0,-1,0).Unix(),
+			time.Now().AddDate(0,0,-1).Unix(),
+			time.Now().AddDate(0,1,0).Unix())
+		quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+		period.IsCurrentPeriod(quotaBucket)
+		if ok := period.IsCurrentPeriod(quotaBucket); !ok{
+			Fail("Exprected true, returned: false")
+		}
+
+		//start Time in period is now
+		startTime = time.Now().Unix()
+		period = NewQuotaPeriod(time.Now().AddDate(0,-1,0).Unix(),
+			time.Now().Unix(),
+			time.Now().AddDate(0,1,0).Unix())
+		quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+		period.IsCurrentPeriod(quotaBucket)
+		if ok := period.IsCurrentPeriod(quotaBucket); !ok{
+			Fail("Exprected true, returned: false")
+		}
+
+		//end Time in period is now // cant set end time to now and tes.. by the time it evaluates isCurrentPeriod the period.endTime will be before time.now()
+		//fmt.Println("entTIme is now : ")
+		//startTime = time.Now().Unix()
+		//period = NewQuotaPeriod(time.Now().AddDate(0,-1,-1).Unix(),
+		//	time.Now().AddDate(0,0,-1).Unix(),
+		//	time.Now().Unix())
+		//quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
+		//err = quotaBucket.Validate()
+		//if err != nil {
+		//	Fail("no error expected but got error: " + 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().Unix()
+		period = NewQuotaPeriod(time.Now().AddDate(0,-1,0).Unix(),
+			time.Now().AddDate(0,0,-1).Unix(),
+			time.Now().AddDate(0,1,0).Unix())
+		quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+		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().Unix()
+		period = NewQuotaPeriod(time.Now().AddDate(0,-1,0).Unix(),
+			time.Now().AddDate(0,-1,0).Unix(),
+			time.Now().AddDate(0,1,0).Unix())
+		quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+		period.IsCurrentPeriod(quotaBucket)
+		if ok := period.IsCurrentPeriod(quotaBucket); !ok{
+			Fail("Exprected true, returned: false")
+		}
+
+	})
+
+	It("Test Non RollingType Window InValid TestCase", func() {
+
+		edgeOrgID := "sampleOrg"
+		id := "sampleID"
+		timeUnit := "hour"
+		quotaType := "calendar"
+		bucketType := "synchronous"
+		interval := 1
+		maxCount := 10
+		preciseAtSecondsLevel := true
+
+		//InputStart time is after now.
+		period := NewQuotaPeriod(time.Now().AddDate(0,1,0).Unix(),
+			time.Now().AddDate(0,1,0).Unix(), time.Now().AddDate(1,0,1).Unix())
+		startTime := time.Now().AddDate(0,1,0).Unix()
+
+		quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
+		err := quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+		if ok := period.IsCurrentPeriod(quotaBucket); ok{
+			Fail("Exprected true, returned: false")
+		}
+
+
+		//endTime is before start time
+		startTime = time.Now().AddDate(0,-1,0).Unix()
+		quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+		quotaBucket.SetPeriod(time.Now(), time.Now().AddDate(0,-1,0))
+
+		if ok := period.IsCurrentPeriod(quotaBucket); ok{
+			Fail("Exprected true, returned: false")
+		}
+
+		//start time in period after now
+		quotaBucket.SetPeriod(time.Now().AddDate(0,1,0), time.Now().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().AddDate(-1,-1,0), time.Now().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"
+		bucketType := "synchronous"
+		interval := 1
+		maxCount := 10
+		preciseAtSecondsLevel := true
+		//InputStart time is before now
+		period := NewQuotaPeriod(time.Now().AddDate(0, -1,0).Unix(),
+			time.Now().AddDate(0,0, -1).Unix(),
+			time.Now().AddDate(0,1,0).Unix())
+		startTime := time.Now().AddDate(0,-1,0).Unix()
+		quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
+		err := quotaBucket.Validate()
+		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().AddDate(0,-1,0)
+		pendTime := time.Now().AddDate(0,1,0)
+		quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
+		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().AddDate(0,-1,0)
+		pendTime = time.Now().AddDate(0,-1,0)
+		quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
+		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")
+		}
+		intervalDuration = qPeriod.GetPeriodEndTime().Sub(qPeriod.GetPeriodStartTime())
+		expectedDuration, err = GetIntervalDurtation(quotaBucket)
+		Expect(intervalDuration).Should(Equal(expectedDuration))
+
+
+
+	})
+
+})
+
diff --git a/quotaBucket/quotaDescriptorType.go b/quotaBucket/quotaDescriptorType.go
new file mode 100644
index 0000000..c94333c
--- /dev/null
+++ b/quotaBucket/quotaDescriptorType.go
@@ -0,0 +1,155 @@
+package quotaBucket
+
+import (
+	"errors"
+	"fmt"
+	"strings"
+	"time"
+)
+
+const (
+	QuotaTypeCalendar      = "calendar"      // after start time
+	QuotaTypeFlexi         = "flexi"         //after first request
+	QuotaTypeRollingWindow = "rollingwindow" // in the past "window" time
+)
+
+type QuotaDescriptorType interface {
+	SetCurrentPeriod(bucket *QuotaBucket) error
+}
+
+func GetQuotaTypeHandler(qType string) (QuotaDescriptorType, error) {
+	var qDescriptor QuotaDescriptorType
+	quotaType := strings.ToLower(strings.TrimSpace(qType))
+	switch quotaType {
+	case QuotaTypeCalendar:
+		qDescriptor = &CalendarQuotaDescriptorType{}
+		return qDescriptor, nil
+	case QuotaTypeRollingWindow:
+		qDescriptor = &RollingWindowQuotaDescriptorType{}
+		return qDescriptor, nil
+	default:
+		return nil, errors.New("Quota type " + qType + " in the request is not supported")
+
+	}
+}
+
+type CalendarQuotaDescriptorType struct{}
+
+func (c CalendarQuotaDescriptorType) SetCurrentPeriod(qbucket *QuotaBucket) error {
+	startTime := qbucket.GetStartTime()
+	currentPeriod,err := qbucket.GetQuotaBucketPeriod()
+if err != nil {
+	return err
+}
+	if startTime.Before(time.Now()) || startTime.Equal(time.Now()) {
+		if currentPeriod != nil {
+			if currentPeriod.IsCurrentPeriod(qbucket) {
+				return nil
+			}
+		} else {
+			if currentPeriod.IsCurrentPeriod(qbucket) {
+				return nil
+			} else {
+				qBucketHandler, err := GetQuotaBucketHandler(qbucket.BucketType)
+				if err != nil {
+					return errors.New("error getting QuotaBucketType: " + err.Error())
+				}
+				qBucketHandler.resetCount(qbucket)
+			}
+		}
+	}
+
+	var currentStart, currentEnd time.Time
+	now := time.Now()
+	timeUnit := strings.ToLower(strings.TrimSpace(qbucket.TimeUnit))
+	switch timeUnit {
+	case TimeUnitSECOND:
+		currentStart = time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second(), 0, time.UTC)
+		secInDuration := time.Duration(int64(qbucket.Interval) * time.Second.Nanoseconds())
+		currentEnd = currentStart.Add(secInDuration)
+		break
+	case TimeUnitMINUTE:
+		currentStart = time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), 0, 0, time.UTC)
+		minInDuration := time.Duration(int64(qbucket.Interval) * time.Minute.Nanoseconds())
+		currentEnd = currentStart.Add(minInDuration)
+		break
+	case TimeUnitHOUR:
+		currentStart = time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, time.UTC)
+		hoursInDuration := time.Duration(int64(qbucket.Interval) * time.Hour.Nanoseconds())
+		currentEnd = currentStart.Add(hoursInDuration)
+
+		break
+	case TimeUnitDAY:
+		currentStart = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.UTC)
+		currentEnd = currentStart.AddDate(0, 0, 1*qbucket.Interval)
+		break
+	case TimeUnitWEEK:
+		//todo
+		currentStart = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.UTC)
+		for currentStart.Weekday() != time.Monday {
+			currentStart = currentStart.AddDate(0, 0, -1)
+		}
+		currentEnd = currentStart.AddDate(0, 0, 7*qbucket.Interval)
+		break
+	case TimeUnitMONTH:
+		currentStart = time.Date(now.Year(), now.Month(), 0, 0, 0, 0, 0, time.UTC)
+		currentEnd = currentStart.AddDate(0, qbucket.Interval, 0)
+		break
+	}
+
+	qbucket.SetPeriod(currentStart, currentEnd)
+	fmt.Println("inside calendar set period: ", qbucket.quotaBucketData.Period)
+	return nil
+}
+
+type RollingWindowQuotaDescriptorType struct{}
+
+func (c RollingWindowQuotaDescriptorType) SetCurrentPeriod(qbucket *QuotaBucket) error {
+	//yet to implement
+	var currentStart, currentEnd time.Time
+	currentEnd = time.Now()
+	interval, err := GetIntervalDurtation(qbucket)
+	if err != nil {
+		return errors.New("error in SetCurrentPeriod: " + err.Error())
+	}
+	currentStart = currentEnd.Add(-interval)
+	qbucket.SetPeriod(currentStart, currentEnd)
+
+	return nil
+}
+func GetIntervalDurtation(qb *QuotaBucket) (time.Duration, error) {
+	timeUnit := strings.ToLower(strings.TrimSpace(qb.TimeUnit))
+	switch timeUnit {
+	case TimeUnitSECOND:
+		return time.Duration(int64(qb.Interval) * time.Second.Nanoseconds()), nil
+	case TimeUnitMINUTE:
+		return time.Duration(int64(qb.Interval) * time.Minute.Nanoseconds()), nil
+	case TimeUnitHOUR:
+		return time.Duration(int64(qb.Interval) * time.Hour.Nanoseconds()), nil
+	case TimeUnitDAY:
+		return time.Duration(int64(qb.Interval*24) * time.Hour.Nanoseconds()), nil
+	case TimeUnitWEEK:
+		return time.Duration(int64(qb.Interval*24*7) * time.Hour.Nanoseconds()), nil
+	case TimeUnitMONTH:
+		now := time.Now()
+		var currentStart, currentEnd time.Time
+		quotaType := strings.ToLower(strings.TrimSpace(qb.QuotaType))
+		switch quotaType {
+		case QuotaTypeCalendar:
+			currentStart = time.Date(now.Year(), now.Month(), 0, 0, 0, 0, 0, time.UTC)
+			currentEnd = currentStart.AddDate(0, qb.Interval, 0)
+			return currentEnd.Sub(currentStart), nil
+		case QuotaTypeRollingWindow:
+			currentEnd = now
+			currentStart = currentEnd.AddDate(0, -qb.Interval, 0)
+			return currentEnd.Sub(currentStart), nil
+		default:
+			return time.Duration(0), errors.New("Ignoring unrecognized quotaType : " + quotaType)
+
+		}
+	default:
+		return time.Duration(0), errors.New("Ignoring unrecognized timeUnit : " + timeUnit)
+
+	}
+
+}
diff --git a/quotaBucket/quotaDescriptorType_test.go b/quotaBucket/quotaDescriptorType_test.go
new file mode 100644
index 0000000..22a4a08
--- /dev/null
+++ b/quotaBucket/quotaDescriptorType_test.go
@@ -0,0 +1,9 @@
+package quotaBucket_test
+
+import (
+	. "github.com/onsi/ginkgo"
+)
+
+var _ = Describe("QuotaDescriptorType", func() {
+
+})