Skip to content

Commit e1deaf9

Browse files
authored
Merge branch 'main' into fix/webflux-multi-buffer-response
2 parents c5c4801 + 873b594 commit e1deaf9

15 files changed

Lines changed: 144 additions & 55 deletions

File tree

‎CODEOWNERS‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
* @getyourguide/uspr
1+
* @getyourguide/payx

‎gradle/libs.versions.toml‎

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
[versions]
22
java = "21"
3-
spring-boot = "4.0.7"
3+
spring-boot = "4.1.2"
44
spring-dependency-management = "1.1.7"
5-
openapi-generator = "7.21.0"
6-
openapi-tools = "0.2.9"
7-
swagger = "2.2.46"
8-
swagger-request-validator = "2.46.1"
5+
openapi-generator = "7.26.0"
6+
openapi-tools = "0.2.13"
7+
swagger = "3.0.0"
8+
swagger-request-validator = "3.0.0"
99
jakarta-validation = "3.1.1"
10-
lombok = "1.18.44"
11-
commons-codec = "1.21.0"
10+
lombok = "1.18.48"
11+
commons-codec = "1.23.0"
1212
find-bugs = "3.0.2"
1313
gradle-nexus-publish-plugin = "2.0.0"
1414
datadog-statsd = "4.4.5"
@@ -17,9 +17,9 @@ checkstyle = "8.44"
1717
pmd = "7.14.0"
1818
jacoco = "0.8.13"
1919
# Testing
20-
mockito = "5.23.0"
21-
junit-jupiter = "6.0.3"
22-
junit-platform = "6.0.3"
20+
mockito = "5.24.0"
21+
junit-jupiter = "6.1.3"
22+
junit-platform = "6.1.3"
2323

2424
[libraries]
2525
openapi-tools-jacksonDatabindNullable = { group = "org.openapitools", name = "jackson-databind-nullable", version.ref = "openapi-tools" }

‎gradle/wrapper/gradle-wrapper.jar‎

-217 Bytes
Binary file not shown.
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-9.8.2-bin.zip
44
networkTimeout=10000
5+
retries=0
6+
retryBackOffMs=500
57
zipStoreBase=GRADLE_USER_HOME
68
zipStorePath=wrapper/dists

‎gradlew‎

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎gradlew.bat‎

Lines changed: 52 additions & 33 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎openapi-validation-api/src/main/java/com/getyourguide/openapi/validation/api/Rules.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ public static class Request {
55
public static final String PATH_MISSING = "validation.request.path.missing";
66
public static final String OPERATION_NOT_ALLOWED = "validation.request.operation.notAllowed";
77
public static final String BODY_SCHEMA_ONE_OF = "validation.request.body.schema.oneOf";
8+
public static final String ACCEPT_NOT_ALLOWED = "validation.request.accept.notAllowed";
89
}
910

1011
public static class Response {

‎openapi-validation-api/src/main/java/com/getyourguide/openapi/validation/api/selector/DefaultTrafficSelector.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public boolean shouldRequestBeValidated(RequestMetaData request) {
4545

4646
private boolean isRandomlySelectedBySampleRate() {
4747
return sampleRate > 0
48-
&& (sampleRate >= 1 || ThreadLocalRandom.current().nextInt((int) (1 / sampleRate)) == 0);
48+
&& (sampleRate >= 1 || ThreadLocalRandom.current().nextDouble() < sampleRate);
4949
}
5050

5151
@Override

‎openapi-validation-api/src/test/java/com/getyourguide/openapi/validation/api/selector/DefaultTrafficSelectorTest.java‎

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.getyourguide.openapi.validation.api.selector;
22

33
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertTrue;
45

56
import com.getyourguide.openapi.validation.api.exclusions.ExcludedHeader;
67
import com.getyourguide.openapi.validation.api.model.RequestMetaData;
@@ -9,9 +10,14 @@
910
import java.util.Map;
1011
import java.util.TreeMap;
1112
import java.util.regex.Pattern;
13+
import java.util.stream.IntStream;
14+
1215
import org.junit.jupiter.api.Test;
1316

1417
class DefaultTrafficSelectorTest {
18+
private static final int SAMPLE_SIZE = 10000;
19+
private static final double ACCEPTABLE_SAMPLE_RATE_DEVIATION = 0.02;
20+
1521
private final TrafficSelector trafficSelector = new DefaultTrafficSelector(
1622
1.0,
1723
null,
@@ -69,4 +75,32 @@ private Map<String, String> toCaseInsensitiveMap(Map<String, String> map) {
6975
newMap.putAll(map);
7076
return newMap;
7177
}
78+
79+
@Test
80+
public void testSampleRateIsApproximatelyCorrectForReciprocalValues() {
81+
List.of(0.1, 0.25, 0.5).forEach(this::assertSampleRateIsApproximatelyCorrect);
82+
}
83+
84+
@Test
85+
public void testSampleRateIsApproximatelyCorrectForNonReciprocalValues() {
86+
List.of(0.3, 0.8).forEach(this::assertSampleRateIsApproximatelyCorrect);
87+
}
88+
89+
private void assertSampleRateIsApproximatelyCorrect(double sampleRate) {
90+
var sampleRateTrafficSelector = new DefaultTrafficSelector(sampleRate, null, null);
91+
var request = new RequestMetaData(
92+
"GET",
93+
URI.create("https://api.example.com/v1/path"),
94+
Map.of("Content-Type", "application/json")
95+
);
96+
var validatedRequestCount = IntStream.range(0, SAMPLE_SIZE)
97+
.filter(ignored -> sampleRateTrafficSelector.shouldRequestBeValidated(request))
98+
.count();
99+
var actualSampleRate = (double) validatedRequestCount / SAMPLE_SIZE;
100+
101+
assertTrue(
102+
Math.abs(actualSampleRate - sampleRate) < ACCEPTABLE_SAMPLE_RATE_DEVIATION,
103+
"Expected a sample rate close to " + sampleRate + ", but was " + actualSampleRate
104+
);
105+
}
72106
}

‎openapi-validation-core/src/main/java/com/getyourguide/openapi/validation/core/exclusions/InternalViolationExclusions.java‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ public class InternalViolationExclusions {
1212
private final ViolationExclusions customViolationExclusions;
1313

1414
public boolean isExcluded(OpenApiViolation violation) {
15-
return falsePositive404(violation)
15+
return falsePositive204(violation)
16+
|| falsePositive404(violation)
1617
|| falsePositive405(violation)
1718
|| falsePositive406(violation)
1819
|| falsePositiveRequestWith4xxResponse(violation)
@@ -31,6 +32,11 @@ private static boolean oneOfMatchesMoreThanOneSchema(OpenApiViolation violation)
3132
.matches(".*Instance failed to match exactly one schema \\(matched [1-9][0-9]* out of \\d+\\).*");
3233
}
3334

35+
private boolean falsePositive204(OpenApiViolation violation) {
36+
return violation.getResponseStatus().orElse(0) == 204
37+
&& Rules.Request.ACCEPT_NOT_ALLOWED.equals(violation.getRule());
38+
}
39+
3440
private boolean falsePositive404(OpenApiViolation violation) {
3541
return
3642
(

0 commit comments

Comments
 (0)