Skip to content

Commit 0a25660

Browse files
committed
Update dependencies and migrate to Instant
- Update client-java to 5.4.3 - Update agent-java-test-utils to 0.1.0 - Update logger-java-logback to 5.4.0 - Replace javax.annotation imports with jakarta.annotation - Replace Date usage with Instant for better timestamp precision - Update CHANGELOG.md with all changes - Add commons-lang3 test dependency
1 parent 2cf12f3 commit 0a25660

24 files changed

+332
-297
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
# Changelog
22

33
## [Unreleased]
4+
### Changed
5+
- Client version updated on [5.4.3](https://github.com/reportportal/client-java/releases/tag/5.4.3), by @HardNorth
6+
- Replace "jsr305" annotations with "jakarta.annotation-api", by @HardNorth
7+
- Switch on use of `Instant` class instead of `Date` to get more timestamp precision, by @HardNorth
48

59
## [5.2.2]
610
### Changed

build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ dependencies {
4444
api "com.epam.reportportal:client-java:${client_version}"
4545
compileOnly "com.intuit.karate:karate-core:${karate_version}"
4646
implementation "org.slf4j:slf4j-api:${slf4j_api_version}"
47+
implementation "org.apache.commons:commons-lang3:3.18.0"
4748

4849
testImplementation "com.intuit.karate:karate-core:${karate_version}"
4950
testImplementation "com.epam.reportportal:logger-java-logback:${logger_version}"
@@ -55,6 +56,7 @@ dependencies {
5556
testImplementation "org.mockito:mockito-junit-jupiter:${mockito_version}"
5657
testImplementation "org.hamcrest:hamcrest-core:${hamcrest_version}"
5758
testImplementation "com.squareup.okhttp3:okhttp:${okhttp_version}"
59+
testImplementation "org.apache.commons:commons-lang3:3.18.0"
5860
}
5961

6062
test {

gradle.properties

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
name=agent-java-karate
2-
version=5.2.3-SNAPSHOT
2+
version=5.3.0-SNAPSHOT
33
description=EPAM ReportPortal. Karate test framework [1.3.1, ) adapter
44
gradle_version=8.2
55
karate_version=1.4.1
66
junit_version=5.10.1
77
mockito_version=5.4.0
8-
test_utils_version=0.0.13
9-
client_version=5.3.17
8+
test_utils_version=0.1.0
9+
client_version=5.4.3
1010
slf4j_api_version=2.0.7
11-
logger_version=5.2.3
11+
logger_version=5.4.0
1212
hamcrest_version=2.2
1313
okhttp_version=4.12.0
1414
scripts_url=https://raw.githubusercontent.com/reportportal/gradle-scripts
15-
scripts_branch=develop
15+
scripts_branch=master
1616
excludeTests=

src/main/java/com/epam/reportportal/karate/ReportPortalHook.java

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,18 @@
3636
import com.intuit.karate.http.HttpRequest;
3737
import com.intuit.karate.http.Response;
3838
import io.reactivex.Maybe;
39+
import jakarta.annotation.Nonnull;
40+
import jakarta.annotation.Nullable;
3941
import org.apache.commons.lang3.StringUtils;
4042
import org.slf4j.Logger;
4143
import org.slf4j.LoggerFactory;
4244

43-
import javax.annotation.Nonnull;
44-
import javax.annotation.Nullable;
45-
import java.util.*;
45+
import java.time.Instant;
46+
import java.time.temporal.ChronoUnit;
47+
import java.util.Collections;
48+
import java.util.Map;
49+
import java.util.Optional;
50+
import java.util.Set;
4651
import java.util.concurrent.ConcurrentHashMap;
4752
import java.util.function.Supplier;
4853

@@ -63,7 +68,7 @@ public class ReportPortalHook implements RuntimeHook {
6368
private final Map<String, Maybe<String>> backgroundIdMap = new ConcurrentHashMap<>();
6469
private final Map<String, ItemStatus> backgroundStatusMap = new ConcurrentHashMap<>();
6570
private final Map<String, Maybe<String>> stepIdMap = new ConcurrentHashMap<>();
66-
private final Map<Maybe<String>, Date> stepStartTimeMap = new ConcurrentHashMap<>();
71+
private final Map<Maybe<String>, Instant> stepStartTimeMap = new ConcurrentHashMap<>();
6772
private final Set<Maybe<String>> innerFeatures = Collections.newSetFromMap(new ConcurrentHashMap<>());
6873
private volatile Thread shutDownHook;
6974

@@ -175,7 +180,7 @@ public boolean beforeFeature(FeatureRuntime fr) {
175180
Maybe<String> itemId = launch.get().startTestItem(scenarioId, rq);
176181
innerFeatures.add(itemId);
177182
if (StringUtils.isNotBlank(rq.getDescription())) {
178-
ReportPortalUtils.sendLog(itemId, rq.getDescription(), LogLevel.INFO, rq.getStartTime());
183+
ReportPortalUtils.sendLog(itemId, rq.getDescription(), LogLevel.INFO, (Instant) rq.getStartTime());
179184
}
180185
return itemId;
181186
}
@@ -192,7 +197,7 @@ public boolean beforeFeature(FeatureRuntime fr) {
192197
*/
193198
@Nonnull
194199
protected FinishTestItemRQ buildFinishFeatureRq(@Nonnull FeatureRuntime fr) {
195-
return buildFinishTestItemRq(Calendar.getInstance().getTime(), fr.result.isFailed() ? ItemStatus.FAILED : ItemStatus.PASSED);
200+
return buildFinishTestItemRq(Instant.now(), fr.result.isFailed() ? ItemStatus.FAILED : ItemStatus.PASSED);
196201
}
197202

198203
@Override
@@ -298,7 +303,7 @@ public Maybe<String> startBackground(@Nonnull Step step, @Nonnull ScenarioRuntim
298303
@Nonnull
299304
@SuppressWarnings("unused")
300305
protected FinishTestItemRQ buildFinishBackgroundRq(@Nullable StepResult stepResult, @Nonnull ScenarioRuntime sr) {
301-
return buildFinishTestItemRq(Calendar.getInstance().getTime(), backgroundStatusMap.remove(sr.scenario.getUniqueId()));
306+
return buildFinishTestItemRq(Instant.now(), backgroundStatusMap.remove(sr.scenario.getUniqueId()));
302307
}
303308

304309
/**
@@ -335,17 +340,17 @@ public void afterScenario(ScenarioRuntime sr) {
335340
* previous step startTime > current step startTime.
336341
*
337342
* @param stepId step ID.
338-
* @return step new startTime in Date format.
343+
* @return step new startTime in Instant format.
339344
*/
340345
@Nonnull
341-
private Date getStepStartTime(@Nullable Maybe<String> stepId) {
342-
Date currentStepStartTime = Calendar.getInstance().getTime();
346+
private Instant getStepStartTime(@Nullable Maybe<String> stepId) {
347+
Instant currentStepStartTime = Instant.now();
343348
if (stepId == null || stepStartTimeMap.isEmpty()) {
344349
return currentStepStartTime;
345350
}
346-
Date lastStepStartTime = stepStartTimeMap.get(stepId);
351+
Instant lastStepStartTime = stepStartTimeMap.get(stepId);
347352
if (lastStepStartTime.compareTo(currentStepStartTime) >= 0) {
348-
currentStepStartTime.setTime(lastStepStartTime.getTime() + 1);
353+
currentStepStartTime = lastStepStartTime.plus(1, ChronoUnit.MICROS);
349354
}
350355
return currentStepStartTime;
351356
}
@@ -361,7 +366,7 @@ private Date getStepStartTime(@Nullable Maybe<String> stepId) {
361366
protected StartTestItemRQ buildStartStepRq(@Nonnull Step step, @Nonnull ScenarioRuntime sr) {
362367
StartTestItemRQ rq = ReportPortalUtils.buildStartStepRq(step, sr.scenario);
363368
Maybe<String> stepId = stepIdMap.get(sr.scenario.getUniqueId());
364-
Date startTime = getStepStartTime(stepId);
369+
Instant startTime = getStepStartTime(stepId);
365370
rq.setStartTime(startTime);
366371
return rq;
367372
}
@@ -388,7 +393,7 @@ public boolean beforeStep(Step step, ScenarioRuntime sr) {
388393

389394
String scenarioId = sr.scenario.getUniqueId();
390395
Maybe<String> stepId = launch.get().startTestItem(background ? backgroundId : scenarioIdMap.get(scenarioId), stepRq);
391-
stepStartTimeMap.put(stepId, stepRq.getStartTime());
396+
stepStartTimeMap.put(stepId, (Instant) stepRq.getStartTime());
392397
stepIdMap.put(scenarioId, stepId);
393398
ofNullable(stepRq.getParameters()).filter(params -> !params.isEmpty())
394399
.ifPresent(params -> sendLog(stepId, String.format(PARAMETERS_PATTERN, formatParametersAsTable(params)), LogLevel.INFO));
@@ -430,7 +435,7 @@ public void sendStepResults(StepResult stepResult, ScenarioRuntime sr) {
430435
@Nonnull
431436
@SuppressWarnings("unused")
432437
protected FinishTestItemRQ buildFinishStepRq(@Nonnull StepResult stepResult, @Nonnull ScenarioRuntime sr) {
433-
return buildFinishTestItemRq(Calendar.getInstance().getTime(), getStepStatus(stepResult.getResult().getStatus()));
438+
return buildFinishTestItemRq(Instant.now(), getStepStatus(stepResult.getResult().getStatus()));
434439
}
435440

436441
private void saveBackgroundStatus(@Nonnull StepResult stepResult, @Nonnull ScenarioRuntime sr) {

src/main/java/com/epam/reportportal/karate/ReportPortalPublisher.java

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,16 @@
2929
import com.epam.ta.reportportal.ws.model.launch.StartLaunchRQ;
3030
import com.intuit.karate.core.*;
3131
import io.reactivex.Maybe;
32+
import jakarta.annotation.Nonnull;
33+
import jakarta.annotation.Nullable;
3234
import org.slf4j.Logger;
3335
import org.slf4j.LoggerFactory;
3436

35-
import javax.annotation.Nonnull;
36-
import javax.annotation.Nullable;
37-
import java.util.*;
37+
import java.time.Instant;
38+
import java.time.temporal.ChronoUnit;
39+
import java.util.HashMap;
40+
import java.util.List;
41+
import java.util.Map;
3842
import java.util.function.Supplier;
3943

4044
import static com.epam.reportportal.karate.ReportPortalUtils.*;
@@ -51,7 +55,7 @@ public class ReportPortalPublisher {
5155
protected final MemoizingSupplier<Launch> launch;
5256
private final Map<String, Maybe<String>> featureIdMap = new HashMap<>();
5357
private final Map<String, Maybe<String>> scenarioIdMap = new HashMap<>();
54-
private final Map<Maybe<String>, Long> stepStartTimeMap = new HashMap<>();
58+
private final Map<Maybe<String>, Instant> stepStartTimeMap = new HashMap<>();
5559
private Maybe<String> backgroundId;
5660
private ItemStatus backgroundStatus;
5761
private Maybe<String> stepId;
@@ -137,7 +141,7 @@ public void startFeature(@Nonnull FeatureResult featureResult) {
137141
*/
138142
@Nonnull
139143
protected FinishTestItemRQ buildFinishFeatureRq(@Nonnull FeatureResult featureResult) {
140-
return buildFinishTestItemRq(Calendar.getInstance().getTime(), featureResult.isFailed() ? ItemStatus.FAILED : ItemStatus.PASSED);
144+
return buildFinishTestItemRq(Instant.now(), featureResult.isFailed() ? ItemStatus.FAILED : ItemStatus.PASSED);
141145
}
142146

143147
/**
@@ -257,7 +261,7 @@ public void startBackground(@Nonnull StepResult stepResult, @Nonnull ScenarioRes
257261
@Nonnull
258262
@SuppressWarnings("unused")
259263
protected FinishTestItemRQ buildFinishBackgroundRq(@Nullable StepResult stepResult, @Nonnull ScenarioResult scenarioResult) {
260-
return buildFinishTestItemRq(Calendar.getInstance().getTime(), backgroundStatus);
264+
return buildFinishTestItemRq(Instant.now(), backgroundStatus);
261265

262266
}
263267

@@ -282,19 +286,19 @@ public void finishBackground(@Nullable StepResult stepResult, @Nonnull ScenarioR
282286
* previous step startTime > current step startTime.
283287
*
284288
* @param stepId step ID.
285-
* @return step new startTime in Date format.
289+
* @return step new startTime in Instant format.
286290
*/
287-
private Date getStepStartTime(@Nonnull Maybe<String> stepId) {
288-
long currentStepStartTime = Calendar.getInstance().getTime().getTime();
291+
private Instant getStepStartTime(@Nonnull Maybe<String> stepId) {
292+
Instant currentStepStartTime = Instant.now();
289293

290294
if (!stepStartTimeMap.isEmpty()) {
291-
long lastStepStartTime = stepStartTimeMap.get(stepId);
295+
Instant lastStepStartTime = stepStartTimeMap.get(stepId);
292296

293-
if (lastStepStartTime >= currentStepStartTime) {
294-
currentStepStartTime += (lastStepStartTime - currentStepStartTime) + 1;
297+
if (lastStepStartTime.compareTo(currentStepStartTime) >= 0) {
298+
currentStepStartTime = lastStepStartTime.plus(1, ChronoUnit.MICROS);
295299
}
296300
}
297-
return new Date(currentStepStartTime);
301+
return currentStepStartTime;
298302
}
299303

300304
/**
@@ -307,7 +311,7 @@ private Date getStepStartTime(@Nonnull Maybe<String> stepId) {
307311
@Nonnull
308312
protected StartTestItemRQ buildStartStepRq(@Nonnull StepResult stepResult, @Nonnull ScenarioResult scenarioResult) {
309313
StartTestItemRQ rq = ReportPortalUtils.buildStartStepRq(stepResult.getStep(), scenarioResult.getScenario());
310-
Date startTime = getStepStartTime(stepId);
314+
Instant startTime = getStepStartTime(stepId);
311315
rq.setStartTime(startTime);
312316
return rq;
313317
}
@@ -331,7 +335,7 @@ public void startStep(StepResult stepResult, ScenarioResult scenarioResult) {
331335
background && backgroundId != null ? backgroundId : scenarioIdMap.get(scenarioResult.getScenario().getName()),
332336
stepRq
333337
);
334-
stepStartTimeMap.put(stepId, stepRq.getStartTime().getTime());
338+
stepStartTimeMap.put(stepId, (Instant) stepRq.getStartTime());
335339
ofNullable(stepRq.getParameters()).filter(params -> !params.isEmpty())
336340
.ifPresent(params -> sendLog(stepId, String.format(PARAMETERS_PATTERN, formatParametersAsTable(params)), LogLevel.INFO));
337341
ofNullable(step.getTable()).ifPresent(table -> sendLog(stepId, "Table:\n\n" + formatDataTable(table.getRows()), LogLevel.INFO));
@@ -351,7 +355,7 @@ public void startStep(StepResult stepResult, ScenarioResult scenarioResult) {
351355
@Nonnull
352356
@SuppressWarnings("unused")
353357
protected FinishTestItemRQ buildFinishStepRq(@Nonnull StepResult stepResult, @Nonnull ScenarioResult scenarioResult) {
354-
return buildFinishTestItemRq(Calendar.getInstance().getTime(), getStepStatus(stepResult.getResult().getStatus()));
358+
return buildFinishTestItemRq(Instant.now(), getStepStatus(stepResult.getResult().getStatus()));
355359
}
356360

357361
@SuppressWarnings("unused")

src/main/java/com/epam/reportportal/karate/ReportPortalUtils.java

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,12 @@
3737
import com.epam.ta.reportportal.ws.model.log.SaveLogRQ;
3838
import com.intuit.karate.core.*;
3939
import io.reactivex.Maybe;
40+
import jakarta.annotation.Nonnull;
41+
import jakarta.annotation.Nullable;
4042
import org.slf4j.Logger;
4143
import org.slf4j.LoggerFactory;
4244

43-
import javax.annotation.Nonnull;
44-
import javax.annotation.Nullable;
45+
import java.time.Instant;
4546
import java.util.*;
4647
import java.util.regex.Pattern;
4748
import java.util.stream.Collectors;
@@ -135,7 +136,7 @@ public static void unregisterShutdownHook(@Nonnull Thread hook) {
135136
public static StartLaunchRQ buildStartLaunchRq(@Nonnull ListenerParameters parameters) {
136137
StartLaunchRQ rq = new StartLaunchRQ();
137138
rq.setName(parameters.getLaunchName());
138-
rq.setStartTime(Calendar.getInstance().getTime());
139+
rq.setStartTime(Instant.now());
139140
rq.setMode(parameters.getLaunchRunningMode());
140141
rq.setAttributes(new HashSet<>(parameters.getAttributes()));
141142
if (isNotBlank(parameters.getDescription())) {
@@ -166,7 +167,7 @@ public static StartLaunchRQ buildStartLaunchRq(@Nonnull ListenerParameters param
166167
@SuppressWarnings("unused")
167168
public static FinishExecutionRQ buildFinishLaunchRq(@Nonnull ListenerParameters parameters) {
168169
FinishExecutionRQ rq = new FinishExecutionRQ();
169-
rq.setEndTime(Calendar.getInstance().getTime());
170+
rq.setEndTime(Instant.now());
170171
return rq;
171172
}
172173

@@ -200,12 +201,12 @@ public static String getCodeRef(@Nonnull Scenario scenario) {
200201
* Build default start test item event/request
201202
*
202203
* @param name item's name
203-
* @param startTime item's start time in Date format
204+
* @param startTime item's start time in Instant format
204205
* @param type item's type (e.g. feature, scenario, step, etc.)
205206
* @return request to ReportPortal
206207
*/
207208
@Nonnull
208-
public static StartTestItemRQ buildStartTestItemRq(@Nonnull String name, @Nonnull Date startTime, @Nonnull ItemType type) {
209+
public static StartTestItemRQ buildStartTestItemRq(@Nonnull String name, @Nonnull Instant startTime, @Nonnull ItemType type) {
209210
StartTestItemRQ rq = new StartTestItemRQ();
210211
rq.setName(name);
211212
rq.setStartTime(startTime);
@@ -221,7 +222,7 @@ public static StartTestItemRQ buildStartTestItemRq(@Nonnull String name, @Nonnul
221222
* @return request to ReportPortal
222223
*/
223224
@Nonnull
224-
public static FinishTestItemRQ buildFinishTestItemRq(@Nonnull Date endTime, @Nullable ItemStatus status) {
225+
public static FinishTestItemRQ buildFinishTestItemRq(@Nonnull Instant endTime, @Nullable ItemStatus status) {
225226
FinishTestItemRQ rq = new FinishTestItemRQ();
226227
rq.setEndTime(endTime);
227228
rq.setStatus(ofNullable(status).map(Enum::name).orElse(null));
@@ -248,7 +249,7 @@ public static Set<ItemAttributesRQ> toAttributes(@Nullable List<Tag> tags) {
248249
@Nonnull
249250
public static StartTestItemRQ buildStartFeatureRq(@Nonnull Feature feature) {
250251
String featureName = ofNullable(feature.getName()).filter(n -> !n.isBlank()).orElseGet(() -> getCodeRef(feature));
251-
StartTestItemRQ rq = buildStartTestItemRq(featureName, Calendar.getInstance().getTime(), ItemType.STORY);
252+
StartTestItemRQ rq = buildStartTestItemRq(featureName, Instant.now(), ItemType.STORY);
252253
rq.setAttributes(toAttributes(feature.getTags()));
253254
String featurePath = feature.getResource().getUri().toString();
254255
String description = feature.getDescription();
@@ -310,7 +311,7 @@ public static TestCaseIdEntry getTestCaseId(@Nonnull Scenario scenario) {
310311
@Nonnull
311312
public static StartTestItemRQ buildStartScenarioRq(@Nonnull ScenarioResult result) {
312313
Scenario scenario = result.getScenario();
313-
StartTestItemRQ rq = buildStartTestItemRq(scenario.getName(), Calendar.getInstance().getTime(), ItemType.STEP);
314+
StartTestItemRQ rq = buildStartTestItemRq(scenario.getName(), Instant.now(), ItemType.STEP);
314315
rq.setCodeRef(getCodeRef(scenario));
315316
rq.setTestCaseId(ofNullable(getTestCaseId(scenario)).map(TestCaseIdEntry::getId).orElse(null));
316317
rq.setAttributes(toAttributes(scenario.getTags()));
@@ -329,7 +330,7 @@ public static StartTestItemRQ buildStartScenarioRq(@Nonnull ScenarioResult resul
329330
public static FinishTestItemRQ buildFinishScenarioRq(@Nonnull ScenarioResult result) {
330331
Scenario scenario = result.getScenario();
331332
FinishTestItemRQ rq = buildFinishTestItemRq(
332-
Calendar.getInstance().getTime(),
333+
Instant.now(),
333334
result.getFailureMessageForDisplay() == null ? ItemStatus.PASSED : ItemStatus.FAILED
334335
);
335336
rq.setDescription(buildDescription(scenario, result.getErrorMessage(), getParameters(scenario)));
@@ -371,7 +372,7 @@ private static void appendWithDelimiter(StringBuilder builder, String text) {
371372
@Nonnull
372373
@SuppressWarnings("unused")
373374
public static StartTestItemRQ buildStartBackgroundRq(@Nonnull Step step, @Nonnull Scenario scenario) {
374-
StartTestItemRQ rq = buildStartTestItemRq(Background.KEYWORD, Calendar.getInstance().getTime(), ItemType.STEP);
375+
StartTestItemRQ rq = buildStartTestItemRq(Background.KEYWORD, Instant.now(), ItemType.STEP);
375376
rq.setHasStats(false);
376377
return rq;
377378
}
@@ -386,7 +387,7 @@ public static StartTestItemRQ buildStartBackgroundRq(@Nonnull Step step, @Nonnul
386387
@Nonnull
387388
public static StartTestItemRQ buildStartStepRq(@Nonnull Step step, @Nonnull Scenario scenario) {
388389
String stepName = step.getPrefix() + " " + step.getText();
389-
StartTestItemRQ rq = buildStartTestItemRq(stepName, Calendar.getInstance().getTime(), ItemType.STEP);
390+
StartTestItemRQ rq = buildStartTestItemRq(stepName, Instant.now(), ItemType.STEP);
390391
rq.setHasStats(false);
391392
if (step.isOutline()) {
392393
List<ParameterResource> parameters = scenario.getExampleData()
@@ -440,7 +441,7 @@ public static ItemStatus getStepStatus(String status) {
440441
* @param level log level
441442
* @param logTime log time
442443
*/
443-
public static void sendLog(Maybe<String> itemId, String message, LogLevel level, Date logTime) {
444+
public static void sendLog(Maybe<String> itemId, String message, LogLevel level, Instant logTime) {
444445
ReportPortal.emitLog(
445446
itemId, id -> {
446447
SaveLogRQ rq = new SaveLogRQ();
@@ -461,7 +462,7 @@ public static void sendLog(Maybe<String> itemId, String message, LogLevel level,
461462
* @param level log level
462463
*/
463464
public static void sendLog(Maybe<String> itemId, String message, LogLevel level) {
464-
sendLog(itemId, message, level, Calendar.getInstance().getTime());
465+
sendLog(itemId, message, level, Instant.now());
465466
}
466467

467468
/**

src/main/java/com/epam/reportportal/karate/utils/BlockingConcurrentHashMap.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@
1616

1717
package com.epam.reportportal.karate.utils;
1818

19+
import jakarta.annotation.Nonnull;
20+
import jakarta.annotation.Nullable;
1921
import org.slf4j.Logger;
2022
import org.slf4j.LoggerFactory;
2123

22-
import javax.annotation.Nonnull;
23-
import javax.annotation.Nullable;
2424
import java.util.Map;
2525
import java.util.concurrent.ArrayBlockingQueue;
2626
import java.util.concurrent.BlockingQueue;

0 commit comments

Comments
 (0)