diff --git a/.github/workflows/maven-core-publish.yml b/.github/workflows/maven-core-publish.yml index 7b13d88..ab04855 100644 --- a/.github/workflows/maven-core-publish.yml +++ b/.github/workflows/maven-core-publish.yml @@ -1,7 +1,7 @@ # This workflow will build a package using Maven and then publish it to Apache Maven Central # For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#Publishing-using-Apache-Maven -name: Maven Package +name: Maven Core Package on: workflow_dispatch: @@ -30,13 +30,6 @@ jobs: - name: Build with Maven run: mvn -B -ntp clean package -DskipTests=true -Pjar - - name: Publish parent to Apache Maven Central - run: mvn deploy -N -DskipTests=true - env: - MAVEN_USERNAME: ${{ secrets.MAVEN_OSSRH_USERNAME }} - MAVEN_CENTRAL_TOKEN: ${{ secrets.MAVEN_OSSRH_TOKEN }} - MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }} - - name: Publish Core to Apache Maven Central run: mvn deploy -DskipTests=true -pl arex-compare-core -Pjar env: diff --git a/.github/workflows/maven-extension-publish.yml b/.github/workflows/maven-extension-publish.yml index b847fd5..72af674 100644 --- a/.github/workflows/maven-extension-publish.yml +++ b/.github/workflows/maven-extension-publish.yml @@ -1,7 +1,7 @@ # This workflow will build a package using Maven and then publish it to Apache Maven Central # For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#Publishing-using-Apache-Maven -name: Maven Package +name: Maven Extension Package on: workflow_dispatch: diff --git a/.github/workflows/maven-parent-publish.yml b/.github/workflows/maven-parent-publish.yml new file mode 100644 index 0000000..ceee795 --- /dev/null +++ b/.github/workflows/maven-parent-publish.yml @@ -0,0 +1,38 @@ +# This workflow will build a package using Maven and then publish it to Apache Maven Central +# For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#Publishing-using-Apache-Maven + +name: Maven Parent Package + +on: + workflow_dispatch: + +jobs: + build: + + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 11 + uses: actions/setup-java@v3 + with: + java-version: '11' + distribution: 'temurin' + server-id: ossrh # Value of the distributionManagement/repository/id field of the pom.xml + server-username: MAVEN_USERNAME # env variable for username in deploy + server-password: MAVEN_CENTRAL_TOKEN # env variable for token in deploy + gpg-private-key: ${{ secrets.MAVEN_GPG_PRIVATE_KEY }} # Value of the GPG private key to import + gpg-passphrase: MAVEN_GPG_PASSPHRASE # env variable for GPG private key passphrase + + - name: Build with Maven + run: mvn -B -ntp clean package -DskipTests=true -Pjar + + - name: Publish parent to Apache Maven Central + run: mvn deploy -N -DskipTests=true + env: + MAVEN_USERNAME: ${{ secrets.MAVEN_OSSRH_USERNAME }} + MAVEN_CENTRAL_TOKEN: ${{ secrets.MAVEN_OSSRH_TOKEN }} + MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }} diff --git a/arex-compare-core/pom.xml b/arex-compare-core/pom.xml index 35a58f8..4582950 100644 --- a/arex-compare-core/pom.xml +++ b/arex-compare-core/pom.xml @@ -5,7 +5,7 @@ arex-compare-parent com.arextest - 0.1.21 + 0.1.22 4.0.0 diff --git a/arex-compare-core/src/main/java/com/arextest/diff/handler/log/filterrules/TimePrecisionFilter.java b/arex-compare-core/src/main/java/com/arextest/diff/handler/log/filterrules/TimePrecisionFilter.java index cdb4bb6..35da804 100644 --- a/arex-compare-core/src/main/java/com/arextest/diff/handler/log/filterrules/TimePrecisionFilter.java +++ b/arex-compare-core/src/main/java/com/arextest/diff/handler/log/filterrules/TimePrecisionFilter.java @@ -2,10 +2,9 @@ import com.arextest.diff.model.log.LogEntity; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.TimeZone; +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeFormatterBuilder; import java.util.function.Predicate; /** @@ -14,24 +13,29 @@ public class TimePrecisionFilter implements Predicate { private static AbstractDataProcessor dataProcessor; - - private static SimpleDateFormat parseFormat1 - = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX"); - private static SimpleDateFormat parseFormat2 - = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); - private static SimpleDateFormat parseFormat3 - = new SimpleDateFormat("HH:mm:ss.SSS"); + private static DateTimeFormatter parseFormat1 = new DateTimeFormatterBuilder() + .appendPattern("yyyy-MM-dd") + .optionalStart().appendLiteral(' ').optionalEnd() + .appendOptional(DateTimeFormatter.ofPattern("HH:mm:ss.SSSSSS")) + .appendOptional(DateTimeFormatter.ofPattern("HH:mm:ss.SSS")) + .toFormatter(); + private static DateTimeFormatter parseFormat2 = new DateTimeFormatterBuilder() + .appendOptional(DateTimeFormatter.ofPattern("HH:mm:ss.SSSSSS")) + .appendOptional(DateTimeFormatter.ofPattern("HH:mm:ss.SSS")) + .toFormatter(); + private static DateTimeFormatter parseFormat3 = new DateTimeFormatterBuilder() + .appendPattern("yyyy-MM-dd") + .optionalStart().appendLiteral('T').optionalEnd() + .optionalStart().appendLiteral(' ').optionalEnd() + .appendOptional(DateTimeFormatter.ofPattern("HH:mm:ss.SSSXXX")) + .appendOptional(DateTimeFormatter.ofPattern("HH:mm:ss.SSSZ")) + .toFormatter(); private long ignoredTimePrecision; static { - parseFormat1.setTimeZone(TimeZone.getTimeZone("GMT+8")); - parseFormat2.setTimeZone(TimeZone.getTimeZone("GMT+8")); - parseFormat3.setTimeZone(TimeZone.getTimeZone("GMT+8")); - parseFormat1.setLenient(false); - parseFormat2.setLenient(false); - parseFormat3.setLenient(false); + parseFormat1 = parseFormat1.withZone(ZoneId.of("UTC")); dataProcessor = new ProcessorChainBuilder() .addProcessor(new FirstDataProcessor()) @@ -68,13 +72,13 @@ public boolean test(LogEntity logEntity) { if ((baseStr.startsWith("0") || baseStr.startsWith("1") || baseStr.startsWith("2")) && (testStr.startsWith("0") || testStr.startsWith("1") || testStr.startsWith("2"))) { - Date baseTime = dataProcessor.process(baseStr); - Date testTime = dataProcessor.process(testStr); + Instant baseTime = dataProcessor.process(baseStr); + Instant testTime = dataProcessor.process(testStr); if (baseTime == null || testTime == null) { return true; } - long durationMillis = baseTime.getTime() - testTime.getTime(); + long durationMillis = baseTime.toEpochMilli() - testTime.toEpochMilli(); if (Math.abs(durationMillis) <= ignoredTimePrecision) { return false; } @@ -90,8 +94,8 @@ public void setNextProcessor(AbstractDataProcessor nextProcessor) { this.nextProcessor = nextProcessor; } - public Date process(String data) { - Date date = processData(data); + public Instant process(String data) { + Instant date = processData(data); if (date != null) { return date; } @@ -101,47 +105,52 @@ public Date process(String data) { return this.nextProcessor.process(data); } - protected abstract Date processData(String data); + protected abstract Instant processData(String data); } public static class FirstDataProcessor extends AbstractDataProcessor { @Override - protected Date processData(String data) { + protected Instant processData(String data) { - Date time = null; + Instant instant = null; try { - time = parseFormat1.parse(data); - } catch (ParseException e) { + ZonedDateTime zdt = ZonedDateTime.parse(data, parseFormat1); + instant = zdt.toInstant(); + } catch (Exception e) { } - return time; + return instant; } } public static class SecondDataProcessor extends AbstractDataProcessor { @Override - protected Date processData(String data) { - Date time = null; + protected Instant processData(String data) { + Instant instant = null; try { - time = parseFormat2.parse(data); - } catch (ParseException e) { + LocalTime time = LocalTime.parse(data, parseFormat2); + LocalDate date = LocalDate.ofEpochDay(0); + LocalDateTime dateTime = LocalDateTime.of(date, time); + instant = dateTime.toInstant(ZoneOffset.UTC); + } catch (Exception e) { } - return time; + return instant; + } } public static class ThirdDataProcessor extends AbstractDataProcessor { @Override - protected Date processData(String data) { - Date time = null; + protected Instant processData(String data) { + Instant instant = null; try { - time = parseFormat3.parse(data); - } catch (ParseException e) { + ZonedDateTime zdt = ZonedDateTime.parse(data, parseFormat3); + instant = zdt.toInstant(); + } catch (Exception e) { } - return time; - + return instant; } } diff --git a/arex-compare-core/src/main/java/com/arextest/diff/utils/DataBaseCompareUtil.java b/arex-compare-core/src/main/java/com/arextest/diff/utils/DataBaseCompareUtil.java index ca9f93d..bb81bb5 100644 --- a/arex-compare-core/src/main/java/com/arextest/diff/utils/DataBaseCompareUtil.java +++ b/arex-compare-core/src/main/java/com/arextest/diff/utils/DataBaseCompareUtil.java @@ -117,8 +117,8 @@ public CompareResult jsonCompare(RulesConfig rulesConfig) { .message("compare successfully") .msgInfo(baseMsg, testMsg) .logs(logs) - .processedBaseMsg(processedBaseMsg) - .processedTestMsg(processedTestMsg) + .processedBaseMsg(rulesConfig.isQuickCompare() ? baseMsg : processedBaseMsg) + .processedTestMsg(rulesConfig.isQuickCompare() ? testMsg : processedTestMsg) .parseNodePaths(parsePaths) .build(); diff --git a/arex-compare-core/src/main/java/com/arextest/diff/utils/NormalCompareUtil.java b/arex-compare-core/src/main/java/com/arextest/diff/utils/NormalCompareUtil.java index 42ff9ef..5c5dbb7 100644 --- a/arex-compare-core/src/main/java/com/arextest/diff/utils/NormalCompareUtil.java +++ b/arex-compare-core/src/main/java/com/arextest/diff/utils/NormalCompareUtil.java @@ -102,8 +102,8 @@ public CompareResult jsonCompare(RulesConfig rulesConfig) { .message("compare successfully") .msgInfo(baseMsg, testMsg) .logs(logs) - .processedBaseMsg(processedBaseMsg) - .processedTestMsg(processedTestMsg) + .processedBaseMsg(rulesConfig.isQuickCompare() ? baseMsg : processedBaseMsg) + .processedTestMsg(rulesConfig.isQuickCompare() ? testMsg : processedTestMsg) .parseNodePaths(parsePaths) .build(); diff --git a/arex-compare-core/src/test/java/com/arextest/diff/sdk/CompareProblemTest.java b/arex-compare-core/src/test/java/com/arextest/diff/sdk/CompareProblemTest.java index e703b86..a2cc4ba 100644 --- a/arex-compare-core/src/test/java/com/arextest/diff/sdk/CompareProblemTest.java +++ b/arex-compare-core/src/test/java/com/arextest/diff/sdk/CompareProblemTest.java @@ -113,4 +113,32 @@ public void testPrefixFilter() { CompareResult result = sdk.compare(baseMsg, testMsg); Assert.assertEquals(result.getLogs().size(), 0); } + + @Test + public void testYearAndNsTimeIgnore() { + CompareSDK sdk = new CompareSDK(); + sdk.getGlobalOptions().putNameToLower(true).putNullEqualsEmpty(true); + String baseMsg = "{\"time\":\"2023-06-08 23:30:00.000\"}"; + String testMsg = "{\"time\":\"2023-06-08 23:30:00.999999\"}"; + + CompareOptions compareOptions = CompareOptions.options(); + compareOptions.putIgnoredTimePrecision(1000L); + + CompareResult result = sdk.compare(baseMsg, testMsg, compareOptions); + Assert.assertEquals(result.getLogs().size(), 0); + } + + @Test + public void testNoYearAndNsTimeIgnore() { + CompareSDK sdk = new CompareSDK(); + sdk.getGlobalOptions().putNameToLower(true).putNullEqualsEmpty(true); + String baseMsg = "{\"time\":\"2023-06-08 23:30:00.000+08:00\"}"; + String testMsg = "{\"time\":\"2023-06-08T23:30:00.100Z\"}"; + + CompareOptions compareOptions = CompareOptions.options(); + compareOptions.putIgnoredTimePrecision(1000L); + + CompareResult result = sdk.compare(baseMsg, testMsg, compareOptions); + Assert.assertEquals(result.getLogs().size(), 1); + } } diff --git a/pom.xml b/pom.xml index 26452f9..41e61f4 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ com.arextest arex-compare-parent pom - 0.1.21 + 0.1.22 arex-compare-extension arex-compare-core