grim/resticide

Rework the way errors work so they're sane
develop
2016-07-09, Gary Kramlich
48f650f4442c
Parents 7dcd9cd95251
Children d4d89cd17dfe
Rework the way errors work so they're sane
--- a/loader/schema.json Sat Jul 09 09:56:31 2016 -0500
+++ b/loader/schema.json Sat Jul 09 10:38:27 2016 -0500
@@ -103,7 +103,7 @@
"anyOf": [{
"required": ["statuscode", "body"]
}, {
- "required": ["status_code", "json-schema"]
+ "required": ["statuscode", "json-schema"]
}, {
"required": ["statuscode"]
}],
--- a/reporter/console_reporter.go Sat Jul 09 09:56:31 2016 -0500
+++ b/reporter/console_reporter.go Sat Jul 09 10:38:27 2016 -0500
@@ -38,7 +38,11 @@
fmt.Printf("%s %s %s\n", test.Name, status, test.Duration.String())
- if reporter.verbose || res.Passed == false {
+ if !res.Passed {
+ fmt.Printf(" %s\n", res.Error.Error())
+ }
+
+ if reporter.verbose {
writer := new(tabwriter.Writer)
writer.Init(os.Stdout, 2, 2, 2, ' ', 0)
--- a/test/request.go Sat Jul 09 09:56:31 2016 -0500
+++ b/test/request.go Sat Jul 09 10:38:27 2016 -0500
@@ -14,6 +14,7 @@
"net/url"
"os"
"path/filepath"
+ "strings"
"gopkg.in/xeipuuv/gojsonschema.v0"
)
@@ -134,12 +135,15 @@
return hreq, nil
}
-func (req *Request) compareResponse(res *Result, hresp *http.Response) {
- res.HttpResponse = *hresp
-
+func (req *Request) compareResponse(hresp *http.Response) (bool, error) {
// first check the resp code
if hresp.StatusCode != req.Response.StatusCode {
- return
+ err := fmt.Errorf(
+ "Expected status code '%d' but got '%d'",
+ req.Response.StatusCode,
+ hresp.StatusCode,
+ )
+ return false, err
}
// check the headers
@@ -147,7 +151,13 @@
actual := hresp.Header[http.CanonicalHeaderKey(name)]
if actual != nil {
if actual[0] != value {
- return
+ err := fmt.Errorf(
+ "Expected header '%s' to be '%s' but received '%s'",
+ name,
+ value,
+ actual[0],
+ )
+ return false, err
}
}
}
@@ -155,44 +165,52 @@
// read the body into a byte array
body_byte, err := ioutil.ReadAll(hresp.Body)
if err != nil {
- return
+ return false, err
}
// check if we have a file block and check it
if len(req.Response.File) > 0 {
- passed := true
-
if sha256_digest, ok := req.Response.File["sha256"]; ok {
sum := sha256.Sum256(body_byte)
+ actual := fmt.Sprintf("%x", sum)
- if fmt.Sprintf("%x", sum) != sha256_digest {
- passed = false
+ if actual != sha256_digest {
+ err := fmt.Errorf(
+ "Expected file to have a SHA256 of '%s' but received '%s'",
+ sha256_digest,
+ actual,
+ )
+
+ return false, err
}
}
if md5_digest, ok := req.Response.File["md5"]; ok {
sum := md5.Sum(body_byte)
+ actual := fmt.Sprintf("%x", sum)
- if fmt.Sprintf("%x", sum) != md5_digest {
- passed = false
+ if actual != md5_digest {
+ err := fmt.Errorf(
+ "Expected file to have a MD5 of '%s' but received '%s'",
+ md5_digest,
+ actual,
+ )
+
+ return false, err
}
}
if filename, ok := req.Response.File["filename"]; ok {
file, err := os.Create(filename)
if err != nil {
- passed = false
+ return false, err
}
_, err = file.Write(body_byte)
if err != nil {
- passed = false
+ return false, err
}
}
-
- if passed == false {
- return
- }
} else {
body := string(body_byte[:])
@@ -203,16 +221,21 @@
schema_result, err := gojsonschema.Validate(schema_loader, body_loader)
if err != nil {
- return
+ return false, err
}
if schema_result.Valid() != true {
- return
+ errors := []string{}
+ for _, err := range schema_result.Errors() {
+ errors = append(errors, err.Description())
+ }
+ err_msg := strings.Join(errors, "\n")
+ err := fmt.Errorf("Schema validation failed:\n%s", err_msg)
+
+ return false, err
}
}
}
- // if we made it this far, we passed, yay!
- res.Passed = true
- res.TestResponse = req.Response
+ return true, nil
}
--- a/test/result.go Sat Jul 09 09:56:31 2016 -0500
+++ b/test/result.go Sat Jul 09 10:38:27 2016 -0500
@@ -7,8 +7,9 @@
type Result struct {
Test *Test
Passed bool
- HttpResponse http.Response
+ HttpResponse *http.Response
TestResponse Response
+ Error error
}
func NewResult(test *Test) *Result {
--- a/test/test.go Sat Jul 09 09:56:31 2016 -0500
+++ b/test/test.go Sat Jul 09 10:38:27 2016 -0500
@@ -29,11 +29,14 @@
client := &http.Client{}
resp, err := client.Do(http_request)
if err != nil {
+ res.Error = err
return res
}
defer resp.Body.Close()
- request.compareResponse(res, resp)
+ res.HttpResponse = resp
+
+ res.Passed, res.Error = request.compareResponse(resp)
}
test.End = time.Now()