[ISSUE-66918282] update tests, improve style
diff --git a/api.go b/api.go
index 321cb96..5f5ab0e 100644
--- a/api.go
+++ b/api.go
@@ -408,7 +408,7 @@
 
 func getHttpHost() string {
 
-	configuredEndpoint := config.GetString(configBundleBlobDownloadEndpoint)
+	configuredEndpoint := config.GetString(configBlobDownloadEndpoint)
 	if configuredEndpoint != "" {
 		return configuredEndpoint
 	}
diff --git a/apidGatewayConfDeploy_suite_test.go b/apidGatewayConfDeploy_suite_test.go
index 0c859f7..a85014a 100644
--- a/apidGatewayConfDeploy_suite_test.go
+++ b/apidGatewayConfDeploy_suite_test.go
@@ -50,7 +50,7 @@
 	config.Set(configApiServerBaseURI, "http://localhost")
 	config.Set(configDebounceDuration, "1ms")
 	config.Set(configDownloadQueueSize, 1)
-	config.Set(configBundleCleanupDelay, time.Millisecond)
+	config.Set(configBlobCleanupDelay, time.Millisecond)
 	apid.InitializePlugins("0.0.0")
 	go apid.API().Listen()
 	time.Sleep(1 * time.Second)
diff --git a/bundle.go b/bundle.go
index 5daf0a0..ab7e073 100644
--- a/bundle.go
+++ b/bundle.go
@@ -150,10 +150,10 @@
 		}
 	}
 	b.blobs = ids
-	log.Debug("Attempt to download blobs, len: %v", len(b.blobs))
+	log.Debugf("Attempt to download blobs, len: %v", len(b.blobs))
 
 	if len(b.blobs) == 0 && b.callback != nil {
-		b.callback()
+		go b.callback()
 		return
 	}
 
@@ -181,7 +181,7 @@
 	attempted     bool
 }
 
