forked from assert200/gorest
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtype.go
155 lines (128 loc) · 4.1 KB
/
type.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
package gorest
import (
"fmt"
"net/http"
"net/http/cookiejar"
"net/url"
"regexp"
"time"
)
// RestRequest struct
type RestRequest struct {
Body []byte
Method string
Headers http.Header
Cookies *cookiejar.Jar
URL url.URL
FollowRedirects bool
Delay time.Duration
}
// NewRestRequest factory
func NewRestRequest() RestRequest {
restRequest := RestRequest{}
restRequest.Headers = http.Header{}
restRequest.FollowRedirects = true
restRequest.Cookies, _ = cookiejar.New(nil)
return restRequest
}
func (r RestRequest) String() string {
s := fmt.Sprintf("Request URL: %s\n", r.URL.String())
s += fmt.Sprintf("Request Method: %s\n", r.Method)
s += fmt.Sprintf("Request Body: %s\n", r.Body)
for k, v := range r.Headers {
s += fmt.Sprintln("Request Header Key: ", k, "Value: ", v)
}
s += fmt.Sprintf("Request Cookies: %v\n", r.Cookies)
return s
}
// RestResponse struct
type RestResponse struct {
Body []byte
Headers http.Header
Cookies *cookiejar.Jar
StatusCode int
}
func (r RestResponse) String() string {
s := fmt.Sprintf("Response status code: %d\n", r.StatusCode)
s += fmt.Sprintf("Response Body: %s\n", string(r.Body))
for k, v := range r.Headers {
s += fmt.Sprintln("Response Header Key: ", k, "Value: ", v)
}
s += fmt.Sprintf("Response Cookies: %v\n", r.Cookies)
return s
}
// A Generator creates new tests from responses from existing tests
type Generator func(restTestResponse RestTest) (newTests []RestTest)
// RestTest struct
type RestTest struct {
RestRequest RestRequest
RestResponse RestResponse
Generator Generator
Description string
Values map[string]string
RequestTime float64
ExpectedStatusCode int
BodyExpectations []*regexp.Regexp
BodyRefusals []*regexp.Regexp
Errors []error
}
// Result Result
type Result struct {
ShortestRequestTime float64
LongestRequestTime float64
TotalElapsedTime float64
TotalRequests int
TotalErrors int
}
func (r Result) String() string {
return fmt.Sprintf("AvgReq, %f, Variance, %f, ShortestReq, %f, LongestReq, %f, TotalElapsed, %f, TotalReqs, %d, TotalErrors, %d", r.TotalElapsedTime/float64(r.TotalRequests), (r.LongestRequestTime - r.ShortestRequestTime), r.ShortestRequestTime, r.LongestRequestTime, r.TotalElapsedTime, r.TotalRequests, r.TotalErrors)
}
//Results Results
type Results map[string]*Result
//Add Add
func (rs Results) Add(restTest RestTest) {
if _, ok := rs[restTest.Description]; !ok {
var result Result
result.ShortestRequestTime = restTest.RequestTime
result.LongestRequestTime = restTest.RequestTime
result.TotalElapsedTime = restTest.RequestTime
result.TotalRequests = 1
result.TotalErrors = len(restTest.Errors)
rs[restTest.Description] = &result
} else {
if restTest.RequestTime < rs[restTest.Description].ShortestRequestTime {
rs[restTest.Description].ShortestRequestTime = restTest.RequestTime
}
if restTest.RequestTime > rs[restTest.Description].LongestRequestTime {
rs[restTest.Description].LongestRequestTime = restTest.RequestTime
}
rs[restTest.Description].TotalElapsedTime += restTest.RequestTime
rs[restTest.Description].TotalRequests++
rs[restTest.Description].TotalErrors += len(restTest.Errors)
}
}
func (rs Results) String() string {
var totalResult Result
var s string
firstResult := true
for key, result := range rs {
if firstResult {
totalResult.ShortestRequestTime = result.ShortestRequestTime
totalResult.LongestRequestTime = result.LongestRequestTime
firstResult = false
} else {
if result.ShortestRequestTime < totalResult.ShortestRequestTime {
totalResult.ShortestRequestTime = result.ShortestRequestTime
}
if result.LongestRequestTime > totalResult.LongestRequestTime {
totalResult.LongestRequestTime = result.LongestRequestTime
}
}
totalResult.TotalElapsedTime += result.TotalElapsedTime
totalResult.TotalErrors += result.TotalErrors
totalResult.TotalRequests += result.TotalRequests
s += fmt.Sprintln(key, ",", result)
}
s += fmt.Sprintln("TOTAL RESULT,", totalResult)
return s
}