Skip to content

Commit 4ddf06e

Browse files
authored
Crashtracking: improve OS version parsing (#9785)
* Crashtracking: improve OS version parsing * suggestion
1 parent 33e27c7 commit 4ddf06e

File tree

2 files changed

+45
-16
lines changed

2 files changed

+45
-16
lines changed

dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/dto/SemanticVersion.java

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@
66
import com.squareup.moshi.ToJson;
77
import java.io.IOException;
88
import java.util.Objects;
9-
import java.util.regex.Matcher;
109
import java.util.regex.Pattern;
10+
import org.slf4j.Logger;
11+
import org.slf4j.LoggerFactory;
1112

1213
public final class SemanticVersion {
13-
private static final Pattern DOT_SPLITTER = Pattern.compile("\\.");
14+
private static final Pattern NUMERIC_SPLITTER = Pattern.compile("[^0-9]+");
15+
private static final Logger LOGGER = LoggerFactory.getLogger(SemanticVersion.class.getName());
1416

1517
public static final class SemanticVersionAdapter {
1618

@@ -54,30 +56,23 @@ public SemanticVersion(int major, int minor, int patch) {
5456
}
5557

5658
public static SemanticVersion of(String version) {
57-
String[] parts = DOT_SPLITTER.split(version);
58-
if (parts.length == 3) {
59-
return new SemanticVersion(
60-
safeParseInteger(parts[0]), safeParseInteger(parts[1]), safeParseInteger(parts[2]));
59+
String[] parts = NUMERIC_SPLITTER.split(version, 4);
60+
if (parts.length == 0) {
61+
LOGGER.error("Invalid version string {} ", version);
62+
return new SemanticVersion(0, 0, 0); // have a sane default
6163
} else if (parts.length == 2) {
6264
return new SemanticVersion(safeParseInteger(parts[0]), safeParseInteger(parts[1]), 0);
6365
} else if (parts.length == 1) {
6466
return new SemanticVersion(safeParseInteger(parts[0]), 0, 0);
65-
} else {
66-
throw new IllegalArgumentException("Invalid version string: " + version);
6767
}
68+
return new SemanticVersion(
69+
safeParseInteger(parts[0]), safeParseInteger(parts[1]), safeParseInteger(parts[2]));
6870
}
6971

70-
private static final Pattern INTEGER_PATTERN = Pattern.compile("(\\d+).*");
71-
7272
private static int safeParseInteger(String value) {
7373
try {
7474
return Integer.parseInt(value);
75-
} catch (NumberFormatException e) {
76-
Matcher matcher = INTEGER_PATTERN.matcher(value);
77-
if (matcher.matches()) {
78-
// this is guaranteed to be an integer
79-
return Integer.parseInt(matcher.group(1));
80-
}
75+
} catch (Throwable ignored) {
8176
return 0;
8277
}
8378
}
@@ -98,4 +93,9 @@ public boolean equals(Object o) {
9893
public int hashCode() {
9994
return Objects.hash(major, minor, patch);
10095
}
96+
97+
@Override
98+
public String toString() {
99+
return "SemanticVersion{" + "major=" + major + ", minor=" + minor + ", patch=" + patch + '}';
100+
}
101101
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package datadog.crashtracking.dto;
2+
3+
import static org.junit.jupiter.api.Assertions.*;
4+
5+
import java.util.stream.Stream;
6+
import org.junit.jupiter.params.ParameterizedTest;
7+
import org.junit.jupiter.params.provider.Arguments;
8+
import org.junit.jupiter.params.provider.MethodSource;
9+
10+
class SemanticVersionTest {
11+
12+
@ParameterizedTest
13+
@MethodSource("argsForSemanticVersionParse")
14+
public void testSemanticVersionParse(String version, SemanticVersion expected) {
15+
assertEquals(expected, SemanticVersion.of(version));
16+
}
17+
18+
private static Stream<Arguments> argsForSemanticVersionParse() {
19+
return Stream.of(
20+
Arguments.of("1", new SemanticVersion(1, 0, 0)),
21+
Arguments.of("1.2", new SemanticVersion(1, 2, 0)),
22+
Arguments.of("1.2.0", new SemanticVersion(1, 2, 0)),
23+
Arguments.of("3.4.5", new SemanticVersion(3, 4, 5)),
24+
Arguments.of("1.2.3-ea1", new SemanticVersion(1, 2, 3)),
25+
Arguments.of("1.2.3.4", new SemanticVersion(1, 2, 3)),
26+
Arguments.of("something", new SemanticVersion(0, 0, 0)) // invalid
27+
);
28+
}
29+
}

0 commit comments

Comments
 (0)