-func (r *DownloadRequest) downloadBundle() error {
+func (r *DownloadRequest) downloadBlob() error {
 
 	log.Debugf("starting bundle download attempt for blobId=%s", r.blobId)
 	var err error
@@ -355,7 +355,7 @@
 
 		for req := range w.bm.downloadQueue {
 			log.Debugf("starting download blobId=%s", req.blobId)
-			err := req.downloadBundle()
+			err := req.downloadBlob()
 			if err != nil {
 				// timeout
 				if _, ok := err.(*timeoutError); ok {
diff --git a/bundle_test.go b/bundle_test.go
index c4ffacd..fc1ec0d 100644
--- a/bundle_test.go
+++ b/bundle_test.go
@@ -66,7 +66,7 @@
 
 		// init dummy api manager
 		dummyApiMan = &dummyApiManager{
-			notifyChan: make(chan int, 1),
+			notifyChan: make(chan bool, 1),
 			initCalled: make(chan bool),
 		}
 
@@ -142,6 +142,28 @@
 			time.Sleep(time.Second)
 			Expect(req.markFailedAt.IsZero()).Should(BeTrue())
 		}, 4)
+
+		It("should call callback func after a round of download attempts", func() {
+			// download blobs
+			var ids []string
+			num := 1 + mathrand.Intn(5)
+			for i := 0; i < num; i++ {
+				ids = append(ids, util.GenerateUUID())
+			}
+			finishChan := make(chan int)
+			testBundleMan.downloadBlobsWithCallback(ids, func() {
+				finishChan <- 1
+			})
+			for i := 0; i < num; i++ {
+				<-dummyDbMan.fileResponse
+			}
+			<-finishChan
+			// if there's no blob
+			testBundleMan.downloadBlobsWithCallback(nil, func() {
+				finishChan <- 1
+			})
+			<-finishChan
+		}, 1)
 	})
 
 	Context("download blobs for changelist", func() {
@@ -201,7 +223,7 @@
 
 type dummyApiManager struct {
 	initCalled chan bool
-	notifyChan chan int
+	notifyChan chan bool
 }
 
 func (a *dummyApiManager) InitAPI() {
@@ -211,7 +233,7 @@
 }
 
 func (a *dummyApiManager) notifyNewChange() {
-	a.notifyChan <- 1
+	a.notifyChan <- true
 }
 
 type dummyBlobServer struct {
diff --git a/init.go b/init.go
index 692d369..41ee499 100644
--- a/init.go
+++ b/init.go
@@ -26,24 +26,24 @@
 )
 
 const (
-	configProtocol                   = "protocol_type"
-	configAPIListen                  = "api_listen"
-	configBundleBlobDownloadEndpoint = "gatewaydeploy_bundle_download_endpoint"
-	configBundleDirKey               = "gatewaydeploy_bundle_dir"
-	configDebounceDuration           = "gatewaydeploy_debounce_duration"
-	configBundleCleanupDelay         = "gatewaydeploy_bundle_cleanup_delay"
-	configMarkDeployFailedAfter      = "gatewaydeploy_deployment_timeout"
-	configDownloadConnTimeout        = "gatewaydeploy_download_connection_timeout"
-	configApiServerBaseURI           = "apigeesync_proxy_server_base"
-	configApidInstanceID             = "apigeesync_apid_instance_id"
-	configApidClusterID              = "apigeesync_cluster_id"
-	configConcurrentDownloads        = "apigeesync_concurrent_downloads"
-	configDownloadQueueSize          = "apigeesync_download_queue_size"
-	configBlobServerBaseURI          = "apigeesync_blob_server_base"
-	configStoragePath                = "local_storage_path"
-	maxIdleConnsPerHost              = 50
-	httpTimeout                      = time.Minute
-	configBearerToken                = "apigeesync_bearer_token"
+	configProtocol              = "protocol_type"
+	configAPIListen             = "api_listen"
+	configBlobDownloadEndpoint  = "gatewaydeploy_bundle_download_endpoint"
+	configBlobDirKey            = "gatewaydeploy_bundle_dir"
+	configDebounceDuration      = "gatewaydeploy_debounce_duration"
+	configBlobCleanupDelay      = "gatewaydeploy_bundle_cleanup_delay"
+	configMarkDeployFailedAfter = "gatewaydeploy_deployment_timeout"
+	configDownloadConnTimeout   = "gatewaydeploy_download_connection_timeout"
+	configApiServerBaseURI      = "apigeesync_proxy_server_base"
+	configApidInstanceID        = "apigeesync_apid_instance_id"
+	configApidClusterID         = "apigeesync_cluster_id"
+	configConcurrentDownloads   = "apigeesync_concurrent_downloads"
+	configDownloadQueueSize     = "apigeesync_download_queue_size"
+	configBlobServerBaseURI     = "apigeesync_blob_server_base"
+	configStoragePath           = "local_storage_path"
+	maxIdleConnsPerHost         = 50
+	httpTimeout                 = time.Minute
+	configBearerToken           = "apigeesync_bearer_token"
 )
 
 var (
@@ -81,9 +81,9 @@
 		return pluginData, fmt.Errorf("%s value %s parse err: %v", configApiServerBaseURI, apiServerBaseURI, err)
 	}
 
-	config.SetDefault(configBundleDirKey, "bundles")
+	config.SetDefault(configBlobDirKey, "bundles")
 	config.SetDefault(configDebounceDuration, time.Second)
-	config.SetDefault(configBundleCleanupDelay, time.Minute)
+	config.SetDefault(configBlobCleanupDelay, time.Minute)
 	config.SetDefault(configMarkDeployFailedAfter, 5*time.Minute)
 	config.SetDefault(configDownloadConnTimeout, 5*time.Minute)
 	config.SetDefault(configConcurrentDownloads, 15)
@@ -94,9 +94,9 @@
 		return pluginData, fmt.Errorf("%s must be a positive duration", configDebounceDuration)
 	}
 
-	bundleCleanupDelay := config.GetDuration(configBundleCleanupDelay)
+	bundleCleanupDelay := config.GetDuration(configBlobCleanupDelay)
 	if bundleCleanupDelay < time.Millisecond {
-		return pluginData, fmt.Errorf("%s must be a positive duration", configBundleCleanupDelay)
+		return pluginData, fmt.Errorf("%s must be a positive duration", configBlobCleanupDelay)
 	}
 
 	markDeploymentFailedAfter := config.GetDuration(configMarkDeployFailedAfter)
@@ -145,7 +145,7 @@
 	// initialize bundle manager
 
 	blobServerURL := config.GetString(configBlobServerBaseURI)
-	relativeBundlePath := config.GetString(configBundleDirKey)
+	relativeBundlePath := config.GetString(configBlobDirKey)
 	storagePath := config.GetString(configStoragePath)
 	bundlePath = path.Join(storagePath, relativeBundlePath)
 	if err := os.MkdirAll(bundlePath, 0700); err != nil {
@@ -169,9 +169,6 @@
 
 	bundleMan.initializeBundleDownloading()
 
-	//TODO initialize apiMan.distributeEvents() for api call with "block"
-	//go apiMan.distributeEvents()
-
 	// initialize event handler
 	eventHandler = &apigeeSyncHandler{
 		dbMan:     dbMan,
diff --git a/listener.go b/listener.go
index 220997a..f77d306 100644
--- a/listener.go
+++ b/listener.go
@@ -36,13 +36,6 @@
 	}
 }
 
-type bundleConfigJson struct {
-	Name         string `json:"name"`
-	URI          string `json:"uri"`
-	ChecksumType string `json:"checksumType"`
-	Checksum     string `json:"checksum"`
-}
-
 type apigeeSyncHandler struct {
 	dbMan     dbManagerInterface
 	apiMan    apiManagerInterface
diff --git a/listener_test.go b/listener_test.go
index b9d3b2b..000a6e9 100644
--- a/listener_test.go
+++ b/listener_test.go
@@ -37,7 +37,7 @@
 		eventHandler.stopListener(services)
 
 		dummyApiMan = &dummyApiManager{
-			notifyChan: make(chan int, 1),
+			notifyChan: make(chan bool, 1),
 			initCalled: make(chan bool),
 		}
 		dummyDbMan = &dummyDbManager{
@@ -89,7 +89,7 @@
 			}
 		})
 
-		It("Snapshot events should set db version, and should only init API endpoint once", func() {
+		It("Snapshot events should set db version", func() {
 
 			// emit snapshot
 			for i := 0; i < 2+rand.Intn(5); i++ {
@@ -100,9 +100,19 @@
 				<-apid.Events().Emit(APIGEE_SYNC_EVENT, snapshot)
 				Expect(dummyDbMan.version).Should(Equal(version))
 			}
+		})
 
-			// verify init API called
-			// Expect(<-dummyApiMan.initCalled).Should(BeTrue())
+		It("Snapshot event should init API endpoint and notify long-polling", func() {
+
+			// emit snapshot
+			version := fmt.Sprint(rand.Uint32())
+			snapshot := &common.Snapshot{
+				SnapshotInfo: version,
+			}
+			<-apid.Events().Emit(APIGEE_SYNC_EVENT, snapshot)
+			Expect(dummyDbMan.version).Should(Equal(version))
+			Expect(<-dummyApiMan.initCalled).Should(BeTrue())
+			Expect(<-dummyApiMan.notifyChan).Should(BeTrue())
 		})
 
 	})
@@ -297,6 +307,7 @@
 			bm.blobChan <- id
 		}
 	}()
+	go callback()
 }
 
 func (bm *dummyBundleManager) makeDownloadRequest(blobId string, bunchRequest *BunchDownloadRequest) *DownloadRequest {