Skip to content

Commit

Permalink
refactoring scenario
Browse files Browse the repository at this point in the history
  • Loading branch information
oke11o committed Jan 9, 2024
1 parent 3a4889b commit cca655a
Show file tree
Hide file tree
Showing 63 changed files with 2,031 additions and 2,476 deletions.
79 changes: 40 additions & 39 deletions .mapping.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,7 @@
"components/guns/http_scenario/gun.go":"load/projects/pandora/components/guns/http_scenario/gun.go",
"components/guns/http_scenario/gun_test.go":"load/projects/pandora/components/guns/http_scenario/gun_test.go",
"components/guns/http_scenario/import.go":"load/projects/pandora/components/guns/http_scenario/import.go",
"components/guns/http_scenario/mock_ammo_test.go":"load/projects/pandora/components/guns/http_scenario/mock_ammo_test.go",
"components/guns/http_scenario/mock_client_test.go":"load/projects/pandora/components/guns/http_scenario/mock_client_test.go",
"components/guns/http_scenario/mock_postprocessor_test.go":"load/projects/pandora/components/guns/http_scenario/mock_postprocessor_test.go",
"components/guns/http_scenario/mock_preprocessor_test.go":"load/projects/pandora/components/guns/http_scenario/mock_preprocessor_test.go",
"components/guns/http_scenario/mock_step_test.go":"load/projects/pandora/components/guns/http_scenario/mock_step_test.go",
"components/guns/http_scenario/mock_templater_test.go":"load/projects/pandora/components/guns/http_scenario/mock_templater_test.go",
"components/guns/http_scenario/new.go":"load/projects/pandora/components/guns/http_scenario/new.go",
"components/guns/http_scenario/templater.go":"load/projects/pandora/components/guns/http_scenario/templater.go",
"components/phttp/import/import.go":"load/projects/pandora/components/phttp/import/import.go",
Expand Down Expand Up @@ -79,39 +74,45 @@
"components/providers/http/testdata/ammo.stpd":"load/projects/pandora/components/providers/http/testdata/ammo.stpd",
"components/providers/http/util/request.go":"load/projects/pandora/components/providers/http/util/request.go",
"components/providers/http/util/request_test.go":"load/projects/pandora/components/providers/http/util/request_test.go",
"components/providers/http_scenario/ammo.go":"load/projects/pandora/components/providers/http_scenario/ammo.go",
"components/providers/http_scenario/ammo_config.go":"load/projects/pandora/components/providers/http_scenario/ammo_config.go",
"components/providers/http_scenario/ammo_hcl.go":"load/projects/pandora/components/providers/http_scenario/ammo_hcl.go",
"components/providers/http_scenario/ammo_hcl_test.go":"load/projects/pandora/components/providers/http_scenario/ammo_hcl_test.go",
"components/providers/http_scenario/decode.go":"load/projects/pandora/components/providers/http_scenario/decode.go",
"components/providers/http_scenario/decode_sample_config_test.golden.hcl":"load/projects/pandora/components/providers/http_scenario/decode_sample_config_test.golden.hcl",
"components/providers/http_scenario/decode_sample_config_test.hcl":"load/projects/pandora/components/providers/http_scenario/decode_sample_config_test.hcl",
"components/providers/http_scenario/decode_sample_config_test.yml":"load/projects/pandora/components/providers/http_scenario/decode_sample_config_test.yml",
"components/providers/http_scenario/decode_test.go":"load/projects/pandora/components/providers/http_scenario/decode_test.go",
"components/providers/http_scenario/import.go":"load/projects/pandora/components/providers/http_scenario/import.go",
"components/providers/http_scenario/postprocessor/assert_response.go":"load/projects/pandora/components/providers/http_scenario/postprocessor/assert_response.go",
"components/providers/http_scenario/postprocessor/assert_response_test.go":"load/projects/pandora/components/providers/http_scenario/postprocessor/assert_response_test.go",
"components/providers/http_scenario/postprocessor/postprocessor.go":"load/projects/pandora/components/providers/http_scenario/postprocessor/postprocessor.go",
"components/providers/http_scenario/postprocessor/var_header.go":"load/projects/pandora/components/providers/http_scenario/postprocessor/var_header.go",
"components/providers/http_scenario/postprocessor/var_header_test.go":"load/projects/pandora/components/providers/http_scenario/postprocessor/var_header_test.go",
"components/providers/http_scenario/postprocessor/var_jsonpath.go":"load/projects/pandora/components/providers/http_scenario/postprocessor/var_jsonpath.go",
"components/providers/http_scenario/postprocessor/var_jsonpath_test.go":"load/projects/pandora/components/providers/http_scenario/postprocessor/var_jsonpath_test.go",
"components/providers/http_scenario/postprocessor/var_xpath.go":"load/projects/pandora/components/providers/http_scenario/postprocessor/var_xpath.go",
"components/providers/http_scenario/postprocessor/var_xpath_test.go":"load/projects/pandora/components/providers/http_scenario/postprocessor/var_xpath_test.go",
"components/providers/http_scenario/preprocessor.go":"load/projects/pandora/components/providers/http_scenario/preprocessor.go",
"components/providers/http_scenario/preprocessor_test.go":"load/projects/pandora/components/providers/http_scenario/preprocessor_test.go",
"components/providers/http_scenario/provider.go":"load/projects/pandora/components/providers/http_scenario/provider.go",
"components/providers/http_scenario/templater.go":"load/projects/pandora/components/providers/http_scenario/templater.go",
"components/providers/http_scenario/templater_html.go":"load/projects/pandora/components/providers/http_scenario/templater_html.go",
"components/providers/http_scenario/templater_html_test.go":"load/projects/pandora/components/providers/http_scenario/templater_html_test.go",
"components/providers/http_scenario/templater_text.go":"load/projects/pandora/components/providers/http_scenario/templater_text.go",
"components/providers/http_scenario/templater_text_test.go":"load/projects/pandora/components/providers/http_scenario/templater_text_test.go",
"components/providers/http_scenario/vs.go":"load/projects/pandora/components/providers/http_scenario/vs.go",
"components/providers/http_scenario/vs_csv.go":"load/projects/pandora/components/providers/http_scenario/vs_csv.go",
"components/providers/http_scenario/vs_csv_test.go":"load/projects/pandora/components/providers/http_scenario/vs_csv_test.go",
"components/providers/http_scenario/vs_json.go":"load/projects/pandora/components/providers/http_scenario/vs_json.go",
"components/providers/http_scenario/vs_json_test.go":"load/projects/pandora/components/providers/http_scenario/vs_json_test.go",
"components/providers/http_scenario/vs_variables.go":"load/projects/pandora/components/providers/http_scenario/vs_variables.go",
"components/providers/scenario/config/config.go":"load/projects/pandora/components/providers/scenario/config/config.go",
"components/providers/scenario/config/decode.go":"load/projects/pandora/components/providers/scenario/config/decode.go",
"components/providers/scenario/config/decode_test.go":"load/projects/pandora/components/providers/scenario/config/decode_test.go",
"components/providers/scenario/config/hcl.go":"load/projects/pandora/components/providers/scenario/config/hcl.go",
"components/providers/scenario/config/hcl_test.go":"load/projects/pandora/components/providers/scenario/config/hcl_test.go",
"components/providers/scenario/http/decode.go":"load/projects/pandora/components/providers/scenario/http/decode.go",
"components/providers/scenario/http/decode_test.go":"load/projects/pandora/components/providers/scenario/http/decode_test.go",
"components/providers/scenario/http/postprocessor/assert_response.go":"load/projects/pandora/components/providers/scenario/http/postprocessor/assert_response.go",
"components/providers/scenario/http/postprocessor/assert_response_test.go":"load/projects/pandora/components/providers/scenario/http/postprocessor/assert_response_test.go",
"components/providers/scenario/http/postprocessor/postprocessor.go":"load/projects/pandora/components/providers/scenario/http/postprocessor/postprocessor.go",
"components/providers/scenario/http/postprocessor/var_header.go":"load/projects/pandora/components/providers/scenario/http/postprocessor/var_header.go",
"components/providers/scenario/http/postprocessor/var_header_test.go":"load/projects/pandora/components/providers/scenario/http/postprocessor/var_header_test.go",
"components/providers/scenario/http/postprocessor/var_jsonpath.go":"load/projects/pandora/components/providers/scenario/http/postprocessor/var_jsonpath.go",
"components/providers/scenario/http/postprocessor/var_jsonpath_test.go":"load/projects/pandora/components/providers/scenario/http/postprocessor/var_jsonpath_test.go",
"components/providers/scenario/http/postprocessor/var_xpath.go":"load/projects/pandora/components/providers/scenario/http/postprocessor/var_xpath.go",
"components/providers/scenario/http/postprocessor/var_xpath_test.go":"load/projects/pandora/components/providers/scenario/http/postprocessor/var_xpath_test.go",
"components/providers/scenario/http/preprocessor/preprocessor.go":"load/projects/pandora/components/providers/scenario/http/preprocessor/preprocessor.go",
"components/providers/scenario/http/preprocessor/preprocessor_test.go":"load/projects/pandora/components/providers/scenario/http/preprocessor/preprocessor_test.go",
"components/providers/scenario/http/provider.go":"load/projects/pandora/components/providers/scenario/http/provider.go",
"components/providers/scenario/http/templater/templater.go":"load/projects/pandora/components/providers/scenario/http/templater/templater.go",
"components/providers/scenario/http/templater/templater_html.go":"load/projects/pandora/components/providers/scenario/http/templater/templater_html.go",
"components/providers/scenario/http/templater/templater_html_test.go":"load/projects/pandora/components/providers/scenario/http/templater/templater_html_test.go",
"components/providers/scenario/http/templater/templater_text.go":"load/projects/pandora/components/providers/scenario/http/templater/templater_text.go",
"components/providers/scenario/http/templater/templater_text_test.go":"load/projects/pandora/components/providers/scenario/http/templater/templater_text_test.go",
"components/providers/scenario/import/import.go":"load/projects/pandora/components/providers/scenario/import/import.go",
"components/providers/scenario/provider.go":"load/projects/pandora/components/providers/scenario/provider.go",
"components/providers/scenario/test/decode_test.go":"load/projects/pandora/components/providers/scenario/test/decode_test.go",
"components/providers/scenario/test/vs_test.go":"load/projects/pandora/components/providers/scenario/test/vs_test.go",
"components/providers/scenario/testdata/grpc_payload.hcl":"load/projects/pandora/components/providers/scenario/testdata/grpc_payload.hcl",
"components/providers/scenario/testdata/grpc_payload.yaml":"load/projects/pandora/components/providers/scenario/testdata/grpc_payload.yaml",
"components/providers/scenario/testdata/http_payload.hcl":"load/projects/pandora/components/providers/scenario/testdata/http_payload.hcl",
"components/providers/scenario/testdata/http_payload.yaml":"load/projects/pandora/components/providers/scenario/testdata/http_payload.yaml",
"components/providers/scenario/vs/storage.go":"load/projects/pandora/components/providers/scenario/vs/storage.go",
"components/providers/scenario/vs/vs.go":"load/projects/pandora/components/providers/scenario/vs/vs.go",
"components/providers/scenario/vs/vs_csv.go":"load/projects/pandora/components/providers/scenario/vs/vs_csv.go",
"components/providers/scenario/vs/vs_csv_test.go":"load/projects/pandora/components/providers/scenario/vs/vs_csv_test.go",
"components/providers/scenario/vs/vs_json.go":"load/projects/pandora/components/providers/scenario/vs/vs_json.go",
"components/providers/scenario/vs/vs_json_test.go":"load/projects/pandora/components/providers/scenario/vs/vs_json_test.go",
"components/providers/scenario/vs/vs_variables.go":"load/projects/pandora/components/providers/scenario/vs/vs_variables.go",
"core/aggregator/discard.go":"load/projects/pandora/core/aggregator/discard.go",
"core/aggregator/encoder.go":"load/projects/pandora/core/aggregator/encoder.go",
"core/aggregator/encoder_test.go":"load/projects/pandora/core/aggregator/encoder_test.go",
Expand Down Expand Up @@ -317,6 +318,6 @@
"script/coverage.sh":"load/projects/pandora/script/coverage.sh",
"tests/http_scenario/main_test.go":"load/projects/pandora/tests/http_scenario/main_test.go",
"tests/http_scenario/testdata/filter.json":"load/projects/pandora/tests/http_scenario/testdata/filter.json",
"tests/http_scenario/testdata/test_payload.hcl":"load/projects/pandora/tests/http_scenario/testdata/test_payload.hcl",
"tests/http_scenario/testdata/http_payload.hcl":"load/projects/pandora/tests/http_scenario/testdata/http_payload.hcl",
"tests/http_scenario/testdata/users.csv":"load/projects/pandora/tests/http_scenario/testdata/users.csv"
}
72 changes: 43 additions & 29 deletions components/guns/http_scenario/ammo.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,49 @@ import (
"time"
)

