Refactor bundle download test cases and negative cases
diff --git a/apidGatewayDeploy_suite_test.go b/apidGatewayDeploy_suite_test.go index 227276d..23981e8 100644 --- a/apidGatewayDeploy_suite_test.go +++ b/apidGatewayDeploy_suite_test.go
@@ -71,7 +71,7 @@ router.HandleFunc("/bundles/{id}", func(w http.ResponseWriter, req *http.Request) { count++ vars := apid.API().Vars(req) - if count%2 == 0 { + if count%2 == 0 && vars["id"] != "checksum" { w.WriteHeader(500) return }
diff --git a/bundle_test.go b/bundle_test.go index ed385da..46e7a74 100644 --- a/bundle_test.go +++ b/bundle_test.go
@@ -69,125 +69,7 @@ Expect(d.ID).To(Equal(deploymentID)) }) - It("should download correctly with sha256", func() { - uri, err := url.Parse(testServer.URL) - Expect(err).ShouldNot(HaveOccurred()) - uri.Path = "/bundles/longfail" - checksum := testGetChecksum("sha256", uri.String()) - - tx, err := getDB().Begin() - Expect(err).ShouldNot(HaveOccurred()) - - deploymentID := "bundle_download_succeed" - dep := DataDeployment{ - ID: deploymentID, - DataScopeID: deploymentID, - BundleURI: uri.String(), - BundleChecksum: checksum, - BundleChecksumType: "sha256", - } - - err = InsertDeployment(tx, dep) - Expect(err).ShouldNot(HaveOccurred()) - - err = tx.Commit() - Expect(err).ShouldNot(HaveOccurred()) - - queueDownloadRequest(dep) - - var listener = make(chan deploymentsResult) - addSubscriber <- listener - result := <-listener - - Expect(result.err).NotTo(HaveOccurred()) - Expect(len(result.deployments)).To(Equal(1)) - d := result.deployments[0] - Expect(d.ID).To(Equal(deploymentID)) - }) - - It("should download correctly with sh512", func() { - uri, err := url.Parse(testServer.URL) - Expect(err).ShouldNot(HaveOccurred()) - uri.Path = "/bundles/longfail" - checksum := testGetChecksum("sha512", uri.String()) - - tx, err := getDB().Begin() - Expect(err).ShouldNot(HaveOccurred()) - - deploymentID := "bundle_download_succeed" - dep := DataDeployment{ - ID: deploymentID, - DataScopeID: deploymentID, - BundleURI: uri.String(), - BundleChecksum: checksum, - BundleChecksumType: "sha512", - } - - err = InsertDeployment(tx, dep) - Expect(err).ShouldNot(HaveOccurred()) - - err = tx.Commit() - Expect(err).ShouldNot(HaveOccurred()) - - queueDownloadRequest(dep) - - var listener = make(chan deploymentsResult) - addSubscriber <- listener - result := <-listener - - Expect(result.err).NotTo(HaveOccurred()) - Expect(len(result.deployments)).To(Equal(1)) - d := result.deployments[0] - Expect(d.ID).To(Equal(deploymentID)) - }) - - It("should download correctly with MD5 and redirects", func() { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.URL.Path == "/bundles/longfail" { - w.Write([]byte("/bundles/longfail")) - } else { - http.Redirect(w, r, "/bundles/longfail", 302) - } - })) - defer ts.Close() - - uri, err := url.Parse(ts.URL) - Expect(err).ShouldNot(HaveOccurred()) - uri.Path = "/bundles/longfail" - checksum := testGetChecksum("MD5", uri.String()) - uri.Path = "/bundles/redirect" - - tx, err := getDB().Begin() - Expect(err).ShouldNot(HaveOccurred()) - - deploymentID := "bundle_download_succeed" - dep := DataDeployment{ - ID: deploymentID, - DataScopeID: deploymentID, - BundleURI: uri.String(), - BundleChecksum: checksum, - BundleChecksumType: "MD5", - } - - err = InsertDeployment(tx, dep) - Expect(err).ShouldNot(HaveOccurred()) - - err = tx.Commit() - Expect(err).ShouldNot(HaveOccurred()) - - queueDownloadRequest(dep) - - var listener = make(chan deploymentsResult) - addSubscriber <- listener - result := <-listener - - Expect(result.err).NotTo(HaveOccurred()) - Expect(len(result.deployments)).To(Equal(1)) - d := result.deployments[0] - Expect(d.ID).To(Equal(deploymentID)) - }) - - It("should timeout deployment, mark status as failed, then finish using crc32", func() { + It("should timeout deployment, mark status as failed, then finish", func() { proceed := make(chan bool) failedOnce := false @@ -379,68 +261,78 @@ // No way to test this programmatically currently // search logs for "never mind, deployment bundle_download_deployment_deleted was deleted" }) + }) - It("should download if empty Checksum and ChecksumType", func() { + Context("checksums", func() { - deploymentID := "bundle_download_temporary" + It("should download with empty checksumType", func() { + checksumDownloadValid("") + }) - uri, err := url.Parse(testServer.URL) - Expect(err).ShouldNot(HaveOccurred()) + It("should fail download with bad empty checksumType", func() { + checksumDownloadInvalid("") + }) - uri.Path = "/bundles/1" - bundleUri := uri.String() - bundle := bundleConfigJson{ - Name: uri.Path, - URI: bundleUri, - ChecksumType: "", - Checksum: "", - } - bundleJson, err := json.Marshal(bundle) - Expect(err).ShouldNot(HaveOccurred()) + It("should fail download with bad md5", func() { + checksumDownloadInvalid("md5") + }) - tx, err := getDB().Begin() - Expect(err).ShouldNot(HaveOccurred()) + It("should download with good md5", func() { + checksumDownloadValid("md5") + }) - dep := DataDeployment{ - ID: deploymentID, - BundleConfigID: deploymentID, - ApidClusterID: deploymentID, - DataScopeID: deploymentID, - BundleConfigJSON: string(bundleJson), - ConfigJSON: string(bundleJson), - Created: "", - CreatedBy: "", - Updated: "", - UpdatedBy: "", - BundleName: deploymentID, - BundleURI: bundle.URI, - BundleChecksum: bundle.Checksum, - BundleChecksumType: bundle.ChecksumType, - LocalBundleURI: "", - DeployStatus: "", - DeployErrorCode: 0, - DeployErrorMessage: "", - } + It("should fail download with bad md5", func() { + checksumDownloadInvalid("md5") + }) - err = InsertDeployment(tx, dep) - Expect(err).ShouldNot(HaveOccurred()) + It("should download with good crc32", func() { + checksumDownloadValid("crc32") + }) - err = tx.Commit() - Expect(err).ShouldNot(HaveOccurred()) + It("should fail download with bad crc32", func() { + checksumDownloadInvalid("crc32") + }) - queueDownloadRequest(dep) + It("should download with good sha256", func() { + checksumDownloadValid("sha256") + }) - // give download time to finish - time.Sleep(markDeploymentFailedAfter + (100 * time.Millisecond)) + It("should fail download with bad sha256", func() { + checksumDownloadInvalid("sha256") + }) - deployments, err := getReadyDeployments() - Expect(err).ShouldNot(HaveOccurred()) + It("should download correctly with sha512", func() { + checksumDownloadValid("sha512") + }) - Expect(len(deployments)).To(Equal(1)) - d := deployments[0] - - Expect(d.ID).To(Equal(deploymentID)) - Expect(d.LocalBundleURI).To(BeAnExistingFile()) + It("should fail download with bad sha512", func() { + checksumDownloadInvalid("sha512") }) }) }) + +func checksumDownloadValid(checksumType string) { + defer GinkgoRecover() + + uri, err := url.Parse(testServer.URL) + Expect(err).ShouldNot(HaveOccurred()) + uri.Path = "/bundles/checksum" + checksum := testGetChecksum(checksumType, uri.String()) + hash, err := getHashWriter(checksumType) + Expect(err).NotTo(HaveOccurred()) + _, err = downloadFromURI(uri.String(), hash, checksum) + Expect(err).NotTo(HaveOccurred()) +} + +func checksumDownloadInvalid(checksumType string) { + defer GinkgoRecover() + + uri, err := url.Parse(testServer.URL) + Expect(err).ShouldNot(HaveOccurred()) + uri.Path = "/bundles/checksum" + checksum := "invalidchecksum" + hash, err := getHashWriter(checksumType) + Expect(err).NotTo(HaveOccurred()) + _, err = downloadFromURI(uri.String(), hash, checksum) + Expect(err).To(HaveOccurred()) +}