fix: data racing by parsing config

This commit is contained in:
debugtalk
2022-04-12 21:47:04 +08:00
parent c6286a222a
commit f07d96cb5e
5 changed files with 47 additions and 51 deletions

View File

@@ -4,6 +4,7 @@ import (
_ "embed"
"time"
"github.com/jinzhu/copier"
"github.com/pkg/errors"
"github.com/rs/zerolog/log"
)
@@ -14,6 +15,7 @@ type SessionRunner struct {
testCase *TestCase
hrpRunner *HRPRunner
parser *Parser
parsedConfig *TConfig
sessionVariables map[string]interface{}
// transactions stores transaction timing info.
// key is transaction name, value is map of transaction type and time, e.g. start time and end time.
@@ -24,10 +26,10 @@ type SessionRunner struct {
func (r *SessionRunner) init() {
log.Info().Msg("init session runner")
r.parsedConfig = &TConfig{}
r.sessionVariables = make(map[string]interface{})
r.transactions = make(map[string]map[transactionType]time.Time)
r.startTime = time.Now()
r.summary.Name = r.testCase.Config.Name
}
func (r *SessionRunner) GetParser() *Parser {
@@ -35,7 +37,7 @@ func (r *SessionRunner) GetParser() *Parser {
}
func (r *SessionRunner) GetConfig() *TConfig {
return r.testCase.Config
return r.parsedConfig
}
func (r *SessionRunner) LogOn() bool {
@@ -62,7 +64,7 @@ func (r *SessionRunner) Start() error {
}()
// parse config
if err := r.parseConfig(config); err != nil {
if err := r.parseConfig(nil); err != nil {
return err
}
@@ -105,56 +107,67 @@ func (r *SessionRunner) MergeStepVariables(vars map[string]interface{}) (map[str
// step variables > session variables (extracted variables from previous steps)
overrideVars := mergeVariables(vars, r.sessionVariables)
// step variables > testcase config variables
overrideVars = mergeVariables(overrideVars, r.testCase.Config.Variables)
overrideVars = mergeVariables(overrideVars, r.parsedConfig.Variables)
// parse step variables
parsedVariables, err := r.parser.ParseVariables(overrideVars)
if err != nil {
log.Error().Interface("variables", r.testCase.Config.Variables).
log.Error().Interface("variables", r.parsedConfig.Variables).
Err(err).Msg("parse step variables failed")
return nil, err
}
return parsedVariables, nil
}
func (r *SessionRunner) parseConfig(cfg *TConfig) error {
// parseConfig parses testcase config with given variables, stores to parsedConfig.
func (r *SessionRunner) parseConfig(variables map[string]interface{}) error {
cfg := r.testCase.Config
// deep copy config to avoid data racing
if err := copier.Copy(r.parsedConfig, cfg); err != nil {
log.Error().Err(err).Msg("copy testcase config failed")
return err
}
// parse config variables
parsedVariables, err := r.parser.ParseVariables(cfg.Variables)
mergedVars := mergeVariables(variables, cfg.Variables)
parsedVariables, err := r.parser.ParseVariables(mergedVars)
if err != nil {
log.Error().Interface("variables", cfg.Variables).Err(err).Msg("parse config variables failed")
return err
}
cfg.Variables = parsedVariables
r.parsedConfig.Variables = parsedVariables
// parse config name
parsedName, err := r.parser.ParseString(cfg.Name, cfg.Variables)
if err != nil {
return err
}
cfg.Name = convertString(parsedName)
r.parsedConfig.Name = convertString(parsedName)
// parse config base url
parsedBaseURL, err := r.parser.ParseString(cfg.BaseURL, cfg.Variables)
if err != nil {
return err
}
cfg.BaseURL = convertString(parsedBaseURL)
r.parsedConfig.BaseURL = convertString(parsedBaseURL)
// ensure correction of think time config
cfg.ThinkTimeSetting.checkThinkTime()
r.parsedConfig.ThinkTimeSetting.checkThinkTime()
return nil
}
func (r *SessionRunner) GetSummary() *TestCaseSummary {
caseSummary := r.summary
caseSummary.Name = r.parsedConfig.Name
caseSummary.Time.StartAt = r.startTime
caseSummary.Time.Duration = time.Since(r.startTime).Seconds()
exportVars := make(map[string]interface{})
for _, value := range r.testCase.Config.Export {
for _, value := range r.parsedConfig.Export {
exportVars[value] = r.sessionVariables[value]
}
caseSummary.InOut.ExportVars = exportVars
caseSummary.InOut.ConfigVars = r.testCase.Config.Variables
caseSummary.InOut.ConfigVars = r.parsedConfig.Variables
return caseSummary
}