//go:generate go run github.com/vektra/mockery/[email protected] --inpackage --name=Preprocessor --filename=mock_preprocessor_test.go
//go:generate go run github.com/vektra/mockery/[email protected] --inpackage --name=Postprocessor --filename=mock_postprocessor_test.go
//go:generate go run github.com/vektra/mockery/[email protected] --inpackage --name=Step --filename=mock_step_test.go
//go:generate go run github.com/vektra/mockery/[email protected] --inpackage --name=Ammo --filename=mock_ammo_test.go
type SourceStorage interface {
Variables() map[string]any
}

type Scenario struct {
Requests []Request
ID uint64
Name string
MinWaitingTime time.Duration
VariableStorage SourceStorage
}

func (a *Scenario) SetID(id uint64) {
a.ID = id
}

type Request struct {
Method string
Headers map[string]string
Tag string
Body *string
Name string
URI string
Preprocessor Preprocessor
Postprocessors []Postprocessor
Templater Templater
Sleep time.Duration
}

func (r *Request) GetBody() []byte {
if r.Body == nil {
return nil
}
return []byte(*r.Body)
}

func (r *Request) GetHeaders() map[string]string {
result := make(map[string]string, len(r.Headers))
for k, v := range r.Headers {
result[k] = v
}
return result
}

