diff --git a/Dockerfile b/Dockerfile
index 71e48fb59d..b2c85e95e3 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -35,7 +35,10 @@ RUN $APT_UPDATE && $APT_INSTALL \
RUN locale-gen "en_US.UTF-8" && update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8
# Force cgi version to fix CVE-2021-41816
-RUN gem install rspec rake selenium-webdriver cgi:0.1.1 && gem update bundler date && gem cleanup
+RUN gem install rspec rake selenium-webdriver cgi:0.1.1 && gem update bundler date && gem cleanup \
+ && rm /usr/lib/ruby/gems/2.7.0/specifications/default/cgi-0.1.0.gemspec \
+ && rm /usr/lib/ruby/gems/2.7.0/specifications/default/bundler-2.1.4.gemspec \
+ && rm /usr/lib/ruby/gems/2.7.0/specifications/default/date-3.0.0.gemspec
# Get Google Chrome
RUN $APT_INSTALL ./google-chrome-stable_current_amd64.deb \
@@ -53,12 +56,6 @@ RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747
&& $APT_UPDATE \
&& $APT_INSTALL k6
-# Install Vegeta
-ENV VEGETA_VERSION 12.8.4
-RUN wget -q "https://github.com/tsenart/vegeta/releases/download/v${VEGETA_VERSION}/vegeta_${VEGETA_VERSION}_linux_amd64.tar.gz" -O /tmp/vegeta.tar.gz \
- && tar xzf /tmp/vegeta.tar.gz -C /bin \
- && rm /tmp/vegeta.tar.gz
-
# auto installable tools
RUN mkdir -p /etc/bzt.d \
&& echo '{"install-id": "Docker"}' > /etc/bzt.d/99-zinstallID.json \
diff --git a/bzt/modules/external.py b/bzt/modules/external.py
index 58edd779bd..7347a400d9 100644
--- a/bzt/modules/external.py
+++ b/bzt/modules/external.py
@@ -9,7 +9,6 @@
from bzt.modules.aggregator import AggregatorListener, ConsolidatingAggregator, DataPoint
from bzt.modules.gatling import DataLogReader as GatlingLogReader
from bzt.modules.jmeter import JTLReader, XMLJTLReader
-from bzt.modules.vegeta import VegetaLogReader
from bzt.utils import dehumanize_time
@@ -109,9 +108,6 @@ def _get_reader(self):
return GatlingLogReader(self.data_file, self.log, None)
elif "timestamp" in header.lower() and "elapsed" in header.lower():
return JTLReader(self.data_file, self.log, self.errors_file)
- elif re.match("^[0-9]{19},", header):
- # Vegeta CSV does not have a header, every line starts with a timestamp in nanoseconds
- return VegetaLogReader(self.data_file, self.log)
else:
self.log.info("Header line was: %s", header)
raise TaurusInternalException("Unable to detect results format for: %s" % self.data_file)
diff --git a/bzt/modules/jmeter.py b/bzt/modules/jmeter.py
index c5c5900a5d..4a30341dc5 100644
--- a/bzt/modules/jmeter.py
+++ b/bzt/modules/jmeter.py
@@ -1582,18 +1582,19 @@ def _get_jar_fixes(self, lib_dir):
affected_components = {
# Needs to be <1.4.18 for old Jmeters https://stackoverflow.com/questions/30812293/com-thoughtworks-xstream-security-forbiddenclassexception
"xstream": "com/thoughtworks/xstream/xstream/1.4.19/xstream-1.4.19.jar",
- "jackson-annotations": "com/fasterxml/jackson/core/jackson-annotations/2.13.3/jackson-annotations-2.13.3.jar",
- "jackson-core": "com/fasterxml/jackson/core/jackson-core/2.13.3/jackson-core-2.13.3.jar",
- "jackson-databind": "com/fasterxml/jackson/core/jackson-databind/2.13.3/jackson-databind-2.13.3.jar",
+ "jackson-annotations": "com/fasterxml/jackson/core/jackson-annotations/2.13.4/jackson-annotations-2.13.4.jar",
+ "jackson-core": "com/fasterxml/jackson/core/jackson-core/2.13.4/jackson-core-2.13.4.jar",
+ "jackson-databind": "com/fasterxml/jackson/core/jackson-databind/2.13.4.2/jackson-databind-2.13.4.2.jar",
"json-smart": "net/minidev/json-smart/2.4.8/json-smart-2.4.8.jar",
"jsoup": "org/jsoup/jsoup/1.15.3/jsoup-1.15.3.jar",
- "snakeyaml": "org/yaml/snakeyaml/1.31/snakeyaml-1.31.jar",
- "okhttp" : "com/squareup/okhttp3/okhttp/4.10.0/okhttp-4.10.0.jar",
+ "snakeyaml": "org/yaml/snakeyaml/1.33/snakeyaml-1.33.jar",
+ "okhttp": "com/squareup/okhttp3/okhttp/4.10.0/okhttp-4.10.0.jar",
+ "commons-text": "org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar",
"xmlgraphics-commons": "org/apache/xmlgraphics/xmlgraphics-commons/2.7/xmlgraphics-commons-2.7.jar"}
if LooseVersion(self.version) <= LooseVersion('5.4.2'): # log4j must be fixed till jmeter 5.4.2
affected_names = ["log4j-core", "log4j-api", "log4j-slf4j-impl", "log4j-1.2-api"]
- fixed_version = '2.17.2'
+ fixed_version = '2.19.0'
maven_link = "org/apache/logging/log4j/{name}/{ver}/{name}-{ver}.jar"
for name in affected_names:
diff --git a/bzt/modules/vegeta.py b/bzt/modules/vegeta.py
deleted file mode 100644
index 15ce3474cb..0000000000
--- a/bzt/modules/vegeta.py
+++ /dev/null
@@ -1,200 +0,0 @@
-"""
-Copyright 2021 BlazeMeter Inc.
-
-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.
-"""
-import json
-import os
-from subprocess import PIPE
-from bzt import TaurusConfigError, ToolError
-from bzt.modules import ScenarioExecutor
-from bzt.modules.console import ExecutorWidget
-from bzt.modules.aggregator import ResultsReader, ConsolidatingAggregator
-from bzt.utils import RequiredTool, CALL_PROBLEMS, FileReader, shutdown_process, get_full_path, is_windows, is_mac, \
- untar
-
-
-class VegetaExecutor(ScenarioExecutor):
- def __init__(self):
- super(VegetaExecutor, self).__init__()
- self.output_file = None
- self.log_file = None
- self.script = None
- self.process = None
- self.vegeta = None
- self.kpi_file = None
- self.scenario = None
-
- def prepare(self):
- super(VegetaExecutor, self).prepare()
- self.scenario = self.get_scenario()
- self.install_required_tools()
-
- self.script = self.get_script_path()
- if not self.script:
- requests = self.scenario.get_requests()
- if not requests:
- raise TaurusConfigError("Either 'script' or 'scenario' should be present for Vegeta executor")
- self.script = os.path.join(self.engine.artifacts_dir, "vegeta.txt")
- with open(self.script, "w") as f:
- i = 0
- for request in requests:
- f.write("{} {}\n".format(request.method, request.url))
- headers = "\n".join(["{}: {}".format(key, value) for key, value in request.headers.items()])
- if headers:
- f.write("{}\n".format(headers))
- if request.body:
- json_body_file = os.path.join(self.engine.artifacts_dir, "body-{}.json".format(i))
- with open(json_body_file, "w") as g:
- g.write(json.dumps(request.body))
- f.write("@{}\n".format(json_body_file))
- f.write("\n")
- i += 1
-
- self.stdout = open(self.engine.create_artifact("Vegeta", ".out"), "w")
- self.stderr = open(self.engine.create_artifact("Vegeta", ".err"), "w")
-
- self.kpi_file = self.engine.create_artifact("kpi", ".csv")
- self.reader = VegetaLogReader(self.kpi_file, self.log)
- if isinstance(self.engine.aggregator, ConsolidatingAggregator):
- self.engine.aggregator.add_underling(self.reader)
-
- def startup(self):
- cmdline = [self.vegeta.tool_path, "attack", "-targets", self.script]
- load = self.get_load()
-
- if load.throughput:
- cmdline += ['-rate', str(load.throughput)]
-
- if load.hold:
- cmdline += ['-duration', str(int(load.hold)) + "s"]
-
- if load.concurrency:
- cmdline += ['-max-workers', str(int(load.concurrency))]
-
- if self.scenario and 'timeout' in self.scenario:
- cmdline += ['-timeout', str(int(self.scenario.get('timeout'))) + "s"]
-
- user_cmd = self.settings.get("cmdline")
- if user_cmd:
- cmdline += user_cmd.split(" ")
-
- self.process = self._execute(cmdline, stdout=PIPE, shell=False)
- with open(self.kpi_file, 'wb') as f:
- self._execute([self.vegeta.tool_path, "encode", "-to=csv"], stdin=self.process.stdout, stdout=f, shell=False)
-
- def get_widget(self):
- if not self.widget:
- label = "%s" % self
- self.widget = ExecutorWidget(self, "Vegeta: " + label.split('/')[1])
- return self.widget
-
- def check(self):
- retcode = self.process.poll()
- if retcode is not None:
- ToolError(f"Vegeta tool exited with non-zero code: {retcode}")
- return True
- return False
-
- def shutdown(self):
- shutdown_process(self.process, self.log)
-
- def post_process(self):
- if self.kpi_file:
- self.engine.existing_artifact(self.kpi_file)
- super(VegetaExecutor, self).post_process()
-
- def install_required_tools(self):
- self.vegeta = self._get_tool(Vegeta, config=self.settings)
- self.vegeta.tool_name = self.vegeta.tool_name.lower()
- if not self.vegeta.check_if_installed():
- self.vegeta.install()
-
- def resource_files(self):
- return [self.get_script_path(required=True)]
-
-
-class VegetaLogReader(ResultsReader):
- def __init__(self, filename, parent_logger):
- super(VegetaLogReader, self).__init__()
- self.log = parent_logger.getChild(self.__class__.__name__)
- self.file = FileReader(filename=filename, parent_logger=self.log)
-
- def _read(self, last_pass=False):
- lines = self.file.get_lines(size=1024 * 1024, last_pass=last_pass)
-
- for line in lines:
- log_vals = [val.strip() for val in line.split(',')]
-
- _tstamp = int(log_vals[0][:10])
- _url = log_vals[10]
- _concur = 1
- _etime = float(log_vals[2]) / 1000000000.0
- _con_time = 0
- _latency = 0
- _rstatus = log_vals[1]
- _error = log_vals[5] or None
- _bytes = int(log_vals[4])
-
- yield _tstamp, _url, _concur, _etime, _con_time, _latency, _rstatus, _error, '', _bytes
-
-
-class Vegeta(RequiredTool):
- DOWNLOAD_LINK = \
- "https://github.com/tsenart/vegeta/releases/download/v{version}/vegeta_{version}_{platform}_amd64.tar.gz "
- VERSION = "12.8.4"
- LOCAL_PATH = "~/.bzt/vegeta-taurus/{version}/"
-
- def __init__(self, config=None, **kwargs):
- settings = config or {}
- version = settings.get("version", self.VERSION)
- self.tool_path = get_full_path(settings.get("path", self.LOCAL_PATH.format(version=version) + 'vegeta'))
- if not is_windows():
- platform = 'darwin' if is_mac() else 'linux'
- download_link = settings.get("download-link", self.DOWNLOAD_LINK).format(version=version, platform=platform)
- else:
- download_link = ''
- super(Vegeta, self).__init__(tool_path=self.tool_path, download_link=download_link, version=version, **kwargs)
-
- def check_if_installed(self):
- self.log.debug('Checking Vegeta Framework: %s' % self.tool_path)
- try:
- out, err = self.call([self.tool_path, '-version'])
- except CALL_PROBLEMS as exc:
- self.log.warning("%s check failed: %s", self.tool_name, exc)
- return False
-
- if err:
- out += err
- self.log.debug("Vegeta output: %s", out)
- return True
-
- def install(self):
- if is_windows():
- raise ToolError("Unable to install Vegeta on Windows! Manual installation required.")
-
- dest = get_full_path(self.tool_path, step_up=1)
- if not os.path.exists(dest):
- os.makedirs(dest)
-
- self.log.info("Will install %s into %s", self.tool_name, dest)
- vegeta_dist = self._download(use_link=True)
-
- self.log.info("Untaring %s", vegeta_dist)
- untar(vegeta_dist, dest, rel_path='vegeta')
- os.remove(vegeta_dist)
- os.chmod(get_full_path(self.tool_path), 0o755)
- self.log.info("Installed Vegeta successfully")
-
- if not self.check_if_installed():
- raise ToolError("Unable to run %s after installation!" % self.tool_name)
diff --git a/bzt/resources/10-base-config.yml b/bzt/resources/10-base-config.yml
index 874f6c9f21..7bac1e5eb0 100644
--- a/bzt/resources/10-base-config.yml
+++ b/bzt/resources/10-base-config.yml
@@ -21,8 +21,6 @@ modules:
class: bzt.modules.tsung.TsungExecutor
k6:
class: bzt.modules.k6.K6Executor
- vegeta:
- class: bzt.modules.vegeta.VegetaExecutor
# selenium & functional executors
selenium:
diff --git a/examples/all-executors.yml b/examples/all-executors.yml
index fb561d569c..bf97c9d574 100644
--- a/examples/all-executors.yml
+++ b/examples/all-executors.yml
@@ -154,12 +154,6 @@ execution:
iterations: 10
scenario:
script: k6/k6_example.js
-
-- executor: vegeta # https://blazedemo.com/?tool=Vegeta
- throughput: 1
- hold-for: 10s
- scenario:
- script: vegeta/vegeta.in
---
# all of load-style executors
execution:
diff --git a/examples/vegeta/vegeta.in b/examples/vegeta/vegeta.in
deleted file mode 100644
index 982224e117..0000000000
--- a/examples/vegeta/vegeta.in
+++ /dev/null
@@ -1,3 +0,0 @@
-GET https://blazedemo.com/?tool=Vegeta
-Content-Type: application/json
-
diff --git a/site/dat/docs/Changelog.md b/site/dat/docs/Changelog.md
index 9bb6650256..8386b00e64 100644
--- a/site/dat/docs/Changelog.md
+++ b/site/dat/docs/Changelog.md
@@ -1,8 +1,15 @@
# Changelog
-## 1.16.15 ?? September 2022
+## 1.16.18 7 November 2022
+- Removing Vegeta test executor as it's not maintained for 2+ years
- Added net-tools to Dockerfile to fix startup loop finding `netstat` command
+## 1.16.17 1 November 2022
+- Vulnerability fixes
+
+## 1.16.15 19 October 2022
+- Fixes for pass-fail validation
+
## 1.16.14 13 September 2022
- Fixes for VU calculation
@@ -43,4 +50,4 @@
- update remote browser logic and capabilities
- migrate to apiritif 1.1.1
-[Changelog for Year 2021](Changelog2021.md)
\ No newline at end of file
+[Changelog for Year 2021](Changelog2021.md)
diff --git a/site/dat/docs/ExecutionSettings.md b/site/dat/docs/ExecutionSettings.md
index 64d2779e50..563a3604ba 100644
--- a/site/dat/docs/ExecutionSettings.md
+++ b/site/dat/docs/ExecutionSettings.md
@@ -47,7 +47,6 @@ Taurus tool may use different underlying tools as executors for scenarios. Curre
- [Robot](Robot.md), executor type `robot`
- [Postman/Newman](Postman.md), executor type `newman`
- [K6](K6.md), executor type `k6`
- - [Vegeta](Vegeta.md), executor type `Vegeta`
Default executor is `jmeter` and can be changed under [general settings](ConfigSyntax.md#Top-Level-Settings) section.
```yaml
diff --git a/site/dat/docs/Index.md b/site/dat/docs/Index.md
index 86bce9bd5c..3b19fb68a0 100644
--- a/site/dat/docs/Index.md
+++ b/site/dat/docs/Index.md
@@ -27,7 +27,6 @@
1. [Siege Executor](Siege.md)
1. [TestNG Executor](TestNG.md)
1. [Tsung Executor](Tsung.md)
- 1. [Vegeta Executor](Vegeta.md)
1. [WebdriverIO Executor](WebdriverIO.md)
1. [xUnit Executor](XUnit.md)
1. [Cloud Provisioned Test Execution](Cloud.md)
diff --git a/site/dat/docs/ResultsLoader.md b/site/dat/docs/ResultsLoader.md
index e9b1206a35..fa318d3009 100644
--- a/site/dat/docs/ResultsLoader.md
+++ b/site/dat/docs/ResultsLoader.md
@@ -23,7 +23,6 @@ List of supported file formats:
- `kpi.jtl`/`error.jtl` (JMeter CSV & XML files)
- `simulation.log` (Gatling)
- TSV files (Apache Benchmark)
-- Headerless CSV files (Vegeta)
You can put `data-file`, and `errors-file` under scenario definition also, and point execution item onto corresponding scenario. If file is defined in both scenario and execution blocks, execution will have higher priority.
diff --git a/site/dat/docs/Vegeta.md b/site/dat/docs/Vegeta.md
deleted file mode 100644
index 1b3632d79e..0000000000
--- a/site/dat/docs/Vegeta.md
+++ /dev/null
@@ -1,60 +0,0 @@
-# Vegeta Executor
-
-[Vegeta](https://github.com/tsenart/vegeta) is an HTTP load generator tool.
-Written in Go programming language Vegeta consumes CPU and memory resources very efficiently.
-This makes Vegeta a good candidate for performance testing organized in the cloud where cost-effectiveness is especially important.
-
-Another strong benefit of Vegeta is that it is safe from the "Coordinated omission" problem.
-
-Vegeta does not have so-called "virtual users", but it is very handy because it supports setting the desired number of requests per second (i.e. throughput).
-
-In Taurus, `Vegeta` executor allows to run the load for given duration with specified request rate (throughput) using either existing Vegeta scripts or YAML representation of the HTTP requests.
-
-Vegeta can be auto-installed on Linux and macOS. For Windows manual installation is necessary.
-
-In order to launch Vegeta executor, you can use yaml config like in the examples below.
-
-Example 1 - use existing Vegeta script:
-```yaml
-execution:
-- executor: vegeta
- throughput: 100 # number of desired requests rate
- hold-for: 60s # execution duration
- concurrency: 100 # maximum number of workers
- scenario:
- script: vegeta.txt # has to be a valid Vegeta script
-```
-
-Example 2 - describe the requests in a scenario:
-```yaml
-execution:
-- executor: vegeta
- throughput: 100
- hold-for: 60s
- scenario: vegeta-test
-
-scenarios:
- vegeta-test:
- timeout: 30
- requests:
- - url: http://localhost:8000
- method: HEAD
- headers:
- X-Account-ID: 8675309
- - url: http://localhost:8000/abc
- method: POST
- headers:
- Confirmation-Token: 90215
- Authorization: Token ABCDEF
- body:
- id: 123
- name: Some name
-```
-
-## Command-line Settings
-You can specify special cli options for Vegeta, for example:
-```yaml
-modules:
- vegeta:
- cmdline: -cert cert.pem
-```
diff --git a/tests/resources/vegeta/vegeta-dist-12.8.4.tar.gz b/tests/resources/vegeta/vegeta-dist-12.8.4.tar.gz
deleted file mode 100644
index fb16a38e34..0000000000
Binary files a/tests/resources/vegeta/vegeta-dist-12.8.4.tar.gz and /dev/null differ
diff --git a/tests/resources/vegeta/vegeta.in b/tests/resources/vegeta/vegeta.in
deleted file mode 100644
index fc62e252fb..0000000000
--- a/tests/resources/vegeta/vegeta.in
+++ /dev/null
@@ -1,3 +0,0 @@
-GET https://blazedemo.com
-Content-Type: application/json
-
diff --git a/tests/resources/vegeta/vegeta_kpi.csv b/tests/resources/vegeta/vegeta_kpi.csv
deleted file mode 100644
index 6368989b8a..0000000000
--- a/tests/resources/vegeta/vegeta_kpi.csv
+++ /dev/null
@@ -1,4 +0,0 @@
-1615016224507076698,200,435643128,0,2945,,PCFkb2N0eXBlIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CiAgICA8dGl0bGU+IEJsYXplRGVtbzwvdGl0bGU+CiAgICA8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQmxhemVNZXRlciBkZW1vIGFwcCI+CiAgICA8bWV0YSBuYW1lPSJzYWdlIiBjb250ZW50PSJmbGlnaHRzIGFwcCI+CgogICAgPHNjcmlwdCBzcmM9Imh0dHA6Ly9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9qcXVlcnkvMi4wLjAvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iL2Fzc2V0cy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIvYXNzZXRzL2Jvb3RzdHJhcC10YWJsZS5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayBocmVmPSIvYXNzZXRzL2Jvb3RzdHJhcC5taW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJzY3JlZW4iPgogICAgPGxpbmsgaHJlZj0iL2Fzc2V0cy9ib290c3RyYXAtdGFibGUuY3NzIiByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJzY3JlZW4iPgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgICBib2R5IHsKICAgICAgICAgICAgYmFja2dyb3VuZDogI2Y1ZjVmNSk7CiAgICAgICAgfQoKICAgICAgICAuaGVyby11bml0IHsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKICAgICAgICB9CgogICAgICAgIC5jZW50ZXIgewogICAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgfQogICAgPC9zdHlsZT4KPC9oZWFkPgo8Ym9keT4KICAgICAgICA8ZGl2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWludmVyc2UiPgogICAgICAgIDxkaXYgY2xhc3M9Im5hdmJhci1pbm5lciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnRuIGJ0bi1uYXZiYXIiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXYtY29sbGFwc2UiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPGEgY2xhc3M9ImJyYW5kIiBocmVmPSJpbmRleC5waHAiPlRyYXZlbCBUaGUgV29ybGQ8L2E+CiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnJhbmQiIGhyZWY9ImhvbWUiPmhvbWU8L2E+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgoKICAgIDxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICAgICAgPGgxPldlbGNvbWUgdG8gdGhlIFNpbXBsZSBUcmF2ZWwgQWdlbmN5ITwvaDE+CiAgICAgICAgICAgIDxwPlRoZSBpcyBhIHNhbXBsZSBzaXRlIHlvdSBjYW4gdGVzdCB3aXRoIEJsYXplTWV0ZXIhIDwvcD4KICAgICAgICAgICAgPHA+Q2hlY2sgb3V0IG91ciA8YSBocmVmPSJ2YWNhdGlvbi5odG1sIj5kZXN0aW5hdGlvbiBvZiB0aGUgd2VlayEgVGhlIEJlYWNoITwvYT48L3A+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICA8aDI+Q2hvb3NlIHlvdXIgZGVwYXJ0dXJlIGNpdHk6PC9oMj4KICAgIDxmb3JtIGFjdGlvbj0icmVzZXJ2ZS5waHAiIG1ldGhvZD0icG9zdCI+CiAgICAgICAgPHNlbGVjdCBuYW1lPSJmcm9tUG9ydCIgY2xhc3M9ImZvcm0taW5saW5lIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iUGFyaXMiPlBhcmlzPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IlBoaWxhZGVscGhpYSI+UGhpbGFkZWxwaGlhPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkJvc3RvbiI+Qm9zdG9uPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IlBvcnRsYW5kIj5Qb3J0bGFuZDwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJTYW4gRGllZ28iPlNhbiBEaWVnbzwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJNZXhpY28gQ2l0eSI+TWV4aWNvIENpdHk8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iU8OjbyBQYW9sbyI+U8OjbyBQYW9sbzwvb3B0aW9uPgogICAgICAgIDwvc2VsZWN0PgogICAgICAgIDxwPgogICAgICAgIDxoMj5DaG9vc2UgeW91ciBkZXN0aW5hdGlvbiBjaXR5OjwvaDI+CiAgICAgICAgPHNlbGVjdCBuYW1lPSJ0b1BvcnQiIGNsYXNzPSJmb3JtLWlubGluZSI+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkJ1ZW5vcyBBaXJlcyI+QnVlbm9zIEFpcmVzPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IlJvbWUiPlJvbWU8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iTG9uZG9uIj5Mb25kb248L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iQmVybGluIj5CZXJsaW48L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iTmV3IFlvcmsiPk5ldyBZb3JrPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkR1YmxpbiI+RHVibGluPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkNhaXJvIj5DYWlybzwvb3B0aW9uPgogICAgICAgIDwvc2VsZWN0PgogICAgICAgIDxwPjwvcD4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiB2YWx1ZT0iRmluZCBGbGlnaHRzIi8+CiAgICAgICAgPC9kaXY+CiAgICA8L2Zvcm0+CjwvZGl2Pgo8L2JvZHk+CjwvaHRtbD4=,,0,GET,https://blazedemo.com/,Q2FjaGUtQ29udHJvbDogbm8tY2FjaGUsIHByaXZhdGUNCkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PVVURi04DQpEYXRlOiBTYXQsIDA2IE1hciAyMDIxIDA3OjM3OjA0IEdNVA0KU2VydmVyOiBHb29nbGUgRnJvbnRlbmQNClZhcnk6IEFjY2VwdC1FbmNvZGluZw0KWC1DbG91ZC1UcmFjZS1Db250ZXh0OiBhMjg4MDEwOTNlYTM1NTM5YjUyMDZhZWE4YzI1NGRiOA0KWC1Qb3dlcmVkLUJ5OiBQSFAvNy4zLjE3DQoNCg==
-1615016224706997706,200,245589109,0,2945,,PCFkb2N0eXBlIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CiAgICA8dGl0bGU+IEJsYXplRGVtbzwvdGl0bGU+CiAgICA8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQmxhemVNZXRlciBkZW1vIGFwcCI+CiAgICA8bWV0YSBuYW1lPSJzYWdlIiBjb250ZW50PSJmbGlnaHRzIGFwcCI+CgogICAgPHNjcmlwdCBzcmM9Imh0dHA6Ly9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9qcXVlcnkvMi4wLjAvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iL2Fzc2V0cy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIvYXNzZXRzL2Jvb3RzdHJhcC10YWJsZS5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayBocmVmPSIvYXNzZXRzL2Jvb3RzdHJhcC5taW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJzY3JlZW4iPgogICAgPGxpbmsgaHJlZj0iL2Fzc2V0cy9ib290c3RyYXAtdGFibGUuY3NzIiByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJzY3JlZW4iPgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgICBib2R5IHsKICAgICAgICAgICAgYmFja2dyb3VuZDogI2Y1ZjVmNSk7CiAgICAgICAgfQoKICAgICAgICAuaGVyby11bml0IHsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKICAgICAgICB9CgogICAgICAgIC5jZW50ZXIgewogICAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgfQogICAgPC9zdHlsZT4KPC9oZWFkPgo8Ym9keT4KICAgICAgICA8ZGl2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWludmVyc2UiPgogICAgICAgIDxkaXYgY2xhc3M9Im5hdmJhci1pbm5lciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnRuIGJ0bi1uYXZiYXIiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXYtY29sbGFwc2UiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPGEgY2xhc3M9ImJyYW5kIiBocmVmPSJpbmRleC5waHAiPlRyYXZlbCBUaGUgV29ybGQ8L2E+CiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnJhbmQiIGhyZWY9ImhvbWUiPmhvbWU8L2E+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgoKICAgIDxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICAgICAgPGgxPldlbGNvbWUgdG8gdGhlIFNpbXBsZSBUcmF2ZWwgQWdlbmN5ITwvaDE+CiAgICAgICAgICAgIDxwPlRoZSBpcyBhIHNhbXBsZSBzaXRlIHlvdSBjYW4gdGVzdCB3aXRoIEJsYXplTWV0ZXIhIDwvcD4KICAgICAgICAgICAgPHA+Q2hlY2sgb3V0IG91ciA8YSBocmVmPSJ2YWNhdGlvbi5odG1sIj5kZXN0aW5hdGlvbiBvZiB0aGUgd2VlayEgVGhlIEJlYWNoITwvYT48L3A+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICA8aDI+Q2hvb3NlIHlvdXIgZGVwYXJ0dXJlIGNpdHk6PC9oMj4KICAgIDxmb3JtIGFjdGlvbj0icmVzZXJ2ZS5waHAiIG1ldGhvZD0icG9zdCI+CiAgICAgICAgPHNlbGVjdCBuYW1lPSJmcm9tUG9ydCIgY2xhc3M9ImZvcm0taW5saW5lIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iUGFyaXMiPlBhcmlzPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IlBoaWxhZGVscGhpYSI+UGhpbGFkZWxwaGlhPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkJvc3RvbiI+Qm9zdG9uPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IlBvcnRsYW5kIj5Qb3J0bGFuZDwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJTYW4gRGllZ28iPlNhbiBEaWVnbzwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJNZXhpY28gQ2l0eSI+TWV4aWNvIENpdHk8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iU8OjbyBQYW9sbyI+U8OjbyBQYW9sbzwvb3B0aW9uPgogICAgICAgIDwvc2VsZWN0PgogICAgICAgIDxwPgogICAgICAgIDxoMj5DaG9vc2UgeW91ciBkZXN0aW5hdGlvbiBjaXR5OjwvaDI+CiAgICAgICAgPHNlbGVjdCBuYW1lPSJ0b1BvcnQiIGNsYXNzPSJmb3JtLWlubGluZSI+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkJ1ZW5vcyBBaXJlcyI+QnVlbm9zIEFpcmVzPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IlJvbWUiPlJvbWU8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iTG9uZG9uIj5Mb25kb248L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iQmVybGluIj5CZXJsaW48L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iTmV3IFlvcmsiPk5ldyBZb3JrPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkR1YmxpbiI+RHVibGluPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkNhaXJvIj5DYWlybzwvb3B0aW9uPgogICAgICAgIDwvc2VsZWN0PgogICAgICAgIDxwPjwvcD4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiB2YWx1ZT0iRmluZCBGbGlnaHRzIi8+CiAgICAgICAgPC9kaXY+CiAgICA8L2Zvcm0+CjwvZGl2Pgo8L2JvZHk+CjwvaHRtbD4=,,4,GET,https://blazedemo.com/,Q2FjaGUtQ29udHJvbDogbm8tY2FjaGUsIHByaXZhdGUNCkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PVVURi04DQpEYXRlOiBTYXQsIDA2IE1hciAyMDIxIDA3OjM3OjA0IEdNVA0KU2VydmVyOiBHb29nbGUgRnJvbnRlbmQNClZhcnk6IEFjY2VwdC1FbmNvZGluZw0KWC1DbG91ZC1UcmFjZS1Db250ZXh0OiAwNzEzYzUxMDM3YjY2YjM4YTRlNDhjMTYxMWNhYzFjYg0KWC1Qb3dlcmVkLUJ5OiBQSFAvNy4zLjE3DQoNCg==
-1615016224556645098,500,401511662,0,2945,Internal Server Error,PCFkb2N0eXBlIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CiAgICA8dGl0bGU+IEJsYXplRGVtbzwvdGl0bGU+CiAgICA8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQmxhemVNZXRlciBkZW1vIGFwcCI+CiAgICA8bWV0YSBuYW1lPSJzYWdlIiBjb250ZW50PSJmbGlnaHRzIGFwcCI+CgogICAgPHNjcmlwdCBzcmM9Imh0dHA6Ly9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9qcXVlcnkvMi4wLjAvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iL2Fzc2V0cy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIvYXNzZXRzL2Jvb3RzdHJhcC10YWJsZS5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayBocmVmPSIvYXNzZXRzL2Jvb3RzdHJhcC5taW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJzY3JlZW4iPgogICAgPGxpbmsgaHJlZj0iL2Fzc2V0cy9ib290c3RyYXAtdGFibGUuY3NzIiByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJzY3JlZW4iPgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgICBib2R5IHsKICAgICAgICAgICAgYmFja2dyb3VuZDogI2Y1ZjVmNSk7CiAgICAgICAgfQoKICAgICAgICAuaGVyby11bml0IHsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKICAgICAgICB9CgogICAgICAgIC5jZW50ZXIgewogICAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgfQogICAgPC9zdHlsZT4KPC9oZWFkPgo8Ym9keT4KICAgICAgICA8ZGl2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWludmVyc2UiPgogICAgICAgIDxkaXYgY2xhc3M9Im5hdmJhci1pbm5lciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnRuIGJ0bi1uYXZiYXIiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXYtY29sbGFwc2UiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPGEgY2xhc3M9ImJyYW5kIiBocmVmPSJpbmRleC5waHAiPlRyYXZlbCBUaGUgV29ybGQ8L2E+CiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnJhbmQiIGhyZWY9ImhvbWUiPmhvbWU8L2E+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgoKICAgIDxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICAgICAgPGgxPldlbGNvbWUgdG8gdGhlIFNpbXBsZSBUcmF2ZWwgQWdlbmN5ITwvaDE+CiAgICAgICAgICAgIDxwPlRoZSBpcyBhIHNhbXBsZSBzaXRlIHlvdSBjYW4gdGVzdCB3aXRoIEJsYXplTWV0ZXIhIDwvcD4KICAgICAgICAgICAgPHA+Q2hlY2sgb3V0IG91ciA8YSBocmVmPSJ2YWNhdGlvbi5odG1sIj5kZXN0aW5hdGlvbiBvZiB0aGUgd2VlayEgVGhlIEJlYWNoITwvYT48L3A+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICA8aDI+Q2hvb3NlIHlvdXIgZGVwYXJ0dXJlIGNpdHk6PC9oMj4KICAgIDxmb3JtIGFjdGlvbj0icmVzZXJ2ZS5waHAiIG1ldGhvZD0icG9zdCI+CiAgICAgICAgPHNlbGVjdCBuYW1lPSJmcm9tUG9ydCIgY2xhc3M9ImZvcm0taW5saW5lIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iUGFyaXMiPlBhcmlzPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IlBoaWxhZGVscGhpYSI+UGhpbGFkZWxwaGlhPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkJvc3RvbiI+Qm9zdG9uPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IlBvcnRsYW5kIj5Qb3J0bGFuZDwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJTYW4gRGllZ28iPlNhbiBEaWVnbzwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJNZXhpY28gQ2l0eSI+TWV4aWNvIENpdHk8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iU8OjbyBQYW9sbyI+U8OjbyBQYW9sbzwvb3B0aW9uPgogICAgICAgIDwvc2VsZWN0PgogICAgICAgIDxwPgogICAgICAgIDxoMj5DaG9vc2UgeW91ciBkZXN0aW5hdGlvbiBjaXR5OjwvaDI+CiAgICAgICAgPHNlbGVjdCBuYW1lPSJ0b1BvcnQiIGNsYXNzPSJmb3JtLWlubGluZSI+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkJ1ZW5vcyBBaXJlcyI+QnVlbm9zIEFpcmVzPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IlJvbWUiPlJvbWU8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iTG9uZG9uIj5Mb25kb248L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iQmVybGluIj5CZXJsaW48L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iTmV3IFlvcmsiPk5ldyBZb3JrPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkR1YmxpbiI+RHVibGluPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkNhaXJvIj5DYWlybzwvb3B0aW9uPgogICAgICAgIDwvc2VsZWN0PgogICAgICAgIDxwPjwvcD4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiB2YWx1ZT0iRmluZCBGbGlnaHRzIi8+CiAgICAgICAgPC9kaXY+CiAgICA8L2Zvcm0+CjwvZGl2Pgo8L2JvZHk+CjwvaHRtbD4=,,1,GET,https://blazedemo.com/,Q2FjaGUtQ29udHJvbDogbm8tY2FjaGUsIHByaXZhdGUNCkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PVVURi04DQpEYXRlOiBTYXQsIDA2IE1hciAyMDIxIDA3OjM3OjA0IEdNVA0KU2VydmVyOiBHb29nbGUgRnJvbnRlbmQNClZhcnk6IEFjY2VwdC1FbmNvZGluZw0KWC1DbG91ZC1UcmFjZS1Db250ZXh0OiA1NWEyMjAxNGQ4Y2VjZDUzY2Y4YWY1OWZmNzMxODdhMQ0KWC1Qb3dlcmVkLUJ5OiBQSFAvNy4zLjE3DQoNCg==
-1615016224610099563,200,424349931,0,2945,,PCFkb2N0eXBlIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CiAgICA8dGl0bGU+IEJsYXplRGVtbzwvdGl0bGU+CiAgICA8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQmxhemVNZXRlciBkZW1vIGFwcCI+CiAgICA8bWV0YSBuYW1lPSJzYWdlIiBjb250ZW50PSJmbGlnaHRzIGFwcCI+CgogICAgPHNjcmlwdCBzcmM9Imh0dHA6Ly9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9qcXVlcnkvMi4wLjAvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iL2Fzc2V0cy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIvYXNzZXRzL2Jvb3RzdHJhcC10YWJsZS5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayBocmVmPSIvYXNzZXRzL2Jvb3RzdHJhcC5taW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJzY3JlZW4iPgogICAgPGxpbmsgaHJlZj0iL2Fzc2V0cy9ib290c3RyYXAtdGFibGUuY3NzIiByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJzY3JlZW4iPgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgICBib2R5IHsKICAgICAgICAgICAgYmFja2dyb3VuZDogI2Y1ZjVmNSk7CiAgICAgICAgfQoKICAgICAgICAuaGVyby11bml0IHsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKICAgICAgICB9CgogICAgICAgIC5jZW50ZXIgewogICAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgfQogICAgPC9zdHlsZT4KPC9oZWFkPgo8Ym9keT4KICAgICAgICA8ZGl2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWludmVyc2UiPgogICAgICAgIDxkaXYgY2xhc3M9Im5hdmJhci1pbm5lciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnRuIGJ0bi1uYXZiYXIiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXYtY29sbGFwc2UiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPgogICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPGEgY2xhc3M9ImJyYW5kIiBocmVmPSJpbmRleC5waHAiPlRyYXZlbCBUaGUgV29ybGQ8L2E+CiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnJhbmQiIGhyZWY9ImhvbWUiPmhvbWU8L2E+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgoKICAgIDxkaXYgY2xhc3M9Imp1bWJvdHJvbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICAgICAgPGgxPldlbGNvbWUgdG8gdGhlIFNpbXBsZSBUcmF2ZWwgQWdlbmN5ITwvaDE+CiAgICAgICAgICAgIDxwPlRoZSBpcyBhIHNhbXBsZSBzaXRlIHlvdSBjYW4gdGVzdCB3aXRoIEJsYXplTWV0ZXIhIDwvcD4KICAgICAgICAgICAgPHA+Q2hlY2sgb3V0IG91ciA8YSBocmVmPSJ2YWNhdGlvbi5odG1sIj5kZXN0aW5hdGlvbiBvZiB0aGUgd2VlayEgVGhlIEJlYWNoITwvYT48L3A+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICA8aDI+Q2hvb3NlIHlvdXIgZGVwYXJ0dXJlIGNpdHk6PC9oMj4KICAgIDxmb3JtIGFjdGlvbj0icmVzZXJ2ZS5waHAiIG1ldGhvZD0icG9zdCI+CiAgICAgICAgPHNlbGVjdCBuYW1lPSJmcm9tUG9ydCIgY2xhc3M9ImZvcm0taW5saW5lIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iUGFyaXMiPlBhcmlzPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IlBoaWxhZGVscGhpYSI+UGhpbGFkZWxwaGlhPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkJvc3RvbiI+Qm9zdG9uPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IlBvcnRsYW5kIj5Qb3J0bGFuZDwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJTYW4gRGllZ28iPlNhbiBEaWVnbzwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJNZXhpY28gQ2l0eSI+TWV4aWNvIENpdHk8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iU8OjbyBQYW9sbyI+U8OjbyBQYW9sbzwvb3B0aW9uPgogICAgICAgIDwvc2VsZWN0PgogICAgICAgIDxwPgogICAgICAgIDxoMj5DaG9vc2UgeW91ciBkZXN0aW5hdGlvbiBjaXR5OjwvaDI+CiAgICAgICAgPHNlbGVjdCBuYW1lPSJ0b1BvcnQiIGNsYXNzPSJmb3JtLWlubGluZSI+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkJ1ZW5vcyBBaXJlcyI+QnVlbm9zIEFpcmVzPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IlJvbWUiPlJvbWU8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iTG9uZG9uIj5Mb25kb248L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iQmVybGluIj5CZXJsaW48L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iTmV3IFlvcmsiPk5ldyBZb3JrPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkR1YmxpbiI+RHVibGluPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkNhaXJvIj5DYWlybzwvb3B0aW9uPgogICAgICAgIDwvc2VsZWN0PgogICAgICAgIDxwPjwvcD4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiB2YWx1ZT0iRmluZCBGbGlnaHRzIi8+CiAgICAgICAgPC9kaXY+CiAgICA8L2Zvcm0+CjwvZGl2Pgo8L2JvZHk+CjwvaHRtbD4=,,2,GET,https://blazedemo.com/,Q2FjaGUtQ29udHJvbDogbm8tY2FjaGUsIHByaXZhdGUNCkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PVVURi04DQpEYXRlOiBTYXQsIDA2IE1hciAyMDIxIDA3OjM3OjA1IEdNVA0KU2VydmVyOiBHb29nbGUgRnJvbnRlbmQNClZhcnk6IEFjY2VwdC1FbmNvZGluZw0KWC1DbG91ZC1UcmFjZS1Db250ZXh0OiA0ODg5NDUzYTY1ODRkNGVhMGUyOGQ1ZTZmMmRjYjg1Yg0KWC1Qb3dlcmVkLUJ5OiBQSFAvNy4zLjE3DQoNCg==
diff --git a/tests/resources/vegeta/vegeta_mock.bat b/tests/resources/vegeta/vegeta_mock.bat
deleted file mode 100755
index 99dfacebf5..0000000000
--- a/tests/resources/vegeta/vegeta_mock.bat
+++ /dev/null
@@ -1,2 +0,0 @@
-@echo off
-echo v12.8.4
diff --git a/tests/resources/vegeta/vegeta_mock.sh b/tests/resources/vegeta/vegeta_mock.sh
deleted file mode 100755
index 45509078bd..0000000000
--- a/tests/resources/vegeta/vegeta_mock.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/bash
-
-echo 12.8.4
diff --git a/tests/unit/modules/jmeter/test_JMeterTool.py b/tests/unit/modules/jmeter/test_JMeterTool.py
index 88d0aecd4f..a4a3175d53 100644
--- a/tests/unit/modules/jmeter/test_JMeterTool.py
+++ b/tests/unit/modules/jmeter/test_JMeterTool.py
@@ -31,7 +31,7 @@ def test_get_jar_fixes(self):
'https://repo1.maven.org/maven2/com/thoughtworks/xstream/xstream/1.4.19/xstream-1.4.19.jar',
os.path.join(lib_dir_path, 'xstream-1.4.15.jar')],
[
- 'https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-core/2.17.2/log4j-core-2.17.2.jar',
+ 'https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-core/2.19.0/log4j-core-2.19.0.jar',
os.path.join(lib_dir_path, 'log4j-core-2.16.jar')]]
self.assertEqual(target_tools_list, jar_tools)
finally:
diff --git a/tests/unit/modules/test_external.py b/tests/unit/modules/test_external.py
index 6b2d913ba7..b70592a31a 100644
--- a/tests/unit/modules/test_external.py
+++ b/tests/unit/modules/test_external.py
@@ -3,7 +3,6 @@
from bzt.modules.jmeter import FuncJTLReader, JTLReader
from bzt.modules.ab import TSVDataReader
from bzt.modules.gatling import DataLogReader as GatlingLogReader
-from bzt.modules.vegeta import VegetaLogReader
from tests.unit import RESOURCES_DIR, close_reader_file, ExecutorTestCase
from tests.unit.mocks import MockReader, MockListener
@@ -411,22 +410,3 @@ def test_gatling(self):
last_dp = results[-1]
cumulative_kpis = last_dp[DataPoint.CUMULATIVE]['']
self.assertEqual(243, cumulative_kpis[KPISet.SUCCESSES])
-
- def test_vegeta(self):
- self.configure({
- "execution": [{
- "data-file": RESOURCES_DIR + "/vegeta/vegeta_kpi.csv",
- }]
- })
- self.obj.prepare()
- self.assertIsInstance(self.obj.reader, VegetaLogReader)
- self.obj.startup()
- self.obj.check()
- self.obj.shutdown()
- self.obj.post_process()
- self.obj.engine.aggregator.post_process()
- results = self.results_listener.results
- self.assertGreater(len(results), 0)
- last_dp = results[-1]
- cumulative_kpis = last_dp[DataPoint.CUMULATIVE]['']
- self.assertEqual(4, cumulative_kpis[KPISet.SUCCESSES] + cumulative_kpis[KPISet.FAILURES])
diff --git a/tests/unit/modules/test_vegeta.py b/tests/unit/modules/test_vegeta.py
deleted file mode 100644
index 714db739a4..0000000000
--- a/tests/unit/modules/test_vegeta.py
+++ /dev/null
@@ -1,214 +0,0 @@
-import os
-import shutil
-import io
-import unittest
-import bzt
-
-from bzt.modules.aggregator import DataPoint, KPISet
-from bzt.modules.vegeta import VegetaExecutor, VegetaLogReader
-from bzt.utils import EXE_SUFFIX, is_windows, ToolError
-from tests.unit import BZTestCase, ExecutorTestCase, RESOURCES_DIR, ROOT_LOGGER, BUILD_DIR
-
-TOOL_NAME = os.path.join(RESOURCES_DIR, 'vegeta', 'vegeta_mock' + EXE_SUFFIX)
-VEGETA_SCRIPT = os.path.join(RESOURCES_DIR, 'vegeta', 'vegeta.in')
-
-
-class TestVegetaExecutor(ExecutorTestCase):
- EXECUTOR = VegetaExecutor
- CMD_LINE = []
-
- def tearDown(self):
- self.CMD_LINE = []
-
- def assertCmd(self, option, value):
- self.assertIn(f'{option} {value}', ' '.join(self.CMD_LINE))
-
- def start_subprocess(self, args, **kwargs):
- self.CMD_LINE.extend(args)
- setattr(self.obj,
- 'process',
- type('', (object,), {'stdout': io.StringIO('foo'),
- 'poll': lambda: True}))
- return self.obj.process
-
- def simple_run(self, config):
- self.configure(config)
-
- tmp_eac = bzt.utils.exec_and_communicate
- try:
- bzt.utils.exec_and_communicate = lambda *args, **kwargs: ("", "")
- self.obj.prepare()
- finally:
- bzt.utils.exec_and_communicate = tmp_eac
-
- self.obj.engine.start_subprocess = self.start_subprocess
-
- self.obj.startup()
- self.obj.post_process()
-
- def test_full(self):
- self.configure({'execution': {
- 'throughput': 5,
- 'hold-for': '30',
- 'scenario': {'script': VEGETA_SCRIPT}}
- })
- tmp_eac = bzt.utils.exec_and_communicate
- try:
- bzt.utils.exec_and_communicate = lambda *args, **kwargs: ("", "")
- self.obj.prepare()
- finally:
- bzt.utils.exec_and_communicate = tmp_eac
-
- self.obj.engine.start_subprocess = self.start_subprocess
-
- self.obj.get_widget()
- self.obj.vegeta.tool_name = TOOL_NAME
- self.obj.startup()
- self.obj.check()
- self.obj.post_process()
-
- def test_no_bin_file(self):
- self.simple_run({
- 'execution': {
- 'scenario': {'script': VEGETA_SCRIPT},
- 'executor': 'vegeta'
- },
- })
- self.assertNotIn('-output', self.CMD_LINE)
-
- def test_throughput(self):
- self.simple_run({
- 'execution': {
- 'throughput': '5',
- 'scenario': {'script': VEGETA_SCRIPT},
- 'executor': 'vegeta'
- },
- })
- self.assertCmd('-rate', 5)
-
- def test_hold_for(self):
- self.simple_run({
- 'execution': {
- 'hold-for': '30',
- 'scenario': {'script': VEGETA_SCRIPT},
- 'executor': 'vegeta'
- }
- })
- self.assertCmd('-duration', '30s')
-
- def test_concurrency(self):
- self.simple_run({
- 'execution': {
- 'concurrency': '100',
- 'scenario': {'script': VEGETA_SCRIPT},
- 'executor': 'vegeta'
- }
- })
- self.assertCmd('-max-workers', '100')
-
- def test_timeout(self):
- self.simple_run({
- 'execution': {
- 'scenario': {'script': VEGETA_SCRIPT, 'timeout': 30},
- 'executor': 'vegeta'
- }
- })
- self.assertCmd('-timeout', '30s')
-
- def test_script(self):
- self.simple_run({
- 'execution': {
- 'iterations': '100',
- 'scenario': {'script': VEGETA_SCRIPT},
- 'executor': 'vegeta'
- },
- })
- self.assertCmd('-targets', VEGETA_SCRIPT)
-
- def test_requests_no_body(self):
- self.simple_run({
- 'execution': {
- 'iterations': '100',
- 'scenario': 'vegeta-test',
- 'executor': 'vegeta'
- },
- 'scenarios': {
- 'vegeta-test': {
- 'requests': [{
- 'url': 'http://localhost:8000',
- 'method': 'HEAD',
- 'headers': {'X-Account-ID': 8675309}
- }]
- }
- }
- })
- with open(self.obj.script, 'r') as f:
- self.assertEqual(f.read(),
- 'HEAD http://localhost:8000\nX-Account-ID: 8675309\n\n')
-
- def test_requests_with_body(self):
- self.simple_run({
- 'execution': {
- 'iterations': '100',
- 'scenario': 'vegeta-test',
- 'executor': 'vegeta'
- },
- 'scenarios': {
- 'vegeta-test': {
- 'requests': [{
- 'url': 'http://localhost:8080',
- 'method': 'POST',
- 'headers': {'Content-Type': 'application/json'},
- 'body': {'str': 'something', 'number': 1.25, 'boolean': True}
- }]
- }
- }
- })
- json_file = os.path.join(self.engine.artifacts_dir, 'body-0.json')
- with open(self.obj.script, 'r') as f:
- self.assertEqual(f.read(),
- f'POST http://localhost:8080\nContent-Type: application/json\n@{json_file}\n\n')
- with open(json_file, 'r') as f:
- self.assertEqual(f.read(),
- '{"str": "something", "number": 1.25, "boolean": true}')
-
- @unittest.skipIf(is_windows(), "disabled on windows")
- def test_install_vegeta(self):
- path = os.path.abspath(BUILD_DIR + 'vegeta')
- shutil.rmtree(os.path.dirname(path), ignore_errors=True)
-
- download_link = "file:///" + RESOURCES_DIR + "vegeta/vegeta-dist-{version}.tar.gz"
- vegeta_version = '12.8.4'
-
- self.assertFalse(os.path.exists(path))
- self.obj.settings.merge({
- "path": path,
- "download-link": download_link,
- "version": vegeta_version})
-
- self.obj.execution.merge({"scenario": {"script": RESOURCES_DIR + "vegeta/vegeta.in"}})
-
- self.obj.prepare()
- self.assertTrue(os.path.exists(path))
-
- @unittest.skipIf(not is_windows(), "only for windows")
- def test_install_vegeta_win(self):
- self.obj.settings.merge({
- "path": os.path.abspath(BUILD_DIR + 'vegeta'),
- "download-link": "",
- "version": '12.8.4'})
-
- self.obj.execution.merge({"scenario": {"script": RESOURCES_DIR + "vegeta/vegeta.in"}})
- self.assertRaises(ToolError, self.obj.prepare)
-
-
-class TestVegetaReader(BZTestCase):
- def test_read(self):
- log_path = os.path.join(RESOURCES_DIR, 'vegeta', 'vegeta_kpi.csv')
- obj = VegetaLogReader(log_path, ROOT_LOGGER)
- points = list(obj.datapoints(True))
-
- for datapoint in points:
- self.assertTrue(datapoint['ts'] > 1500000000)
- self.assertEqual(points[-1][DataPoint.CUMULATIVE][''][KPISet.SUCCESSES], 3)
- self.assertEqual(points[-1][DataPoint.CUMULATIVE][''][KPISet.FAILURES], 1)