mirror of
https://github.com/dutchcoders/transfer.sh.git
synced 2025-01-15 13:10:18 +01:00
146 lines
3.8 KiB
Go
146 lines
3.8 KiB
Go
|
// Copyright 2015 Google Inc. All rights reserved.
|
||
|
//
|
||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
// you may not use this file except in compliance with the License.
|
||
|
// You may obtain a copy of the License at
|
||
|
//
|
||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||
|
//
|
||
|
// Unless required by applicable law or agreed to in writing, software
|
||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
// See the License for the specific language governing permissions and
|
||
|
// limitations under the License.
|
||
|
|
||
|
// Package martiantest provides helper utilities for testing
|
||
|
// modifiers.
|
||
|
package martiantest
|
||
|
|
||
|
import (
|
||
|
"net/http"
|
||
|
"sync/atomic"
|
||
|
)
|
||
|
|
||
|
// Modifier keeps track of the number of requests and responses it has modified
|
||
|
// and can be configured to return errors or run custom functions.
|
||
|
type Modifier struct {
|
||
|
reqcount int32 // atomic
|
||
|
rescount int32 // atomic
|
||
|
reqerr error
|
||
|
reserr error
|
||
|
reqfunc func(*http.Request)
|
||
|
resfunc func(*http.Response)
|
||
|
}
|
||
|
|
||
|
// NewModifier returns a new test modifier.
|
||
|
func NewModifier() *Modifier {
|
||
|
return &Modifier{}
|
||
|
}
|
||
|
|
||
|
// RequestCount returns the number of requests modified.
|
||
|
func (m *Modifier) RequestCount() int32 {
|
||
|
return atomic.LoadInt32(&m.reqcount)
|
||
|
}
|
||
|
|
||
|
// ResponseCount returns the number of responses modified.
|
||
|
func (m *Modifier) ResponseCount() int32 {
|
||
|
return atomic.LoadInt32(&m.rescount)
|
||
|
}
|
||
|
|
||
|
// RequestModified returns whether a request has been modified.
|
||
|
func (m *Modifier) RequestModified() bool {
|
||
|
return m.RequestCount() != 0
|
||
|
}
|
||
|
|
||
|
// ResponseModified returns whether a response has been modified.
|
||
|
func (m *Modifier) ResponseModified() bool {
|
||
|
return m.ResponseCount() != 0
|
||
|
}
|
||
|
|
||
|
// RequestError overrides the error returned by ModifyRequest.
|
||
|
func (m *Modifier) RequestError(err error) {
|
||
|
m.reqerr = err
|
||
|
}
|
||
|
|
||
|
// ResponseError overrides the error returned by ModifyResponse.
|
||
|
func (m *Modifier) ResponseError(err error) {
|
||
|
m.reserr = err
|
||
|
}
|
||
|
|
||
|
// RequestFunc is a function to run during ModifyRequest.
|
||
|
func (m *Modifier) RequestFunc(reqfunc func(req *http.Request)) {
|
||
|
m.reqfunc = reqfunc
|
||
|
}
|
||
|
|
||
|
// ResponseFunc is a function to run during ModifyResponse.
|
||
|
func (m *Modifier) ResponseFunc(resfunc func(res *http.Response)) {
|
||
|
m.resfunc = resfunc
|
||
|
}
|
||
|
|
||
|
// ModifyRequest increases the count of requests seen and runs reqfunc if configured.
|
||
|
func (m *Modifier) ModifyRequest(req *http.Request) error {
|
||
|
atomic.AddInt32(&m.reqcount, 1)
|
||
|
|
||
|
if m.reqfunc != nil {
|
||
|
m.reqfunc(req)
|
||
|
}
|
||
|
|
||
|
return m.reqerr
|
||
|
}
|
||
|
|
||
|
// ModifyResponse increases the count of responses seen and runs resfunc if configured.
|
||
|
func (m *Modifier) ModifyResponse(res *http.Response) error {
|
||
|
atomic.AddInt32(&m.rescount, 1)
|
||
|
|
||
|
if m.resfunc != nil {
|
||
|
m.resfunc(res)
|
||
|
}
|
||
|
|
||
|
return m.reserr
|
||
|
}
|
||
|
|
||
|
// Reset resets the request and response counts, the custom
|
||
|
// functions, and the modifier errors.
|
||
|
func (m *Modifier) Reset() {
|
||
|
atomic.StoreInt32(&m.reqcount, 0)
|
||
|
atomic.StoreInt32(&m.rescount, 0)
|
||
|
|
||
|
m.reqfunc = nil
|
||
|
m.resfunc = nil
|
||
|
|
||
|
m.reqerr = nil
|
||
|
m.reserr = nil
|
||
|
}
|
||
|
|
||
|
// Matcher is a stubbed matcher used in tests.
|
||
|
type Matcher struct {
|
||
|
resval bool
|
||
|
reqval bool
|
||
|
}
|
||
|
|
||
|
// NewMatcher returns a pointer to martiantest.Matcher with the return values
|
||
|
// for MatchRequest and MatchResponse intiailized to true.
|
||
|
func NewMatcher() *Matcher {
|
||
|
return &Matcher{resval: true, reqval: true}
|
||
|
}
|
||
|
|
||
|
// ResponseEvaluatesTo sets the value returned by MatchResponse.
|
||
|
func (tm *Matcher) ResponseEvaluatesTo(value bool) {
|
||
|
tm.resval = value
|
||
|
}
|
||
|
|
||
|
// RequestEvaluatesTo sets the value returned by MatchRequest.
|
||
|
func (tm *Matcher) RequestEvaluatesTo(value bool) {
|
||
|
tm.reqval = value
|
||
|
}
|
||
|
|
||
|
// MatchRequest returns the stubbed value in tm.reqval.
|
||
|
func (tm *Matcher) MatchRequest(*http.Request) bool {
|
||
|
return tm.reqval
|
||
|
}
|
||
|
|
||
|
// MatchResponse returns the stubbed value in tm.resval.
|
||
|
func (tm *Matcher) MatchResponse(*http.Response) bool {
|
||
|
return tm.resval
|
||
|
}
|