Skip to content

Commit beb0cf8

Browse files
authored
feat: add rules for java.time.Local* and java.time.ZonedDateTime (#38)
* SystemTimeMillis * Update tests to reflect new changes * Update assert statements with new hard coded lines
1 parent 199cf08 commit beb0cf8

File tree

3 files changed

+47
-6
lines changed

3 files changed

+47
-6
lines changed

src/main/java/software/amazon/lambda/snapstart/ByteCodeIntrospector.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,14 @@ public class ByteCodeIntrospector {
3737

3838
private static final String INSTANT_SIGNATURE = "Ljava/time/Instant;";
3939

40+
private static final String LOCAL_DATE_TIME_SIGNATURE = "Ljava/time/LocalDateTime;";
41+
42+
private static final String LOCAL_DATE_SIGNATURE = "Ljava/time/LocalDate;";
43+
44+
private static final String LOCAL_TIME_SIGNATURE = "Ljava/time/LocalTime;";
45+
46+
private static final String ZONED_DATE_TIME_SIGNATURE = "Ljava/time/ZonedDateTime;";
47+
4048
private static final Map<String, Set<String>> TIMESTAMP_METHODS = new HashMap<String, Set<String>>() {{
4149
put("java.lang.System", setOf("currentTimeMillis", "nanoTime"));
4250
}};
@@ -188,6 +196,18 @@ boolean isTimestamp(OpcodeStack stack) {
188196
if (INSTANT_SIGNATURE.equals(stack.getStackItem(0).getSignature())) {
189197
return true;
190198
}
199+
if (LOCAL_DATE_TIME_SIGNATURE.equals(stack.getStackItem(0).getSignature())) {
200+
return true;
201+
}
202+
if (LOCAL_DATE_SIGNATURE.equals(stack.getStackItem(0).getSignature())) {
203+
return true;
204+
}
205+
if (LOCAL_TIME_SIGNATURE.equals(stack.getStackItem(0).getSignature())) {
206+
return true;
207+
}
208+
if (ZONED_DATE_TIME_SIGNATURE.equals(stack.getStackItem(0).getSignature())) {
209+
return true;
210+
}
191211
XMethod xMethod = stack.getStackItem(0).getReturnValueOf();
192212
if (xMethod != null) {
193213
Set<String> methodNames = TIMESTAMP_METHODS.get(xMethod.getClassName());

src/test/java/software/amazon/lambda/snapstart/LambdaHandlerInitedWithRandomValueTest.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -113,13 +113,17 @@ public void timestampMemberFieldBreaksSnapStart() {
113113
BugCollection bugCollection = findBugsInClasses("LambdaUsingTs");
114114
BugInstanceMatcherBuilder bugMatcherBuilder = snapStartBugMatcher().inClass("LambdaUsingTs");
115115

116-
assertThat(bugCollection, containsExactly(1, bugMatcherBuilder.atField("tsFromSystemTimeMillis").atLine(24).build()));
117-
assertThat(bugCollection, containsExactly(1, bugMatcherBuilder.atField("tsFromSystemTimeNano").atLine(25).build()));
118-
assertThat(bugCollection, containsExactly(1, bugMatcherBuilder.atField("tsFromInstantNow").atLine(26).build()));
119-
assertThat(bugCollection, containsExactly(1, bugMatcherBuilder.atField("tsFromClock").atLine(27).build()));
116+
assertThat(bugCollection, containsExactly(1, bugMatcherBuilder.atField("tsFromSystemTimeMillis").atLine(32).build()));
117+
assertThat(bugCollection, containsExactly(1, bugMatcherBuilder.atField("tsFromSystemTimeNano").atLine(33).build()));
118+
assertThat(bugCollection, containsExactly(1, bugMatcherBuilder.atField("tsFromInstantNow").atLine(34).build()));
119+
assertThat(bugCollection, containsExactly(1, bugMatcherBuilder.atField("tsFromClock").atLine(35).build()));
120+
assertThat(bugCollection, containsExactly(1, bugMatcherBuilder.atField("tsFromLocalDateTimeNow").atLine(36).build()));
121+
assertThat(bugCollection, containsExactly(1, bugMatcherBuilder.atField("tsFromLocalDateNow").atLine(37).build()));
122+
assertThat(bugCollection, containsExactly(1, bugMatcherBuilder.atField("tsFromLocalTimeNow").atLine(38).build()));
123+
assertThat(bugCollection, containsExactly(1, bugMatcherBuilder.atField("tsFromZonedDateTimeNow").atLine(39).build()));
120124
toBeFixed(() -> assertThat(bugCollection, containsExactly(1, bugMatcherBuilder.atField("logName").atLine(29).build())));
121-
assertThat(bugCollection, containsExactly(4, snapStartBugMatcher().build()));
122-
toBeFixed(() -> assertThat(bugCollection, containsExactly(5, snapStartBugMatcher().build())));
125+
assertThat(bugCollection, containsExactly(8, snapStartBugMatcher().build()));
126+
toBeFixed(() -> assertThat(bugCollection, containsExactly(9, snapStartBugMatcher().build())));
123127
}
124128

125129
@Test

src/test/java/software/amazon/lambda/snapstart/lambdaexamples/LambdaUsingTs.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@
99
import com.amazonaws.services.lambda.runtime.RequestHandler;
1010
import java.time.Clock;
1111
import java.time.Instant;
12+
import java.time.LocalDateTime;
13+
import java.time.LocalDate;
14+
import java.time.LocalTime;
15+
import java.time.ZonedDateTime;
1216
import java.util.Map;
1317

1418
public class LambdaUsingTs implements RequestHandler<Map<String,String>, String> {
@@ -19,12 +23,21 @@ public class LambdaUsingTs implements RequestHandler<Map<String,String>, String>
1923
private long tsFromSystemTimeNano;
2024
private Instant tsFromInstantNow;
2125
private Instant tsFromClock;
26+
private LocalDateTime tsFromLocalDateTimeNow;
27+
private LocalDate tsFromLocalDateNow;
28+
private LocalTime tsFromLocalTimeNow;
29+
private ZonedDateTime tsFromZonedDateTimeNow;
2230

2331
public LambdaUsingTs(Clock clock) {
2432
tsFromSystemTimeMillis = System.currentTimeMillis(); // This is a bug
2533
tsFromSystemTimeNano = System.nanoTime(); // This is a bug
2634
tsFromInstantNow = Instant.now(); // This is a bug
2735
tsFromClock = clock.instant(); // This is a bug
36+
tsFromLocalDateTimeNow = LocalDateTime.now(); // This is a bug
37+
tsFromLocalDateNow = LocalDate.now(); // This is a bug
38+
tsFromLocalTimeNow = LocalTime.now(); // This is a bug
39+
tsFromZonedDateTimeNow = ZonedDateTime.now(); // This is a bug
40+
2841

2942
logName = getLogName(); // This is a bug
3043
}
@@ -40,6 +53,10 @@ public String handleRequest(Map<String, String> event, Context context) {
4053
out.println(tsFromSystemTimeNano);
4154
out.println(tsFromInstantNow);
4255
out.println(tsFromClock);
56+
out.println(tsFromLocalDateTimeNow);
57+
out.println(tsFromLocalDateNow);
58+
out.println(tsFromLocalTimeNow);
59+
out.println(tsFromZonedDateTimeNow);
4360
return "200";
4461
}
4562
}

0 commit comments

Comments
 (0)