├── .editorconfig ├── .gitignore ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── FEEDBACK.md ├── LICENSE.txt ├── README.md ├── aws-policy.json ├── bitbucket-pipelines.yml ├── build.gradle.kts ├── docs ├── JPT-banner@1x.png └── tests │ ├── APP.md │ ├── ON_PREMISE.md │ └── plain-text-report.png ├── examples ├── btf-test │ ├── .editorconfig │ ├── .gitignore │ ├── .mvn │ │ └── wrapper │ │ │ ├── MavenWrapperDownloader.java │ │ │ ├── maven-wrapper.jar │ │ │ └── maven-wrapper.properties │ ├── README.md │ ├── mvnw │ ├── mvnw.cmd │ ├── pom.xml │ └── src │ │ └── test │ │ ├── java │ │ └── com │ │ │ └── atlassian │ │ │ └── performance │ │ │ └── tools │ │ │ └── btftest │ │ │ └── MyJiraOnPremiseIT.java │ │ └── resources │ │ └── log4j2.xml └── ref-app │ ├── .editorconfig │ ├── .gitignore │ ├── .mvn │ ├── jvm.config │ └── wrapper │ │ ├── MavenWrapperDownloader.java │ │ ├── maven-wrapper.jar │ │ └── maven-wrapper.properties │ ├── mvnw │ ├── mvnw.cmd │ ├── pom.xml │ ├── reference-jira-app-performance-tests │ ├── pom.xml │ └── src │ │ ├── main │ │ └── assembly │ │ │ └── assembly.xml │ │ └── test │ │ ├── java │ │ └── com │ │ │ └── atlassian │ │ │ └── performance │ │ │ └── tools │ │ │ └── referencejiraapp │ │ │ ├── SlowEventListenerPerformanceIT.java │ │ │ ├── aws │ │ │ ├── CleanExpiredCommand.java │ │ │ ├── DeleteMyStacksCommand.java │ │ │ ├── ListMyStacksCommand.java │ │ │ └── MyAws.java │ │ │ └── scenario │ │ │ ├── CustomViewIssueAction.java │ │ │ └── MyScenario.java │ │ └── resources │ │ └── log4j2.xml │ └── reference-jira-app │ ├── pom.xml │ └── src │ └── main │ ├── java │ └── com │ │ └── atlassian │ │ └── performance │ │ └── tools │ │ └── referencejiraapp │ │ └── SlowEventListener.java │ └── resources │ ├── META-INF │ └── spring │ │ └── plugin-context.xml │ ├── atlassian-plugin.xml │ └── images │ ├── pluginIcon.png │ └── pluginLogo.png ├── gradle.properties ├── gradle ├── dependency-locks │ ├── annotationProcessor.lockfile │ ├── apiDependenciesMetadata.lockfile │ ├── archives.lockfile │ ├── compile.lockfile │ ├── compileClasspath.lockfile │ ├── compileOnly.lockfile │ ├── compileOnlyDependenciesMetadata.lockfile │ ├── default.lockfile │ ├── implementationDependenciesMetadata.lockfile │ ├── kapt.lockfile │ ├── kaptTest.lockfile │ ├── kotlinCompilerClasspath.lockfile │ ├── kotlinCompilerPluginClasspath.lockfile │ ├── runtime.lockfile │ ├── runtimeClasspath.lockfile │ ├── runtimeOnlyDependenciesMetadata.lockfile │ ├── signatures.lockfile │ ├── testAnnotationProcessor.lockfile │ ├── testApiDependenciesMetadata.lockfile │ ├── testCompile.lockfile │ ├── testCompileClasspath.lockfile │ ├── testCompileOnly.lockfile │ ├── testCompileOnlyDependenciesMetadata.lockfile │ ├── testImplementationDependenciesMetadata.lockfile │ ├── testRuntime.lockfile │ ├── testRuntimeClasspath.lockfile │ └── testRuntimeOnlyDependenciesMetadata.lockfile └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── reference-virtual-users ├── build.gradle.kts └── gradle │ └── dependency-locks │ ├── annotationProcessor.lockfile │ ├── apiDependenciesMetadata.lockfile │ ├── archives.lockfile │ ├── compile.lockfile │ ├── compileClasspath.lockfile │ ├── compileOnly.lockfile │ ├── compileOnlyDependenciesMetadata.lockfile │ ├── default.lockfile │ ├── implementationDependenciesMetadata.lockfile │ ├── kapt.lockfile │ ├── kaptTest.lockfile │ ├── kotlinCompilerClasspath.lockfile │ ├── kotlinCompilerPluginClasspath.lockfile │ ├── runtime.lockfile │ ├── runtimeClasspath.lockfile │ ├── runtimeOnlyDependenciesMetadata.lockfile │ ├── shadow.lockfile │ ├── testAnnotationProcessor.lockfile │ ├── testApiDependenciesMetadata.lockfile │ ├── testCompile.lockfile │ ├── testCompileClasspath.lockfile │ ├── testCompileOnly.lockfile │ ├── testCompileOnlyDependenciesMetadata.lockfile │ ├── testImplementationDependenciesMetadata.lockfile │ ├── testRuntime.lockfile │ ├── testRuntimeClasspath.lockfile │ └── testRuntimeOnlyDependenciesMetadata.lockfile ├── settings.gradle.kts └── src ├── main └── kotlin │ └── com │ └── atlassian │ └── performance │ └── tools │ └── jiraperformancetests │ └── api │ ├── AppImpactTest.kt │ ├── AwsHousekeeping.kt │ ├── CustomDatasetSourceRegistry.kt │ ├── ExplainingAwsCredentialsProvider.kt │ ├── GroupableTest.kt │ ├── JiraDeployments.kt │ ├── LocalApp.kt │ ├── OnPremisePerformanceTest.kt │ ├── ProvisioningPerformanceTest.kt │ ├── RegressionResults.kt │ ├── VisitableJira.kt │ └── VisitableJiraRegistry.kt └── test ├── kotlin └── com │ └── atlassian │ └── performance │ └── tools │ └── jiraperformancetests │ ├── AcceptanceCategory.kt │ ├── MavenProcess.kt │ ├── SystemProperty.kt │ └── api │ ├── AppImpactTestSmokeTest.kt │ ├── CustomerJourneyTest.kt │ └── VendorJourneyTest.kt └── resources └── log4j2.xml /.editorconfig: -------------------------------------------------------------------------------- 1 | [*.{kt,kts}] 2 | indent_size = 4 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | build 3 | target -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | All notable changes to this project will be documented in this file. 3 | 4 | The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) 5 | and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). 6 | 7 | ## API 8 | The API consists of all public Java types from `com.atlassian.performance.tools.jiraperformancetests.api` and its subpackages: 9 | 10 | * [source compatibility] 11 | * [binary compatibility] 12 | * [behavioral compatibility] with behavioral contracts expressed via Javadoc 13 | 14 | [source compatibility]: http://cr.openjdk.java.net/~darcy/OpenJdkDevGuide/OpenJdkDevelopersGuide.v0.777.html#source_compatibility 15 | [binary compatibility]: http://cr.openjdk.java.net/~darcy/OpenJdkDevGuide/OpenJdkDevelopersGuide.v0.777.html#binary_compatibility 16 | [behavioral compatibility]: http://cr.openjdk.java.net/~darcy/OpenJdkDevGuide/OpenJdkDevelopersGuide.v0.777.html#behavioral_compatibility 17 | 18 | ## [Unreleased] 19 | [Unreleased]: https://bitbucket.org/atlassian/jira-performance-tests/branches/compare/master%0Drelease-2.0.2 20 | 21 | ## [2.0.2] - 2018-12-18 🎂 22 | [2.0.1]: https://bitbucket.org/atlassian/jira-performance-tests/branches/compare/release-2.0.2%0Drelease-2.0.1 23 | 24 | ### Fixed 25 | - Timeline for `OnPremisePerformanceTest`. Resolve [JPERF-309]. 26 | 27 | [JPERF-309]: https://ecosystem.atlassian.net/browse/JPERF-309 28 | 29 | ## [2.0.1] - 2018-12-17 🎄 30 | [2.0.1]: https://bitbucket.org/atlassian/jira-performance-tests/branches/compare/release-2.0.1%0Drelease-2.0.0 31 | 32 | ### Fixed 33 | - Enable diagnostics for `OnPremisePerformanceTest`. Resolve JPERF-232. 34 | 35 | [JPERF-232]: https://ecosystem.atlassian.net/browse/JPERF-232 36 | 37 | ## [2.0.0] - 2018-12-03 38 | [2.0.0]: https://bitbucket.org/atlassian/jira-performance-tests/branches/compare/release-2.0.0%0Drelease-1.3.0 39 | 40 | ### Added 41 | - Allow JPT to instantiate different browsers which resolves [JPERF-169]. 42 | - Add support for `virtual-users:3.3.4`. 43 | - Add support for `infrastructure:4`. 44 | - Add support for `aws-infrastructure:2` which resolves [JPERF-280]. 45 | 46 | ### Removed 47 | - Drop deprecated classes `AppRegressionTest`,`AwsPluginTester` and `BtfJiraPerformanceMeter`. 48 | - Drop support of `virtual-users:2`. 49 | - Drop support of `infrastructure:2`. 50 | - Drop support of `aws-infrastructure:1`. 51 | - Remove Kotlin data-class generated methods from API. 52 | 53 | [JPERF-169]: https://ecosystem.atlassian.net/browse/JPERF-169 54 | [JPERF-280]: https://ecosystem.atlassian.net/browse/JPERF-280 55 | 56 | ## [1.3.0] - 2018-10-31 57 | [1.3.0]: https://bitbucket.org/atlassian/jira-performance-tests/branches/compare/release-1.3.0%0Drelease-1.2.1 58 | 59 | ### Added 60 | - Expose `setAllowInsecureConnections` in `OnPremisePerformanceTest`. Work around [JPERF-196]. 61 | 62 | [JPERF-196]: https://ecosystem.atlassian.net/browse/JPERF-196 63 | 64 | ## [1.2.1] - 2018-10-16 65 | [1.2.1]: https://bitbucket.org/atlassian/jira-performance-tests/branches/compare/release-1.2.1%0Drelease-1.2.0 66 | 67 | ### Deprecated 68 | - Deprecate the intermediate app test APIs. Promote the high-level API and low-level API instead. 69 | 70 | ## [1.2.0] 71 | [1.2.0]: https://bitbucket.org/atlassian/jira-performance-tests/branches/compare/release-1.2.0%0Drelease-1.1.0 72 | 73 | ### Added 74 | - Add an option to test on premise Jira with custom test scenario, which resolves [JPERF-84]. 75 | - Accept any `AppSource` in `AppImpactTest`. Work around [JPERF-93]. 76 | - Support testing locally built apps. Work around [JPERF-93]. 77 | 78 | [JPERF-84]: https://ecosystem.atlassian.net/browse/JPERF-84 79 | [JPERF-93]: https://ecosystem.atlassian.net/browse/JPERF-93 80 | 81 | ### Fixed 82 | - Works around [JPERF-83]. 83 | 84 | [JPERF-83]: https://ecosystem.atlassian.net/browse/JPERF-83 85 | 86 | ## [1.1.0] 87 | [1.1.0]: https://bitbucket.org/atlassian/jira-performance-tests/branches/compare/release-1.1.0%0Drelease-1.0.0 88 | 89 | ### Added 90 | - Add a way to test on premise Jira instance which resolves [JPERF-16](https://ecosystem.atlassian.net/browse/JPERF-16) 91 | 92 | ## [1.0.0] 93 | [1.0.0]: https://bitbucket.org/atlassian/jira-performance-tests/branches/compare/release-1.0.0%0Drelease-0.1.2 94 | 95 | ## [0.1.2] 96 | [0.1.2]: https://bitbucket.org/atlassian/jira-performance-tests/branches/compare/release-0.1.2%0Drelease-0.1.1 97 | 98 | ### Changed 99 | - Use stable APIs. 100 | 101 | ### Added 102 | - Added `AwsHousekeeping` to the API. 103 | 104 | ## [0.1.1] 105 | [0.1.1]: https://bitbucket.org/atlassian/jira-performance-tests/branches/compare/release-0.1.1%0Drelease-0.1.0 106 | 107 | ### Added 108 | - Allow throttling virtual user diagnostics. 109 | 110 | ### Changed 111 | - Define the public API. 112 | 113 | ## [0.1.0] 114 | [0.1.0]: https://bitbucket.org/atlassian/jira-performance-tests/branches/compare/release-0.1.0%0Drelease-0.0.3 115 | 116 | ### Changed 117 | - Reshape `JiraPerformanceTest` into `AppImpactTest`. 118 | 119 | ### Added 120 | - Choose deployment for Jira and number of nodes for DC. 121 | 122 | ### Fixed 123 | - Expect a correct report count. 124 | - Force updating snapshots when running `testRefApp`. 125 | - Hint how to customize the `AppImpactTest`. 126 | - Depend on a stable version of APT `infrastructure`. 127 | - Depend on a stable version of APT `report`. 128 | 129 | ## [0.0.3] 130 | [0.0.3]: https://bitbucket.org/atlassian/jira-performance-tests/branches/compare/release-0.0.3%0Drelease-0.0.2 131 | 132 | ### Added 133 | - Allow running performance tests without extra Jira apps installed. 134 | - Generate charts in app tests. [JPERF-9](https://ecosystem.atlassian.net/browse/JPERF-9). 135 | - Explain [contribution guidelines](CONTRIBUTING.md). 136 | 137 | ### Fixed 138 | - Correctly label the experiment test cohort. 139 | - Distinguish between cohorts even if we test the same version of a plugin. [JPERF-7](https://ecosystem.atlassian.net/browse/JPERF-7). 140 | - Allow tests to consume custom datasets created within the same task. 141 | - Fix scanner errors in log. See [JPERF-10](https://ecosystem.atlassian.net/browse/JPERF-10). 142 | - Print a full stack trace when ref app fails. [JPERF-8](https://ecosystem.atlassian.net/browse/JPERF-8). 143 | 144 | ## [0.0.2] - 2018-08-08 145 | [0.0.2]: https://bitbucket.org/atlassian/jira-performance-tests/branches/compare/release-0.0.2%0Drelease-0.0.1 146 | 147 | ### Fixed 148 | - Add the missing virtual users main class. See [JPERF-2](https://ecosystem.atlassian.net/browse/JPERF-2). 149 | 150 | ## [0.0.1] - 2018-08-07 151 | [0.0.1]: https://bitbucket.org/atlassian/jira-performance-tests/branches/compare/release-0.0.1%0Dinitial-commit 152 | 153 | ### Added 154 | - Migrate high-level test API from [JPT submodule]. 155 | - Add [README.md](README.md). 156 | - Add this changelog. 157 | - Enable Bitbucket Pipelines. 158 | 159 | [JPT submodule]: https://stash.atlassian.com/projects/JIRASERVER/repos/jira-performance-tests/browse/jira-performance-tests?at=24b1522734605e8689a72396917e6080fddb8731 160 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Code of Conduct 2 | 3 | As contributors and maintainers of this project, and in the interest of fostering an open and welcoming community, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities. 4 | 5 | We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, religion, or nationality. 6 | 7 | Examples of unacceptable behavior by participants include: 8 | 9 | * The use of sexualized language or imagery 10 | * Personal attacks 11 | * Trolling or insulting/derogatory comments 12 | * Public or private harassment 13 | * Publishing other's private information, such as physical or electronic addresses, without explicit permission 14 | * Submitting contributions or comments that you know to violate the intellectual property or privacy rights of others 15 | * Other unethical or unprofessional conduct 16 | 17 | Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. 18 | By adopting this Code of Conduct, project maintainers commit themselves to fairly and consistently applying these principles to every aspect of managing this project. Project maintainers who do not follow or enforce the Code of Conduct may be permanently removed from the project team. 19 | 20 | This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. 21 | 22 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting a project maintainer. Complaints will result in a response and be reviewed and investigated in a way that is deemed necessary and appropriate to the circumstances. Maintainers are obligated to maintain confidentiality with regard to the reporter of an incident. 23 | 24 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.3.0, available at [http://contributor-covenant.org/version/1/3/0/][version] 25 | 26 | [homepage]: http://contributor-covenant.org 27 | [version]: http://contributor-covenant.org/version/1/3/0/ 28 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | Thanks for taking the time to contribute! 4 | 5 | The following is a set of guidelines for contributing to [JPT](README.md). 6 | All the changes are welcome. Please help us to improve code, examples and documentation. 7 | 8 | ## Testing 9 | 10 | This module's tests require an access to AWS. 11 | The credentials should be provided via setting the environmental variables `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`. 12 | 13 | To run this module default test suite execute `./gradlew build`. 14 | To run the full test suite including acceptance tests execute `./gradlew testAcceptance`. 15 | 16 | ## Developer’s Environment 17 | 18 | You can build and run JPT on MacOS, Windows or Linux. You'll need JDK 8-11 to build the project and AWS credentials 19 | to test the change. 20 | 21 | ## Submitting changes 22 | 23 | Pull requests, issues and comments are welcome. For pull requests: 24 | 25 | - Create your own [fork] of the repository and raise a pull request targeting master branch in the main repository 26 | - Enable Bitbucket pipelines, it is important that you do it via *Settings* menu and not *Pipelines* menu otherwise 27 | Bitbucket will create an empty commit polluting Git history of your fork 28 | - Configure Bitbucket pipelines by providing `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` 29 | environment variables with your AWS credentials. This can be done in your [repository settings] in *Pipelines* section 30 | - Add tests for new features and bug fixes 31 | - Follow the existing style 32 | - Separate unrelated changes into multiple pull requests 33 | 34 | [fork]: https://confluence.atlassian.com/bitbucket/forking-a-repository-221449527.html 35 | [repository settings]: https://confluence.atlassian.com/bitbucket/environment-variables-794502608.html 36 | 37 | See the [existing issues](https://ecosystem.atlassian.net/projects/JPERF/issues/?filter=allissues) for things to start contributing. 38 | 39 | For bigger changes, make sure you start a discussion first by creating 40 | an issue and explaining the intended change. 41 | 42 | All the pull requests and other changes will be accepted and merged by Atlassians. 43 | 44 | Atlassian requires contributors to sign a Contributor License Agreement, 45 | known as a CLA. This serves as a record stating that the contributor is 46 | entitled to contribute the code/documentation/translation to the project 47 | and is willing to have it used in distributions and derivative works 48 | (or is willing to transfer ownership). 49 | 50 | Prior to accepting your contributions we ask that you please follow the appropriate 51 | link below to digitally sign the CLA. The Corporate CLA is for those who are 52 | contributing as a member of an organization and the individual CLA is for 53 | those contributing as an individual. 54 | 55 | * [CLA for corporate contributors](https://na2.docusign.net/Member/PowerFormSigning.aspx?PowerFormId=e1c17c66-ca4d-4aab-a953-2c231af4a20b) 56 | * [CLA for individuals](https://na2.docusign.net/Member/PowerFormSigning.aspx?PowerFormId=3f94fbdc-2fbe-46ac-b14c-5d152700ae5d) 57 | 58 | ## Style Guide / Coding conventions 59 | 60 | [Git commit messages](https://chris.beams.io/posts/git-commit/) 61 | 62 | (**incomplete**) 63 | 64 | ## Releasing 65 | 66 | Versioning, releasing and distribution are managed by the [gradle-release] plugin. 67 | 68 | [gradle-release]: https://bitbucket.org/atlassian/gradle-release/src/release-0.4.1/README.md -------------------------------------------------------------------------------- /FEEDBACK.md: -------------------------------------------------------------------------------- 1 | # Providing feedback on JPT 2 | 3 | Thank you for taking the time to provide feedback on JPT. 4 | 5 | ## Chat 6 | Come to our [public JPT community Slack][slack-invite] and chat. 7 | Feel free to ask any questions, discuss or lurk. 8 | 9 | ## Jira 10 | 11 | Issues are tracked in the [public Ecosystem Jira instance][ecosystem-jira], 12 | in the Jira Performance Testing Tools (JPERF) project. 13 | 14 | ## Raising bugs 15 | 16 | Before you raise a bug, take a look at the [known bug list][bug-list]. 17 | 18 | If you find it, vote on it and watch it. Add comments if it's missing 19 | some important context, or [contribute][article-contributing] a solution. 20 | We'll provide further updates in the ticket. 21 | 22 | If you don't find it, [create a new bug][bug-create]. When you create a 23 | new bug, please include the following information: 24 | 25 | * description of the problem, 26 | * requirements and steps to reproduce the issue, 27 | * expected behavior, 28 | * actual behavior, 29 | * attach the `target/jpt-workspace/jpt.log` log file. 30 | 31 | ## Adding suggestions 32 | 33 | Before you share a suggestion, take a look at the 34 | [existing suggestions list][suggestion-list]. 35 | 36 | If you find it, vote on it and watch it. We'll provide further updates 37 | in the ticket. 38 | 39 | If you don't find it, [create a new suggestion][suggestion-create]. When 40 | you create a new suggestion, make sure you describe: 41 | 42 | * a problem you would like to solve, 43 | * optionally provide an example, 44 | * optionally provide suggestions on how you think it should be solved. 45 | 46 | [slack-invite]: http://go.atlassian.com/jpt-slack 47 | [article-contributing]: CONTRIBUTING.md 48 | [ecosystem-jira]: https://ecosystem.atlassian.net/secure/RapidBoard.jspa?rapidView=457&projectKey=JPERF&view=planning 49 | [suggestion-list]: https://ecosystem.atlassian.net/issues/?filter=61606 50 | [suggestion-create]: https://ecosystem.atlassian.net/secure/CreateIssue!default.jspa?projectKey=JPERF&issuetype=11500 51 | [bug-list]: https://ecosystem.atlassian.net/issues/?filter=61607 52 | [bug-create]: https://ecosystem.atlassian.net/secure/CreateIssue!default.jspa?projectKey=JPERF&issuetype=1 53 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright @ 2018 Atlassian Pty Ltd 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Repository migration in progress 2 | 3 | ⚠️ This repository hasn't been fully migrated from its original location yet. Until this happens, active development takes place here: https://bitbucket.org/atlassian/jira-performance-tests/. 4 | 5 | ## 6 | 7 | ![picture](docs/JPT-banner@1x.png) 8 | 9 | Jira Performance Tests (JPT) is a fully-automated performance benchmarking tool designed for Jira Server and Jira Data Center. 10 | It can manage all aspects of the testing process -- provisioning a new Jira instance, running performance tests, and generating 11 | a report. 12 | 13 | JPT focuses on _user experience_, allowing you to test both front-end and back-end performance simultaneously. Rather than 14 | using simple HTTP traffic, JPT uses browsers to test end-to-end interactions. 15 | 16 | Atlassian maintains and uses JPT to benchmark Jira's performance each release (see [Scaling Jira](https://confluence.atlassian.com/enterprise/scaling-jira-867028644.html) for details). 17 | If you're an Atlassian developer, you can access their [internal JPT tests](https://stash.atlassian.com/projects/JIRASERVER/repos/jira-performance-tests/browse/README.md) 18 | using your employee credentials. 19 | 20 | ## Features 21 | 22 | - Runs performance tests 23 | - Automatically provisions a Jira instance in AWS infrastructure 24 | - Generates a report and chart 25 | - Uses configuration as a code 26 | - Uses a large Jira dataset 27 | - Uses data-agnostic scenarios 28 | - Starts with reasonable defaults 29 | - Gathers system and GC metrics 30 | - Supports Jira 7.2 and up 31 | - Compares Jira with and without plugin installed 32 | - _(planned)_ Supports Jira 8+ 33 | 34 | ## Basic use cases 35 | 36 | - As a customer, you can **[test the performance of an existing Jira instance](docs/tests/ON_PREMISE.md)**. 37 | - As a Jira app developer, you can **[test the performance impact of your app](docs/tests/APP.md)**. 38 | 39 | ## Feedback 40 | 41 | We welcome all feedback. You can send it our way via our Slack and Jira. 42 | You can find the details on the [feedback page](FEEDBACK.md). 43 | 44 | ## Contributing 45 | 46 | See [CONTRIBUTING.md](CONTRIBUTING.md). 47 | 48 | ## License 49 | 50 | Copyright (c) 2018 Atlassian and others. 51 | Apache 2.0 licensed, see [LICENSE.txt](LICENSE.txt) file. 52 | -------------------------------------------------------------------------------- /aws-policy.json: -------------------------------------------------------------------------------- 1 | { 2 | "Version": "2012-10-17", 3 | "Statement": [ 4 | { 5 | "Effect": "Allow", 6 | "Action": [ 7 | "cloudformation:Describe*" 8 | ], 9 | "Resource": "*" 10 | }, 11 | { 12 | "Effect": "Allow", 13 | "Action": [ 14 | "cloudformation:CreateStack", 15 | "cloudformation:DeleteStack", 16 | "cloudformation:ListStackResources" 17 | ], 18 | "Resource": "*" 19 | }, 20 | { 21 | "Effect": "Allow", 22 | "Action": [ 23 | "ec2:CreateKeyPair", 24 | "ec2:DescribeImages", 25 | "ec2:DescribeKeyPairs", 26 | "ec2:CreateSecurityGroup", 27 | "ec2:DescribeSecurityGroups", 28 | "ec2:createTags", 29 | "ec2:AuthorizeSecurityGroupIngress", 30 | "ec2:RunInstances", 31 | "ec2:DescribeInstances", 32 | "ec2:DeleteSecurityGroup", 33 | "ec2:TerminateInstances", 34 | "ec2:DeleteKeyPair" 35 | ], 36 | "Resource": "*" 37 | }, 38 | { 39 | "Effect": "Allow", 40 | "Action": [ 41 | "s3:CreateBucket", 42 | "s3:ListBucket" 43 | ], 44 | "Resource": [ 45 | "*" 46 | ] 47 | }, 48 | { 49 | "Effect": "Allow", 50 | "Action": [ 51 | "s3:PutObject", 52 | "s3:GetObject" 53 | ], 54 | "Resource": [ 55 | "*" 56 | ] 57 | }, 58 | { 59 | "Effect": "Allow", 60 | "Action": [ 61 | "iam:CreateRole", 62 | "iam:PutRolePolicy", 63 | "iam:AttachRolePolicy", 64 | "iam:CreateInstanceProfile", 65 | "iam:AddRoleToInstanceProfile", 66 | "iam:PassRole" 67 | ], 68 | "Resource": "*" 69 | } 70 | ] 71 | } -------------------------------------------------------------------------------- /bitbucket-pipelines.yml: -------------------------------------------------------------------------------- 1 | image: openjdk:8 2 | 3 | pipelines: 4 | default: 5 | - step: 6 | name: Smoke test 7 | caches: 8 | - gradle 9 | - gradlewrapper 10 | script: 11 | - bash ./gradlew build 12 | artifacts: 13 | - build/reports/** 14 | - build/test-results/** 15 | - target/jpt-workspace/** 16 | - target/surefire-reports/** 17 | - examples/ref-app/reference-jira-app-performance-tests/target/** 18 | - step: 19 | name: Acceptance test 20 | caches: 21 | - gradle 22 | - gradlewrapper 23 | trigger: manual 24 | script: 25 | - bash ./gradlew testAcceptance 26 | artifacts: 27 | - build/reports/** 28 | - build/test-results/** 29 | - target/jpt-workspace/** 30 | - target/surefire-reports/** 31 | - examples/ref-app/reference-jira-app-performance-tests/target/** 32 | branches: 33 | master: 34 | - step: 35 | name: Acceptance test 36 | caches: 37 | - gradle 38 | - gradlewrapper 39 | script: 40 | - bash ./gradlew testAcceptance 41 | artifacts: 42 | - build/reports/** 43 | - build/test-results/** 44 | - target/jpt-workspace/** 45 | - target/surefire-reports/** 46 | - examples/ref-app/reference-jira-app-performance-tests/target/** 47 | - step: 48 | name: Release 49 | caches: 50 | - gradle 51 | - gradlewrapper 52 | trigger: manual 53 | script: 54 | - git config --global user.email "bitbucketci-team@atlassian.com" 55 | - git config --global user.name "Bitbucket Pipelines" 56 | - bash ./gradlew release -Prelease.customKeyFile="/opt/atlassian/pipelines/agent/data/id_rsa" 57 | - bash ./gradlew publish 58 | artifacts: 59 | - build/reports/** 60 | - build/test-results/** 61 | - target/jpt-workspace/** 62 | - target/surefire-reports/** 63 | - examples/ref-app/reference-jira-app-performance-tests/target/** 64 | custom: 65 | aws-housekeeping: 66 | - step: 67 | name: AWS housekeeping 68 | script: 69 | - cd ./examples/ref-app 70 | - bash ./mvnw -pl reference-jira-app-performance-tests test-compile exec:java@clean-all-expired 71 | definitions: 72 | caches: 73 | gradlewrapper: ~/.gradle/wrapper 74 | -------------------------------------------------------------------------------- /build.gradle.kts: -------------------------------------------------------------------------------- 1 | import com.vanniktech.dependency.graph.generator.DependencyGraphGeneratorExtension 2 | import org.apache.tools.ant.taskdefs.condition.Os.* 3 | import org.gradle.api.tasks.testing.logging.TestExceptionFormat 4 | import java.nio.file.Paths 5 | import com.vanniktech.dependency.graph.generator.DependencyGraphGeneratorPlugin 6 | import com.vanniktech.dependency.graph.generator.DependencyGraphGeneratorExtension.Generator 7 | import guru.nidi.graphviz.attribute.Color 8 | import guru.nidi.graphviz.attribute.Style 9 | 10 | val kotlinVersion = "1.2.70" 11 | 12 | buildscript { 13 | repositories { 14 | mavenCentral() 15 | } 16 | dependencies { 17 | classpath("com.vanniktech:gradle-dependency-graph-generator-plugin:0.5.0") 18 | } 19 | } 20 | 21 | plugins { 22 | kotlin("jvm").version("1.2.70") 23 | id("com.atlassian.performance.tools.gradle-release").version("0.4.3") 24 | `java-library` 25 | } 26 | 27 | plugins.apply("com.vanniktech.dependency.graph.generator") 28 | 29 | configurations.all { 30 | resolutionStrategy { 31 | activateDependencyLocking() 32 | failOnVersionConflict() 33 | eachDependency { 34 | when (requested.module.toString()) { 35 | "com.google.guava:guava" -> useVersion("23.6-jre") 36 | "org.apache.commons:commons-csv" -> useVersion("1.4") 37 | "commons-logging:commons-logging" -> useVersion("1.2") 38 | "commons-io:commons-io" -> useVersion("2.5") 39 | "org.apache.httpcomponents:httpclient" -> useVersion("4.5.5") 40 | "org.apache.httpcomponents:httpcore" -> useVersion("4.4.9") 41 | "org.codehaus.plexus:plexus-utils" -> useVersion("3.1.0") 42 | "org.slf4j:slf4j-api" -> useVersion("1.8.0-alpha2") 43 | "com.jcraft:jzlib" -> useVersion("1.1.3") 44 | "com.google.code.gson:gson" -> useVersion("2.8.2") 45 | "org.jsoup:jsoup" -> useVersion("1.10.2") 46 | "com.fasterxml.jackson.core:jackson-core" -> useVersion("2.9.4") 47 | } 48 | when (requested.group) { 49 | "org.jetbrains.kotlin" -> useVersion(kotlinVersion) 50 | } 51 | } 52 | } 53 | } 54 | 55 | val jptDependenciesGenerator = Generator( 56 | "jptLibraries", 57 | { dependency -> dependency.moduleGroup.startsWith("com.atlassian.performance.tools") }, 58 | { _ -> true }, 59 | { node, _ -> node.add(Style.FILLED, Color.rgb("#ffcb2b")) } 60 | ) 61 | 62 | configure { 63 | generators = listOf(jptDependenciesGenerator) 64 | } 65 | 66 | dependencies { 67 | 68 | api("com.atlassian.performance.tools:workspace:[2.0.0,3.0.0)") 69 | api("com.atlassian.performance.tools:report:[2.1.0,3.0.0)") 70 | api("com.atlassian.performance.tools:infrastructure:[4.0.0,5.0.0)") 71 | 72 | listOf( 73 | "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion", 74 | "com.atlassian.performance.tools:aws-resources:[1.0.0,2.0.0)", 75 | "com.atlassian.performance.tools:aws-infrastructure:[2.0.0,3.0.0)", 76 | "com.atlassian.performance.tools:jira-software-actions:[1.0.0,2.0.0)", 77 | "com.atlassian.performance.tools:virtual-users:[3.3.4,4.0.0)" 78 | ).plus( 79 | log4jCore() 80 | ).forEach { implementation(it) } 81 | 82 | listOf( 83 | "junit:junit:4.12", 84 | "org.assertj:assertj-core:3.11.0", 85 | "org.zeroturnaround:zt-exec:1.10" 86 | ).forEach { testCompile(it) } 87 | } 88 | 89 | fun log4jCore(): List = log4j( 90 | "api", 91 | "core", 92 | "slf4j-impl" 93 | ) 94 | 95 | fun log4j( 96 | vararg modules: String 97 | ): List = modules.map { module -> 98 | "org.apache.logging.log4j:log4j-$module:2.10.0" 99 | } 100 | 101 | tasks.getByName("test", Test::class).apply { 102 | useJUnit { 103 | excludeCategories("com.atlassian.performance.tools.jiraperformancetests.AcceptanceCategory") 104 | } 105 | } 106 | 107 | val testAcceptance = task("testAcceptance") { 108 | dependsOn("publishToMavenLocal") 109 | systemProperty("jpt.version", version) 110 | maxParallelForks = 3 111 | } 112 | 113 | tasks.withType(Test::class.java) { 114 | val shadowJarTask = tasks.getByPath(":reference-virtual-users:shadowJar") 115 | dependsOn(shadowJarTask) 116 | systemProperty("jpt.virtual-users.shadow-jar", shadowJarTask.outputs.files.files.first()) 117 | failFast = true 118 | } 119 | 120 | tasks["release"].dependsOn(testAcceptance) 121 | 122 | task("wrapper") { 123 | gradleVersion = "4.9" 124 | distributionType = Wrapper.DistributionType.ALL 125 | } -------------------------------------------------------------------------------- /docs/JPT-banner@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atlassian/jira-performance-tests/367223afb9143c177cbb7f43bb96685c5a10080d/docs/JPT-banner@1x.png -------------------------------------------------------------------------------- /docs/tests/APP.md: -------------------------------------------------------------------------------- 1 | # Evaluate your app's performance impact 2 | 3 | [JPT](../../README.md) provides a framework for automating the way you test your apps. 4 | It’s designed to compare how your app impacts the Jira user experience, comparing the response times of Jira with and without your app installed. 5 | JPT can automate all aspects of the testing cycle, from provisioning instances, all the way to testing them and collecting performance data. 6 | 7 | Atlassian uses JPT to benchmark each Jira release (posting the results on [Scaling Jira](https://confluence.atlassian.com/enterprise/scaling-jira-867028644.html)), 8 | and also to test internally-developed apps like [Portfolio for Jira](https://www.atlassian.com/software/jira/portfolio). 9 | 10 | ## How it works 11 | 12 | JPT starts by provisioning two Jira instances in Amazon Web Services (AWS): 13 | 14 | * a _baseline_ instance, with no apps installed, and 15 | * an _experiment_ instance, with your app installed 16 | 17 | JPT will then benchmark both instances, running the most common user actions multiple times.
When JPT finishes testing either instance, it reports: 18 | 19 | 1. What **user actions** it performed 20 | 2. **How many times** it performed each action 21 | 3. How many times each action resulted in an **error** 22 | 4. The **95th percentile** of all response times for each action 23 | 24 | The _difference_ between both instance's response times will help show you the performance impact of your app. 25 | 26 | ## Requirements 27 | 28 | You can install and run JPT from any system that has: 29 | 30 | * [JDK](http://openjdk.java.net/) 8 - 11 (Make sure to install JDK, not JRE) 31 | * [Git](https://git-scm.com/) 32 | * MacOS or Linux installed 33 | 34 | ### Amazon Web Services instances 35 | 36 | JPT provisions Jira instances in AWS and you need to supply your AWS credentials before running the tests. 37 | Please check **Setting your AWS credentials** section of this README that explains how to do that. 38 | 39 | Keep in mind that running JPT's tests will incur AWS usage costs. 40 | Your own costs may vary depending on the size and resource usage of your app. 41 | For comparison, running a two-node Jira Software Data Center instance in AWS typically costs around $6 per hour. 42 | Although JPT cleans up AWS resources after each test, sometimes test may be terminated abruptly and you can be left with running instances that will incur continuous cost. 43 | Each JPT instance in AWS is marked with expiry tag, running the following command will clean up all expired instances: 44 | Run from the `examples/ref-app` directory: `./mvnw -pl reference-jira-app-performance-tests test-compile exec:java@clean-all-expired` 45 | In our own environment we have it run automatically every hour. 46 | 47 | ### Windows Compatibility 48 | 49 | None of the technologies exclude Windows shell from being used, but there is no Windows compatibility CI employed to protect any compatibility promise. Use at your own risk. 50 | 51 | ## How to use JPT 52 | 53 | JPT ships with a reference app, which you will replace with your own. 54 | From there, JPT can handle the rest of the testing process. 55 | 56 | ### Preparing JPT for testing 57 | 58 | 1. Clone the JPT repository: 59 | 60 | ``` 61 | git clone https://bitbucket.org/atlassian/jira-performance-tests.git 62 | ``` 63 | 64 | 2. This repository ships with a Maven project. Open the following project in your IDE: 65 | 66 | 67 | ``` 68 | examples/ref-apps/ 69 | ``` 70 | 71 | 3. This Maven project is a reference app. Replace it with your own app. 72 | 73 | 74 | ### Configuring virtual user actions 75 | 76 | 77 | JPT uses _virtual users_ to perform common user actions. 78 | You can configure those actions to create a more suitable test cases for your app. 79 | 80 | To do this, you'll need to create your own test module. 81 | Use the following modules as a reference: 82 | 83 | - https://bitbucket.org/atlassian/jira-actions/src/master/ 84 | - https://bitbucket.org/atlassian/jira-software-actions/src/master/ 85 | 86 | ### Setting your AWS credentials 87 | 88 | JPT needs your AWS credentials to provision instances. 89 | By default, JPT manages AWS credentials through the `com.amazonaws.auth.DefaultAWSCredentialsProviderChain` class. 90 | 91 | You can provide your AWS credentials for this class through the following methods: 92 | 93 | - Setting the environmental variables `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`, or 94 | - Setting Java System Properties `aws.accessKeyId` and `aws.secretKey` 95 | 96 | For more information about this class (including alternative methods for setting credentials), see [Working with AWS Credentials](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html). 97 | 98 | JPT ships with a pre-configured policy for managing AWS access. 99 | You can view and edit this policy through the [aws-policy.json file](../../aws-policy.json). 100 | For more information, see [Policies and Permissions](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html). 101 | 102 | ### Running benchmark tests with JPT 103 | 104 | Once you've applied your app and set your AWS credentials, run the following command from the repository's root: 105 | 106 | 107 | ``` 108 | cd jira-performance-tests/examples/ref-app/ 109 | ./mvnw install 110 | ``` 111 | 112 | Depending on your bandwidth, the entire test (from provisioning to data collection) could take around 45 minutes. 113 | JPT will display test results for both baseline and experiment instances: 114 | 115 | ![Plain text report](plain-text-report.png) 116 | 117 | JPT will also generate detailed test results and store them under `examples/ref-app/reference-jira-app-performance-tests/target/`: 118 | 119 | - `detailed.log`: for detailed test logs. 120 | - `/jpt-workspace/` subdirectory: contains raw test results for both baseline and experiment instances. 121 | - `/surefire-reports/` subdirectory: contains detailed results in CSV and HTML formats. 122 | 123 | After completing the test, JPT will terminate both instances it provisioned in AWS. 124 | -------------------------------------------------------------------------------- /docs/tests/plain-text-report.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atlassian/jira-performance-tests/367223afb9143c177cbb7f43bb96685c5a10080d/docs/tests/plain-text-report.png -------------------------------------------------------------------------------- /examples/btf-test/.editorconfig: -------------------------------------------------------------------------------- 1 | [*.xml] 2 | indent_size = 4 -------------------------------------------------------------------------------- /examples/btf-test/.gitignore: -------------------------------------------------------------------------------- 1 | target -------------------------------------------------------------------------------- /examples/btf-test/.mvn/wrapper/MavenWrapperDownloader.java: -------------------------------------------------------------------------------- 1 | /* 2 | Licensed to the Apache Software Foundation (ASF) under one 3 | or more contributor license agreements. See the NOTICE file 4 | distributed with this work for additional information 5 | regarding copyright ownership. The ASF licenses this file 6 | to you under the Apache License, Version 2.0 (the 7 | "License"); you may not use this file except in compliance 8 | with the License. You may obtain a copy of the License at 9 | 10 | http://www.apache.org/licenses/LICENSE-2.0 11 | 12 | Unless required by applicable law or agreed to in writing, 13 | software distributed under the License is distributed on an 14 | "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | KIND, either express or implied. See the License for the 16 | specific language governing permissions and limitations 17 | under the License. 18 | */ 19 | 20 | import java.net.*; 21 | import java.io.*; 22 | import java.nio.channels.*; 23 | import java.util.Properties; 24 | 25 | public class MavenWrapperDownloader { 26 | 27 | /** 28 | * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. 29 | */ 30 | private static final String DEFAULT_DOWNLOAD_URL = 31 | "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"; 32 | 33 | /** 34 | * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to 35 | * use instead of the default one. 36 | */ 37 | private static final String MAVEN_WRAPPER_PROPERTIES_PATH = 38 | ".mvn/wrapper/maven-wrapper.properties"; 39 | 40 | /** 41 | * Path where the maven-wrapper.jar will be saved to. 42 | */ 43 | private static final String MAVEN_WRAPPER_JAR_PATH = 44 | ".mvn/wrapper/maven-wrapper.jar"; 45 | 46 | /** 47 | * Name of the property which should be used to override the default download url for the wrapper. 48 | */ 49 | private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; 50 | 51 | public static void main(String args[]) { 52 | System.out.println("- Downloader started"); 53 | File baseDirectory = new File(args[0]); 54 | System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); 55 | 56 | // If the maven-wrapper.properties exists, read it and check if it contains a custom 57 | // wrapperUrl parameter. 58 | File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); 59 | String url = DEFAULT_DOWNLOAD_URL; 60 | if(mavenWrapperPropertyFile.exists()) { 61 | FileInputStream mavenWrapperPropertyFileInputStream = null; 62 | try { 63 | mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); 64 | Properties mavenWrapperProperties = new Properties(); 65 | mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); 66 | url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); 67 | } catch (IOException e) { 68 | System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); 69 | } finally { 70 | try { 71 | if(mavenWrapperPropertyFileInputStream != null) { 72 | mavenWrapperPropertyFileInputStream.close(); 73 | } 74 | } catch (IOException e) { 75 | // Ignore ... 76 | } 77 | } 78 | } 79 | System.out.println("- Downloading from: : " + url); 80 | 81 | File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); 82 | if(!outputFile.getParentFile().exists()) { 83 | if(!outputFile.getParentFile().mkdirs()) { 84 | System.out.println( 85 | "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'"); 86 | } 87 | } 88 | System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); 89 | try { 90 | downloadFileFromURL(url, outputFile); 91 | System.out.println("Done"); 92 | System.exit(0); 93 | } catch (Throwable e) { 94 | System.out.println("- Error downloading"); 95 | e.printStackTrace(); 96 | System.exit(1); 97 | } 98 | } 99 | 100 | private static void downloadFileFromURL(String urlString, File destination) throws Exception { 101 | URL website = new URL(urlString); 102 | ReadableByteChannel rbc; 103 | rbc = Channels.newChannel(website.openStream()); 104 | FileOutputStream fos = new FileOutputStream(destination); 105 | fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); 106 | fos.close(); 107 | rbc.close(); 108 | } 109 | 110 | } 111 | -------------------------------------------------------------------------------- /examples/btf-test/.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atlassian/jira-performance-tests/367223afb9143c177cbb7f43bb96685c5a10080d/examples/btf-test/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /examples/btf-test/.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.5.4/apache-maven-3.5.4-bin.zip -------------------------------------------------------------------------------- /examples/btf-test/README.md: -------------------------------------------------------------------------------- 1 | # Example performance test against running Jira instance 2 | 3 | The [MyBtf](src/test/java/com/atlassian/performance/tools/btftest/MyJiraOnPermiseIT.java) shows how to consume 4 | `com.atlassian.performance.tools.jiraperformancetests.api.OnPremisePerformanceTest` API to create a test that measures 5 | running Jira performance 6 | 7 | To run the test execute: `./mvnw verify` from your command line -------------------------------------------------------------------------------- /examples/btf-test/mvnw.cmd: -------------------------------------------------------------------------------- 1 | @REM ---------------------------------------------------------------------------- 2 | @REM Licensed to the Apache Software Foundation (ASF) under one 3 | @REM or more contributor license agreements. See the NOTICE file 4 | @REM distributed with this work for additional information 5 | @REM regarding copyright ownership. The ASF licenses this file 6 | @REM to you under the Apache License, Version 2.0 (the 7 | @REM "License"); you may not use this file except in compliance 8 | @REM with the License. You may obtain a copy of the License at 9 | @REM 10 | @REM http://www.apache.org/licenses/LICENSE-2.0 11 | @REM 12 | @REM Unless required by applicable law or agreed to in writing, 13 | @REM software distributed under the License is distributed on an 14 | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | @REM KIND, either express or implied. See the License for the 16 | @REM specific language governing permissions and limitations 17 | @REM under the License. 18 | @REM ---------------------------------------------------------------------------- 19 | 20 | @REM ---------------------------------------------------------------------------- 21 | @REM Maven2 Start Up Batch script 22 | @REM 23 | @REM Required ENV vars: 24 | @REM JAVA_HOME - location of a JDK home dir 25 | @REM 26 | @REM Optional ENV vars 27 | @REM M2_HOME - location of maven2's installed home dir 28 | @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands 29 | @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending 30 | @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven 31 | @REM e.g. to debug Maven itself, use 32 | @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 33 | @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files 34 | @REM ---------------------------------------------------------------------------- 35 | 36 | @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' 37 | @echo off 38 | @REM set title of command window 39 | title %0 40 | @REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' 41 | @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% 42 | 43 | @REM set %HOME% to equivalent of $HOME 44 | if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") 45 | 46 | @REM Execute a user defined script before this one 47 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre 48 | @REM check for pre script, once with legacy .bat ending and once with .cmd ending 49 | if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" 50 | if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" 51 | :skipRcPre 52 | 53 | @setlocal 54 | 55 | set ERROR_CODE=0 56 | 57 | @REM To isolate internal variables from possible post scripts, we use another setlocal 58 | @setlocal 59 | 60 | @REM ==== START VALIDATION ==== 61 | if not "%JAVA_HOME%" == "" goto OkJHome 62 | 63 | echo. 64 | echo Error: JAVA_HOME not found in your environment. >&2 65 | echo Please set the JAVA_HOME variable in your environment to match the >&2 66 | echo location of your Java installation. >&2 67 | echo. 68 | goto error 69 | 70 | :OkJHome 71 | if exist "%JAVA_HOME%\bin\java.exe" goto init 72 | 73 | echo. 74 | echo Error: JAVA_HOME is set to an invalid directory. >&2 75 | echo JAVA_HOME = "%JAVA_HOME%" >&2 76 | echo Please set the JAVA_HOME variable in your environment to match the >&2 77 | echo location of your Java installation. >&2 78 | echo. 79 | goto error 80 | 81 | @REM ==== END VALIDATION ==== 82 | 83 | :init 84 | 85 | @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". 86 | @REM Fallback to current working directory if not found. 87 | 88 | set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% 89 | IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir 90 | 91 | set EXEC_DIR=%CD% 92 | set WDIR=%EXEC_DIR% 93 | :findBaseDir 94 | IF EXIST "%WDIR%"\.mvn goto baseDirFound 95 | cd .. 96 | IF "%WDIR%"=="%CD%" goto baseDirNotFound 97 | set WDIR=%CD% 98 | goto findBaseDir 99 | 100 | :baseDirFound 101 | set MAVEN_PROJECTBASEDIR=%WDIR% 102 | cd "%EXEC_DIR%" 103 | goto endDetectBaseDir 104 | 105 | :baseDirNotFound 106 | set MAVEN_PROJECTBASEDIR=%EXEC_DIR% 107 | cd "%EXEC_DIR%" 108 | 109 | :endDetectBaseDir 110 | 111 | IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig 112 | 113 | @setlocal EnableExtensions EnableDelayedExpansion 114 | for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a 115 | @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% 116 | 117 | :endReadAdditionalConfig 118 | 119 | SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" 120 | set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" 121 | set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 122 | 123 | set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" 124 | FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO ( 125 | IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B 126 | ) 127 | 128 | @REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central 129 | @REM This allows using the maven wrapper in projects that prohibit checking in binary data. 130 | if exist %WRAPPER_JAR% ( 131 | echo Found %WRAPPER_JAR% 132 | ) else ( 133 | echo Couldn't find %WRAPPER_JAR%, downloading it ... 134 | echo Downloading from: %DOWNLOAD_URL% 135 | powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')" 136 | echo Finished downloading %WRAPPER_JAR% 137 | ) 138 | @REM End of extension 139 | 140 | %MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* 141 | if ERRORLEVEL 1 goto error 142 | goto end 143 | 144 | :error 145 | set ERROR_CODE=1 146 | 147 | :end 148 | @endlocal & set ERROR_CODE=%ERROR_CODE% 149 | 150 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost 151 | @REM check for post script, once with legacy .bat ending and once with .cmd ending 152 | if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" 153 | if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" 154 | :skipRcPost 155 | 156 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' 157 | if "%MAVEN_BATCH_PAUSE%" == "on" pause 158 | 159 | if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% 160 | 161 | exit /B %ERROR_CODE% 162 | -------------------------------------------------------------------------------- /examples/btf-test/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 4.0.0 8 | com.atlassian.performance.tools.btftest 9 | btf-test 10 | 1.0-SNAPSHOT 11 | 12 | 13 | atlassian-public 14 | https://packages.atlassian.com/maven/repository/public 15 | 16 | true 17 | warn 18 | 19 | 20 | 21 | 22 | 23 | 24 | org.apache.maven.plugins 25 | maven-compiler-plugin 26 | 3.8.0 27 | 28 | 8 29 | 8 30 | 31 | 32 | 33 | maven-jar-plugin 34 | 2.4 35 | 36 | true 37 | 38 | 39 | 40 | default-jar 41 | package 42 | 43 | jar 44 | 45 | 46 | 47 | 48 | 49 | org.apache.maven.plugins 50 | maven-failsafe-plugin 51 | 2.22.0 52 | 53 | 54 | 55 | integration-test 56 | verify 57 | 58 | 59 | 60 | 61 | 62 | ${project.build.directory} 63 | 64 | 65 | -Djdk.net.URLClassPath.disableClassPathURLCheck=true 66 | false 67 | 68 | 69 | 70 | 71 | 72 | 73 | junit 74 | junit 75 | 4.10 76 | test 77 | 78 | 79 | com.atlassian.performance.tools 80 | jira-performance-tests 81 | ${jpt.version} 82 | 83 | 84 | com.atlassian.performance.tools 85 | virtual-users 86 | 2.2.0 87 | 88 | 89 | 90 | 2.0.0 91 | UTF-8 92 | 93 | -------------------------------------------------------------------------------- /examples/btf-test/src/test/java/com/atlassian/performance/tools/btftest/MyJiraOnPremiseIT.java: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.btftest; 2 | 3 | import com.atlassian.performance.tools.jiraperformancetests.api.OnPremisePerformanceTest; 4 | import org.junit.Test; 5 | 6 | import java.net.URI; 7 | import java.net.URISyntaxException; 8 | import java.time.Duration; 9 | 10 | public class MyJiraOnPremiseIT { 11 | 12 | /** 13 | * Defaults to yield results quickly. Needs additional configuration to achieve greater meaningfulness. 14 | */ 15 | @Test 16 | public void testMyJira() throws URISyntaxException { 17 | 18 | /* 19 | * Point this toward tested Jira. 20 | */ 21 | final URI myJira = new URI("http://localhost:8090/jira/"); 22 | 23 | final OnPremisePerformanceTest jiraOnPremiseTest = new OnPremisePerformanceTest(myJira); 24 | 25 | /* 26 | * Set credentials so the test knows how to access your jira. 27 | */ 28 | jiraOnPremiseTest.setAdminLogin("admin"); 29 | jiraOnPremiseTest.setAdminPassword("admin"); 30 | 31 | /* 32 | * Optionally, set the number of virtual users that will generate the load. 33 | */ 34 | jiraOnPremiseTest.setVirtualUsers(1); 35 | 36 | /* 37 | * Optionally, change the test duration. 38 | */ 39 | jiraOnPremiseTest.setTestDuration(Duration.ofMinutes(5)); 40 | 41 | jiraOnPremiseTest.run(); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /examples/btf-test/src/test/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /examples/ref-app/.editorconfig: -------------------------------------------------------------------------------- 1 | [*.{java,xml}] 2 | indent_size = 4 -------------------------------------------------------------------------------- /examples/ref-app/.gitignore: -------------------------------------------------------------------------------- 1 | target -------------------------------------------------------------------------------- /examples/ref-app/.mvn/jvm.config: -------------------------------------------------------------------------------- 1 | -Xmx256m -Xms256m -------------------------------------------------------------------------------- /examples/ref-app/.mvn/wrapper/MavenWrapperDownloader.java: -------------------------------------------------------------------------------- 1 | /* 2 | Licensed to the Apache Software Foundation (ASF) under one 3 | or more contributor license agreements. See the NOTICE file 4 | distributed with this work for additional information 5 | regarding copyright ownership. The ASF licenses this file 6 | to you under the Apache License, Version 2.0 (the 7 | "License"); you may not use this file except in compliance 8 | with the License. You may obtain a copy of the License at 9 | 10 | http://www.apache.org/licenses/LICENSE-2.0 11 | 12 | Unless required by applicable law or agreed to in writing, 13 | software distributed under the License is distributed on an 14 | "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | KIND, either express or implied. See the License for the 16 | specific language governing permissions and limitations 17 | under the License. 18 | */ 19 | 20 | import java.net.*; 21 | import java.io.*; 22 | import java.nio.channels.*; 23 | import java.util.Properties; 24 | 25 | public class MavenWrapperDownloader { 26 | 27 | /** 28 | * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. 29 | */ 30 | private static final String DEFAULT_DOWNLOAD_URL = 31 | "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"; 32 | 33 | /** 34 | * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to 35 | * use instead of the default one. 36 | */ 37 | private static final String MAVEN_WRAPPER_PROPERTIES_PATH = 38 | ".mvn/wrapper/maven-wrapper.properties"; 39 | 40 | /** 41 | * Path where the maven-wrapper.jar will be saved to. 42 | */ 43 | private static final String MAVEN_WRAPPER_JAR_PATH = 44 | ".mvn/wrapper/maven-wrapper.jar"; 45 | 46 | /** 47 | * Name of the property which should be used to override the default download url for the wrapper. 48 | */ 49 | private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; 50 | 51 | public static void main(String args[]) { 52 | System.out.println("- Downloader started"); 53 | File baseDirectory = new File(args[0]); 54 | System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); 55 | 56 | // If the maven-wrapper.properties exists, read it and check if it contains a custom 57 | // wrapperUrl parameter. 58 | File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); 59 | String url = DEFAULT_DOWNLOAD_URL; 60 | if(mavenWrapperPropertyFile.exists()) { 61 | FileInputStream mavenWrapperPropertyFileInputStream = null; 62 | try { 63 | mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); 64 | Properties mavenWrapperProperties = new Properties(); 65 | mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); 66 | url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); 67 | } catch (IOException e) { 68 | System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); 69 | } finally { 70 | try { 71 | if(mavenWrapperPropertyFileInputStream != null) { 72 | mavenWrapperPropertyFileInputStream.close(); 73 | } 74 | } catch (IOException e) { 75 | // Ignore ... 76 | } 77 | } 78 | } 79 | System.out.println("- Downloading from: : " + url); 80 | 81 | File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); 82 | if(!outputFile.getParentFile().exists()) { 83 | if(!outputFile.getParentFile().mkdirs()) { 84 | System.out.println( 85 | "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'"); 86 | } 87 | } 88 | System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); 89 | try { 90 | downloadFileFromURL(url, outputFile); 91 | System.out.println("Done"); 92 | System.exit(0); 93 | } catch (Throwable e) { 94 | System.out.println("- Error downloading"); 95 | e.printStackTrace(); 96 | System.exit(1); 97 | } 98 | } 99 | 100 | private static void downloadFileFromURL(String urlString, File destination) throws Exception { 101 | URL website = new URL(urlString); 102 | ReadableByteChannel rbc; 103 | rbc = Channels.newChannel(website.openStream()); 104 | FileOutputStream fos = new FileOutputStream(destination); 105 | fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); 106 | fos.close(); 107 | rbc.close(); 108 | } 109 | 110 | } 111 | -------------------------------------------------------------------------------- /examples/ref-app/.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atlassian/jira-performance-tests/367223afb9143c177cbb7f43bb96685c5a10080d/examples/ref-app/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /examples/ref-app/.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.5.4/apache-maven-3.5.4-bin.zip -------------------------------------------------------------------------------- /examples/ref-app/mvnw.cmd: -------------------------------------------------------------------------------- 1 | @REM ---------------------------------------------------------------------------- 2 | @REM Licensed to the Apache Software Foundation (ASF) under one 3 | @REM or more contributor license agreements. See the NOTICE file 4 | @REM distributed with this work for additional information 5 | @REM regarding copyright ownership. The ASF licenses this file 6 | @REM to you under the Apache License, Version 2.0 (the 7 | @REM "License"); you may not use this file except in compliance 8 | @REM with the License. You may obtain a copy of the License at 9 | @REM 10 | @REM http://www.apache.org/licenses/LICENSE-2.0 11 | @REM 12 | @REM Unless required by applicable law or agreed to in writing, 13 | @REM software distributed under the License is distributed on an 14 | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | @REM KIND, either express or implied. See the License for the 16 | @REM specific language governing permissions and limitations 17 | @REM under the License. 18 | @REM ---------------------------------------------------------------------------- 19 | 20 | @REM ---------------------------------------------------------------------------- 21 | @REM Maven2 Start Up Batch script 22 | @REM 23 | @REM Required ENV vars: 24 | @REM JAVA_HOME - location of a JDK home dir 25 | @REM 26 | @REM Optional ENV vars 27 | @REM M2_HOME - location of maven2's installed home dir 28 | @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands 29 | @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending 30 | @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven 31 | @REM e.g. to debug Maven itself, use 32 | @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 33 | @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files 34 | @REM ---------------------------------------------------------------------------- 35 | 36 | @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' 37 | @echo off 38 | @REM set title of command window 39 | title %0 40 | @REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' 41 | @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% 42 | 43 | @REM set %HOME% to equivalent of $HOME 44 | if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") 45 | 46 | @REM Execute a user defined script before this one 47 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre 48 | @REM check for pre script, once with legacy .bat ending and once with .cmd ending 49 | if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" 50 | if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" 51 | :skipRcPre 52 | 53 | @setlocal 54 | 55 | set ERROR_CODE=0 56 | 57 | @REM To isolate internal variables from possible post scripts, we use another setlocal 58 | @setlocal 59 | 60 | @REM ==== START VALIDATION ==== 61 | if not "%JAVA_HOME%" == "" goto OkJHome 62 | 63 | echo. 64 | echo Error: JAVA_HOME not found in your environment. >&2 65 | echo Please set the JAVA_HOME variable in your environment to match the >&2 66 | echo location of your Java installation. >&2 67 | echo. 68 | goto error 69 | 70 | :OkJHome 71 | if exist "%JAVA_HOME%\bin\java.exe" goto init 72 | 73 | echo. 74 | echo Error: JAVA_HOME is set to an invalid directory. >&2 75 | echo JAVA_HOME = "%JAVA_HOME%" >&2 76 | echo Please set the JAVA_HOME variable in your environment to match the >&2 77 | echo location of your Java installation. >&2 78 | echo. 79 | goto error 80 | 81 | @REM ==== END VALIDATION ==== 82 | 83 | :init 84 | 85 | @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". 86 | @REM Fallback to current working directory if not found. 87 | 88 | set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% 89 | IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir 90 | 91 | set EXEC_DIR=%CD% 92 | set WDIR=%EXEC_DIR% 93 | :findBaseDir 94 | IF EXIST "%WDIR%"\.mvn goto baseDirFound 95 | cd .. 96 | IF "%WDIR%"=="%CD%" goto baseDirNotFound 97 | set WDIR=%CD% 98 | goto findBaseDir 99 | 100 | :baseDirFound 101 | set MAVEN_PROJECTBASEDIR=%WDIR% 102 | cd "%EXEC_DIR%" 103 | goto endDetectBaseDir 104 | 105 | :baseDirNotFound 106 | set MAVEN_PROJECTBASEDIR=%EXEC_DIR% 107 | cd "%EXEC_DIR%" 108 | 109 | :endDetectBaseDir 110 | 111 | IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig 112 | 113 | @setlocal EnableExtensions EnableDelayedExpansion 114 | for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a 115 | @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% 116 | 117 | :endReadAdditionalConfig 118 | 119 | SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" 120 | set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" 121 | set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 122 | 123 | set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" 124 | FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO ( 125 | IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B 126 | ) 127 | 128 | @REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central 129 | @REM This allows using the maven wrapper in projects that prohibit checking in binary data. 130 | if exist %WRAPPER_JAR% ( 131 | echo Found %WRAPPER_JAR% 132 | ) else ( 133 | echo Couldn't find %WRAPPER_JAR%, downloading it ... 134 | echo Downloading from: %DOWNLOAD_URL% 135 | powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')" 136 | echo Finished downloading %WRAPPER_JAR% 137 | ) 138 | @REM End of extension 139 | 140 | %MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* 141 | if ERRORLEVEL 1 goto error 142 | goto end 143 | 144 | :error 145 | set ERROR_CODE=1 146 | 147 | :end 148 | @endlocal & set ERROR_CODE=%ERROR_CODE% 149 | 150 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost 151 | @REM check for post script, once with legacy .bat ending and once with .cmd ending 152 | if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" 153 | if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" 154 | :skipRcPost 155 | 156 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' 157 | if "%MAVEN_BATCH_PAUSE%" == "on" pause 158 | 159 | if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% 160 | 161 | exit /B %ERROR_CODE% 162 | -------------------------------------------------------------------------------- /examples/ref-app/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 4.0.0 8 | com.atlassian.performance.tools 9 | reference-jira-app-parent 10 | 1.0-SNAPSHOT 11 | pom 12 | Reference Jira app with performance tests 13 | 14 | reference-jira-app 15 | reference-jira-app-performance-tests 16 | 17 | 18 | Atlassian 19 | http://www.atlassian.com/ 20 | 21 | 22 | 23 | Apache License 2.0 24 | http://www.apache.org/licenses/LICENSE-2.0 25 | repo 26 | 27 | 28 | 29 | 30 | atlassian-public 31 | https://packages.atlassian.com/maven/repository/public 32 | 33 | true 34 | never 35 | warn 36 | 37 | 38 | true 39 | warn 40 | 41 | 42 | 43 | 44 | 45 | atlassian-public 46 | https://maven.atlassian.com/repository/public 47 | 48 | true 49 | warn 50 | 51 | 52 | never 53 | warn 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /examples/ref-app/reference-jira-app-performance-tests/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 4.0.0 8 | 9 | com.atlassian.performance.tools 10 | reference-jira-app-parent 11 | 1.0-SNAPSHOT 12 | 13 | reference-jira-app-performance-tests 14 | 15 | 16 | 17 | org.apache.maven.plugins 18 | maven-compiler-plugin 19 | 3.7.0 20 | 21 | 1.8 22 | 1.8 23 | 24 | 25 | 26 | org.apache.maven.plugins 27 | maven-failsafe-plugin 28 | 2.22.0 29 | 30 | 31 | 32 | integration-test 33 | verify 34 | 35 | 36 | 37 | 38 | false 39 | 40 | -Xmx256m -Xms256m -Djdk.net.URLClassPath.disableClassPathURLCheck=true 41 | 42 | 43 | 44 | maven-assembly-plugin 45 | 3.1.0 46 | 47 | 48 | src/main/assembly/assembly.xml 49 | 50 | 51 | 52 | 53 | make-assembly 54 | package 55 | 56 | single 57 | 58 | 59 | 60 | 61 | com.atlassian.performance.tools.virtualusers.api.EntryPointKt 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | maven-jar-plugin 70 | 2.4 71 | 72 | true 73 | 74 | 75 | 76 | default-jar 77 | package 78 | 79 | jar 80 | 81 | 82 | 83 | 84 | 85 | 86 | org.codehaus.mojo 87 | exec-maven-plugin 88 | 1.2.1 89 | 90 | 91 | clean-all-expired 92 | 93 | java 94 | 95 | 96 | com.atlassian.performance.tools.referencejiraapp.aws.CleanExpiredCommand 97 | test 98 | 99 | 100 | 101 | list-my-stacks 102 | 103 | java 104 | 105 | 106 | com.atlassian.performance.tools.referencejiraapp.aws.ListMyStacksCommand 107 | test 108 | 109 | 110 | 111 | delete-my-stacks 112 | 113 | java 114 | 115 | 116 | com.atlassian.performance.tools.referencejiraapp.aws.DeleteMyStacksCommand 117 | test 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | junit 127 | junit 128 | 4.10 129 | test 130 | 131 | 132 | com.atlassian.performance.tools 133 | jira-performance-tests 134 | ${jpt.version} 135 | test 136 | 137 | 138 | 139 | 2.0.0 140 | UTF-8 141 | 142 | -------------------------------------------------------------------------------- /examples/ref-app/reference-jira-app-performance-tests/src/main/assembly/assembly.xml: -------------------------------------------------------------------------------- 1 | 4 | fat-tests 5 | 6 | jar 7 | 8 | false 9 | 10 | 11 | false 12 | true 13 | test 14 | 15 | 16 | 17 | 18 | ${project.build.directory}/test-classes 19 | 20 | 21 | **/*.class 22 | 23 | true 24 | 25 | 26 | -------------------------------------------------------------------------------- /examples/ref-app/reference-jira-app-performance-tests/src/test/java/com/atlassian/performance/tools/referencejiraapp/SlowEventListenerPerformanceIT.java: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.referencejiraapp; 2 | 3 | import com.atlassian.performance.tools.infrastructure.api.app.AppSource; 4 | import com.atlassian.performance.tools.jiraperformancetests.api.AppImpactTest; 5 | import com.atlassian.performance.tools.jiraperformancetests.api.LocalApp; 6 | import com.atlassian.performance.tools.referencejiraapp.aws.MyAws; 7 | import org.junit.Test; 8 | 9 | import java.io.File; 10 | 11 | public class SlowEventListenerPerformanceIT { 12 | 13 | @Test 14 | public void shouldNotSlowJiraDown() { 15 | final AppSource app = new LocalApp( 16 | new File("../reference-jira-app/target/reference-jira-app-1.0-SNAPSHOT.obr") 17 | ); 18 | final File virtualUsersJar = new File("target/reference-jira-app-performance-tests-1.0-SNAPSHOT-fat-tests.jar"); 19 | final AppImpactTest test = new AppImpactTest(app, new MyAws().aws, virtualUsersJar); 20 | 21 | // /* 22 | // * Optionally, express your performance impact expectations here. Uncomment it and fix imports if you wish. 23 | // */ 24 | // final java.util.Map< 25 | // com.atlassian.performance.tools.jiraactions.api.ActionType, 26 | // com.atlassian.performance.tools.report.api.Criteria 27 | // > criteria = 28 | // com.google.common.collect.ImmutableMap.of( 29 | // com.atlassian.performance.tools.jiraactions.api.ActionTypes.CREATE_ISSUE_SUBMIT, 30 | // new com.atlassian.performance.tools.report.api.Criteria( 31 | // 0.20f, 32 | // 12, 33 | // 3 34 | // ) 35 | // ); 36 | // test.setCriteria(criteria); 37 | 38 | // /* 39 | // * More complex expectations can be expressed by adding new entries to the map like below: 40 | // */ 41 | // final java.util.Map< 42 | // com.atlassian.performance.tools.jiraactions.api.ActionType, 43 | // com.atlassian.performance.tools.report.api.Criteria 44 | // > criteria = 45 | // com.google.common.collect.ImmutableMap.of( 46 | // com.atlassian.performance.tools.jiraactions.api.ActionTypes.CREATE_ISSUE_SUBMIT, 47 | // new com.atlassian.performance.tools.report.api.Criteria( 48 | // 0.20f, 49 | // 12, 50 | // 3 51 | // ), 52 | // com.atlassian.performance.tools.jiraactions.api.ActionTypes.EDIT_ISSUE, 53 | // new com.atlassian.performance.tools.report.api.Criteria( 54 | // 0.30f, 55 | // 5, 56 | // 1 57 | // ) 58 | // 59 | // ); 60 | // test.setCriteria(criteria); 61 | 62 | // /* 63 | // * Optionally, pass in your custom user scenario. The default user scenario might not cover 64 | // * interactions with your app. 65 | // */ 66 | // test.setScenario(com.atlassian.performance.tools.referencejiraapp.scenario.MyScenario.class); 67 | 68 | // /* 69 | // * Optionally, set Jira version to test against. 70 | // */ 71 | // test.setJiraVersion("7.2.12"); 72 | 73 | // /* 74 | // * Optionally, change the duration of the test to suit your needs. 75 | // */ 76 | // test.setDuration(java.time.Duration.ofMinutes(15)); 77 | 78 | // /* 79 | // * Optionally, set the location of the JAR file with the tests. 80 | // */ 81 | // test.setTestJar(new java.io.File("/path/to/custom/jar/file")); 82 | 83 | test.run(); 84 | } 85 | } -------------------------------------------------------------------------------- /examples/ref-app/reference-jira-app-performance-tests/src/test/java/com/atlassian/performance/tools/referencejiraapp/aws/CleanExpiredCommand.java: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.referencejiraapp.aws; 2 | 3 | import com.atlassian.performance.tools.jiraperformancetests.api.AwsHousekeeping; 4 | 5 | public class CleanExpiredCommand { 6 | 7 | /** 8 | * This will clean all expired stacks and instances for all users. 9 | * You can run it manually from IDE or from command line in the examples/ref-app directory: 10 | * ./mvnw -pl reference-jira-app-performance-tests test-compile exec:java@clean-all-expired 11 | * 12 | * Example output: 13 | * ``` 14 | * 13:46:13,520 INFO {: } Cleaning expired resources... 15 | * 13:46:14,940 INFO {: } All expired resources have been cleaned 16 | * ``` 17 | */ 18 | public static void main(String[] args) { 19 | new AwsHousekeeping(new MyAws().aws).cleanAllExpired(); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /examples/ref-app/reference-jira-app-performance-tests/src/test/java/com/atlassian/performance/tools/referencejiraapp/aws/DeleteMyStacksCommand.java: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.referencejiraapp.aws; 2 | 3 | import com.atlassian.performance.tools.jiraperformancetests.api.AwsHousekeeping; 4 | 5 | public class DeleteMyStacksCommand { 6 | 7 | /** 8 | * This will delete all AWS stacks provisioned by the current user. 9 | * You can run it manually from IDE or from command line in the examples/ref-app directory: 10 | * ./mvnw -pl reference-jira-app-performance-tests test-compile exec:java@delete-my-stacks 11 | * 12 | * Example output: 13 | * ``` 14 | * 13:46:37,826 INFO {: } Retrieving stacks for the current user... 15 | * 13:46:38,186 INFO {: } Deleting stacks... 16 | * 13:46:38,540 INFO {: } Deleted jpt-ad772592-1ded-474e-9712-2cb8882f775d-d2f52ac1 17 | * 13:46:38,695 INFO {: } Deleted jpt-b9dec4c0-ab09-4283-a6f8-59b6a1ff2c98-cb80e05a 18 | * 13:46:38,696 INFO {: } All stacks of the current user have been deleted 19 | * ``` 20 | */ 21 | public static void main(String[] args) { 22 | new AwsHousekeeping(new MyAws().aws).deleteMyStacks(); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /examples/ref-app/reference-jira-app-performance-tests/src/test/java/com/atlassian/performance/tools/referencejiraapp/aws/ListMyStacksCommand.java: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.referencejiraapp.aws; 2 | 3 | import com.atlassian.performance.tools.jiraperformancetests.api.AwsHousekeeping; 4 | 5 | public class ListMyStacksCommand { 6 | 7 | /** 8 | * This will list all AWS stacks provisioned by the current user. 9 | * You can run it manually from IDE or from command line in the examples/ref-app directory: 10 | * ./mvnw -pl reference-jira-app-performance-tests test-compile exec:java@list-my-stacks 11 | * 12 | * Example output: 13 | * ``` 14 | * 13:42:07,556 INFO {: } Below is the list of AWS stacks that were provisioned by the current user: 15 | * 13:42:07,558 INFO {: } johndoe: ListedStack(name=jpt-ad772592-1ded-474e-9712-2cb8882f775d-d2f52ac1, user=johndoe, timeLeft=PT59M51.072S, status=CREATE_IN_PROGRESS) 16 | * 13:42:07,558 INFO {: } johndoe: ListedStack(name=jpt-b9dec4c0-ab09-4283-a6f8-59b6a1ff2c98-cb80e05a, user=johndoe, timeLeft=PT59M50.92S, status=CREATE_IN_PROGRESS) 17 | * ``` 18 | */ 19 | public static void main(String[] args) { 20 | new AwsHousekeeping(new MyAws().aws).listMyStacks(); 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /examples/ref-app/reference-jira-app-performance-tests/src/test/java/com/atlassian/performance/tools/referencejiraapp/aws/MyAws.java: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.referencejiraapp.aws; 2 | 3 | import com.amazonaws.auth.AWSCredentialsProviderChain; 4 | import com.amazonaws.auth.DefaultAWSCredentialsProviderChain; 5 | import com.amazonaws.regions.Regions; 6 | import com.atlassian.performance.tools.aws.api.Aws; 7 | import com.atlassian.performance.tools.jiraperformancetests.api.ExplainingAwsCredentialsProvider; 8 | 9 | public class MyAws { 10 | 11 | /** 12 | * The following AWS regions are not yet supported: EU_WEST_3, SA_EAST_1, GovCloud 13 | */ 14 | public final Aws aws = new Aws( 15 | Regions.US_EAST_1, 16 | new AWSCredentialsProviderChain( 17 | new DefaultAWSCredentialsProviderChain(), 18 | new ExplainingAwsCredentialsProvider(MyAws.class) 19 | ) 20 | ); 21 | } 22 | -------------------------------------------------------------------------------- /examples/ref-app/reference-jira-app-performance-tests/src/test/java/com/atlassian/performance/tools/referencejiraapp/scenario/CustomViewIssueAction.java: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.referencejiraapp.scenario; 2 | 3 | import com.atlassian.performance.tools.jiraactions.api.ActionTypes; 4 | import com.atlassian.performance.tools.jiraactions.api.WebJira; 5 | import com.atlassian.performance.tools.jiraactions.api.action.Action; 6 | import com.atlassian.performance.tools.jiraactions.api.measure.ActionMeter; 7 | import com.atlassian.performance.tools.jiraactions.api.memories.IssueKeyMemory; 8 | import org.apache.logging.log4j.LogManager; 9 | import org.apache.logging.log4j.Logger; 10 | 11 | class CustomViewIssueAction implements Action { 12 | private final static Logger logger = LogManager.getLogger(CustomViewIssueAction.class); 13 | 14 | private final WebJira jira; 15 | private final ActionMeter meter; 16 | private final IssueKeyMemory issueKeyMemory; 17 | 18 | 19 | CustomViewIssueAction(WebJira jira, ActionMeter meter, IssueKeyMemory issueKeyMemory) { 20 | this.jira = jira; 21 | this.meter = meter; 22 | this.issueKeyMemory = issueKeyMemory; 23 | } 24 | 25 | @Override 26 | public void run() { 27 | final String issueKey = issueKeyMemory.recall(); 28 | if (issueKey == null) { 29 | logger.info("Skipping View Issue action. I have no knowledge of issue keys."); 30 | return; 31 | } 32 | meter.measure( 33 | ActionTypes.VIEW_ISSUE, 34 | () -> jira.goToIssue(issueKey).waitForSummary() 35 | ); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /examples/ref-app/reference-jira-app-performance-tests/src/test/java/com/atlassian/performance/tools/referencejiraapp/scenario/MyScenario.java: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.referencejiraapp.scenario; 2 | 3 | import com.atlassian.performance.tools.jiraactions.api.SeededRandom; 4 | import com.atlassian.performance.tools.jiraactions.api.WebJira; 5 | import com.atlassian.performance.tools.jiraactions.api.action.Action; 6 | import com.atlassian.performance.tools.jiraactions.api.action.BrowseProjectsAction; 7 | import com.atlassian.performance.tools.jiraactions.api.action.CreateIssueAction; 8 | import com.atlassian.performance.tools.jiraactions.api.action.SearchJqlAction; 9 | import com.atlassian.performance.tools.jiraactions.api.measure.ActionMeter; 10 | import com.atlassian.performance.tools.jiraactions.api.memories.IssueKeyMemory; 11 | import com.atlassian.performance.tools.jiraactions.api.memories.adaptive.AdaptiveIssueKeyMemory; 12 | import com.atlassian.performance.tools.jiraactions.api.memories.adaptive.AdaptiveJqlMemory; 13 | import com.atlassian.performance.tools.jiraactions.api.memories.adaptive.AdaptiveProjectMemory; 14 | import com.atlassian.performance.tools.jiraactions.api.scenario.Scenario; 15 | import com.google.common.collect.ImmutableList; 16 | import org.jetbrains.annotations.NotNull; 17 | 18 | import java.util.List; 19 | 20 | public class MyScenario implements Scenario { 21 | @NotNull 22 | @Override 23 | public List getActions(WebJira webJira, SeededRandom seededRandom, ActionMeter actionMeter) { 24 | 25 | final AdaptiveJqlMemory jqlMemory = new AdaptiveJqlMemory(seededRandom); 26 | final IssueKeyMemory issueKeyMemory = new AdaptiveIssueKeyMemory(seededRandom); 27 | final AdaptiveProjectMemory adaptiveProjectMemory = new AdaptiveProjectMemory(seededRandom); 28 | return ImmutableList.of( 29 | new SearchJqlAction(webJira, actionMeter, jqlMemory, issueKeyMemory), 30 | new BrowseProjectsAction(webJira, actionMeter, adaptiveProjectMemory), 31 | new CreateIssueAction(webJira, actionMeter, adaptiveProjectMemory, seededRandom), 32 | new CreateIssueAction(webJira, actionMeter, adaptiveProjectMemory, seededRandom), 33 | new CreateIssueAction(webJira, actionMeter, adaptiveProjectMemory, seededRandom), 34 | new CreateIssueAction(webJira, actionMeter, adaptiveProjectMemory, seededRandom), 35 | new CreateIssueAction(webJira, actionMeter, adaptiveProjectMemory, seededRandom), 36 | new CreateIssueAction(webJira, actionMeter, adaptiveProjectMemory, seededRandom), 37 | new CreateIssueAction(webJira, actionMeter, adaptiveProjectMemory, seededRandom), 38 | new CreateIssueAction(webJira, actionMeter, adaptiveProjectMemory, seededRandom), 39 | new CustomViewIssueAction(webJira, actionMeter, issueKeyMemory) 40 | ); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /examples/ref-app/reference-jira-app-performance-tests/src/test/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /examples/ref-app/reference-jira-app/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 4.0.0 8 | 9 | com.atlassian.performance.tools 10 | reference-jira-app-parent 11 | 1.0-SNAPSHOT 12 | 13 | reference-jira-app 14 | atlassian-plugin 15 | 16 | 17 | com.atlassian.jira 18 | jira-api 19 | ${jira.version} 20 | provided 21 | 22 | 23 | jta 24 | jta 25 | 26 | 27 | 28 | 29 | org.springframework 30 | spring-context 31 | 4.3.6.RELEASE 32 | provided 33 | 34 | 35 | junit 36 | junit 37 | 4.10 38 | test 39 | 40 | 41 | com.atlassian.plugin 42 | atlassian-spring-scanner-annotation 43 | ${atlassian.spring.scanner.version} 44 | compile 45 | 46 | 47 | com.atlassian.plugin 48 | atlassian-spring-scanner-runtime 49 | ${atlassian.spring.scanner.version} 50 | runtime 51 | 52 | 53 | javax.inject 54 | javax.inject 55 | 1 56 | provided 57 | 58 | 59 | com.atlassian.jira.tests 60 | jira-testkit-client 61 | 7.1.9 62 | test 63 | 64 | 65 | com.atlassian.jira.tests 66 | jira-func-test-basics 67 | 2.0.0 68 | test 69 | 70 | 71 | javax.ws.rs 72 | jsr311-api 73 | 1.1.1 74 | provided 75 | 76 | 77 | 78 | 79 | 80 | com.atlassian.maven.plugins 81 | maven-jira-plugin 82 | ${amps.version} 83 | true 84 | 85 | ${jira.version} 86 | 7.1.0 87 | true 88 | false 89 | 90 | ${atlassian.plugin.key} 91 | 92 | 93 | org.springframework.osgi.*;resolution:="optional", 94 | org.eclipse.gemini.blueprint.*;resolution:="optional", 95 | * 96 | 97 | * 98 | 99 | 100 | 101 | 102 | com.atlassian.plugin 103 | atlassian-spring-scanner-maven-plugin 104 | ${atlassian.spring.scanner.version} 105 | 106 | 107 | 108 | atlassian-spring-scanner 109 | 110 | process-classes 111 | 112 | 113 | 114 | 115 | 116 | com.atlassian.plugin 117 | atlassian-spring-scanner-external-jar 118 | 119 | 120 | false 121 | -com.atlassian.plugin.spring.scanner.annotation.* 122 | 123 | 124 | 125 | 126 | 127 | 7.1.0 128 | 6.3.15 129 | 1.2.13 130 | ${project.groupId}.${project.artifactId} 131 | UTF-8 132 | 1.8 133 | 1.8 134 | 3.1.3 135 | 136 | 137 | -------------------------------------------------------------------------------- /examples/ref-app/reference-jira-app/src/main/java/com/atlassian/performance/tools/referencejiraapp/SlowEventListener.java: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.referencejiraapp; 2 | 3 | import com.atlassian.event.api.EventListener; 4 | import com.atlassian.event.api.EventPublisher; 5 | import com.atlassian.jira.event.issue.IssueEvent; 6 | import com.atlassian.jira.event.type.EventType; 7 | import com.atlassian.plugin.spring.scanner.annotation.imports.JiraImport; 8 | import org.springframework.beans.factory.DisposableBean; 9 | import org.springframework.beans.factory.InitializingBean; 10 | import org.springframework.beans.factory.annotation.Autowired; 11 | import org.springframework.stereotype.Component; 12 | 13 | import static java.lang.Thread.sleep; 14 | import static java.time.Duration.ofMillis; 15 | 16 | @Component 17 | public class SlowEventListener implements InitializingBean, DisposableBean { 18 | @JiraImport 19 | private final EventPublisher eventPublisher; 20 | 21 | @Autowired 22 | public SlowEventListener(EventPublisher eventPublisher) { 23 | this.eventPublisher = eventPublisher; 24 | } 25 | 26 | @EventListener 27 | public void onIssueEvent(IssueEvent issueEvent) { 28 | final Long eventTypeId = issueEvent.getEventTypeId(); 29 | if (eventTypeId.equals(EventType.ISSUE_CREATED_ID)) { 30 | try { 31 | sleep(ofMillis(50).toMillis()); 32 | } catch (InterruptedException e) { 33 | throw new RuntimeException(e); 34 | } 35 | } 36 | } 37 | 38 | @Override 39 | public void destroy() throws Exception { 40 | eventPublisher.unregister(this); 41 | } 42 | 43 | @Override 44 | public void afterPropertiesSet() throws Exception { 45 | eventPublisher.register(this); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /examples/ref-app/reference-jira-app/src/main/resources/META-INF/spring/plugin-context.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | -------------------------------------------------------------------------------- /examples/ref-app/reference-jira-app/src/main/resources/atlassian-plugin.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ${project.description} 6 | ${project.version} 7 | 8 | images/pluginIcon.png 9 | images/pluginLogo.png 10 | 11 | -------------------------------------------------------------------------------- /examples/ref-app/reference-jira-app/src/main/resources/images/pluginIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atlassian/jira-performance-tests/367223afb9143c177cbb7f43bb96685c5a10080d/examples/ref-app/reference-jira-app/src/main/resources/images/pluginIcon.png -------------------------------------------------------------------------------- /examples/ref-app/reference-jira-app/src/main/resources/images/pluginLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atlassian/jira-performance-tests/367223afb9143c177cbb7f43bb96685c5a10080d/examples/ref-app/reference-jira-app/src/main/resources/images/pluginLogo.png -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx256m -Xms256m -------------------------------------------------------------------------------- /gradle/dependency-locks/annotationProcessor.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /gradle/dependency-locks/apiDependenciesMetadata.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | com.atlassian.performance.tools:concurrency:1.0.0 5 | com.atlassian.performance.tools:infrastructure:4.0.0 6 | com.atlassian.performance.tools:io:1.1.0 7 | com.atlassian.performance.tools:jira-actions:3.0.0 8 | com.atlassian.performance.tools:jira-software-actions:1.3.0 9 | com.atlassian.performance.tools:jvm-tasks:1.0.0 10 | com.atlassian.performance.tools:report:2.3.0 11 | com.atlassian.performance.tools:ssh:2.1.0 12 | com.atlassian.performance.tools:virtual-users:3.3.4 13 | com.atlassian.performance.tools:workspace:2.0.0 14 | com.github.stephenc.jcip:jcip-annotations:1.0-1 15 | com.google.code.findbugs:jsr305:1.3.9 16 | com.google.code.gson:gson:2.8.2 17 | com.google.errorprone:error_prone_annotations:2.1.3 18 | com.google.guava:guava:23.6-jre 19 | com.google.j2objc:j2objc-annotations:1.1 20 | com.googlecode.javaewah:JavaEWAH:1.1.6 21 | com.hierynomus:sshj:0.23.0 22 | com.jcraft:jsch:0.1.54 23 | com.jcraft:jzlib:1.1.3 24 | com.squareup.okhttp3:okhttp:3.9.1 25 | com.squareup.okio:okio:1.13.0 26 | com.typesafe:config:1.2.1 27 | commons-cli:commons-cli:1.4 28 | commons-codec:commons-codec:1.10 29 | commons-io:commons-io:2.5 30 | commons-logging:commons-logging:1.2 31 | io.github.bonigarcia:webdrivermanager:1.7.1 32 | javax.inject:javax.inject:1 33 | net.bytebuddy:byte-buddy:1.7.9 34 | net.i2p.crypto:eddsa:0.2.0 35 | org.apache.commons:commons-compress:1.9 36 | org.apache.commons:commons-csv:1.4 37 | org.apache.commons:commons-exec:1.3 38 | org.apache.commons:commons-lang3:3.5 39 | org.apache.commons:commons-math3:3.6.1 40 | org.apache.httpcomponents:httpclient:4.5.5 41 | org.apache.httpcomponents:httpcore:4.4.9 42 | org.apache.logging.log4j:log4j-api:2.10.0 43 | org.apache.logging.log4j:log4j-core:2.10.0 44 | org.apache.logging.log4j:log4j-jul:2.10.0 45 | org.apache.logging.log4j:log4j-slf4j-impl:2.10.0 46 | org.apache.maven.resolver:maven-resolver-api:1.1.0 47 | org.apache.maven.resolver:maven-resolver-connector-basic:1.1.0 48 | org.apache.maven.resolver:maven-resolver-impl:1.1.0 49 | org.apache.maven.resolver:maven-resolver-spi:1.1.0 50 | org.apache.maven.resolver:maven-resolver-transport-wagon:1.1.0 51 | org.apache.maven.resolver:maven-resolver-util:1.1.0 52 | org.apache.maven.wagon:wagon-file:2.12 53 | org.apache.maven.wagon:wagon-http-lightweight:2.12 54 | org.apache.maven.wagon:wagon-http-shared:2.12 55 | org.apache.maven.wagon:wagon-provider-api:2.12 56 | org.apache.maven:maven-artifact:3.5.2 57 | org.apache.maven:maven-builder-support:3.5.2 58 | org.apache.maven:maven-model-builder:3.5.2 59 | org.apache.maven:maven-model:3.5.2 60 | org.apache.maven:maven-repository-metadata:3.5.2 61 | org.apache.maven:maven-resolver-provider:3.5.2 62 | org.apache.maven:maven-settings-builder:3.5.2 63 | org.apache.maven:maven-settings:3.5.2 64 | org.bouncycastle:bcpkix-jdk15on:1.56 65 | org.bouncycastle:bcprov-jdk15on:1.56 66 | org.checkerframework:checker-compat-qual:2.0.0 67 | org.codehaus.mojo:animal-sniffer-annotations:1.14 68 | org.codehaus.plexus:plexus-component-annotations:1.7.1 69 | org.codehaus.plexus:plexus-interpolation:1.24 70 | org.codehaus.plexus:plexus-utils:3.1.0 71 | org.eclipse.jgit:org.eclipse.jgit:4.11.0.201803080745-r 72 | org.glassfish:javax.json:1.1 73 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-api-maven:3.1.3 74 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-api:3.1.3 75 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-impl-maven:3.1.3 76 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-spi-maven:3.1.3 77 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-spi:3.1.3 78 | org.jetbrains.kotlin:kotlin-stdlib-common:1.2.70 79 | org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.70 80 | org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.70 81 | org.jetbrains.kotlin:kotlin-stdlib-jre7:1.2.70 82 | org.jetbrains.kotlin:kotlin-stdlib-jre8:1.2.70 83 | org.jetbrains.kotlin:kotlin-stdlib:1.2.70 84 | org.jetbrains:annotations:13.0 85 | org.jsoup:jsoup:1.10.2 86 | org.rauschig:jarchivelib:0.7.1 87 | org.seleniumhq.selenium:selenium-api:3.11.0 88 | org.seleniumhq.selenium:selenium-chrome-driver:3.11.0 89 | org.seleniumhq.selenium:selenium-remote-driver:3.11.0 90 | org.seleniumhq.selenium:selenium-support:3.11.0 91 | org.slf4j:slf4j-api:1.8.0-alpha2 92 | org.sonatype.plexus:plexus-cipher:1.4 93 | org.sonatype.plexus:plexus-sec-dispatcher:1.4 94 | -------------------------------------------------------------------------------- /gradle/dependency-locks/archives.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /gradle/dependency-locks/compile.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /gradle/dependency-locks/compileClasspath.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | com.amazonaws:aws-java-sdk-cloudformation:1.11.424 5 | com.amazonaws:aws-java-sdk-core:1.11.424 6 | com.amazonaws:aws-java-sdk-ec2:1.11.424 7 | com.amazonaws:aws-java-sdk-elasticloadbalancing:1.11.424 8 | com.amazonaws:aws-java-sdk-iam:1.11.424 9 | com.amazonaws:aws-java-sdk-kms:1.11.424 10 | com.amazonaws:aws-java-sdk-s3:1.11.424 11 | com.amazonaws:aws-java-sdk-sts:1.11.424 12 | com.amazonaws:aws-java-sdk-support:1.11.424 13 | com.amazonaws:jmespath-java:1.11.424 14 | com.atlassian.performance.tools:aws-infrastructure:2.0.0 15 | com.atlassian.performance.tools:aws-resources:1.3.0 16 | com.atlassian.performance.tools:concurrency:1.0.0 17 | com.atlassian.performance.tools:infrastructure:4.0.0 18 | com.atlassian.performance.tools:io:1.1.0 19 | com.atlassian.performance.tools:jira-actions:2.3.0 20 | com.atlassian.performance.tools:jira-software-actions:1.3.0 21 | com.atlassian.performance.tools:jvm-tasks:1.0.0 22 | com.atlassian.performance.tools:report:2.3.0 23 | com.atlassian.performance.tools:ssh:2.1.0 24 | com.atlassian.performance.tools:virtual-users:3.3.4 25 | com.atlassian.performance.tools:workspace:2.0.0 26 | com.fasterxml.jackson.core:jackson-annotations:2.6.0 27 | com.fasterxml.jackson.core:jackson-core:2.9.4 28 | com.fasterxml.jackson.core:jackson-databind:2.6.7.1 29 | com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.6.7 30 | com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.9.4 31 | com.github.stephenc.jcip:jcip-annotations:1.0-1 32 | com.google.code.findbugs:jsr305:1.3.9 33 | com.google.code.gson:gson:2.8.2 34 | com.google.errorprone:error_prone_annotations:2.1.3 35 | com.google.guava:guava:23.6-jre 36 | com.google.j2objc:j2objc-annotations:1.1 37 | com.googlecode.javaewah:JavaEWAH:1.1.6 38 | com.hierynomus:sshj:0.23.0 39 | com.jcraft:jsch:0.1.54 40 | com.jcraft:jzlib:1.1.3 41 | com.squareup.okhttp3:okhttp:3.9.1 42 | com.squareup.okio:okio:1.13.0 43 | com.sun.istack:istack-commons-runtime:3.0.5 44 | com.sun.xml.fastinfoset:FastInfoset:1.2.13 45 | com.typesafe:config:1.2.1 46 | commons-cli:commons-cli:1.4 47 | commons-codec:commons-codec:1.10 48 | commons-io:commons-io:2.5 49 | commons-logging:commons-logging:1.2 50 | io.github.bonigarcia:webdrivermanager:1.7.1 51 | javax.activation:activation:1.1.1 52 | javax.inject:javax.inject:1 53 | javax.xml.bind:jaxb-api:2.3.0 54 | joda-time:joda-time:2.8.1 55 | net.bytebuddy:byte-buddy:1.7.9 56 | net.i2p.crypto:eddsa:0.2.0 57 | org.apache.commons:commons-compress:1.9 58 | org.apache.commons:commons-csv:1.4 59 | org.apache.commons:commons-exec:1.3 60 | org.apache.commons:commons-lang3:3.5 61 | org.apache.commons:commons-math3:3.6.1 62 | org.apache.httpcomponents:httpclient:4.5.5 63 | org.apache.httpcomponents:httpcore:4.4.9 64 | org.apache.logging.log4j:log4j-api:2.10.0 65 | org.apache.logging.log4j:log4j-core:2.10.0 66 | org.apache.logging.log4j:log4j-jcl:2.10.0 67 | org.apache.logging.log4j:log4j-jul:2.10.0 68 | org.apache.logging.log4j:log4j-slf4j-impl:2.10.0 69 | org.apache.maven.resolver:maven-resolver-api:1.1.0 70 | org.apache.maven.resolver:maven-resolver-connector-basic:1.1.0 71 | org.apache.maven.resolver:maven-resolver-impl:1.1.0 72 | org.apache.maven.resolver:maven-resolver-spi:1.1.0 73 | org.apache.maven.resolver:maven-resolver-transport-wagon:1.1.0 74 | org.apache.maven.resolver:maven-resolver-util:1.1.0 75 | org.apache.maven.wagon:wagon-file:2.12 76 | org.apache.maven.wagon:wagon-http-lightweight:2.12 77 | org.apache.maven.wagon:wagon-http-shared:2.12 78 | org.apache.maven.wagon:wagon-provider-api:2.12 79 | org.apache.maven:maven-artifact:3.5.2 80 | org.apache.maven:maven-builder-support:3.5.2 81 | org.apache.maven:maven-model-builder:3.5.2 82 | org.apache.maven:maven-model:3.5.2 83 | org.apache.maven:maven-repository-metadata:3.5.2 84 | org.apache.maven:maven-resolver-provider:3.5.2 85 | org.apache.maven:maven-settings-builder:3.5.2 86 | org.apache.maven:maven-settings:3.5.2 87 | org.bouncycastle:bcpkix-jdk15on:1.56 88 | org.bouncycastle:bcprov-jdk15on:1.56 89 | org.checkerframework:checker-compat-qual:2.0.0 90 | org.codehaus.mojo:animal-sniffer-annotations:1.14 91 | org.codehaus.plexus:plexus-component-annotations:1.7.1 92 | org.codehaus.plexus:plexus-interpolation:1.24 93 | org.codehaus.plexus:plexus-utils:3.1.0 94 | org.eclipse.jgit:org.eclipse.jgit:4.11.0.201803080745-r 95 | org.glassfish.jaxb:jaxb-core:2.3.0 96 | org.glassfish.jaxb:jaxb-runtime:2.3.0 97 | org.glassfish.jaxb:txw2:2.3.0 98 | org.glassfish:javax.json:1.1 99 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-api-maven:3.1.3 100 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-api:3.1.3 101 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-impl-maven:3.1.3 102 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-spi-maven:3.1.3 103 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-spi:3.1.3 104 | org.jetbrains.kotlin:kotlin-stdlib-common:1.2.70 105 | org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.70 106 | org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.70 107 | org.jetbrains.kotlin:kotlin-stdlib-jre7:1.2.70 108 | org.jetbrains.kotlin:kotlin-stdlib-jre8:1.2.70 109 | org.jetbrains.kotlin:kotlin-stdlib:1.2.70 110 | org.jetbrains:annotations:13.0 111 | org.jsoup:jsoup:1.10.2 112 | org.jvnet.staxex:stax-ex:1.7.8 113 | org.rauschig:jarchivelib:0.7.1 114 | org.seleniumhq.selenium:selenium-api:3.11.0 115 | org.seleniumhq.selenium:selenium-chrome-driver:3.11.0 116 | org.seleniumhq.selenium:selenium-remote-driver:3.11.0 117 | org.seleniumhq.selenium:selenium-support:3.11.0 118 | org.slf4j:slf4j-api:1.8.0-alpha2 119 | org.sonatype.plexus:plexus-cipher:1.4 120 | org.sonatype.plexus:plexus-sec-dispatcher:1.4 121 | org.yaml:snakeyaml:1.18 122 | software.amazon.ion:ion-java:1.0.2 123 | -------------------------------------------------------------------------------- /gradle/dependency-locks/compileOnly.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /gradle/dependency-locks/compileOnlyDependenciesMetadata.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /gradle/dependency-locks/default.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | com.amazonaws:aws-java-sdk-cloudformation:1.11.424 5 | com.amazonaws:aws-java-sdk-core:1.11.424 6 | com.amazonaws:aws-java-sdk-ec2:1.11.424 7 | com.amazonaws:aws-java-sdk-elasticloadbalancing:1.11.424 8 | com.amazonaws:aws-java-sdk-iam:1.11.424 9 | com.amazonaws:aws-java-sdk-kms:1.11.424 10 | com.amazonaws:aws-java-sdk-s3:1.11.424 11 | com.amazonaws:aws-java-sdk-sts:1.11.424 12 | com.amazonaws:aws-java-sdk-support:1.11.424 13 | com.amazonaws:jmespath-java:1.11.424 14 | com.atlassian.performance.tools:aws-infrastructure:2.0.0 15 | com.atlassian.performance.tools:aws-resources:1.3.0 16 | com.atlassian.performance.tools:concurrency:1.0.0 17 | com.atlassian.performance.tools:infrastructure:4.0.0 18 | com.atlassian.performance.tools:io:1.1.0 19 | com.atlassian.performance.tools:jira-actions:2.3.0 20 | com.atlassian.performance.tools:jira-software-actions:1.3.0 21 | com.atlassian.performance.tools:jvm-tasks:1.0.0 22 | com.atlassian.performance.tools:report:2.3.0 23 | com.atlassian.performance.tools:ssh:2.1.0 24 | com.atlassian.performance.tools:virtual-users:3.3.4 25 | com.atlassian.performance.tools:workspace:2.0.0 26 | com.fasterxml.jackson.core:jackson-annotations:2.6.0 27 | com.fasterxml.jackson.core:jackson-core:2.9.4 28 | com.fasterxml.jackson.core:jackson-databind:2.6.7.1 29 | com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.6.7 30 | com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.9.4 31 | com.github.stephenc.jcip:jcip-annotations:1.0-1 32 | com.google.code.findbugs:jsr305:1.3.9 33 | com.google.code.gson:gson:2.8.2 34 | com.google.errorprone:error_prone_annotations:2.1.3 35 | com.google.guava:guava:23.6-jre 36 | com.google.j2objc:j2objc-annotations:1.1 37 | com.googlecode.javaewah:JavaEWAH:1.1.6 38 | com.hierynomus:sshj:0.23.0 39 | com.jcraft:jsch:0.1.54 40 | com.jcraft:jzlib:1.1.3 41 | com.squareup.okhttp3:okhttp:3.9.1 42 | com.squareup.okio:okio:1.13.0 43 | com.sun.istack:istack-commons-runtime:3.0.5 44 | com.sun.xml.fastinfoset:FastInfoset:1.2.13 45 | com.typesafe:config:1.2.1 46 | commons-cli:commons-cli:1.4 47 | commons-codec:commons-codec:1.10 48 | commons-io:commons-io:2.5 49 | commons-logging:commons-logging:1.2 50 | io.github.bonigarcia:webdrivermanager:1.7.1 51 | javax.activation:activation:1.1.1 52 | javax.inject:javax.inject:1 53 | javax.xml.bind:jaxb-api:2.3.0 54 | joda-time:joda-time:2.8.1 55 | net.bytebuddy:byte-buddy:1.7.9 56 | net.i2p.crypto:eddsa:0.2.0 57 | org.apache.commons:commons-compress:1.9 58 | org.apache.commons:commons-csv:1.4 59 | org.apache.commons:commons-exec:1.3 60 | org.apache.commons:commons-lang3:3.5 61 | org.apache.commons:commons-math3:3.6.1 62 | org.apache.httpcomponents:httpclient:4.5.5 63 | org.apache.httpcomponents:httpcore:4.4.9 64 | org.apache.logging.log4j:log4j-api:2.10.0 65 | org.apache.logging.log4j:log4j-core:2.10.0 66 | org.apache.logging.log4j:log4j-jcl:2.10.0 67 | org.apache.logging.log4j:log4j-jul:2.10.0 68 | org.apache.logging.log4j:log4j-slf4j-impl:2.10.0 69 | org.apache.maven.resolver:maven-resolver-api:1.1.0 70 | org.apache.maven.resolver:maven-resolver-connector-basic:1.1.0 71 | org.apache.maven.resolver:maven-resolver-impl:1.1.0 72 | org.apache.maven.resolver:maven-resolver-spi:1.1.0 73 | org.apache.maven.resolver:maven-resolver-transport-wagon:1.1.0 74 | org.apache.maven.resolver:maven-resolver-util:1.1.0 75 | org.apache.maven.wagon:wagon-file:2.12 76 | org.apache.maven.wagon:wagon-http-lightweight:2.12 77 | org.apache.maven.wagon:wagon-http-shared:2.12 78 | org.apache.maven.wagon:wagon-provider-api:2.12 79 | org.apache.maven:maven-artifact:3.5.2 80 | org.apache.maven:maven-builder-support:3.5.2 81 | org.apache.maven:maven-model-builder:3.5.2 82 | org.apache.maven:maven-model:3.5.2 83 | org.apache.maven:maven-repository-metadata:3.5.2 84 | org.apache.maven:maven-resolver-provider:3.5.2 85 | org.apache.maven:maven-settings-builder:3.5.2 86 | org.apache.maven:maven-settings:3.5.2 87 | org.bouncycastle:bcpkix-jdk15on:1.56 88 | org.bouncycastle:bcprov-jdk15on:1.56 89 | org.checkerframework:checker-compat-qual:2.0.0 90 | org.codehaus.mojo:animal-sniffer-annotations:1.14 91 | org.codehaus.plexus:plexus-component-annotations:1.7.1 92 | org.codehaus.plexus:plexus-interpolation:1.24 93 | org.codehaus.plexus:plexus-utils:3.1.0 94 | org.eclipse.jgit:org.eclipse.jgit:4.11.0.201803080745-r 95 | org.glassfish.jaxb:jaxb-core:2.3.0 96 | org.glassfish.jaxb:jaxb-runtime:2.3.0 97 | org.glassfish.jaxb:txw2:2.3.0 98 | org.glassfish:javax.json:1.1 99 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-api-maven:3.1.3 100 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-api:3.1.3 101 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-impl-maven:3.1.3 102 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-spi-maven:3.1.3 103 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-spi:3.1.3 104 | org.jetbrains.kotlin:kotlin-stdlib-common:1.2.70 105 | org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.70 106 | org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.70 107 | org.jetbrains.kotlin:kotlin-stdlib-jre7:1.2.70 108 | org.jetbrains.kotlin:kotlin-stdlib-jre8:1.2.70 109 | org.jetbrains.kotlin:kotlin-stdlib:1.2.70 110 | org.jetbrains:annotations:13.0 111 | org.jsoup:jsoup:1.10.2 112 | org.jvnet.staxex:stax-ex:1.7.8 113 | org.rauschig:jarchivelib:0.7.1 114 | org.seleniumhq.selenium:selenium-api:3.11.0 115 | org.seleniumhq.selenium:selenium-chrome-driver:3.11.0 116 | org.seleniumhq.selenium:selenium-remote-driver:3.11.0 117 | org.seleniumhq.selenium:selenium-support:3.11.0 118 | org.slf4j:slf4j-api:1.8.0-alpha2 119 | org.sonatype.plexus:plexus-cipher:1.4 120 | org.sonatype.plexus:plexus-sec-dispatcher:1.4 121 | org.yaml:snakeyaml:1.18 122 | software.amazon.ion:ion-java:1.0.2 123 | -------------------------------------------------------------------------------- /gradle/dependency-locks/implementationDependenciesMetadata.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | com.amazonaws:aws-java-sdk-cloudformation:1.11.424 5 | com.amazonaws:aws-java-sdk-core:1.11.424 6 | com.amazonaws:aws-java-sdk-ec2:1.11.424 7 | com.amazonaws:aws-java-sdk-elasticloadbalancing:1.11.424 8 | com.amazonaws:aws-java-sdk-iam:1.11.424 9 | com.amazonaws:aws-java-sdk-kms:1.11.424 10 | com.amazonaws:aws-java-sdk-s3:1.11.424 11 | com.amazonaws:aws-java-sdk-sts:1.11.424 12 | com.amazonaws:aws-java-sdk-support:1.11.424 13 | com.amazonaws:jmespath-java:1.11.424 14 | com.atlassian.performance.tools:aws-infrastructure:2.0.0 15 | com.atlassian.performance.tools:aws-resources:1.3.0 16 | com.atlassian.performance.tools:concurrency:1.0.0 17 | com.atlassian.performance.tools:infrastructure:4.0.0 18 | com.atlassian.performance.tools:io:1.1.0 19 | com.atlassian.performance.tools:jira-actions:2.3.0 20 | com.atlassian.performance.tools:jira-software-actions:1.3.0 21 | com.atlassian.performance.tools:jvm-tasks:1.0.0 22 | com.atlassian.performance.tools:report:2.3.0 23 | com.atlassian.performance.tools:ssh:2.1.0 24 | com.atlassian.performance.tools:virtual-users:3.3.4 25 | com.atlassian.performance.tools:workspace:2.0.0 26 | com.fasterxml.jackson.core:jackson-annotations:2.6.0 27 | com.fasterxml.jackson.core:jackson-core:2.9.4 28 | com.fasterxml.jackson.core:jackson-databind:2.6.7.1 29 | com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.6.7 30 | com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.9.4 31 | com.github.stephenc.jcip:jcip-annotations:1.0-1 32 | com.google.code.findbugs:jsr305:1.3.9 33 | com.google.code.gson:gson:2.8.2 34 | com.google.errorprone:error_prone_annotations:2.1.3 35 | com.google.guava:guava:23.6-jre 36 | com.google.j2objc:j2objc-annotations:1.1 37 | com.googlecode.javaewah:JavaEWAH:1.1.6 38 | com.hierynomus:sshj:0.23.0 39 | com.jcraft:jsch:0.1.54 40 | com.jcraft:jzlib:1.1.3 41 | com.squareup.okhttp3:okhttp:3.9.1 42 | com.squareup.okio:okio:1.13.0 43 | com.sun.istack:istack-commons-runtime:3.0.5 44 | com.sun.xml.fastinfoset:FastInfoset:1.2.13 45 | com.typesafe:config:1.2.1 46 | commons-cli:commons-cli:1.4 47 | commons-codec:commons-codec:1.10 48 | commons-io:commons-io:2.5 49 | commons-logging:commons-logging:1.2 50 | io.github.bonigarcia:webdrivermanager:1.7.1 51 | javax.activation:activation:1.1.1 52 | javax.inject:javax.inject:1 53 | javax.xml.bind:jaxb-api:2.3.0 54 | joda-time:joda-time:2.8.1 55 | net.bytebuddy:byte-buddy:1.7.9 56 | net.i2p.crypto:eddsa:0.2.0 57 | org.apache.commons:commons-compress:1.9 58 | org.apache.commons:commons-csv:1.4 59 | org.apache.commons:commons-exec:1.3 60 | org.apache.commons:commons-lang3:3.5 61 | org.apache.commons:commons-math3:3.6.1 62 | org.apache.httpcomponents:httpclient:4.5.5 63 | org.apache.httpcomponents:httpcore:4.4.9 64 | org.apache.logging.log4j:log4j-api:2.10.0 65 | org.apache.logging.log4j:log4j-core:2.10.0 66 | org.apache.logging.log4j:log4j-jcl:2.10.0 67 | org.apache.logging.log4j:log4j-jul:2.10.0 68 | org.apache.logging.log4j:log4j-slf4j-impl:2.10.0 69 | org.apache.maven.resolver:maven-resolver-api:1.1.0 70 | org.apache.maven.resolver:maven-resolver-connector-basic:1.1.0 71 | org.apache.maven.resolver:maven-resolver-impl:1.1.0 72 | org.apache.maven.resolver:maven-resolver-spi:1.1.0 73 | org.apache.maven.resolver:maven-resolver-transport-wagon:1.1.0 74 | org.apache.maven.resolver:maven-resolver-util:1.1.0 75 | org.apache.maven.wagon:wagon-file:2.12 76 | org.apache.maven.wagon:wagon-http-lightweight:2.12 77 | org.apache.maven.wagon:wagon-http-shared:2.12 78 | org.apache.maven.wagon:wagon-provider-api:2.12 79 | org.apache.maven:maven-artifact:3.5.2 80 | org.apache.maven:maven-builder-support:3.5.2 81 | org.apache.maven:maven-model-builder:3.5.2 82 | org.apache.maven:maven-model:3.5.2 83 | org.apache.maven:maven-repository-metadata:3.5.2 84 | org.apache.maven:maven-resolver-provider:3.5.2 85 | org.apache.maven:maven-settings-builder:3.5.2 86 | org.apache.maven:maven-settings:3.5.2 87 | org.bouncycastle:bcpkix-jdk15on:1.56 88 | org.bouncycastle:bcprov-jdk15on:1.56 89 | org.checkerframework:checker-compat-qual:2.0.0 90 | org.codehaus.mojo:animal-sniffer-annotations:1.14 91 | org.codehaus.plexus:plexus-component-annotations:1.7.1 92 | org.codehaus.plexus:plexus-interpolation:1.24 93 | org.codehaus.plexus:plexus-utils:3.1.0 94 | org.eclipse.jgit:org.eclipse.jgit:4.11.0.201803080745-r 95 | org.glassfish.jaxb:jaxb-core:2.3.0 96 | org.glassfish.jaxb:jaxb-runtime:2.3.0 97 | org.glassfish.jaxb:txw2:2.3.0 98 | org.glassfish:javax.json:1.1 99 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-api-maven:3.1.3 100 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-api:3.1.3 101 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-impl-maven:3.1.3 102 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-spi-maven:3.1.3 103 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-spi:3.1.3 104 | org.jetbrains.kotlin:kotlin-stdlib-common:1.2.70 105 | org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.70 106 | org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.70 107 | org.jetbrains.kotlin:kotlin-stdlib-jre7:1.2.70 108 | org.jetbrains.kotlin:kotlin-stdlib-jre8:1.2.70 109 | org.jetbrains.kotlin:kotlin-stdlib:1.2.70 110 | org.jetbrains:annotations:13.0 111 | org.jsoup:jsoup:1.10.2 112 | org.jvnet.staxex:stax-ex:1.7.8 113 | org.rauschig:jarchivelib:0.7.1 114 | org.seleniumhq.selenium:selenium-api:3.11.0 115 | org.seleniumhq.selenium:selenium-chrome-driver:3.11.0 116 | org.seleniumhq.selenium:selenium-remote-driver:3.11.0 117 | org.seleniumhq.selenium:selenium-support:3.11.0 118 | org.slf4j:slf4j-api:1.8.0-alpha2 119 | org.sonatype.plexus:plexus-cipher:1.4 120 | org.sonatype.plexus:plexus-sec-dispatcher:1.4 121 | org.yaml:snakeyaml:1.18 122 | software.amazon.ion:ion-java:1.0.2 123 | -------------------------------------------------------------------------------- /gradle/dependency-locks/kapt.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /gradle/dependency-locks/kaptTest.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /gradle/dependency-locks/kotlinCompilerClasspath.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | org.jetbrains.kotlin:kotlin-compiler-embeddable:1.2.70 5 | org.jetbrains.kotlin:kotlin-reflect:1.2.70 6 | org.jetbrains.kotlin:kotlin-script-runtime:1.2.70 7 | org.jetbrains.kotlin:kotlin-stdlib-common:1.2.70 8 | org.jetbrains.kotlin:kotlin-stdlib:1.2.70 9 | org.jetbrains:annotations:13.0 10 | -------------------------------------------------------------------------------- /gradle/dependency-locks/kotlinCompilerPluginClasspath.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.2.70 5 | -------------------------------------------------------------------------------- /gradle/dependency-locks/runtime.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /gradle/dependency-locks/runtimeClasspath.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | com.amazonaws:aws-java-sdk-cloudformation:1.11.424 5 | com.amazonaws:aws-java-sdk-core:1.11.424 6 | com.amazonaws:aws-java-sdk-ec2:1.11.424 7 | com.amazonaws:aws-java-sdk-elasticloadbalancing:1.11.424 8 | com.amazonaws:aws-java-sdk-iam:1.11.424 9 | com.amazonaws:aws-java-sdk-kms:1.11.424 10 | com.amazonaws:aws-java-sdk-s3:1.11.424 11 | com.amazonaws:aws-java-sdk-sts:1.11.424 12 | com.amazonaws:aws-java-sdk-support:1.11.424 13 | com.amazonaws:jmespath-java:1.11.424 14 | com.atlassian.performance.tools:aws-infrastructure:2.0.0 15 | com.atlassian.performance.tools:aws-resources:1.3.0 16 | com.atlassian.performance.tools:concurrency:1.0.0 17 | com.atlassian.performance.tools:infrastructure:4.0.0 18 | com.atlassian.performance.tools:io:1.1.0 19 | com.atlassian.performance.tools:jira-actions:2.3.0 20 | com.atlassian.performance.tools:jira-software-actions:1.3.0 21 | com.atlassian.performance.tools:jvm-tasks:1.0.0 22 | com.atlassian.performance.tools:report:2.3.0 23 | com.atlassian.performance.tools:ssh:2.1.0 24 | com.atlassian.performance.tools:virtual-users:3.3.4 25 | com.atlassian.performance.tools:workspace:2.0.0 26 | com.fasterxml.jackson.core:jackson-annotations:2.6.0 27 | com.fasterxml.jackson.core:jackson-core:2.9.4 28 | com.fasterxml.jackson.core:jackson-databind:2.6.7.1 29 | com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.6.7 30 | com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.9.4 31 | com.github.stephenc.jcip:jcip-annotations:1.0-1 32 | com.google.code.findbugs:jsr305:1.3.9 33 | com.google.code.gson:gson:2.8.2 34 | com.google.errorprone:error_prone_annotations:2.1.3 35 | com.google.guava:guava:23.6-jre 36 | com.google.j2objc:j2objc-annotations:1.1 37 | com.googlecode.javaewah:JavaEWAH:1.1.6 38 | com.hierynomus:sshj:0.23.0 39 | com.jcraft:jsch:0.1.54 40 | com.jcraft:jzlib:1.1.3 41 | com.squareup.okhttp3:okhttp:3.9.1 42 | com.squareup.okio:okio:1.13.0 43 | com.sun.istack:istack-commons-runtime:3.0.5 44 | com.sun.xml.fastinfoset:FastInfoset:1.2.13 45 | com.typesafe:config:1.2.1 46 | commons-cli:commons-cli:1.4 47 | commons-codec:commons-codec:1.10 48 | commons-io:commons-io:2.5 49 | commons-logging:commons-logging:1.2 50 | io.github.bonigarcia:webdrivermanager:1.7.1 51 | javax.activation:activation:1.1.1 52 | javax.inject:javax.inject:1 53 | javax.xml.bind:jaxb-api:2.3.0 54 | joda-time:joda-time:2.8.1 55 | net.bytebuddy:byte-buddy:1.7.9 56 | net.i2p.crypto:eddsa:0.2.0 57 | org.apache.commons:commons-compress:1.9 58 | org.apache.commons:commons-csv:1.4 59 | org.apache.commons:commons-exec:1.3 60 | org.apache.commons:commons-lang3:3.5 61 | org.apache.commons:commons-math3:3.6.1 62 | org.apache.httpcomponents:httpclient:4.5.5 63 | org.apache.httpcomponents:httpcore:4.4.9 64 | org.apache.logging.log4j:log4j-api:2.10.0 65 | org.apache.logging.log4j:log4j-core:2.10.0 66 | org.apache.logging.log4j:log4j-jcl:2.10.0 67 | org.apache.logging.log4j:log4j-jul:2.10.0 68 | org.apache.logging.log4j:log4j-slf4j-impl:2.10.0 69 | org.apache.maven.resolver:maven-resolver-api:1.1.0 70 | org.apache.maven.resolver:maven-resolver-connector-basic:1.1.0 71 | org.apache.maven.resolver:maven-resolver-impl:1.1.0 72 | org.apache.maven.resolver:maven-resolver-spi:1.1.0 73 | org.apache.maven.resolver:maven-resolver-transport-wagon:1.1.0 74 | org.apache.maven.resolver:maven-resolver-util:1.1.0 75 | org.apache.maven.wagon:wagon-file:2.12 76 | org.apache.maven.wagon:wagon-http-lightweight:2.12 77 | org.apache.maven.wagon:wagon-http-shared:2.12 78 | org.apache.maven.wagon:wagon-provider-api:2.12 79 | org.apache.maven:maven-artifact:3.5.2 80 | org.apache.maven:maven-builder-support:3.5.2 81 | org.apache.maven:maven-model-builder:3.5.2 82 | org.apache.maven:maven-model:3.5.2 83 | org.apache.maven:maven-repository-metadata:3.5.2 84 | org.apache.maven:maven-resolver-provider:3.5.2 85 | org.apache.maven:maven-settings-builder:3.5.2 86 | org.apache.maven:maven-settings:3.5.2 87 | org.bouncycastle:bcpkix-jdk15on:1.56 88 | org.bouncycastle:bcprov-jdk15on:1.56 89 | org.checkerframework:checker-compat-qual:2.0.0 90 | org.codehaus.mojo:animal-sniffer-annotations:1.14 91 | org.codehaus.plexus:plexus-component-annotations:1.7.1 92 | org.codehaus.plexus:plexus-interpolation:1.24 93 | org.codehaus.plexus:plexus-utils:3.1.0 94 | org.eclipse.jgit:org.eclipse.jgit:4.11.0.201803080745-r 95 | org.glassfish.jaxb:jaxb-core:2.3.0 96 | org.glassfish.jaxb:jaxb-runtime:2.3.0 97 | org.glassfish.jaxb:txw2:2.3.0 98 | org.glassfish:javax.json:1.1 99 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-api-maven:3.1.3 100 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-api:3.1.3 101 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-impl-maven:3.1.3 102 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-spi-maven:3.1.3 103 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-spi:3.1.3 104 | org.jetbrains.kotlin:kotlin-stdlib-common:1.2.70 105 | org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.70 106 | org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.70 107 | org.jetbrains.kotlin:kotlin-stdlib-jre7:1.2.70 108 | org.jetbrains.kotlin:kotlin-stdlib-jre8:1.2.70 109 | org.jetbrains.kotlin:kotlin-stdlib:1.2.70 110 | org.jetbrains:annotations:13.0 111 | org.jsoup:jsoup:1.10.2 112 | org.jvnet.staxex:stax-ex:1.7.8 113 | org.rauschig:jarchivelib:0.7.1 114 | org.seleniumhq.selenium:selenium-api:3.11.0 115 | org.seleniumhq.selenium:selenium-chrome-driver:3.11.0 116 | org.seleniumhq.selenium:selenium-remote-driver:3.11.0 117 | org.seleniumhq.selenium:selenium-support:3.11.0 118 | org.slf4j:slf4j-api:1.8.0-alpha2 119 | org.sonatype.plexus:plexus-cipher:1.4 120 | org.sonatype.plexus:plexus-sec-dispatcher:1.4 121 | org.yaml:snakeyaml:1.18 122 | software.amazon.ion:ion-java:1.0.2 123 | -------------------------------------------------------------------------------- /gradle/dependency-locks/runtimeOnlyDependenciesMetadata.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /gradle/dependency-locks/signatures.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /gradle/dependency-locks/testAnnotationProcessor.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /gradle/dependency-locks/testApiDependenciesMetadata.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | commons-io:commons-io:2.5 5 | junit:junit:4.12 6 | org.assertj:assertj-core:3.11.0 7 | org.hamcrest:hamcrest-core:1.3 8 | org.slf4j:slf4j-api:1.8.0-alpha2 9 | org.zeroturnaround:zt-exec:1.10 10 | -------------------------------------------------------------------------------- /gradle/dependency-locks/testCompile.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | commons-io:commons-io:2.5 5 | junit:junit:4.12 6 | org.assertj:assertj-core:3.11.0 7 | org.hamcrest:hamcrest-core:1.3 8 | org.slf4j:slf4j-api:1.8.0-alpha2 9 | org.zeroturnaround:zt-exec:1.10 10 | -------------------------------------------------------------------------------- /gradle/dependency-locks/testCompileClasspath.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | com.amazonaws:aws-java-sdk-cloudformation:1.11.424 5 | com.amazonaws:aws-java-sdk-core:1.11.424 6 | com.amazonaws:aws-java-sdk-ec2:1.11.424 7 | com.amazonaws:aws-java-sdk-elasticloadbalancing:1.11.424 8 | com.amazonaws:aws-java-sdk-iam:1.11.424 9 | com.amazonaws:aws-java-sdk-kms:1.11.424 10 | com.amazonaws:aws-java-sdk-s3:1.11.424 11 | com.amazonaws:aws-java-sdk-sts:1.11.424 12 | com.amazonaws:aws-java-sdk-support:1.11.424 13 | com.amazonaws:jmespath-java:1.11.424 14 | com.atlassian.performance.tools:aws-infrastructure:2.0.0 15 | com.atlassian.performance.tools:aws-resources:1.3.0 16 | com.atlassian.performance.tools:concurrency:1.0.0 17 | com.atlassian.performance.tools:infrastructure:4.0.0 18 | com.atlassian.performance.tools:io:1.1.0 19 | com.atlassian.performance.tools:jira-actions:2.3.0 20 | com.atlassian.performance.tools:jira-software-actions:1.3.0 21 | com.atlassian.performance.tools:jvm-tasks:1.0.0 22 | com.atlassian.performance.tools:report:2.3.0 23 | com.atlassian.performance.tools:ssh:2.1.0 24 | com.atlassian.performance.tools:virtual-users:3.3.4 25 | com.atlassian.performance.tools:workspace:2.0.0 26 | com.fasterxml.jackson.core:jackson-annotations:2.6.0 27 | com.fasterxml.jackson.core:jackson-core:2.9.4 28 | com.fasterxml.jackson.core:jackson-databind:2.6.7.1 29 | com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.6.7 30 | com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.9.4 31 | com.github.stephenc.jcip:jcip-annotations:1.0-1 32 | com.google.code.findbugs:jsr305:1.3.9 33 | com.google.code.gson:gson:2.8.2 34 | com.google.errorprone:error_prone_annotations:2.1.3 35 | com.google.guava:guava:23.6-jre 36 | com.google.j2objc:j2objc-annotations:1.1 37 | com.googlecode.javaewah:JavaEWAH:1.1.6 38 | com.hierynomus:sshj:0.23.0 39 | com.jcraft:jsch:0.1.54 40 | com.jcraft:jzlib:1.1.3 41 | com.squareup.okhttp3:okhttp:3.9.1 42 | com.squareup.okio:okio:1.13.0 43 | com.sun.istack:istack-commons-runtime:3.0.5 44 | com.sun.xml.fastinfoset:FastInfoset:1.2.13 45 | com.typesafe:config:1.2.1 46 | commons-cli:commons-cli:1.4 47 | commons-codec:commons-codec:1.10 48 | commons-io:commons-io:2.5 49 | commons-logging:commons-logging:1.2 50 | io.github.bonigarcia:webdrivermanager:1.7.1 51 | javax.activation:activation:1.1.1 52 | javax.inject:javax.inject:1 53 | javax.xml.bind:jaxb-api:2.3.0 54 | joda-time:joda-time:2.8.1 55 | junit:junit:4.12 56 | net.bytebuddy:byte-buddy:1.7.9 57 | net.i2p.crypto:eddsa:0.2.0 58 | org.apache.commons:commons-compress:1.9 59 | org.apache.commons:commons-csv:1.4 60 | org.apache.commons:commons-exec:1.3 61 | org.apache.commons:commons-lang3:3.5 62 | org.apache.commons:commons-math3:3.6.1 63 | org.apache.httpcomponents:httpclient:4.5.5 64 | org.apache.httpcomponents:httpcore:4.4.9 65 | org.apache.logging.log4j:log4j-api:2.10.0 66 | org.apache.logging.log4j:log4j-core:2.10.0 67 | org.apache.logging.log4j:log4j-jcl:2.10.0 68 | org.apache.logging.log4j:log4j-jul:2.10.0 69 | org.apache.logging.log4j:log4j-slf4j-impl:2.10.0 70 | org.apache.maven.resolver:maven-resolver-api:1.1.0 71 | org.apache.maven.resolver:maven-resolver-connector-basic:1.1.0 72 | org.apache.maven.resolver:maven-resolver-impl:1.1.0 73 | org.apache.maven.resolver:maven-resolver-spi:1.1.0 74 | org.apache.maven.resolver:maven-resolver-transport-wagon:1.1.0 75 | org.apache.maven.resolver:maven-resolver-util:1.1.0 76 | org.apache.maven.wagon:wagon-file:2.12 77 | org.apache.maven.wagon:wagon-http-lightweight:2.12 78 | org.apache.maven.wagon:wagon-http-shared:2.12 79 | org.apache.maven.wagon:wagon-provider-api:2.12 80 | org.apache.maven:maven-artifact:3.5.2 81 | org.apache.maven:maven-builder-support:3.5.2 82 | org.apache.maven:maven-model-builder:3.5.2 83 | org.apache.maven:maven-model:3.5.2 84 | org.apache.maven:maven-repository-metadata:3.5.2 85 | org.apache.maven:maven-resolver-provider:3.5.2 86 | org.apache.maven:maven-settings-builder:3.5.2 87 | org.apache.maven:maven-settings:3.5.2 88 | org.assertj:assertj-core:3.11.0 89 | org.bouncycastle:bcpkix-jdk15on:1.56 90 | org.bouncycastle:bcprov-jdk15on:1.56 91 | org.checkerframework:checker-compat-qual:2.0.0 92 | org.codehaus.mojo:animal-sniffer-annotations:1.14 93 | org.codehaus.plexus:plexus-component-annotations:1.7.1 94 | org.codehaus.plexus:plexus-interpolation:1.24 95 | org.codehaus.plexus:plexus-utils:3.1.0 96 | org.eclipse.jgit:org.eclipse.jgit:4.11.0.201803080745-r 97 | org.glassfish.jaxb:jaxb-core:2.3.0 98 | org.glassfish.jaxb:jaxb-runtime:2.3.0 99 | org.glassfish.jaxb:txw2:2.3.0 100 | org.glassfish:javax.json:1.1 101 | org.hamcrest:hamcrest-core:1.3 102 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-api-maven:3.1.3 103 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-api:3.1.3 104 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-impl-maven:3.1.3 105 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-spi-maven:3.1.3 106 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-spi:3.1.3 107 | org.jetbrains.kotlin:kotlin-stdlib-common:1.2.70 108 | org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.70 109 | org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.70 110 | org.jetbrains.kotlin:kotlin-stdlib-jre7:1.2.70 111 | org.jetbrains.kotlin:kotlin-stdlib-jre8:1.2.70 112 | org.jetbrains.kotlin:kotlin-stdlib:1.2.70 113 | org.jetbrains:annotations:13.0 114 | org.jsoup:jsoup:1.10.2 115 | org.jvnet.staxex:stax-ex:1.7.8 116 | org.rauschig:jarchivelib:0.7.1 117 | org.seleniumhq.selenium:selenium-api:3.11.0 118 | org.seleniumhq.selenium:selenium-chrome-driver:3.11.0 119 | org.seleniumhq.selenium:selenium-remote-driver:3.11.0 120 | org.seleniumhq.selenium:selenium-support:3.11.0 121 | org.slf4j:slf4j-api:1.8.0-alpha2 122 | org.sonatype.plexus:plexus-cipher:1.4 123 | org.sonatype.plexus:plexus-sec-dispatcher:1.4 124 | org.yaml:snakeyaml:1.18 125 | org.zeroturnaround:zt-exec:1.10 126 | software.amazon.ion:ion-java:1.0.2 127 | -------------------------------------------------------------------------------- /gradle/dependency-locks/testCompileOnly.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /gradle/dependency-locks/testCompileOnlyDependenciesMetadata.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /gradle/dependency-locks/testImplementationDependenciesMetadata.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | com.amazonaws:aws-java-sdk-cloudformation:1.11.424 5 | com.amazonaws:aws-java-sdk-core:1.11.424 6 | com.amazonaws:aws-java-sdk-ec2:1.11.424 7 | com.amazonaws:aws-java-sdk-elasticloadbalancing:1.11.424 8 | com.amazonaws:aws-java-sdk-iam:1.11.424 9 | com.amazonaws:aws-java-sdk-kms:1.11.424 10 | com.amazonaws:aws-java-sdk-s3:1.11.424 11 | com.amazonaws:aws-java-sdk-sts:1.11.424 12 | com.amazonaws:aws-java-sdk-support:1.11.424 13 | com.amazonaws:jmespath-java:1.11.424 14 | com.atlassian.performance.tools:aws-infrastructure:2.0.0 15 | com.atlassian.performance.tools:aws-resources:1.3.0 16 | com.atlassian.performance.tools:concurrency:1.0.0 17 | com.atlassian.performance.tools:infrastructure:4.0.0 18 | com.atlassian.performance.tools:io:1.1.0 19 | com.atlassian.performance.tools:jira-actions:2.3.0 20 | com.atlassian.performance.tools:jira-software-actions:1.3.0 21 | com.atlassian.performance.tools:jvm-tasks:1.0.0 22 | com.atlassian.performance.tools:report:2.3.0 23 | com.atlassian.performance.tools:ssh:2.1.0 24 | com.atlassian.performance.tools:virtual-users:3.3.4 25 | com.atlassian.performance.tools:workspace:2.0.0 26 | com.fasterxml.jackson.core:jackson-annotations:2.6.0 27 | com.fasterxml.jackson.core:jackson-core:2.9.4 28 | com.fasterxml.jackson.core:jackson-databind:2.6.7.1 29 | com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.6.7 30 | com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.9.4 31 | com.github.stephenc.jcip:jcip-annotations:1.0-1 32 | com.google.code.findbugs:jsr305:1.3.9 33 | com.google.code.gson:gson:2.8.2 34 | com.google.errorprone:error_prone_annotations:2.1.3 35 | com.google.guava:guava:23.6-jre 36 | com.google.j2objc:j2objc-annotations:1.1 37 | com.googlecode.javaewah:JavaEWAH:1.1.6 38 | com.hierynomus:sshj:0.23.0 39 | com.jcraft:jsch:0.1.54 40 | com.jcraft:jzlib:1.1.3 41 | com.squareup.okhttp3:okhttp:3.9.1 42 | com.squareup.okio:okio:1.13.0 43 | com.sun.istack:istack-commons-runtime:3.0.5 44 | com.sun.xml.fastinfoset:FastInfoset:1.2.13 45 | com.typesafe:config:1.2.1 46 | commons-cli:commons-cli:1.4 47 | commons-codec:commons-codec:1.10 48 | commons-io:commons-io:2.5 49 | commons-logging:commons-logging:1.2 50 | io.github.bonigarcia:webdrivermanager:1.7.1 51 | javax.activation:activation:1.1.1 52 | javax.inject:javax.inject:1 53 | javax.xml.bind:jaxb-api:2.3.0 54 | joda-time:joda-time:2.8.1 55 | junit:junit:4.12 56 | net.bytebuddy:byte-buddy:1.7.9 57 | net.i2p.crypto:eddsa:0.2.0 58 | org.apache.commons:commons-compress:1.9 59 | org.apache.commons:commons-csv:1.4 60 | org.apache.commons:commons-exec:1.3 61 | org.apache.commons:commons-lang3:3.5 62 | org.apache.commons:commons-math3:3.6.1 63 | org.apache.httpcomponents:httpclient:4.5.5 64 | org.apache.httpcomponents:httpcore:4.4.9 65 | org.apache.logging.log4j:log4j-api:2.10.0 66 | org.apache.logging.log4j:log4j-core:2.10.0 67 | org.apache.logging.log4j:log4j-jcl:2.10.0 68 | org.apache.logging.log4j:log4j-jul:2.10.0 69 | org.apache.logging.log4j:log4j-slf4j-impl:2.10.0 70 | org.apache.maven.resolver:maven-resolver-api:1.1.0 71 | org.apache.maven.resolver:maven-resolver-connector-basic:1.1.0 72 | org.apache.maven.resolver:maven-resolver-impl:1.1.0 73 | org.apache.maven.resolver:maven-resolver-spi:1.1.0 74 | org.apache.maven.resolver:maven-resolver-transport-wagon:1.1.0 75 | org.apache.maven.resolver:maven-resolver-util:1.1.0 76 | org.apache.maven.wagon:wagon-file:2.12 77 | org.apache.maven.wagon:wagon-http-lightweight:2.12 78 | org.apache.maven.wagon:wagon-http-shared:2.12 79 | org.apache.maven.wagon:wagon-provider-api:2.12 80 | org.apache.maven:maven-artifact:3.5.2 81 | org.apache.maven:maven-builder-support:3.5.2 82 | org.apache.maven:maven-model-builder:3.5.2 83 | org.apache.maven:maven-model:3.5.2 84 | org.apache.maven:maven-repository-metadata:3.5.2 85 | org.apache.maven:maven-resolver-provider:3.5.2 86 | org.apache.maven:maven-settings-builder:3.5.2 87 | org.apache.maven:maven-settings:3.5.2 88 | org.assertj:assertj-core:3.11.0 89 | org.bouncycastle:bcpkix-jdk15on:1.56 90 | org.bouncycastle:bcprov-jdk15on:1.56 91 | org.checkerframework:checker-compat-qual:2.0.0 92 | org.codehaus.mojo:animal-sniffer-annotations:1.14 93 | org.codehaus.plexus:plexus-component-annotations:1.7.1 94 | org.codehaus.plexus:plexus-interpolation:1.24 95 | org.codehaus.plexus:plexus-utils:3.1.0 96 | org.eclipse.jgit:org.eclipse.jgit:4.11.0.201803080745-r 97 | org.glassfish.jaxb:jaxb-core:2.3.0 98 | org.glassfish.jaxb:jaxb-runtime:2.3.0 99 | org.glassfish.jaxb:txw2:2.3.0 100 | org.glassfish:javax.json:1.1 101 | org.hamcrest:hamcrest-core:1.3 102 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-api-maven:3.1.3 103 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-api:3.1.3 104 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-impl-maven:3.1.3 105 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-spi-maven:3.1.3 106 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-spi:3.1.3 107 | org.jetbrains.kotlin:kotlin-stdlib-common:1.2.70 108 | org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.70 109 | org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.70 110 | org.jetbrains.kotlin:kotlin-stdlib-jre7:1.2.70 111 | org.jetbrains.kotlin:kotlin-stdlib-jre8:1.2.70 112 | org.jetbrains.kotlin:kotlin-stdlib:1.2.70 113 | org.jetbrains:annotations:13.0 114 | org.jsoup:jsoup:1.10.2 115 | org.jvnet.staxex:stax-ex:1.7.8 116 | org.rauschig:jarchivelib:0.7.1 117 | org.seleniumhq.selenium:selenium-api:3.11.0 118 | org.seleniumhq.selenium:selenium-chrome-driver:3.11.0 119 | org.seleniumhq.selenium:selenium-remote-driver:3.11.0 120 | org.seleniumhq.selenium:selenium-support:3.11.0 121 | org.slf4j:slf4j-api:1.8.0-alpha2 122 | org.sonatype.plexus:plexus-cipher:1.4 123 | org.sonatype.plexus:plexus-sec-dispatcher:1.4 124 | org.yaml:snakeyaml:1.18 125 | org.zeroturnaround:zt-exec:1.10 126 | software.amazon.ion:ion-java:1.0.2 127 | -------------------------------------------------------------------------------- /gradle/dependency-locks/testRuntime.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | commons-io:commons-io:2.5 5 | junit:junit:4.12 6 | org.assertj:assertj-core:3.11.0 7 | org.hamcrest:hamcrest-core:1.3 8 | org.slf4j:slf4j-api:1.8.0-alpha2 9 | org.zeroturnaround:zt-exec:1.10 10 | -------------------------------------------------------------------------------- /gradle/dependency-locks/testRuntimeClasspath.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | com.amazonaws:aws-java-sdk-cloudformation:1.11.424 5 | com.amazonaws:aws-java-sdk-core:1.11.424 6 | com.amazonaws:aws-java-sdk-ec2:1.11.424 7 | com.amazonaws:aws-java-sdk-elasticloadbalancing:1.11.424 8 | com.amazonaws:aws-java-sdk-iam:1.11.424 9 | com.amazonaws:aws-java-sdk-kms:1.11.424 10 | com.amazonaws:aws-java-sdk-s3:1.11.424 11 | com.amazonaws:aws-java-sdk-sts:1.11.424 12 | com.amazonaws:aws-java-sdk-support:1.11.424 13 | com.amazonaws:jmespath-java:1.11.424 14 | com.atlassian.performance.tools:aws-infrastructure:2.0.0 15 | com.atlassian.performance.tools:aws-resources:1.3.0 16 | com.atlassian.performance.tools:concurrency:1.0.0 17 | com.atlassian.performance.tools:infrastructure:4.0.0 18 | com.atlassian.performance.tools:io:1.1.0 19 | com.atlassian.performance.tools:jira-actions:2.3.0 20 | com.atlassian.performance.tools:jira-software-actions:1.3.0 21 | com.atlassian.performance.tools:jvm-tasks:1.0.0 22 | com.atlassian.performance.tools:report:2.3.0 23 | com.atlassian.performance.tools:ssh:2.1.0 24 | com.atlassian.performance.tools:virtual-users:3.3.4 25 | com.atlassian.performance.tools:workspace:2.0.0 26 | com.fasterxml.jackson.core:jackson-annotations:2.6.0 27 | com.fasterxml.jackson.core:jackson-core:2.9.4 28 | com.fasterxml.jackson.core:jackson-databind:2.6.7.1 29 | com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.6.7 30 | com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.9.4 31 | com.github.stephenc.jcip:jcip-annotations:1.0-1 32 | com.google.code.findbugs:jsr305:1.3.9 33 | com.google.code.gson:gson:2.8.2 34 | com.google.errorprone:error_prone_annotations:2.1.3 35 | com.google.guava:guava:23.6-jre 36 | com.google.j2objc:j2objc-annotations:1.1 37 | com.googlecode.javaewah:JavaEWAH:1.1.6 38 | com.hierynomus:sshj:0.23.0 39 | com.jcraft:jsch:0.1.54 40 | com.jcraft:jzlib:1.1.3 41 | com.squareup.okhttp3:okhttp:3.9.1 42 | com.squareup.okio:okio:1.13.0 43 | com.sun.istack:istack-commons-runtime:3.0.5 44 | com.sun.xml.fastinfoset:FastInfoset:1.2.13 45 | com.typesafe:config:1.2.1 46 | commons-cli:commons-cli:1.4 47 | commons-codec:commons-codec:1.10 48 | commons-io:commons-io:2.5 49 | commons-logging:commons-logging:1.2 50 | io.github.bonigarcia:webdrivermanager:1.7.1 51 | javax.activation:activation:1.1.1 52 | javax.inject:javax.inject:1 53 | javax.xml.bind:jaxb-api:2.3.0 54 | joda-time:joda-time:2.8.1 55 | junit:junit:4.12 56 | net.bytebuddy:byte-buddy:1.7.9 57 | net.i2p.crypto:eddsa:0.2.0 58 | org.apache.commons:commons-compress:1.9 59 | org.apache.commons:commons-csv:1.4 60 | org.apache.commons:commons-exec:1.3 61 | org.apache.commons:commons-lang3:3.5 62 | org.apache.commons:commons-math3:3.6.1 63 | org.apache.httpcomponents:httpclient:4.5.5 64 | org.apache.httpcomponents:httpcore:4.4.9 65 | org.apache.logging.log4j:log4j-api:2.10.0 66 | org.apache.logging.log4j:log4j-core:2.10.0 67 | org.apache.logging.log4j:log4j-jcl:2.10.0 68 | org.apache.logging.log4j:log4j-jul:2.10.0 69 | org.apache.logging.log4j:log4j-slf4j-impl:2.10.0 70 | org.apache.maven.resolver:maven-resolver-api:1.1.0 71 | org.apache.maven.resolver:maven-resolver-connector-basic:1.1.0 72 | org.apache.maven.resolver:maven-resolver-impl:1.1.0 73 | org.apache.maven.resolver:maven-resolver-spi:1.1.0 74 | org.apache.maven.resolver:maven-resolver-transport-wagon:1.1.0 75 | org.apache.maven.resolver:maven-resolver-util:1.1.0 76 | org.apache.maven.wagon:wagon-file:2.12 77 | org.apache.maven.wagon:wagon-http-lightweight:2.12 78 | org.apache.maven.wagon:wagon-http-shared:2.12 79 | org.apache.maven.wagon:wagon-provider-api:2.12 80 | org.apache.maven:maven-artifact:3.5.2 81 | org.apache.maven:maven-builder-support:3.5.2 82 | org.apache.maven:maven-model-builder:3.5.2 83 | org.apache.maven:maven-model:3.5.2 84 | org.apache.maven:maven-repository-metadata:3.5.2 85 | org.apache.maven:maven-resolver-provider:3.5.2 86 | org.apache.maven:maven-settings-builder:3.5.2 87 | org.apache.maven:maven-settings:3.5.2 88 | org.assertj:assertj-core:3.11.0 89 | org.bouncycastle:bcpkix-jdk15on:1.56 90 | org.bouncycastle:bcprov-jdk15on:1.56 91 | org.checkerframework:checker-compat-qual:2.0.0 92 | org.codehaus.mojo:animal-sniffer-annotations:1.14 93 | org.codehaus.plexus:plexus-component-annotations:1.7.1 94 | org.codehaus.plexus:plexus-interpolation:1.24 95 | org.codehaus.plexus:plexus-utils:3.1.0 96 | org.eclipse.jgit:org.eclipse.jgit:4.11.0.201803080745-r 97 | org.glassfish.jaxb:jaxb-core:2.3.0 98 | org.glassfish.jaxb:jaxb-runtime:2.3.0 99 | org.glassfish.jaxb:txw2:2.3.0 100 | org.glassfish:javax.json:1.1 101 | org.hamcrest:hamcrest-core:1.3 102 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-api-maven:3.1.3 103 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-api:3.1.3 104 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-impl-maven:3.1.3 105 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-spi-maven:3.1.3 106 | org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-spi:3.1.3 107 | org.jetbrains.kotlin:kotlin-stdlib-common:1.2.70 108 | org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.70 109 | org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.70 110 | org.jetbrains.kotlin:kotlin-stdlib-jre7:1.2.70 111 | org.jetbrains.kotlin:kotlin-stdlib-jre8:1.2.70 112 | org.jetbrains.kotlin:kotlin-stdlib:1.2.70 113 | org.jetbrains:annotations:13.0 114 | org.jsoup:jsoup:1.10.2 115 | org.jvnet.staxex:stax-ex:1.7.8 116 | org.rauschig:jarchivelib:0.7.1 117 | org.seleniumhq.selenium:selenium-api:3.11.0 118 | org.seleniumhq.selenium:selenium-chrome-driver:3.11.0 119 | org.seleniumhq.selenium:selenium-remote-driver:3.11.0 120 | org.seleniumhq.selenium:selenium-support:3.11.0 121 | org.slf4j:slf4j-api:1.8.0-alpha2 122 | org.sonatype.plexus:plexus-cipher:1.4 123 | org.sonatype.plexus:plexus-sec-dispatcher:1.4 124 | org.yaml:snakeyaml:1.18 125 | org.zeroturnaround:zt-exec:1.10 126 | software.amazon.ion:ion-java:1.0.2 127 | -------------------------------------------------------------------------------- /gradle/dependency-locks/testRuntimeOnlyDependenciesMetadata.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atlassian/jira-performance-tests/367223afb9143c177cbb7f43bb96685c5a10080d/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-all.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS="" 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn () { 37 | echo "$*" 38 | } 39 | 40 | die () { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Escape application args 158 | save () { 159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 160 | echo " " 161 | } 162 | APP_ARGS=$(save "$@") 163 | 164 | # Collect all arguments for the java command, following the shell quoting and substitution rules 165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 166 | 167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 169 | cd "$(dirname "$0")" 170 | fi 171 | 172 | exec "$JAVACMD" "$@" 173 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /reference-virtual-users/build.gradle.kts: -------------------------------------------------------------------------------- 1 | import java.net.URI 2 | import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar 3 | 4 | val kotlinVersion = "1.2.70" 5 | 6 | plugins { 7 | kotlin("jvm") 8 | id("com.github.johnrengelman.shadow").version("2.0.4") 9 | } 10 | 11 | dependencies { 12 | runtime("com.atlassian.performance.tools:jira-software-actions:[1.0.0,2.0.0)") 13 | runtime("com.atlassian.performance.tools:virtual-users:[3.3.4,4.0.0)") 14 | } 15 | 16 | tasks.getByName("shadowJar", ShadowJar::class).apply { 17 | manifest.attributes["Main-Class"] = "com.atlassian.performance.tools.virtualusers.api.EntryPointKt" 18 | } 19 | 20 | configurations.all { 21 | resolutionStrategy { 22 | activateDependencyLocking() 23 | failOnVersionConflict() 24 | eachDependency { 25 | when (requested.module.toString()) { 26 | "commons-codec:commons-codec" -> useVersion("1.10") 27 | "com.google.code.gson:gson" -> useVersion("2.8.2") 28 | "org.slf4j:slf4j-api" -> useVersion("1.8.0-alpha2") 29 | } 30 | when (requested.group) { 31 | "org.jetbrains.kotlin" -> useVersion(kotlinVersion) 32 | } 33 | } 34 | } 35 | } 36 | 37 | repositories { 38 | maven(url = URI("https://packages.atlassian.com/maven-external/")) 39 | } 40 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/annotationProcessor.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/apiDependenciesMetadata.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/archives.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/compile.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/compileClasspath.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/compileOnly.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/compileOnlyDependenciesMetadata.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/default.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | com.atlassian.performance.tools:concurrency:1.0.0 5 | com.atlassian.performance.tools:io:1.1.0 6 | com.atlassian.performance.tools:jira-actions:3.0.0 7 | com.atlassian.performance.tools:jira-software-actions:1.3.0 8 | com.atlassian.performance.tools:jvm-tasks:1.0.0 9 | com.atlassian.performance.tools:virtual-users:3.3.4 10 | com.github.stephenc.jcip:jcip-annotations:1.0-1 11 | com.google.code.findbugs:jsr305:1.3.9 12 | com.google.code.gson:gson:2.8.2 13 | com.google.errorprone:error_prone_annotations:2.1.3 14 | com.google.guava:guava:23.6-jre 15 | com.google.j2objc:j2objc-annotations:1.1 16 | com.squareup.okhttp3:okhttp:3.9.1 17 | com.squareup.okio:okio:1.13.0 18 | com.typesafe:config:1.2.1 19 | commons-cli:commons-cli:1.4 20 | commons-codec:commons-codec:1.10 21 | commons-io:commons-io:2.5 22 | commons-logging:commons-logging:1.2 23 | io.github.bonigarcia:webdrivermanager:1.7.1 24 | net.bytebuddy:byte-buddy:1.7.9 25 | org.apache.commons:commons-compress:1.9 26 | org.apache.commons:commons-csv:1.3 27 | org.apache.commons:commons-exec:1.3 28 | org.apache.commons:commons-lang3:3.5 29 | org.apache.commons:commons-math3:3.6.1 30 | org.apache.httpcomponents:httpclient:4.5.3 31 | org.apache.httpcomponents:httpcore:4.4.6 32 | org.apache.logging.log4j:log4j-api:2.10.0 33 | org.apache.logging.log4j:log4j-core:2.10.0 34 | org.apache.logging.log4j:log4j-jul:2.10.0 35 | org.apache.logging.log4j:log4j-slf4j-impl:2.10.0 36 | org.checkerframework:checker-compat-qual:2.0.0 37 | org.codehaus.mojo:animal-sniffer-annotations:1.14 38 | org.glassfish:javax.json:1.1 39 | org.jetbrains.kotlin:kotlin-stdlib-common:1.2.70 40 | org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.70 41 | org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.70 42 | org.jetbrains.kotlin:kotlin-stdlib-jre7:1.2.70 43 | org.jetbrains.kotlin:kotlin-stdlib-jre8:1.2.70 44 | org.jetbrains.kotlin:kotlin-stdlib:1.2.70 45 | org.jetbrains:annotations:13.0 46 | org.jsoup:jsoup:1.10.2 47 | org.rauschig:jarchivelib:0.7.1 48 | org.seleniumhq.selenium:selenium-api:3.11.0 49 | org.seleniumhq.selenium:selenium-chrome-driver:3.11.0 50 | org.seleniumhq.selenium:selenium-remote-driver:3.11.0 51 | org.seleniumhq.selenium:selenium-support:3.11.0 52 | org.slf4j:slf4j-api:1.8.0-alpha2 53 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/implementationDependenciesMetadata.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/kapt.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/kaptTest.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/kotlinCompilerClasspath.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | org.jetbrains.kotlin:kotlin-compiler-embeddable:1.2.70 5 | org.jetbrains.kotlin:kotlin-reflect:1.2.70 6 | org.jetbrains.kotlin:kotlin-script-runtime:1.2.70 7 | org.jetbrains.kotlin:kotlin-stdlib-common:1.2.70 8 | org.jetbrains.kotlin:kotlin-stdlib:1.2.70 9 | org.jetbrains:annotations:13.0 10 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/kotlinCompilerPluginClasspath.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.2.70 5 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/runtime.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | com.atlassian.performance.tools:concurrency:1.0.0 5 | com.atlassian.performance.tools:io:1.1.0 6 | com.atlassian.performance.tools:jira-actions:3.0.0 7 | com.atlassian.performance.tools:jira-software-actions:1.3.0 8 | com.atlassian.performance.tools:jvm-tasks:1.0.0 9 | com.atlassian.performance.tools:virtual-users:3.3.4 10 | com.github.stephenc.jcip:jcip-annotations:1.0-1 11 | com.google.code.findbugs:jsr305:1.3.9 12 | com.google.code.gson:gson:2.8.2 13 | com.google.errorprone:error_prone_annotations:2.1.3 14 | com.google.guava:guava:23.6-jre 15 | com.google.j2objc:j2objc-annotations:1.1 16 | com.squareup.okhttp3:okhttp:3.9.1 17 | com.squareup.okio:okio:1.13.0 18 | com.typesafe:config:1.2.1 19 | commons-cli:commons-cli:1.4 20 | commons-codec:commons-codec:1.10 21 | commons-io:commons-io:2.5 22 | commons-logging:commons-logging:1.2 23 | io.github.bonigarcia:webdrivermanager:1.7.1 24 | net.bytebuddy:byte-buddy:1.7.9 25 | org.apache.commons:commons-compress:1.9 26 | org.apache.commons:commons-csv:1.3 27 | org.apache.commons:commons-exec:1.3 28 | org.apache.commons:commons-lang3:3.5 29 | org.apache.commons:commons-math3:3.6.1 30 | org.apache.httpcomponents:httpclient:4.5.3 31 | org.apache.httpcomponents:httpcore:4.4.6 32 | org.apache.logging.log4j:log4j-api:2.10.0 33 | org.apache.logging.log4j:log4j-core:2.10.0 34 | org.apache.logging.log4j:log4j-jul:2.10.0 35 | org.apache.logging.log4j:log4j-slf4j-impl:2.10.0 36 | org.checkerframework:checker-compat-qual:2.0.0 37 | org.codehaus.mojo:animal-sniffer-annotations:1.14 38 | org.glassfish:javax.json:1.1 39 | org.jetbrains.kotlin:kotlin-stdlib-common:1.2.70 40 | org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.70 41 | org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.70 42 | org.jetbrains.kotlin:kotlin-stdlib-jre7:1.2.70 43 | org.jetbrains.kotlin:kotlin-stdlib-jre8:1.2.70 44 | org.jetbrains.kotlin:kotlin-stdlib:1.2.70 45 | org.jetbrains:annotations:13.0 46 | org.jsoup:jsoup:1.10.2 47 | org.rauschig:jarchivelib:0.7.1 48 | org.seleniumhq.selenium:selenium-api:3.11.0 49 | org.seleniumhq.selenium:selenium-chrome-driver:3.11.0 50 | org.seleniumhq.selenium:selenium-remote-driver:3.11.0 51 | org.seleniumhq.selenium:selenium-support:3.11.0 52 | org.slf4j:slf4j-api:1.8.0-alpha2 53 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/runtimeClasspath.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | com.atlassian.performance.tools:concurrency:1.0.0 5 | com.atlassian.performance.tools:io:1.1.0 6 | com.atlassian.performance.tools:jira-actions:3.0.0 7 | com.atlassian.performance.tools:jira-software-actions:1.3.0 8 | com.atlassian.performance.tools:jvm-tasks:1.0.0 9 | com.atlassian.performance.tools:virtual-users:3.3.4 10 | com.github.stephenc.jcip:jcip-annotations:1.0-1 11 | com.google.code.findbugs:jsr305:1.3.9 12 | com.google.code.gson:gson:2.8.2 13 | com.google.errorprone:error_prone_annotations:2.1.3 14 | com.google.guava:guava:23.6-jre 15 | com.google.j2objc:j2objc-annotations:1.1 16 | com.squareup.okhttp3:okhttp:3.9.1 17 | com.squareup.okio:okio:1.13.0 18 | com.typesafe:config:1.2.1 19 | commons-cli:commons-cli:1.4 20 | commons-codec:commons-codec:1.10 21 | commons-io:commons-io:2.5 22 | commons-logging:commons-logging:1.2 23 | io.github.bonigarcia:webdrivermanager:1.7.1 24 | net.bytebuddy:byte-buddy:1.7.9 25 | org.apache.commons:commons-compress:1.9 26 | org.apache.commons:commons-csv:1.3 27 | org.apache.commons:commons-exec:1.3 28 | org.apache.commons:commons-lang3:3.5 29 | org.apache.commons:commons-math3:3.6.1 30 | org.apache.httpcomponents:httpclient:4.5.3 31 | org.apache.httpcomponents:httpcore:4.4.6 32 | org.apache.logging.log4j:log4j-api:2.10.0 33 | org.apache.logging.log4j:log4j-core:2.10.0 34 | org.apache.logging.log4j:log4j-jul:2.10.0 35 | org.apache.logging.log4j:log4j-slf4j-impl:2.10.0 36 | org.checkerframework:checker-compat-qual:2.0.0 37 | org.codehaus.mojo:animal-sniffer-annotations:1.14 38 | org.glassfish:javax.json:1.1 39 | org.jetbrains.kotlin:kotlin-stdlib-common:1.2.70 40 | org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.70 41 | org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.70 42 | org.jetbrains.kotlin:kotlin-stdlib-jre7:1.2.70 43 | org.jetbrains.kotlin:kotlin-stdlib-jre8:1.2.70 44 | org.jetbrains.kotlin:kotlin-stdlib:1.2.70 45 | org.jetbrains:annotations:13.0 46 | org.jsoup:jsoup:1.10.2 47 | org.rauschig:jarchivelib:0.7.1 48 | org.seleniumhq.selenium:selenium-api:3.11.0 49 | org.seleniumhq.selenium:selenium-chrome-driver:3.11.0 50 | org.seleniumhq.selenium:selenium-remote-driver:3.11.0 51 | org.seleniumhq.selenium:selenium-support:3.11.0 52 | org.slf4j:slf4j-api:1.8.0-alpha2 53 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/runtimeOnlyDependenciesMetadata.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/shadow.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/testAnnotationProcessor.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/testApiDependenciesMetadata.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/testCompile.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/testCompileClasspath.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/testCompileOnly.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/testCompileOnlyDependenciesMetadata.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/testImplementationDependenciesMetadata.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/testRuntime.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | com.atlassian.performance.tools:concurrency:1.0.0 5 | com.atlassian.performance.tools:io:1.1.0 6 | com.atlassian.performance.tools:jira-actions:3.0.0 7 | com.atlassian.performance.tools:jira-software-actions:1.3.0 8 | com.atlassian.performance.tools:jvm-tasks:1.0.0 9 | com.atlassian.performance.tools:virtual-users:3.3.4 10 | com.github.stephenc.jcip:jcip-annotations:1.0-1 11 | com.google.code.findbugs:jsr305:1.3.9 12 | com.google.code.gson:gson:2.8.2 13 | com.google.errorprone:error_prone_annotations:2.1.3 14 | com.google.guava:guava:23.6-jre 15 | com.google.j2objc:j2objc-annotations:1.1 16 | com.squareup.okhttp3:okhttp:3.9.1 17 | com.squareup.okio:okio:1.13.0 18 | com.typesafe:config:1.2.1 19 | commons-cli:commons-cli:1.4 20 | commons-codec:commons-codec:1.10 21 | commons-io:commons-io:2.5 22 | commons-logging:commons-logging:1.2 23 | io.github.bonigarcia:webdrivermanager:1.7.1 24 | net.bytebuddy:byte-buddy:1.7.9 25 | org.apache.commons:commons-compress:1.9 26 | org.apache.commons:commons-csv:1.3 27 | org.apache.commons:commons-exec:1.3 28 | org.apache.commons:commons-lang3:3.5 29 | org.apache.commons:commons-math3:3.6.1 30 | org.apache.httpcomponents:httpclient:4.5.3 31 | org.apache.httpcomponents:httpcore:4.4.6 32 | org.apache.logging.log4j:log4j-api:2.10.0 33 | org.apache.logging.log4j:log4j-core:2.10.0 34 | org.apache.logging.log4j:log4j-jul:2.10.0 35 | org.apache.logging.log4j:log4j-slf4j-impl:2.10.0 36 | org.checkerframework:checker-compat-qual:2.0.0 37 | org.codehaus.mojo:animal-sniffer-annotations:1.14 38 | org.glassfish:javax.json:1.1 39 | org.jetbrains.kotlin:kotlin-stdlib-common:1.2.70 40 | org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.70 41 | org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.70 42 | org.jetbrains.kotlin:kotlin-stdlib-jre7:1.2.70 43 | org.jetbrains.kotlin:kotlin-stdlib-jre8:1.2.70 44 | org.jetbrains.kotlin:kotlin-stdlib:1.2.70 45 | org.jetbrains:annotations:13.0 46 | org.jsoup:jsoup:1.10.2 47 | org.rauschig:jarchivelib:0.7.1 48 | org.seleniumhq.selenium:selenium-api:3.11.0 49 | org.seleniumhq.selenium:selenium-chrome-driver:3.11.0 50 | org.seleniumhq.selenium:selenium-remote-driver:3.11.0 51 | org.seleniumhq.selenium:selenium-support:3.11.0 52 | org.slf4j:slf4j-api:1.8.0-alpha2 53 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/testRuntimeClasspath.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | com.atlassian.performance.tools:concurrency:1.0.0 5 | com.atlassian.performance.tools:io:1.1.0 6 | com.atlassian.performance.tools:jira-actions:3.0.0 7 | com.atlassian.performance.tools:jira-software-actions:1.3.0 8 | com.atlassian.performance.tools:jvm-tasks:1.0.0 9 | com.atlassian.performance.tools:virtual-users:3.3.4 10 | com.github.stephenc.jcip:jcip-annotations:1.0-1 11 | com.google.code.findbugs:jsr305:1.3.9 12 | com.google.code.gson:gson:2.8.2 13 | com.google.errorprone:error_prone_annotations:2.1.3 14 | com.google.guava:guava:23.6-jre 15 | com.google.j2objc:j2objc-annotations:1.1 16 | com.squareup.okhttp3:okhttp:3.9.1 17 | com.squareup.okio:okio:1.13.0 18 | com.typesafe:config:1.2.1 19 | commons-cli:commons-cli:1.4 20 | commons-codec:commons-codec:1.10 21 | commons-io:commons-io:2.5 22 | commons-logging:commons-logging:1.2 23 | io.github.bonigarcia:webdrivermanager:1.7.1 24 | net.bytebuddy:byte-buddy:1.7.9 25 | org.apache.commons:commons-compress:1.9 26 | org.apache.commons:commons-csv:1.3 27 | org.apache.commons:commons-exec:1.3 28 | org.apache.commons:commons-lang3:3.5 29 | org.apache.commons:commons-math3:3.6.1 30 | org.apache.httpcomponents:httpclient:4.5.3 31 | org.apache.httpcomponents:httpcore:4.4.6 32 | org.apache.logging.log4j:log4j-api:2.10.0 33 | org.apache.logging.log4j:log4j-core:2.10.0 34 | org.apache.logging.log4j:log4j-jul:2.10.0 35 | org.apache.logging.log4j:log4j-slf4j-impl:2.10.0 36 | org.checkerframework:checker-compat-qual:2.0.0 37 | org.codehaus.mojo:animal-sniffer-annotations:1.14 38 | org.glassfish:javax.json:1.1 39 | org.jetbrains.kotlin:kotlin-stdlib-common:1.2.70 40 | org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.70 41 | org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.70 42 | org.jetbrains.kotlin:kotlin-stdlib-jre7:1.2.70 43 | org.jetbrains.kotlin:kotlin-stdlib-jre8:1.2.70 44 | org.jetbrains.kotlin:kotlin-stdlib:1.2.70 45 | org.jetbrains:annotations:13.0 46 | org.jsoup:jsoup:1.10.2 47 | org.rauschig:jarchivelib:0.7.1 48 | org.seleniumhq.selenium:selenium-api:3.11.0 49 | org.seleniumhq.selenium:selenium-chrome-driver:3.11.0 50 | org.seleniumhq.selenium:selenium-remote-driver:3.11.0 51 | org.seleniumhq.selenium:selenium-support:3.11.0 52 | org.slf4j:slf4j-api:1.8.0-alpha2 53 | -------------------------------------------------------------------------------- /reference-virtual-users/gradle/dependency-locks/testRuntimeOnlyDependenciesMetadata.lockfile: -------------------------------------------------------------------------------- 1 | # This is a Gradle generated file for dependency locking. 2 | # Manual edits can break the build and are not advised. 3 | # This file is expected to be part of source control. 4 | -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | rootProject.name = "jira-performance-tests" 2 | 3 | include("reference-virtual-users") 4 | -------------------------------------------------------------------------------- /src/main/kotlin/com/atlassian/performance/tools/jiraperformancetests/api/AppImpactTest.kt: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.jiraperformancetests.api 2 | 3 | import com.atlassian.performance.tools.aws.api.Aws 4 | import com.atlassian.performance.tools.aws.api.Investment 5 | import com.atlassian.performance.tools.awsinfrastructure.api.DatasetCatalogue 6 | import com.atlassian.performance.tools.awsinfrastructure.api.InfrastructureFormula 7 | import com.atlassian.performance.tools.awsinfrastructure.api.jira.StandaloneFormula 8 | import com.atlassian.performance.tools.awsinfrastructure.api.storage.JiraSoftwareStorage 9 | import com.atlassian.performance.tools.awsinfrastructure.api.virtualusers.Ec2VirtualUsersFormula 10 | import com.atlassian.performance.tools.infrastructure.api.app.AppSource 11 | import com.atlassian.performance.tools.infrastructure.api.app.Apps 12 | import com.atlassian.performance.tools.infrastructure.api.app.MavenApp 13 | import com.atlassian.performance.tools.infrastructure.api.app.NoApp 14 | import com.atlassian.performance.tools.infrastructure.api.dataset.Dataset 15 | import com.atlassian.performance.tools.jiraactions.api.ActionType 16 | import com.atlassian.performance.tools.jiraactions.api.scenario.Scenario 17 | import com.atlassian.performance.tools.jirasoftwareactions.api.JiraSoftwareScenario 18 | import com.atlassian.performance.tools.report.api.Criteria 19 | import com.atlassian.performance.tools.report.api.PerformanceCriteria 20 | import com.atlassian.performance.tools.report.api.judge.MaximumCoverageJudge 21 | import com.atlassian.performance.tools.virtualusers.api.VirtualUserLoad 22 | import com.atlassian.performance.tools.virtualusers.api.browsers.Browser 23 | import com.atlassian.performance.tools.virtualusers.api.browsers.HeadlessChromeBrowser 24 | import com.atlassian.performance.tools.virtualusers.api.config.VirtualUserBehavior 25 | import com.atlassian.performance.tools.workspace.api.RootWorkspace 26 | import com.atlassian.performance.tools.workspace.api.TestWorkspace 27 | import com.google.common.util.concurrent.ThreadFactoryBuilder 28 | import java.io.File 29 | import java.nio.file.Path 30 | import java.nio.file.Paths 31 | import java.time.Duration 32 | import java.util.concurrent.Executors 33 | 34 | /** 35 | * Tests the performance impact of the [app]. 36 | */ 37 | class AppImpactTest( 38 | private val app: AppSource, 39 | private val aws: Aws, 40 | var testJar: File 41 | ) { 42 | 43 | constructor( 44 | app: MavenApp, 45 | aws: Aws 46 | ) : this( 47 | app = app, 48 | aws = aws, 49 | testJar = File("target/${app.artifactId}-performance-tests-${app.version}-fat-tests.jar") 50 | ) 51 | 52 | var scenario: Class = JiraSoftwareScenario::class.java 53 | var browser: Class = HeadlessChromeBrowser::class.java 54 | var criteria: Map, Criteria> = emptyMap() 55 | var jiraVersion: String = "7.5.0" 56 | var duration: Duration = Duration.ofMinutes(20) 57 | internal var dataset: Dataset = DatasetCatalogue().largeJira() 58 | private val outputDirectory: Path = Paths.get("target") 59 | private val appLabel = app.getLabel() 60 | 61 | fun run() { 62 | val load = VirtualUserLoad( 63 | virtualUsers = 10, 64 | hold = Duration.ZERO, 65 | ramp = Duration.ZERO, 66 | flat = duration 67 | ) 68 | val results = runRegression(load) 69 | assertNoRegression(results, load) 70 | } 71 | 72 | private fun runRegression( 73 | load: VirtualUserLoad 74 | ): RegressionResults { 75 | val workspace = RootWorkspace(outputDirectory).currentTask.isolateTest("App impact test") 76 | val baseline = testCohort( 77 | cohort = "without $appLabel", 78 | app = NoApp() 79 | ) 80 | val experiment = testCohort( 81 | cohort = "with $appLabel", 82 | app = app 83 | ) 84 | val virtualUserBehavior = VirtualUserBehavior( 85 | load = load, 86 | browser = browser, 87 | scenario = scenario, 88 | diagnosticsLimit = 255, 89 | seed = 123 90 | ) 91 | val executor = Executors.newFixedThreadPool( 92 | 2, 93 | ThreadFactoryBuilder() 94 | .setNameFormat("standalone-stability-test-thread-%d") 95 | .build() 96 | ) 97 | val futureBaselineResults = baseline.runAsync(workspace, executor, virtualUserBehavior) 98 | val futureExperimentResults = experiment.runAsync(workspace, executor, virtualUserBehavior) 99 | val baselineResults = futureBaselineResults.get() 100 | val experimentResults = futureExperimentResults.get() 101 | executor.shutdownNow() 102 | 103 | return RegressionResults( 104 | baseline = baselineResults, 105 | experiment = experimentResults 106 | ) 107 | } 108 | 109 | private fun testCohort( 110 | cohort: String, 111 | app: AppSource 112 | ): ProvisioningPerformanceTest = ProvisioningPerformanceTest( 113 | cohort = cohort, 114 | infrastructureFormula = InfrastructureFormula( 115 | investment = Investment( 116 | useCase = "Measure app impact of $appLabel", 117 | lifespan = Duration.ofHours(1) 118 | ), 119 | jiraFormula = StandaloneFormula( 120 | apps = Apps(listOf(app)), 121 | application = JiraSoftwareStorage(jiraVersion), 122 | jiraHomeSource = dataset.jiraHomeSource, 123 | database = dataset.database 124 | ), 125 | virtualUsersFormula = Ec2VirtualUsersFormula( 126 | shadowJar = testJar 127 | ), 128 | aws = aws 129 | ) 130 | ) 131 | 132 | private fun assertNoRegression( 133 | results: RegressionResults, 134 | load: VirtualUserLoad 135 | ) { 136 | val reportWorkspace = outputDirectory.resolve("surefire-reports") 137 | val verdict = MaximumCoverageJudge().judge( 138 | baseline = results.baseline, 139 | experiment = results.experiment, 140 | criteria = PerformanceCriteria( 141 | actionCriteria = criteria, 142 | virtualUserLoad = load 143 | ), 144 | report = TestWorkspace(reportWorkspace) 145 | ) 146 | verdict.assertAccepted( 147 | javaClass.canonicalName, 148 | reportWorkspace 149 | ) 150 | } 151 | } 152 | -------------------------------------------------------------------------------- /src/main/kotlin/com/atlassian/performance/tools/jiraperformancetests/api/AwsHousekeeping.kt: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.jiraperformancetests.api 2 | 3 | import com.atlassian.performance.tools.aws.api.Aws 4 | import com.atlassian.performance.tools.aws.api.ProvisionedStack 5 | import com.atlassian.performance.tools.aws.api.currentUser 6 | import org.apache.logging.log4j.LogManager 7 | import org.apache.logging.log4j.Logger 8 | import java.time.Duration 9 | import java.time.Instant.now 10 | 11 | /** 12 | * Cleans up unnecessary AWS resources 13 | */ 14 | class AwsHousekeeping( 15 | private val aws: Aws 16 | ) { 17 | private val logger: Logger = LogManager.getLogger(this::class.java) 18 | 19 | /** 20 | * Lists all stacks that were provisioned by current user 21 | */ 22 | fun listMyStacks() { 23 | val stacks = aws.listDisposableStacks() 24 | .map { ProvisionedStack(it, aws) } 25 | .filter { it.user == currentUser() } 26 | logger.info("Below is the list of AWS stacks that were provisioned by the current user:") 27 | if (stacks.isNotEmpty()) { 28 | stacks.forEach { 29 | val remainingTime = Duration.between(now(), it.expiry) 30 | val listedStack = ListedStack( 31 | name = it.stackName, 32 | user = it.user, 33 | timeLeft = if (remainingTime.isNegative) "EXPIRED" else remainingTime.toString(), 34 | status = it.status 35 | ) 36 | logger.info("${it.user}: $listedStack") 37 | } 38 | } else { 39 | logger.info("No stacks found") 40 | } 41 | } 42 | 43 | private data class ListedStack( 44 | val name: String, 45 | val user: String?, 46 | val timeLeft: String, 47 | val status: String 48 | ) 49 | 50 | /** 51 | * Deletes all stacks (live or expired) that were provisioned by current user 52 | */ 53 | fun deleteMyStacks() { 54 | logger.info("Retrieving stacks for the current user...") 55 | val stacks = aws.listDisposableStacks() 56 | .map { ProvisionedStack(it, aws) } 57 | .filter { it.user == currentUser() } 58 | if (stacks.isNotEmpty()) { 59 | logger.info("Deleting stacks...") 60 | stacks 61 | .map { stack -> 62 | stack 63 | .release() 64 | .thenAccept { logger.info("Deleted ${stack.stackName} ") } 65 | } 66 | .forEach { it.get() } 67 | logger.info("All stacks of the current user have been deleted") 68 | } else { 69 | logger.info("No stacks to delete") 70 | } 71 | } 72 | 73 | /** 74 | * Deletes every stack and every instance that exceeded its lifespan for all users 75 | */ 76 | fun cleanAllExpired() { 77 | logger.info("Cleaning expired resources...") 78 | aws.cleanLeftovers() 79 | logger.info("All expired resources have been cleaned") 80 | } 81 | 82 | } -------------------------------------------------------------------------------- /src/main/kotlin/com/atlassian/performance/tools/jiraperformancetests/api/CustomDatasetSourceRegistry.kt: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.jiraperformancetests.api 2 | 3 | import com.atlassian.performance.tools.awsinfrastructure.api.CustomDatasetSource 4 | import com.atlassian.performance.tools.awsinfrastructure.api.Infrastructure 5 | import com.atlassian.performance.tools.io.api.ensureParentDirectory 6 | import com.atlassian.performance.tools.workspace.api.RootWorkspace 7 | import com.atlassian.performance.tools.workspace.api.TaskWorkspace 8 | import org.apache.logging.log4j.LogManager 9 | import org.apache.logging.log4j.Logger 10 | import java.io.File 11 | import java.nio.file.Files 12 | import java.nio.file.Path 13 | import java.nio.file.attribute.BasicFileAttributes 14 | import java.nio.file.attribute.FileTime 15 | import javax.json.Json 16 | 17 | class CustomDatasetSourceRegistry( 18 | private val workspace: RootWorkspace 19 | ) { 20 | private val logger: Logger = LogManager.getLogger(this::class.java) 21 | 22 | private fun jsonFile( 23 | task: TaskWorkspace 24 | ): File = task 25 | .directory 26 | .resolve("dataset-source.json") 27 | .toFile() 28 | 29 | fun register( 30 | infrastructure: Infrastructure<*> 31 | ): CustomDatasetSource { 32 | val datasetSource = CustomDatasetSource( 33 | infrastructure.jira.jiraHome, 34 | infrastructure.jira.database!! 35 | ) 36 | logger.info("Registering dataset source") 37 | jsonFile(workspace.currentTask) 38 | .ensureParentDirectory() 39 | .writeText(datasetSource.toJson().toString()) 40 | return datasetSource 41 | } 42 | 43 | fun load(): CustomDatasetSource? = workspace 44 | .listTasks() 45 | .sortedByDescending { it.directory.getCreationTime() } 46 | .asSequence() 47 | .mapNotNull { extractSource(it) } 48 | .firstOrNull() 49 | 50 | private fun Path.getCreationTime(): FileTime = Files.readAttributes( 51 | this, 52 | BasicFileAttributes::class.java 53 | ).creationTime() 54 | 55 | private fun extractSource( 56 | task: TaskWorkspace 57 | ): CustomDatasetSource? = try { 58 | val fileReader = jsonFile(task).reader() 59 | val json = Json.createReader(fileReader).readObject() 60 | val source = CustomDatasetSource(json) 61 | logger.info("Found a custom dataset source in ${task.directory}") 62 | source 63 | } catch (e: Exception) { 64 | logger.debug("Failed to extract a custom dataset source from $task", e) 65 | null 66 | } 67 | } -------------------------------------------------------------------------------- /src/main/kotlin/com/atlassian/performance/tools/jiraperformancetests/api/ExplainingAwsCredentialsProvider.kt: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.jiraperformancetests.api 2 | 3 | import com.amazonaws.auth.AWSCredentials 4 | import com.amazonaws.auth.AWSCredentialsProvider 5 | import com.amazonaws.auth.DefaultAWSCredentialsProviderChain 6 | import org.apache.logging.log4j.LogManager 7 | import org.apache.logging.log4j.Logger 8 | 9 | class ExplainingAwsCredentialsProvider( 10 | private val classToCustomize: Class<*> 11 | ) : AWSCredentialsProvider { 12 | 13 | private val logger: Logger = LogManager.getLogger(this::class.java) 14 | 15 | override fun getCredentials(): AWSCredentials { 16 | """ 17 | You need to provide AWS credentials to run the test. 18 | By default we use ${DefaultAWSCredentialsProviderChain::class.java}. 19 | 20 | AWS credentials provider chain that looks for credentials in this order: 21 | * Environment Variables - AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY 22 | * Java System Properties - aws.accessKeyId and aws.secretKey 23 | * Credential profiles file at the default location (~/.aws/credentials) shared by all AWS SDKs and the AWS CLI 24 | * Credentials delivered through the Amazon EC2 container service if AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" 25 | environment variable is set and security manager has permission to access the variable, 26 | * Instance profile credentials delivered through the Amazon EC2 metadata service 27 | 28 | 29 | JPT by default uses Regions.US_EAST_1. 30 | **************************************************************** 31 | You can also customise AWS credential providers and region in 32 | class $classToCustomize. 33 | **************************************************************** 34 | """ 35 | .trimIndent() 36 | .lines() 37 | .forEach { logger.error(it) } 38 | throw Exception("We can only explain how you can supply the credentials") 39 | } 40 | 41 | override fun refresh() { 42 | } 43 | } -------------------------------------------------------------------------------- /src/main/kotlin/com/atlassian/performance/tools/jiraperformancetests/api/GroupableTest.kt: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.jiraperformancetests.api 2 | 3 | import com.atlassian.performance.tools.workspace.api.TaskWorkspace 4 | import com.atlassian.performance.tools.workspace.api.TestWorkspace 5 | import org.apache.logging.log4j.CloseableThreadContext 6 | 7 | abstract class GroupableTest( 8 | protected val feature: String 9 | ) { 10 | fun run( 11 | group: String, 12 | workspace: TaskWorkspace 13 | ) { 14 | CloseableThreadContext.put("test", "$group : $feature").use { 15 | run(workspace.isolateTest("$group - $feature")) 16 | } 17 | } 18 | 19 | abstract fun run(workspace: TestWorkspace) 20 | } -------------------------------------------------------------------------------- /src/main/kotlin/com/atlassian/performance/tools/jiraperformancetests/api/JiraDeployments.kt: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.jiraperformancetests.api 2 | 3 | import com.atlassian.performance.tools.awsinfrastructure.api.hardware.C5NineExtraLargeEphemeral 4 | import com.atlassian.performance.tools.awsinfrastructure.api.jira.DataCenterFormula 5 | import com.atlassian.performance.tools.awsinfrastructure.api.jira.JiraFormula 6 | import com.atlassian.performance.tools.awsinfrastructure.api.jira.StandaloneFormula 7 | import com.atlassian.performance.tools.awsinfrastructure.api.loadbalancer.ElasticLoadBalancerFormula 8 | import com.atlassian.performance.tools.awsinfrastructure.api.storage.ApplicationStorage 9 | import com.atlassian.performance.tools.infrastructure.api.app.Apps 10 | import com.atlassian.performance.tools.infrastructure.api.database.Database 11 | import com.atlassian.performance.tools.infrastructure.api.jira.JiraHomeSource 12 | import com.atlassian.performance.tools.infrastructure.api.jira.JiraJvmArgs 13 | import com.atlassian.performance.tools.infrastructure.api.jira.JiraLaunchTimeouts 14 | import com.atlassian.performance.tools.infrastructure.api.jira.JiraNodeConfig 15 | import java.time.Duration 16 | 17 | interface AwsJiraDeployment { 18 | 19 | fun createJiraFormula( 20 | apps: Apps, 21 | application: ApplicationStorage, 22 | jiraHomeSource: JiraHomeSource, 23 | database: Database 24 | ): JiraFormula 25 | } 26 | 27 | class StandaloneAwsDeployment : AwsJiraDeployment { 28 | override fun createJiraFormula( 29 | apps: Apps, 30 | application: ApplicationStorage, 31 | jiraHomeSource: JiraHomeSource, 32 | database: Database 33 | ): JiraFormula = StandaloneFormula( 34 | apps = apps, 35 | application = application, 36 | jiraHomeSource = jiraHomeSource, 37 | database = database 38 | ) 39 | } 40 | 41 | class DataCenterAwsDeployment( 42 | private val nodes: Int = 2 43 | ) : AwsJiraDeployment { 44 | override fun createJiraFormula( 45 | apps: Apps, 46 | application: ApplicationStorage, 47 | jiraHomeSource: JiraHomeSource, 48 | database: Database 49 | ): JiraFormula = DataCenterFormula( 50 | configs = JiraNodeConfig( 51 | name = "jira-node", 52 | jvmArgs = JiraJvmArgs(), 53 | launchTimeouts = JiraLaunchTimeouts( 54 | offlineTimeout = Duration.ofMinutes(8), 55 | initTimeout = Duration.ofMinutes(4), 56 | upgradeTimeout = Duration.ofMinutes(8), 57 | unresponsivenessTimeout = Duration.ofMinutes(4) 58 | ) 59 | ).clone(nodes), 60 | loadBalancerFormula = ElasticLoadBalancerFormula(), 61 | apps = apps, 62 | application = application, 63 | jiraHomeSource = jiraHomeSource, 64 | database = database, 65 | computer = C5NineExtraLargeEphemeral() 66 | ) 67 | } -------------------------------------------------------------------------------- /src/main/kotlin/com/atlassian/performance/tools/jiraperformancetests/api/LocalApp.kt: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.jiraperformancetests.api 2 | 3 | import com.atlassian.performance.tools.infrastructure.api.app.AppSource 4 | import java.io.File 5 | 6 | /** 7 | * Points to a pre-built local app. 8 | */ 9 | class LocalApp( 10 | private val app: File 11 | ) : AppSource { 12 | override fun acquireFiles(directory: File): List = listOf(app) 13 | override fun getLabel(): String = app.name 14 | } 15 | -------------------------------------------------------------------------------- /src/main/kotlin/com/atlassian/performance/tools/jiraperformancetests/api/OnPremisePerformanceTest.kt: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.jiraperformancetests.api 2 | 3 | import com.atlassian.performance.tools.infrastructure.api.virtualusers.LocalVirtualUsers 4 | import com.atlassian.performance.tools.jiraactions.api.parser.MergingActionMetricsParser 5 | import com.atlassian.performance.tools.jiraactions.api.scenario.Scenario 6 | import com.atlassian.performance.tools.jirasoftwareactions.api.JiraSoftwareScenario 7 | import com.atlassian.performance.tools.report.api.FullReport 8 | import com.atlassian.performance.tools.report.api.FullTimeline 9 | import com.atlassian.performance.tools.report.api.HistoricalCohortsReporter 10 | import com.atlassian.performance.tools.report.api.parser.MergingNodeCountParser 11 | import com.atlassian.performance.tools.report.api.parser.SystemMetricsParser 12 | import com.atlassian.performance.tools.report.api.result.FullCohortResult 13 | import com.atlassian.performance.tools.virtualusers.api.VirtualUserLoad 14 | import com.atlassian.performance.tools.virtualusers.api.VirtualUserOptions 15 | import com.atlassian.performance.tools.virtualusers.api.browsers.Browser 16 | import com.atlassian.performance.tools.virtualusers.api.browsers.HeadlessChromeBrowser 17 | import com.atlassian.performance.tools.virtualusers.api.config.VirtualUserBehavior 18 | import com.atlassian.performance.tools.virtualusers.api.config.VirtualUserTarget 19 | import com.atlassian.performance.tools.workspace.api.RootWorkspace 20 | import com.atlassian.performance.tools.workspace.api.TestWorkspace 21 | import java.net.URI 22 | import java.time.Duration 23 | import java.util.* 24 | 25 | /** 26 | * Gauges Jira performance, even if Jira is not accessible from the Internet. 27 | */ 28 | class OnPremisePerformanceTest( 29 | private val jira: URI 30 | ) { 31 | 32 | var adminLogin: String = "admin" 33 | var adminPassword: String = "admin" 34 | var scenario: Class = JiraSoftwareScenario::class.java 35 | var browser: Class = HeadlessChromeBrowser::class.java 36 | var virtualUsers: Int = 10 37 | var testDuration: Duration = Duration.ofMinutes(30) 38 | var workspace: RootWorkspace = RootWorkspace() 39 | private val cohortName = "my-jira" 40 | 41 | fun run() { 42 | val virtualUserBehavior = VirtualUserBehavior( 43 | load = VirtualUserLoad( 44 | virtualUsers = virtualUsers, 45 | flat = testDuration 46 | ), 47 | browser = browser, 48 | scenario = scenario, 49 | diagnosticsLimit = 64, 50 | seed = Random().nextLong() 51 | ) 52 | val virtualUserTarget = VirtualUserTarget( 53 | webApplication = jira, 54 | userName = adminLogin, 55 | password = adminPassword 56 | ) 57 | val options = VirtualUserOptions( 58 | virtualUserTarget, 59 | virtualUserBehavior 60 | ) 61 | 62 | val localVirtualUsers = LocalVirtualUsers(workspace = workspace.currentTask.directory) 63 | 64 | try { 65 | localVirtualUsers.applyLoad(options) 66 | } finally { 67 | localVirtualUsers.gatherResults() 68 | } 69 | val result = FullCohortResult( 70 | cohort = cohortName, 71 | results = workspace.currentTask.directory, 72 | actionParser = MergingActionMetricsParser(), 73 | systemParser = SystemMetricsParser(), 74 | nodeParser = MergingNodeCountParser() 75 | ).prepareForJudgement( 76 | timeline = FullTimeline() 77 | ) 78 | FullReport().dump( 79 | results = listOf(result), 80 | workspace = TestWorkspace(workspace.currentTask.directory) 81 | ) 82 | 83 | HistoricalCohortsReporter(workspace).dump() 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/main/kotlin/com/atlassian/performance/tools/jiraperformancetests/api/ProvisioningPerformanceTest.kt: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.jiraperformancetests.api 2 | 3 | import com.atlassian.performance.tools.awsinfrastructure.api.InfrastructureFormula 4 | import com.atlassian.performance.tools.concurrency.api.submitWithLogContext 5 | import com.atlassian.performance.tools.io.api.ensureDirectory 6 | import com.atlassian.performance.tools.jiraactions.api.parser.MergingActionMetricsParser 7 | import com.atlassian.performance.tools.report.api.parser.MergingNodeCountParser 8 | import com.atlassian.performance.tools.report.api.parser.SystemMetricsParser 9 | import com.atlassian.performance.tools.report.api.result.CohortResult 10 | import com.atlassian.performance.tools.report.api.result.FailedCohortResult 11 | import com.atlassian.performance.tools.report.api.result.FullCohortResult 12 | import com.atlassian.performance.tools.virtualusers.api.config.VirtualUserBehavior 13 | import com.atlassian.performance.tools.workspace.api.TestWorkspace 14 | import org.apache.logging.log4j.CloseableThreadContext 15 | import org.apache.logging.log4j.LogManager 16 | import org.apache.logging.log4j.Logger 17 | import java.nio.file.Path 18 | import java.util.concurrent.CompletableFuture 19 | import java.util.concurrent.ExecutorService 20 | import java.util.concurrent.TimeUnit 21 | 22 | class ProvisioningPerformanceTest( 23 | private val infrastructureFormula: InfrastructureFormula<*>, 24 | private val cohort: String 25 | ) { 26 | private val logger: Logger = LogManager.getLogger(this::class.java) 27 | 28 | fun runAsync( 29 | workingDirectory: TestWorkspace, 30 | executor: ExecutorService, 31 | behavior: VirtualUserBehavior 32 | ): CompletableFuture { 33 | return executor.submitWithLogContext(cohort) { 34 | CloseableThreadContext.put("cohort", cohort).use { 35 | run(workingDirectory, behavior) 36 | } 37 | } 38 | } 39 | 40 | fun run( 41 | workingDirectory: TestWorkspace, 42 | behavior: VirtualUserBehavior 43 | ): CohortResult { 44 | val workspace = workingDirectory.directory.resolve(cohort).ensureDirectory() 45 | try { 46 | val provisionedInfrastructure = infrastructureFormula.provision(workspace) 47 | val infrastructure = provisionedInfrastructure.infrastructure 48 | val resource = provisionedInfrastructure.resource 49 | val downloadedResults: Path 50 | try { 51 | infrastructure.applyLoad(behavior) 52 | } catch (e: Exception) { 53 | logger.error("Failed to test on $infrastructure", e) 54 | throw e 55 | } finally { 56 | if (resource.isExpired()) { 57 | logger.warn("$resource is already expired, but the test just finished") 58 | } 59 | downloadedResults = infrastructure.downloadResults(workspace) 60 | } 61 | logger.info("Freeing AWS resources...") 62 | resource.release().get(2, TimeUnit.MINUTES) 63 | logger.info("AWS resources are freed") 64 | return FullCohortResult( 65 | cohort = cohort, 66 | results = downloadedResults, 67 | actionParser = MergingActionMetricsParser(), 68 | systemParser = SystemMetricsParser(), 69 | nodeParser = MergingNodeCountParser() 70 | ) 71 | } catch (e: Exception) { 72 | return FailedCohortResult(cohort, e) 73 | } 74 | } 75 | } -------------------------------------------------------------------------------- /src/main/kotlin/com/atlassian/performance/tools/jiraperformancetests/api/RegressionResults.kt: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.jiraperformancetests.api 2 | 3 | import com.atlassian.performance.tools.report.api.result.CohortResult 4 | 5 | class RegressionResults( 6 | val baseline: CohortResult, 7 | val experiment: CohortResult 8 | ) -------------------------------------------------------------------------------- /src/main/kotlin/com/atlassian/performance/tools/jiraperformancetests/api/VisitableJira.kt: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.jiraperformancetests.api 2 | 3 | import java.net.URI 4 | import javax.json.Json 5 | import javax.json.JsonObject 6 | 7 | class VisitableJira( 8 | val address: URI 9 | ) { 10 | constructor( 11 | json: JsonObject 12 | ) : this( 13 | address = URI(json.getString("address")) 14 | ) 15 | 16 | fun toJson() = Json.createObjectBuilder() 17 | .add("address", address.toString()) 18 | .build() 19 | .toString() 20 | } -------------------------------------------------------------------------------- /src/main/kotlin/com/atlassian/performance/tools/jiraperformancetests/api/VisitableJiraRegistry.kt: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.jiraperformancetests.api 2 | 3 | import com.atlassian.performance.tools.io.api.ensureParentDirectory 4 | import com.atlassian.performance.tools.workspace.api.RootWorkspace 5 | import org.apache.logging.log4j.LogManager 6 | import org.apache.logging.log4j.Logger 7 | import javax.json.Json 8 | 9 | /** 10 | * Remembers the last known automatically visitable Jira. 11 | */ 12 | class VisitableJiraRegistry( 13 | workspace: RootWorkspace 14 | ) { 15 | 16 | private val logger: Logger = LogManager.getLogger(this::class.java) 17 | private val memory = workspace.directory.resolve("visitable-jira.json").toFile() 18 | 19 | fun memorize( 20 | jira: VisitableJira 21 | ) { 22 | logger.info("I'll remember how to automatically visit $jira") 23 | memory 24 | .ensureParentDirectory() 25 | .writeText(jira.toJson()) 26 | } 27 | 28 | fun recall(): VisitableJira? { 29 | return if (memory.exists()) { 30 | VisitableJira( 31 | json = Json.createReader(memory.reader()).readObject() 32 | ) 33 | } else { 34 | logger.info("I don't remember a Jira you can automatically visit. I checked in $memory .") 35 | null 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /src/test/kotlin/com/atlassian/performance/tools/jiraperformancetests/AcceptanceCategory.kt: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.jiraperformancetests 2 | 3 | interface AcceptanceCategory -------------------------------------------------------------------------------- /src/test/kotlin/com/atlassian/performance/tools/jiraperformancetests/MavenProcess.kt: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.jiraperformancetests 2 | 3 | import org.codehaus.plexus.util.Os.FAMILY_WINDOWS 4 | import org.codehaus.plexus.util.Os.isFamily 5 | import org.zeroturnaround.exec.ProcessExecutor 6 | import org.zeroturnaround.exec.ProcessResult 7 | import java.time.Duration 8 | import java.util.concurrent.TimeUnit 9 | 10 | class MavenProcess( 11 | private val processExecutor: ProcessExecutor, 12 | private val arguments: List 13 | ) { 14 | /** 15 | * We don't want to hang forever, so we need a timeout. 16 | * It's short, because it was enough for the buffered readers to flush. 17 | */ 18 | private val closeTimeout: Duration = Duration.ofSeconds(4) 19 | 20 | fun run(): ProcessResult = processExecutor 21 | .command(getMavenCommand(), *arguments.toTypedArray()) 22 | .closeTimeout(closeTimeout.toMillis(), TimeUnit.MILLISECONDS) 23 | .readOutput(true) 24 | .redirectOutputAlsoTo(System.out) 25 | .execute() 26 | 27 | private fun getMavenCommand(): String { 28 | return if (isFamily(FAMILY_WINDOWS)) { 29 | processExecutor.directory.toPath().toAbsolutePath().resolve("mvnw.cmd").toString() 30 | } else { 31 | "./mvnw" 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /src/test/kotlin/com/atlassian/performance/tools/jiraperformancetests/SystemProperty.kt: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.jiraperformancetests 2 | 3 | class SystemProperty( 4 | private val name: String 5 | ) { 6 | 7 | fun dereference(): String = System.getProperty(name) ?: throw Exception("`$name` should be set") 8 | } -------------------------------------------------------------------------------- /src/test/kotlin/com/atlassian/performance/tools/jiraperformancetests/api/AppImpactTestSmokeTest.kt: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.jiraperformancetests.api 2 | 3 | import com.amazonaws.auth.DefaultAWSCredentialsProviderChain 4 | import com.amazonaws.regions.Regions 5 | import com.amazonaws.services.support.AWSSupportClientBuilder 6 | import com.atlassian.performance.tools.aws.api.Aws 7 | import com.atlassian.performance.tools.aws.api.StorageLocation 8 | import com.atlassian.performance.tools.aws.api.SupportCapacityMediator 9 | import com.atlassian.performance.tools.awsinfrastructure.api.DatasetCatalogue 10 | import com.atlassian.performance.tools.infrastructure.api.app.AppSource 11 | import com.atlassian.performance.tools.io.api.dereference 12 | import com.atlassian.performance.tools.jirasoftwareactions.api.JiraSoftwareScenario 13 | import org.apache.http.message.BasicHeaderValueParser.INSTANCE 14 | import org.apache.http.message.BasicHeaderValueParser.parseHeaderElement 15 | import org.junit.Test 16 | import java.io.File 17 | import java.net.URI 18 | import java.nio.file.Files 19 | import java.nio.file.StandardCopyOption 20 | import java.time.Duration 21 | 22 | class AppImpactTestSmokeTest { 23 | 24 | /** 25 | * Don't bump the timeout. If it times out, make it quicker. 26 | */ 27 | @Test(timeout = 27 * 60 * 1000L) 28 | fun shouldRun() { 29 | val region = Regions.US_EAST_1 30 | val credentialsProvider = DefaultAWSCredentialsProviderChain() 31 | val support = AWSSupportClientBuilder.standard() 32 | .withCredentials(credentialsProvider) 33 | .withRegion(region) 34 | .build() 35 | val test = AppImpactTest( 36 | app = MarketplaceUriApp( 37 | uri = URI("https://marketplace.atlassian.com/download/apps/1217110/version/1000051"), 38 | label = "Jira training app" 39 | ), 40 | aws = Aws( 41 | region = region, 42 | credentialsProvider = credentialsProvider, 43 | capacity = SupportCapacityMediator( 44 | support = support, 45 | region = region 46 | ), 47 | regionsWithHousekeeping = listOf(Regions.US_EAST_1), 48 | batchingCloudformationRefreshPeriod = Duration.ofMinutes(1) 49 | ), 50 | testJar = dereference("jpt.virtual-users.shadow-jar") 51 | ) 52 | test.scenario = JiraSoftwareScenario::class.java 53 | test.duration = Duration.ofMinutes(1) 54 | test.dataset = DatasetCatalogue().custom( 55 | label = "700 issues", 56 | location = StorageLocation( 57 | uri = URI.create("s3://jpt-custom-datasets-storage-a008820-datasetbucket-1sjxdtrv5hdhj/dataset-919767fe-55b5-4c06-a3f4-c1d8222b6a2d"), 58 | region = Regions.EU_WEST_1 59 | ) 60 | ) 61 | 62 | test.run() 63 | } 64 | } 65 | 66 | private class MarketplaceUriApp( 67 | private val uri: URI, 68 | private val label: String 69 | ) : AppSource { 70 | 71 | override fun acquireFiles( 72 | directory: File 73 | ): List = listOf(downloadToDirectory(directory)) 74 | 75 | private fun downloadToDirectory( 76 | directory: File 77 | ): File { 78 | val url = uri.toURL() 79 | val connection = url.openConnection() 80 | connection.connect() 81 | val contentDisposition = connection.getHeaderField("Content-Disposition")!! 82 | val attachmentFilename = parseHeaderElement(contentDisposition, INSTANCE) 83 | .getParameterByName("filename") 84 | .value 85 | val file = directory.resolve(attachmentFilename) 86 | url.openStream().use { Files.copy(it, file.toPath(), StandardCopyOption.REPLACE_EXISTING) } 87 | return file 88 | } 89 | 90 | override fun getLabel(): String = label 91 | } 92 | -------------------------------------------------------------------------------- /src/test/kotlin/com/atlassian/performance/tools/jiraperformancetests/api/CustomerJourneyTest.kt: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.jiraperformancetests.api 2 | 3 | import com.atlassian.performance.tools.jiraperformancetests.AcceptanceCategory 4 | import com.atlassian.performance.tools.jiraperformancetests.MavenProcess 5 | import com.atlassian.performance.tools.jiraperformancetests.SystemProperty 6 | import org.assertj.core.api.Assertions.assertThat 7 | import org.junit.Test 8 | import org.junit.experimental.categories.Category 9 | import org.zeroturnaround.exec.ProcessExecutor 10 | import java.nio.file.Paths 11 | import java.util.concurrent.TimeUnit 12 | 13 | class CustomerJourneyTest { 14 | 15 | @Test 16 | @Category(AcceptanceCategory::class) 17 | fun shouldLinkLibrariesInBtfExample() { 18 | val jptVersion: String = SystemProperty("jpt.version").dereference() 19 | val mavenProcess = MavenProcess( 20 | processExecutor = ProcessExecutor() 21 | .directory(Paths.get("examples", "btf-test").toFile()) 22 | .timeout(7, TimeUnit.MINUTES), 23 | arguments = listOf("verify", "-Djpt.version=$jptVersion") 24 | ) 25 | Thread.sleep(10000) // Work around https://github.com/takari/maven-wrapper/issues/93 26 | 27 | val result = mavenProcess.run() 28 | 29 | val testsHeader = "[INFO] T E S T S" 30 | assertThat(result.output.lines) 31 | .`as`("the example should reach the tests") 32 | .contains(testsHeader) 33 | val outputAfterTests = result.output.lines.dropWhile { it != testsHeader } 34 | assertThat(outputAfterTests) 35 | .`as`("the example should link libraries successfully") 36 | .noneMatch { it.contains("NoSuchMethodError") } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/kotlin/com/atlassian/performance/tools/jiraperformancetests/api/VendorJourneyTest.kt: -------------------------------------------------------------------------------- 1 | package com.atlassian.performance.tools.jiraperformancetests.api 2 | 3 | import com.atlassian.performance.tools.jiraperformancetests.AcceptanceCategory 4 | import com.atlassian.performance.tools.jiraperformancetests.MavenProcess 5 | import com.atlassian.performance.tools.jiraperformancetests.SystemProperty 6 | import org.assertj.core.api.Assertions.assertThat 7 | import org.junit.Test 8 | import org.junit.experimental.categories.Category 9 | import org.zeroturnaround.exec.ProcessExecutor 10 | import java.nio.file.Paths 11 | import java.util.concurrent.TimeUnit 12 | 13 | class VendorJourneyTest { 14 | 15 | @Test 16 | @Category(AcceptanceCategory::class) 17 | fun shouldRunRefApp() { 18 | val jptVersion: String = SystemProperty("jpt.version").dereference() 19 | val mavenProcess = MavenProcess( 20 | arguments = listOf("install", "-Djpt.version=$jptVersion"), 21 | processExecutor = ProcessExecutor() 22 | .directory(Paths.get("examples", "ref-app").toFile()) 23 | .timeout(55, TimeUnit.MINUTES) 24 | ) 25 | 26 | val result = mavenProcess.run() 27 | 28 | val lastFewLinesOfOutput = result.output.lines.takeLast(12).joinToString(separator = "\n") 29 | assertThat(lastFewLinesOfOutput) 30 | .`as`("last few lines of output") 31 | .contains("BUILD SUCCESS") 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/test/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | --------------------------------------------------------------------------------