normalize case and use crc32 instead of crc-32 to match to what UI is sending for checksumType, add support for sha256 and sha512
diff --git a/api_test.go b/api_test.go
index e793251..665074e 100644
--- a/api_test.go
+++ b/api_test.go
@@ -374,7 +374,7 @@
bundle := bundleConfigJson{
Name: uri.Path,
URI: bundleUri,
- ChecksumType: "crc-32",
+ ChecksumType: "crc32",
}
bundle.Checksum = testGetChecksum(bundle.ChecksumType, bundleUri)
bundleJson, err := json.Marshal(bundle)
diff --git a/bundle.go b/bundle.go
index 8d03074..ccc72e0 100644
--- a/bundle.go
+++ b/bundle.go
@@ -2,6 +2,8 @@
import (
"crypto/md5"
+ "crypto/sha256"
+ "crypto/sha512"
"encoding/base64"
"encoding/hex"
"errors"
@@ -14,6 +16,7 @@
"net/url"
"os"
"path"
+ "strings"
"time"
)
@@ -201,7 +204,7 @@
// todo: add authentication - TBD?
- // assume it's a file if no scheme
+ // assume it's a file if no scheme - todo: remove file support?
if uri.Scheme == "" || uri.Scheme == "file" {
f, err := os.Open(uri.Path)
if err != nil {
@@ -228,15 +231,21 @@
var hashWriter hash.Hash
- switch hashType {
+ switch strings.ToLower(hashType) {
+ case "":
+ // todo: remove empty checksum support?
+ hashWriter = fakeHash{md5.New()}
case "md5":
hashWriter = md5.New()
- case "crc-32":
+ case "crc32":
hashWriter = crc32.NewIEEE()
+ case "sha256":
+ hashWriter = sha256.New()
+ case "sha512":
+ hashWriter = sha512.New()
default:
- // todo: temporary - this disables checksums until server implements (XAPID-544)
- hashWriter = fakeHash{md5.New()}
- //return nil, errors.New("checksumType must be md5 or crc-32")
+ return nil, errors.New(
+ fmt.Sprintf("invalid checksumType: %s. valid types: md5, crc32, sha256, sha512", hashType))
}
return hashWriter, nil
diff --git a/bundle_test.go b/bundle_test.go
index fd2be63..88f83b7 100644
--- a/bundle_test.go
+++ b/bundle_test.go
@@ -30,7 +30,6 @@
time.Sleep(1 * time.Second)
w.WriteHeader(500)
} else {
- //proceed <- true
w.Write([]byte("/bundles/longfail"))
}
}))
@@ -48,8 +47,8 @@
ID: deploymentID,
DataScopeID: deploymentID,
BundleURI: uri.String(),
- BundleChecksum: testGetChecksum("crc-32", uri.String()),
- BundleChecksumType: "crc-32",
+ BundleChecksum: testGetChecksum("crc32", uri.String()),
+ BundleChecksumType: "crc32",
}
err = InsertDeployment(tx, dep)
@@ -70,7 +69,125 @@
Expect(d.ID).To(Equal(deploymentID))
})
- It("should timeout deployment, mark status as failed, then finish", func() {
+ 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() {
proceed := make(chan bool)
failedOnce := false
@@ -97,7 +214,7 @@
bundle := bundleConfigJson{
Name: uri.Path,
URI: bundleUri,
- ChecksumType: "crc-32",
+ ChecksumType: "crc32",
}
bundle.Checksum = testGetChecksum(bundle.ChecksumType, bundleUri)
bundleJson, err := json.Marshal(bundle)
@@ -208,7 +325,7 @@
bundle := bundleConfigJson{
Name: uri.Path,
URI: bundleUri,
- ChecksumType: "crc-32",
+ ChecksumType: "crc32",
}
bundle.Checksum = testGetChecksum(bundle.ChecksumType, bundleUri)
bundleJson, err := json.Marshal(bundle)
@@ -263,8 +380,8 @@
// search logs for "never mind, deployment bundle_download_deployment_deleted was deleted"
})
- // todo: temporary - this tests that checksum is disabled until server implements (XAPID-544)
- It("should TEMPORARILY download even if empty Checksum and ChecksumType", func() {
+ // todo: remove empty checksum support?
+ It("should download even if empty Checksum and ChecksumType", func() {
deploymentID := "bundle_download_temporary"
diff --git a/listener_test.go b/listener_test.go
index 33ebd41..0c79f3f 100644
--- a/listener_test.go
+++ b/listener_test.go
@@ -30,7 +30,7 @@
bundle1 := bundleConfigJson{
Name: uri.Path,
URI: bundleUri,
- ChecksumType: "crc-32",
+ ChecksumType: "crc32",
}
bundle1.Checksum = testGetChecksum(bundle1.ChecksumType, bundleUri)
bundle1Json, err := json.Marshal(bundle1)
@@ -92,7 +92,7 @@
bundle := bundleConfigJson{
Name: uri.Path,
URI: bundleUri,
- ChecksumType: "crc-32",
+ ChecksumType: "crc32",
}
bundle.Checksum = testGetChecksum(bundle.ChecksumType, bundleUri)
@@ -243,7 +243,7 @@
bundle := bundleConfigJson{
Name: uri.Path,
URI: bundleUri,
- ChecksumType: "crc-32",
+ ChecksumType: "crc32",
}
bundle.Checksum = testGetChecksum(bundle.ChecksumType, bundleUri)
bundle1Json, err := json.Marshal(bundle)