AI prompts
base on A controlled concurrency testing framework for the JVM # Fray: General-Purpose Concurrency Testing
[](https://github.com/cmu-pasta/fray/actions/workflows/build-and-test.yml)
[](https://plugins.gradle.org/plugin/org.pastalab.fray.gradle)
[](https://central.sonatype.com/artifact/org.pastalab.fray.maven/fray-plugins-maven)
[](https://plugins.jetbrains.com/plugin/26623-fray-debugger)
[](https://discord.gg/2VkNRuHUCX)
<a href="https://github.com/cmu-pasta/fray">
<img src="./assets/logo-cropped.png" width="256" alt="logo"/>
</a>
Fray is a concurrency testing tool for Java that can help you **find and debug tricky race conditions that manifest as assertion violations, run-time exceptions, or deadlocks**.
It performs controlled concurrency testing using state-of-the-art techniques such as [probabilistic concurrency testing](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/asplos277-pct.pdf)
or [partial order sampling](https://www.cs.columbia.edu/~junfeng/papers/pos-cav18.pdf). Fray also provides deterministic replay capabilities for debugging specific thread interleavings. Fray is designed
to be easy to use and can be integrated into existing testing frameworks.
# Quick Start
## JUnit 5
If you are using JUnit 5, you can use the `@ConcurrencyTest` annotation to mark a test as a concurrency test. You
also need to add the `@ExtendWith(FrayTestExtension.class)` annotation to the test class.
```java
import org.pastalab.fray.junit.junit5.FrayTestExtension;
import org.pastalab.fray.junit.junit5.annotations.ConcurrencyTest;
@ExtendWith(FrayTestExtension.class)
public class SimpleTest {
@ConcurrencyTest
public void concurrencyTest() {
... // some multithreaded code
assert(...);
}
}
```
## Other Testing Frameworks
Fray can be used with other testing frameworks as well. You may use the `FrayInTestLauncher`
```java
import org.pastalab.fray.junit.plain.FrayInTestLauncher;
public void test() {
FrayInTestLauncher.INSTANCE.launchFrayTest(() -> {
... // some multithreaded code
assert(...);
});
}
```
## Gradle
To use Fray with Gradle, add the following plugin to your `build.gradle` file:
```kotlin
plugins {
id("org.pastalab.fray.gradle") version "0.6.6"
}
```
## Maven
- First please add Fray plugin to your project
```xml
<plugin>
<groupId>org.pastalab.fray.maven</groupId>
<artifactId>fray-plugins-maven</artifactId>
<version>0.6.6</version>
<executions>
<execution>
<id>prepare-fray</id>
<goals>
<goal>prepare-fray</goal>
</goals>
</execution>
</executions>
</plugin>
```
- Next, please add the `fray-junit` dependency
```xml
<dependency>
<groupId>org.pastalab.fray</groupId>
<artifactId>fray-junit</artifactId>
<version>0.6.6</version>
<scope>test</scope>
</dependency>
```
# Documentation
- [Technical Report](https://arxiv.org/abs/2501.12618)
- [Usage Guide](./docs/usage.md)
- [IDE Settings](./docs/IDE.md)
- [Bugs Found by Fray and Testimonies](./docs/bugs.md)
# Contributing
Contributions to Fray are both welcomed and appreciated! Please see our [contributing guide](./docs/contributing.md) for more information on how to contribute to Fray.
# Publications and Media
Fray's design and evaluation is described in the following research paper (please cite this if you are referencing Fray from any other work):
> Ao Li, Byeongjee Kang, Vasudev Vikram, Isabella Laybourn, Samvid Dharanikota, Shrey Tiwari, and Rohan
> Padhye. 2025. Fray: An Efficient General-Purpose Concurrency Testing Platform for the JVM. Proc. ACM
> Program. Lang. 9, OOPSLA2, Article 417 (October 2025), 28 pages. https://doi.org/10.1145/3764119
An extended version of the paper with detailed formalizations and proofs is available at: https://arxiv.org/abs/2501.12618
See also a YouTube video of a talk given by Rohan Padhye at the [DC Systems Meetup](https://dcsystems.wtf/) hosted by [Antithesis](https://antithesis.com).
<a href="https://www.youtube.com/watch?v=AX6Pqz8gSYY">
<img width="601" height="334" alt="image" src="https://github.com/user-attachments/assets/a67304e3-3769-40e3-bd6d-9187837f80d4" />
</a>
# Acknowledgements
This material is based upon work supported in part by the National Science Foundation and by an Amazon Research Award.
Any opinions, findings, and conclusions or recommendations expressed in this material are those of the author(s)
and do not necessarily reflect the views of any sponsor.
", Assign "at most 3 tags" to the expected json: {"id":"13991","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"