From 38aca39285b9ecf584dae5eb6dfb06db165c9a48 Mon Sep 17 00:00:00 2001 From: mykhaliev1 <79195818+mykhaliev1@users.noreply.github.com> Date: Wed, 19 Oct 2022 10:49:26 +0200 Subject: [PATCH 1/5] 1.16.15 Release (#1687) Co-authored-by: Dmytro Mykhaliev --- site/dat/docs/Changelog.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/site/dat/docs/Changelog.md b/site/dat/docs/Changelog.md index 10c609e20a..19076d1ad8 100644 --- a/site/dat/docs/Changelog.md +++ b/site/dat/docs/Changelog.md @@ -1,5 +1,7 @@ # Changelog - +## 1.16.15 19 October 2022 +- Fixes for pass-fail validation +- ## 1.16.14 13 September 2022 - Fixes for VU calculation From 429b565e161b2ffca33e6037bfb0c774994bcf45 Mon Sep 17 00:00:00 2001 From: Matus Gazo Date: Tue, 1 Nov 2022 11:01:35 +0100 Subject: [PATCH 2/5] Fix changelog for 2021 --- bzt/modules/jmeter.py | 13 +++++++------ site/dat/docs/Changelog.md | 3 +++ 2 files changed, 10 insertions(+), 6 deletions(-) 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/site/dat/docs/Changelog.md b/site/dat/docs/Changelog.md index 19076d1ad8..3e1e49bd4b 100644 --- a/site/dat/docs/Changelog.md +++ b/site/dat/docs/Changelog.md @@ -1,4 +1,7 @@ # Changelog +## 1.16.16 1 November 2022 +- Vulnerability fixes + ## 1.16.15 19 October 2022 - Fixes for pass-fail validation - From 50d1a3a78c6ee35ed30175793cd0ffb69dc17991 Mon Sep 17 00:00:00 2001 From: Matus Gazo Date: Tue, 1 Nov 2022 13:59:36 +0100 Subject: [PATCH 3/5] Vulnerability fixes for ruby gems --- Dockerfile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index f3251d276d..7bbdfade96 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 \ From 97572623acae29093975ce3dc95c8754bd977c08 Mon Sep 17 00:00:00 2001 From: matus-gazo Date: Mon, 7 Nov 2022 17:27:15 +0000 Subject: [PATCH 4/5] US46260 Fix vulnerabilities by dropping EOL Vegeta support within Taurus CLI (#1689) --- Dockerfile | 6 - bzt/modules/external.py | 4 - bzt/modules/vegeta.py | 200 ---------------- bzt/resources/10-base-config.yml | 2 - examples/all-executors.yml | 6 - examples/vegeta/vegeta.in | 3 - site/dat/docs/Changelog.md | 6 +- site/dat/docs/ExecutionSettings.md | 1 - site/dat/docs/Index.md | 1 - site/dat/docs/ResultsLoader.md | 1 - site/dat/docs/Vegeta.md | 60 ----- .../vegeta/vegeta-dist-12.8.4.tar.gz | Bin 147 -> 0 bytes tests/resources/vegeta/vegeta.in | 3 - tests/resources/vegeta/vegeta_kpi.csv | 4 - tests/resources/vegeta/vegeta_mock.bat | 2 - tests/resources/vegeta/vegeta_mock.sh | 3 - tests/unit/modules/jmeter/test_JMeterTool.py | 2 +- tests/unit/modules/test_external.py | 20 -- tests/unit/modules/test_vegeta.py | 214 ------------------ 19 files changed, 6 insertions(+), 532 deletions(-) delete mode 100644 bzt/modules/vegeta.py delete mode 100644 examples/vegeta/vegeta.in delete mode 100644 site/dat/docs/Vegeta.md delete mode 100644 tests/resources/vegeta/vegeta-dist-12.8.4.tar.gz delete mode 100644 tests/resources/vegeta/vegeta.in delete mode 100644 tests/resources/vegeta/vegeta_kpi.csv delete mode 100755 tests/resources/vegeta/vegeta_mock.bat delete mode 100755 tests/resources/vegeta/vegeta_mock.sh delete mode 100644 tests/unit/modules/test_vegeta.py diff --git a/Dockerfile b/Dockerfile index 7bbdfade96..189162854c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -56,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/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 3e1e49bd4b..d2ddc475a2 100644 --- a/site/dat/docs/Changelog.md +++ b/site/dat/docs/Changelog.md @@ -1,5 +1,9 @@ # Changelog -## 1.16.16 1 November 2022 + +## 1.16.18 7 November 2022 +- Removing Vegeta test executor as it's not maintained for 2+ years + +## 1.16.17 1 November 2022 - Vulnerability fixes ## 1.16.15 19 October 2022 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 fb16a38e3472bba88b0f9b8cd34af95d2620d8e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmb2|=3oE==C|iIavd^|IP&pKWmiY_?Dd|~@#<3(T7wQAv)S)8ozHc-(xLy`?-ZEF zcut?P_}0`~&V{whTf(mGELe2p_OVjOBkZY1E$?e4f8V>c;*90J-oRw7%u|Iusny@t s{trIxd^djiuKv#pO0D?Km3>QB?fLiB5MnQsJmBs>Mf-Lyg9ZZw0B~MFng9R* 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) From 72c89160f3b6f8054dd52b3d2f7a5a43553a19c6 Mon Sep 17 00:00:00 2001 From: Piotr Smietana Date: Mon, 7 Nov 2022 18:29:42 +0100 Subject: [PATCH 5/5] Fix typo in Changelog.md (#1688) --- site/dat/docs/Changelog.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/dat/docs/Changelog.md b/site/dat/docs/Changelog.md index d2ddc475a2..89da7445ca 100644 --- a/site/dat/docs/Changelog.md +++ b/site/dat/docs/Changelog.md @@ -8,7 +8,7 @@ ## 1.16.15 19 October 2022 - Fixes for pass-fail validation -- + ## 1.16.14 13 September 2022 - Fixes for VU calculation @@ -49,4 +49,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)