* loadParameters loads parameters from multiple sources. parameter value may be in three types: (1) data list, e.g. ["iOS/10.1", "iOS/10.2", "iOS/10.3"] (2) call built-in parameterize function, "${parameterize(account.csv)}" (3) call custom function in debugtalk.py, "${gen_app_version()}" co
(configParameters map[string]interface{}, variablesMapping map[string]interface{})
| 241 | } |
| 242 | */ |
| 243 | func (p *Parser) loadParameters(configParameters map[string]interface{}, variablesMapping map[string]interface{}) ( |
| 244 | map[string]Parameters, error) { |
| 245 | |
| 246 | if len(configParameters) == 0 { |
| 247 | return nil, nil |
| 248 | } |
| 249 | |
| 250 | parsedParameters := make(map[string]Parameters) |
| 251 | |
| 252 | for k, v := range configParameters { |
| 253 | var parametersRawList interface{} |
| 254 | rawValue := reflect.ValueOf(v) |
| 255 | |
| 256 | switch rawValue.Kind() { |
| 257 | case reflect.Slice: |
| 258 | // case 1 |
| 259 | // e.g. user_agent: ["iOS/10.1", "iOS/10.2"] |
| 260 | // => ["iOS/10.1", "iOS/10.2"] |
| 261 | parametersRawList = rawValue.Interface() |
| 262 | |
| 263 | case reflect.String: |
| 264 | // case 2 or case 3 |
| 265 | // e.g. username-password: ${parameterize(examples/hrp/account.csv)} |
| 266 | // => [{"username": "test1", "password": "111111"}, {"username": "test2", "password": "222222"}] |
| 267 | // => [["test1", "111111"], ["test2", "222222"]] |
| 268 | // e.g. "app_version": "${gen_app_version()}" |
| 269 | // => ["1.0.0", "1.0.1"] |
| 270 | parsedParameterContent, err := p.ParseString(rawValue.String(), variablesMapping) |
| 271 | if err != nil { |
| 272 | log.Error().Err(err). |
| 273 | Str("parametersRawContent", rawValue.String()). |
| 274 | Msg("parse parameters content failed") |
| 275 | return nil, err |
| 276 | } |
| 277 | |
| 278 | parsedParameterRawValue := reflect.ValueOf(parsedParameterContent) |
| 279 | if parsedParameterRawValue.Kind() != reflect.Slice { |
| 280 | log.Error(). |
| 281 | Interface("parsedParameterContent", parsedParameterRawValue). |
| 282 | Msg("parsed parameters content is not slice") |
| 283 | return nil, errors.New("parsed parameters content should be slice") |
| 284 | } |
| 285 | parametersRawList = parsedParameterRawValue.Interface() |
| 286 | |
| 287 | default: |
| 288 | log.Error(). |
| 289 | Interface("parameters", configParameters). |
| 290 | Msg("config parameters raw value should be slice or string (functions call)") |
| 291 | return nil, errors.New("config parameters raw value format error") |
| 292 | } |
| 293 | |
| 294 | parameterSlice, err := convertParameters(k, parametersRawList) |
| 295 | if err != nil { |
| 296 | return nil, err |
| 297 | } |
| 298 | parsedParameters[k] = parameterSlice |
| 299 | } |
| 300 | return parsedParameters, nil |