Added testcases for upload_manager
diff --git a/upload_manager_test.go b/upload_manager_test.go
new file mode 100644
index 0000000..e0033e9
--- /dev/null
+++ b/upload_manager_test.go
@@ -0,0 +1,111 @@
+package apidAnalytics
+
+import (
+	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/gomega"
+	"io/ioutil"
+	"os"
+	"path/filepath"
+	"strconv"
+)
+
+var _ = Describe("test handleUploadDirStatus()", func() {
+	Context("successful upload", func() {
+		It("should delete dir from staging and remove entry from map", func() {
+			dirName := "testorg~testenv~20160101530000"
+			dirPath := filepath.Join(localAnalyticsStagingDir, dirName)
+
+			err := os.Mkdir(dirPath, os.ModePerm)
+			Expect(err).ShouldNot(HaveOccurred())
+
+			info, e := os.Stat(dirPath)
+			Expect(e).ShouldNot(HaveOccurred())
+			handleUploadDirStatus(info, true)
+
+			status, _ := exists(dirPath)
+			Expect(status).To(BeFalse())
+			_, exists := retriesMap[dirName]
+			Expect(exists).To(BeFalse())
+		})
+	})
+	Context("unsuccessful upload", func() {
+		It("retry thrice before moving to failed", func() {
+			dirName := "testorg~testenv~20160101530000"
+			dirPath := filepath.Join(localAnalyticsStagingDir, dirName)
+
+			err := os.Mkdir(dirPath, os.ModePerm)
+			Expect(err).ShouldNot(HaveOccurred())
+
+			info, e := os.Stat(dirPath)
+			Expect(e).ShouldNot(HaveOccurred())
+
+			// Retry thrice
+			for i := 1; i < maxRetries; i++ {
+				handleUploadDirStatus(info, false)
+
+				status, _ := exists(dirPath)
+				Expect(status).To(BeTrue())
+
+				cnt, exists := retriesMap[dirName]
+				Expect(exists).To(BeTrue())
+				Expect(cnt).To(Equal(i))
+			}
+
+			// after final retry, it should be moved to failed
+			handleUploadDirStatus(info, false)
+
+			failedPath := filepath.Join(localAnalyticsFailedDir, dirName)
+
+			status, _ := exists(failedPath)
+			Expect(status).To(BeTrue())
+
+			_, exists := retriesMap[dirName]
+			Expect(exists).To(BeFalse())
+		})
+	})
+})
+
+var _ = Describe("test retryFailedUploads()", func() {
+	Context("previously failed directories in failed folder", func() {
+		It("should be moved to staging directory", func() {
+			dirName := "testorg~testenv~20160101830000"
+			dirPath := filepath.Join(localAnalyticsFailedDir, dirName)
+
+			err := os.Mkdir(dirPath, os.ModePerm)
+			Expect(err).ShouldNot(HaveOccurred())
+
+			retryFailedUploads()
+
+			stagingPath := filepath.Join(localAnalyticsStagingDir, dirName)
+
+			// move from failed to staging directory
+			status, _ := exists(dirPath)
+			Expect(status).To(BeFalse())
+
+			status, _ = exists(stagingPath)
+			Expect(status).To(BeTrue())
+		})
+		It("if multiple folders, then move only configured batch at a time", func() {
+			for i := 1; i < (retryFailedDirBatchSize * 2); i++ {
+				dirName := "testorg~testenv" + strconv.Itoa(i) + "~2016010183000"
+				dirPath := filepath.Join(localAnalyticsFailedDir, dirName)
+				err := os.Mkdir(dirPath, os.ModePerm)
+				Expect(err).ShouldNot(HaveOccurred())
+			}
+
+			// before count failed
+			dirs, _ := ioutil.ReadDir(localAnalyticsFailedDir)
+			failedDirCntBefore := len(dirs)
+
+			retryFailedUploads()
+
+			// after count failed
+			dirs, _ = ioutil.ReadDir(localAnalyticsFailedDir)
+			failedDirCntAfter := len(dirs)
+
+			Expect(failedDirCntBefore - failedDirCntAfter).
+				To(Equal(retryFailedDirBatchSize))
+
+		})
+	})
+})