type Preprocessor interface {
// Process is called before request is sent
Expand All @@ -22,34 +61,9 @@ type Postprocessor interface {
Process(resp *http.Response, body io.Reader) (map[string]any, error)
}

type VariableStorage interface {
Variables() map[string]any
}

type Step interface {
GetName() string
GetURL() string
GetMethod() string
GetBody() []byte
GetHeaders() map[string]string
GetTag() string
GetTemplater() Templater
GetPostProcessors() []Postprocessor
Preprocessor() Preprocessor
GetSleep() time.Duration
}

type RequestParts struct {
URL string
Method string
Body []byte
Headers map[string]string
}

type Ammo interface {
Steps() []Step
ID() uint64
Sources() VariableStorage
Name() string
GetMinWaitingTime() time.Duration
}
48 changes: 23 additions & 25 deletions components/guns/http_scenario/gun.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import (
)

type Gun interface {
Shoot(ammo Ammo)
Shoot(ammo *Scenario)
Bind(sample netsample.Aggregator, deps core.GunDeps) error
}

Expand Down Expand Up @@ -65,7 +65,7 @@ func (g *BaseGun) Bind(aggregator netsample.Aggregator, deps core.GunDeps) error
}

// Shoot is thread safe iff Do and Connect hooks are thread safe.
func (g *BaseGun) Shoot(ammo Ammo) {
func (g *BaseGun) Shoot(ammo *Scenario) {
if g.Aggregator == nil {
zap.L().Panic("must bind before shoot")
}
Expand All @@ -78,12 +78,12 @@ func (g *BaseGun) Shoot(ammo Ammo) {
}

templateVars := map[string]any{
"source": ammo.Sources().Variables(),
"source": ammo.VariableStorage.Variables(),
}

err := g.shoot(ammo, templateVars)
if err != nil {
g.Log.Warn("Invalid ammo", zap.Uint64("request", ammo.ID()), zap.Error(err))
g.Log.Warn("Invalid ammo", zap.Uint64("request", ammo.ID), zap.Error(err))
return
}
}
Expand All @@ -99,7 +99,7 @@ func (g *BaseGun) Close() error {
return nil
}

func (g *BaseGun) shoot(ammo Ammo, templateVars map[string]any) error {
func (g *BaseGun) shoot(ammo *Scenario, templateVars map[string]any) error {
if templateVars == nil {
templateVars = map[string]any{}
}
Expand All @@ -110,54 +110,52 @@ func (g *BaseGun) shoot(ammo Ammo, templateVars map[string]any) error {
startAt := time.Now()
var idBuilder strings.Builder
rnd := strconv.Itoa(rand.Int())
for _, step := range ammo.Steps() {
tag := ammo.Name() + "." + step.GetTag()
g.buildLogID(&idBuilder, tag, ammo.ID(), rnd)
for _, req := range ammo.Requests {
tag := ammo.Name + "." + req.Name
g.buildLogID(&idBuilder, tag, ammo.ID, rnd)
sample := netsample.Acquire(tag)

err := g.shootStep(step, sample, ammo.Name(), templateVars, requestVars, idBuilder.String())
err := g.shootStep(req, sample, ammo.Name, templateVars, requestVars, idBuilder.String())
if err != nil {
g.reportErr(sample, err)
return err
}
}
spent := time.Since(startAt)
if ammo.GetMinWaitingTime() > spent {
time.Sleep(ammo.GetMinWaitingTime() - spent)
if ammo.MinWaitingTime > spent {
time.Sleep(ammo.MinWaitingTime - spent)
}
return nil
}

func (g *BaseGun) shootStep(step Step, sample *netsample.Sample, ammoName string, templateVars map[string]any, requestVars map[string]any, stepLogID string) error {
func (g *BaseGun) shootStep(step Request, sample *netsample.Sample, ammoName string, templateVars map[string]any, requestVars map[string]any, stepLogID string) error {
const op = "base_gun.shootStep"

stepVars := map[string]any{}
requestVars[step.GetName()] = stepVars
requestVars[step.Name] = stepVars

// Preprocessor
preProcessor := step.Preprocessor()
if preProcessor != nil {
preProcVars, err := preProcessor.Process(templateVars)
if step.Preprocessor != nil {
preProcVars, err := step.Preprocessor.Process(templateVars)
if err != nil {
return fmt.Errorf("%s preProcessor %w", op, err)
}
stepVars["preprocessor"] = preProcVars
if g.DebugLog {
g.GunDeps.Log.Debug("Preprocessor variables", zap.Any(fmt.Sprintf(".resuest.%s.preprocessor", step.GetName()), preProcVars))
g.GunDeps.Log.Debug("Preprocessor variables", zap.Any(fmt.Sprintf(".request.%s.preprocessor", step.Name), preProcVars))
}
}

// Entities
reqParts := RequestParts{
URL: step.GetURL(),
Method: step.GetMethod(),
URL: step.URI,
Method: step.Method,
Body: step.GetBody(),
Headers: step.GetHeaders(),
}

// Template
templater := step.GetTemplater()
if err := templater.Apply(&reqParts, templateVars, ammoName, step.GetName()); err != nil {
if err := step.Templater.Apply(&reqParts, templateVars, ammoName, step.Name); err != nil {
return fmt.Errorf("%s templater.Apply %w", op, err)
}

Expand Down Expand Up @@ -187,7 +185,7 @@ func (g *BaseGun) shootStep(step Step, sample *netsample.Sample, ammoName string
}

// Log
processors := step.GetPostProcessors()
processors := step.Postprocessors
var respBody *bytes.Reader
var respBodyBytes []byte
if g.Config.AnswLog.Enabled || g.DebugLog || len(processors) > 0 {
Expand Down Expand Up @@ -237,11 +235,11 @@ func (g *BaseGun) shootStep(step Step, sample *netsample.Sample, ammoName string
g.Aggregator.Report(sample)

if g.DebugLog {
g.GunDeps.Log.Debug("Postprocessor variables", zap.Any(fmt.Sprintf(".resuest.%s.postprocessor", step.GetName()), postprocessorVars))
g.GunDeps.Log.Debug("Postprocessor variables", zap.Any(fmt.Sprintf(".request.%s.postprocessor", step.Name), postprocessorVars))
}

if step.GetSleep() > 0 {
time.Sleep(step.GetSleep())
if step.Sleep > 0 {
time.Sleep(step.Sleep)
}
return nil
}
Expand Down
Loading

0 comments on commit cca655a

Please sign in to comment.