From 034b9d59414931a6033d5948377f537ce263ba61 Mon Sep 17 00:00:00 2001 From: NguyenHoangSon96 Date: Mon, 11 May 2026 15:41:11 +0700 Subject: [PATCH 1/4] test: add writing with different time unit tests --- .../v3/client/integration/E2ETest.java | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/influxdb/v3/client/integration/E2ETest.java b/src/test/java/com/influxdb/v3/client/integration/E2ETest.java index dc02f7da..cd038a8b 100644 --- a/src/test/java/com/influxdb/v3/client/integration/E2ETest.java +++ b/src/test/java/com/influxdb/v3/client/integration/E2ETest.java @@ -595,10 +595,43 @@ public void testMultipleQueries() throws Exception { } } } - - } + @EnabledIfEnvironmentVariable(named = "TESTING_INFLUXDB_URL", matches = ".*") + @EnabledIfEnvironmentVariable(named = "TESTING_INFLUXDB_TOKEN", matches = ".*") + @EnabledIfEnvironmentVariable(named = "TESTING_INFLUXDB_DATABASE", matches = ".*") + @Test + public void testWriteWithDifferentTimeUnit() throws Exception { + // These tests make sure that timestamp always converted to nanoseconds when writing Points. + try (InfluxDBClient client = InfluxDBClient.getInstance( + System.getenv("TESTING_INFLUXDB_URL"), + System.getenv("TESTING_INFLUXDB_TOKEN").toCharArray(), + System.getenv("TESTING_INFLUXDB_DATABASE"), + null)) { + var writeOptions = new WriteOptions.Builder().precision(WritePrecision.MS).build(); + String measurement = "test_" + Instant.now().toEpochMilli() % 1000; + List points = List.of( + Point.measurement(measurement) + .setTag("type", "test") + .setFloatField("rads", 3.14) + .setIntegerField("life", 42) + .setTimestamp(Instant.now().toEpochMilli(), WritePrecision.MS), + Point.measurement(measurement) + .setTag("type", "test") + .setFloatField("rads", 3.14) + .setIntegerField("life", 12) + .setTimestamp(Instant.now().toEpochMilli() / 1000, WritePrecision.S), + Point.measurement(measurement) + .setTag("type", "test") + .setFloatField("rads", 3.14) + .setIntegerField("life", 432) + .setTimestamp(Instant.now().toEpochMilli() * 1000, WritePrecision.US) + ); + client.writePoints(points, writeOptions); + var results = client.queryPoints("select * from " + measurement).collect(Collectors.toList()); + Assertions.assertThat(results).hasSize(3); + } + } private void assertGetDataSuccess(@Nonnull final InfluxDBClient influxDBClient) { influxDBClient.writePoint( From e98445c9ce4df23061067ac075033e04acfbb078 Mon Sep 17 00:00:00 2001 From: NguyenHoangSon96 Date: Mon, 11 May 2026 15:42:26 +0700 Subject: [PATCH 2/4] fix: send correct time unit when writing Points --- .../influxdb/v3/client/internal/InfluxDBClientImpl.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/influxdb/v3/client/internal/InfluxDBClientImpl.java b/src/main/java/com/influxdb/v3/client/internal/InfluxDBClientImpl.java index 3dc05155..f7988cde 100644 --- a/src/main/java/com/influxdb/v3/client/internal/InfluxDBClientImpl.java +++ b/src/main/java/com/influxdb/v3/client/internal/InfluxDBClientImpl.java @@ -304,7 +304,13 @@ private void writeData(@Nonnull final List data, @Nonnull final WriteOpti + "or use default configuration at 'ClientConfig.database'."); } - WritePrecision precision = options.precisionSafe(config); + WritePrecision precision; + if (!data.isEmpty() && data.get(0) instanceof Point) { + // When writing points, timestamp always be converted to nanoseconds. + precision = WritePrecision.NS; + } else { + precision = options.precisionSafe(config); + } options.validate(config); String path; From cb14a6134c0d04ba8a05e8b822f4a485ce1adeab Mon Sep 17 00:00:00 2001 From: NguyenHoangSon96 Date: Mon, 11 May 2026 16:38:02 +0700 Subject: [PATCH 3/4] test: refactor expect precisions --- .../influxdb/v3/client/InfluxDBClientWriteTest.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/influxdb/v3/client/InfluxDBClientWriteTest.java b/src/test/java/com/influxdb/v3/client/InfluxDBClientWriteTest.java index 4382b646..3e0173fa 100644 --- a/src/test/java/com/influxdb/v3/client/InfluxDBClientWriteTest.java +++ b/src/test/java/com/influxdb/v3/client/InfluxDBClientWriteTest.java @@ -401,7 +401,7 @@ void writePointWithDefaultWriteOptionsCustomConfig() throws Exception { mockServer.enqueue(createResponse(200)); ClientConfig cfg = new ClientConfig.Builder().host(baseURL).token("TOKEN".toCharArray()).database("DB") - .writePrecision(WritePrecision.S) + .writePrecision(WritePrecision.US) .writeNoSync(true) .gzipThreshold(1) .build(); @@ -412,7 +412,10 @@ void writePointWithDefaultWriteOptionsCustomConfig() throws Exception { client.writePoint(point); } - checkWriteCalled("/api/v3/write_lp", "DB", "second", true, "true", null, true); + // When writing Point, precision send to the servers is always nanosecond + var expectedPrecision = "nanosecond"; + + checkWriteCalled("/api/v3/write_lp", "DB", expectedPrecision, true, "true", null, true); } @Test @@ -447,7 +450,10 @@ void writePointsWithDefaultWriteOptionsCustomConfig() throws Exception { client.writePoints(List.of(point)); } - checkWriteCalled("/api/v3/write_lp", "DB", "second", true, "true", null, true); + // When writing Point, precision send to the servers is always nanosecond + var expectedPrecision = "nanosecond"; + + checkWriteCalled("/api/v3/write_lp", "DB", expectedPrecision, true, "true", null, true); } private void checkWriteCalled(final String expectedPath, final String expectedDB, From b29c2cebc4caa2521f2251beaa5d2d573661f1e2 Mon Sep 17 00:00:00 2001 From: NguyenHoangSon96 Date: Mon, 11 May 2026 16:38:02 +0700 Subject: [PATCH 4/4] test: refactor expect precisions --- .../influxdb/v3/client/InfluxDBClientWriteTest.java | 12 +++++++++--- .../com/influxdb/v3/client/integration/E2ETest.java | 4 ++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/test/java/com/influxdb/v3/client/InfluxDBClientWriteTest.java b/src/test/java/com/influxdb/v3/client/InfluxDBClientWriteTest.java index 4382b646..3e0173fa 100644 --- a/src/test/java/com/influxdb/v3/client/InfluxDBClientWriteTest.java +++ b/src/test/java/com/influxdb/v3/client/InfluxDBClientWriteTest.java @@ -401,7 +401,7 @@ void writePointWithDefaultWriteOptionsCustomConfig() throws Exception { mockServer.enqueue(createResponse(200)); ClientConfig cfg = new ClientConfig.Builder().host(baseURL).token("TOKEN".toCharArray()).database("DB") - .writePrecision(WritePrecision.S) + .writePrecision(WritePrecision.US) .writeNoSync(true) .gzipThreshold(1) .build(); @@ -412,7 +412,10 @@ void writePointWithDefaultWriteOptionsCustomConfig() throws Exception { client.writePoint(point); } - checkWriteCalled("/api/v3/write_lp", "DB", "second", true, "true", null, true); + // When writing Point, precision send to the servers is always nanosecond + var expectedPrecision = "nanosecond"; + + checkWriteCalled("/api/v3/write_lp", "DB", expectedPrecision, true, "true", null, true); } @Test @@ -447,7 +450,10 @@ void writePointsWithDefaultWriteOptionsCustomConfig() throws Exception { client.writePoints(List.of(point)); } - checkWriteCalled("/api/v3/write_lp", "DB", "second", true, "true", null, true); + // When writing Point, precision send to the servers is always nanosecond + var expectedPrecision = "nanosecond"; + + checkWriteCalled("/api/v3/write_lp", "DB", expectedPrecision, true, "true", null, true); } private void checkWriteCalled(final String expectedPath, final String expectedDB, diff --git a/src/test/java/com/influxdb/v3/client/integration/E2ETest.java b/src/test/java/com/influxdb/v3/client/integration/E2ETest.java index cd038a8b..d0015121 100644 --- a/src/test/java/com/influxdb/v3/client/integration/E2ETest.java +++ b/src/test/java/com/influxdb/v3/client/integration/E2ETest.java @@ -620,12 +620,12 @@ public void testWriteWithDifferentTimeUnit() throws Exception { .setTag("type", "test") .setFloatField("rads", 3.14) .setIntegerField("life", 12) - .setTimestamp(Instant.now().toEpochMilli() / 1000, WritePrecision.S), + .setTimestamp(Instant.now().plusSeconds(1).toEpochMilli() / 1000, WritePrecision.S), Point.measurement(measurement) .setTag("type", "test") .setFloatField("rads", 3.14) .setIntegerField("life", 432) - .setTimestamp(Instant.now().toEpochMilli() * 1000, WritePrecision.US) + .setTimestamp(Instant.now().plusSeconds(2).toEpochMilli() * 1000, WritePrecision.US) ); client.writePoints(points, writeOptions); var results = client.queryPoints("select * from " + measurement).collect(Collectors.toList());