This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking.git


The following commit(s) were added to refs/heads/master by this push:
     new ad12d91e8e Add unit tests for JDBCEventQueryDAO, 
JDBCBrowserLogQueryDAO, and JDBCProfileThreadSnapshotQueryDAO (#13802)
ad12d91e8e is described below

commit ad12d91e8ef55d22e086a4e9364e7173956f0101
Author: Hyunjin-Jeong <[email protected]>
AuthorDate: Wed Apr 8 17:10:38 2026 +0900

    Add unit tests for JDBCEventQueryDAO, JDBCBrowserLogQueryDAO, and 
JDBCProfileThreadSnapshotQueryDAO (#13802)
---
 .../common/dao/JDBCBrowserLogQueryDAOTest.java     | 129 +++++++++++++++++++
 .../jdbc/common/dao/JDBCEventQueryDAOTest.java     | 140 +++++++++++++++++++++
 .../dao/JDBCProfileThreadSnapshotQueryDAOTest.java |  98 +++++++++++++++
 3 files changed, 367 insertions(+)

diff --git 
a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/test/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/common/dao/JDBCBrowserLogQueryDAOTest.java
 
b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/test/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/common/dao/JDBCBrowserLogQueryDAOTest.java
new file mode 100644
index 0000000000..dffae18705
--- /dev/null
+++ 
b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/test/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/common/dao/JDBCBrowserLogQueryDAOTest.java
@@ -0,0 +1,129 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.oap.server.storage.plugin.jdbc.common.dao;
+
+import 
org.apache.skywalking.oap.server.core.browser.manual.errorlog.BrowserErrorLogRecord;
+import 
org.apache.skywalking.oap.server.core.browser.source.BrowserErrorCategory;
+import org.apache.skywalking.oap.server.core.query.input.Duration;
+import org.apache.skywalking.oap.server.core.query.enumeration.Step;
+import 
org.apache.skywalking.oap.server.library.client.jdbc.hikaricp.JDBCClient;
+import 
org.apache.skywalking.oap.server.storage.plugin.jdbc.common.JDBCTableInstaller;
+import 
org.apache.skywalking.oap.server.storage.plugin.jdbc.common.SQLAndParameters;
+import org.apache.skywalking.oap.server.storage.plugin.jdbc.common.TableHelper;
+import org.joda.time.DateTime;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.mockito.junit.jupiter.MockitoSettings;
+import org.mockito.quality.Strictness;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@ExtendWith(MockitoExtension.class)
+@MockitoSettings(strictness = Strictness.LENIENT)
+class JDBCBrowserLogQueryDAOTest {
+
+    private static final String TABLE = BrowserErrorLogRecord.INDEX_NAME;
+
+    @Mock
+    private JDBCClient jdbcClient;
+    @Mock
+    private TableHelper tableHelper;
+
+    private JDBCBrowserLogQueryDAO dao;
+
+    @BeforeEach
+    void setUp() {
+        dao = new JDBCBrowserLogQueryDAO(jdbcClient, tableHelper);
+    }
+
+    @Test
+    void buildSQL_shouldAlwaysContainTableColumnCondition() {
+        final SQLAndParameters result = dao.buildSQL(null, null, null, null, 
null, 10, 0, TABLE);
+
+        assertThat(result.sql()).contains(JDBCTableInstaller.TABLE_COLUMN + " 
= ?");
+        
assertThat(result.parameters()).contains(BrowserErrorLogRecord.INDEX_NAME);
+    }
+
+    @Test
+    void buildSQL_withNoOptionalConditions_shouldProduceMinimalSQL() {
+        final SQLAndParameters result = dao.buildSQL(null, null, null, null, 
null, 10, 0, TABLE);
+
+        
assertThat(result.sql()).doesNotContain(BrowserErrorLogRecord.SERVICE_ID);
+        
assertThat(result.sql()).doesNotContain(BrowserErrorLogRecord.SERVICE_VERSION_ID);
+        
assertThat(result.sql()).doesNotContain(BrowserErrorLogRecord.PAGE_PATH_ID);
+        
assertThat(result.sql()).doesNotContain(BrowserErrorLogRecord.ERROR_CATEGORY);
+        
assertThat(result.sql()).doesNotContain(BrowserErrorLogRecord.TIME_BUCKET);
+    }
+
+    @Test
+    void buildSQL_withServiceId_shouldIncludeServiceCondition() {
+        final SQLAndParameters result = dao.buildSQL("service-1", null, null, 
null, null, 10, 0, TABLE);
+
+        assertThat(result.sql()).contains(BrowserErrorLogRecord.SERVICE_ID + " 
= ?");
+        assertThat(result.parameters()).contains("service-1");
+    }
+
+    @Test
+    void buildSQL_withServiceVersionId_shouldIncludeVersionCondition() {
+        final SQLAndParameters result = dao.buildSQL(null, "version-1", null, 
null, null, 10, 0, TABLE);
+
+        
assertThat(result.sql()).contains(BrowserErrorLogRecord.SERVICE_VERSION_ID + " 
= ?");
+        assertThat(result.parameters()).contains("version-1");
+    }
+
+    @Test
+    void buildSQL_withPagePathId_shouldIncludePagePathCondition() {
+        final SQLAndParameters result = dao.buildSQL(null, null, "path-1", 
null, null, 10, 0, TABLE);
+
+        assertThat(result.sql()).contains(BrowserErrorLogRecord.PAGE_PATH_ID + 
" = ?");
+        assertThat(result.parameters()).contains("path-1");
+    }
+
+    @Test
+    void buildSQL_withCategory_shouldIncludeCategoryCondition() {
+        final SQLAndParameters result = dao.buildSQL(
+            null, null, null, BrowserErrorCategory.AJAX, null, 10, 0, TABLE);
+
+        assertThat(result.sql()).contains(BrowserErrorLogRecord.ERROR_CATEGORY 
+ " = ?");
+        
assertThat(result.parameters()).contains(BrowserErrorCategory.AJAX.getValue());
+    }
+
+    @Test
+    void buildSQL_withDuration_shouldIncludeTimeBucketRange() {
+        final Duration duration = new Duration();
+        duration.setStart(new DateTime(2023, 1, 1, 0, 0).toString("yyyy-MM-dd 
HHmm"));
+        duration.setEnd(new DateTime(2023, 1, 2, 0, 0).toString("yyyy-MM-dd 
HHmm"));
+        duration.setStep(Step.MINUTE);
+
+        final SQLAndParameters result = dao.buildSQL(null, null, null, null, 
duration, 10, 0, TABLE);
+
+        assertThat(result.sql()).contains(BrowserErrorLogRecord.TIME_BUCKET + 
" >= ?");
+        assertThat(result.sql()).contains(BrowserErrorLogRecord.TIME_BUCKET + 
" <= ?");
+    }
+
+    @Test
+    void buildSQL_limitAndOffset_shouldBeApplied() {
+        final SQLAndParameters result = dao.buildSQL(null, null, null, null, 
null, 20, 5, TABLE);
+
+        assertThat(result.sql()).contains("limit 25");
+    }
+}
diff --git 
a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/test/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/common/dao/JDBCEventQueryDAOTest.java
 
b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/test/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/common/dao/JDBCEventQueryDAOTest.java
new file mode 100644
index 0000000000..4f4793f96d
--- /dev/null
+++ 
b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/test/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/common/dao/JDBCEventQueryDAOTest.java
@@ -0,0 +1,140 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.oap.server.storage.plugin.jdbc.common.dao;
+
+import io.vavr.Tuple2;
+import org.apache.skywalking.oap.server.core.analysis.record.Event;
+import 
org.apache.skywalking.oap.server.core.query.type.event.EventQueryCondition;
+import org.apache.skywalking.oap.server.core.query.type.event.EventType;
+import org.apache.skywalking.oap.server.core.query.type.event.Source;
+import 
org.apache.skywalking.oap.server.library.client.jdbc.hikaricp.JDBCClient;
+import 
org.apache.skywalking.oap.server.storage.plugin.jdbc.common.JDBCTableInstaller;
+import org.apache.skywalking.oap.server.storage.plugin.jdbc.common.TableHelper;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.mockito.junit.jupiter.MockitoSettings;
+import org.mockito.quality.Strictness;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@ExtendWith(MockitoExtension.class)
+@MockitoSettings(strictness = Strictness.LENIENT)
+class JDBCEventQueryDAOTest {
+
+    @Mock
+    private JDBCClient jdbcClient;
+    @Mock
+    private TableHelper tableHelper;
+
+    private JDBCEventQueryDAO dao;
+
+    @BeforeEach
+    void setUp() {
+        dao = new JDBCEventQueryDAO(jdbcClient, tableHelper);
+    }
+
+    @Test
+    void buildQuery_shouldAlwaysContainTableColumnCondition() {
+        final EventQueryCondition condition = new EventQueryCondition();
+
+        final Tuple2<Stream<String>, Stream<Object>> result = 
dao.buildQuery(condition);
+        final List<String> conditions = 
result._1().collect(Collectors.toList());
+
+        assertThat(conditions).contains(JDBCTableInstaller.TABLE_COLUMN + " = 
?");
+    }
+
+    @Test
+    void 
buildQuery_withNoOptionalConditions_shouldProduceOnlyTableColumnCondition() {
+        final EventQueryCondition condition = new EventQueryCondition();
+
+        final Tuple2<Stream<String>, Stream<Object>> result = 
dao.buildQuery(condition);
+        final List<String> conditions = 
result._1().collect(Collectors.toList());
+        final List<Object> parameters = 
result._2().collect(Collectors.toList());
+
+        assertThat(conditions).hasSize(1);
+        
assertThat(conditions.get(0)).isEqualTo(JDBCTableInstaller.TABLE_COLUMN + " = 
?");
+        assertThat(parameters).containsExactly(Event.INDEX_NAME);
+    }
+
+    @Test
+    void buildQuery_withUuid_shouldIncludeUuidCondition() {
+        final EventQueryCondition condition = new EventQueryCondition();
+        condition.setUuid("test-uuid");
+
+        final Tuple2<Stream<String>, Stream<Object>> result = 
dao.buildQuery(condition);
+        final List<String> conditions = 
result._1().collect(Collectors.toList());
+        final List<Object> parameters = 
result._2().collect(Collectors.toList());
+
+        assertThat(conditions).contains(Event.UUID + "=?");
+        assertThat(parameters).contains("test-uuid");
+    }
+
+    @Test
+    void buildQuery_withSource_shouldIncludeServiceConditions() {
+        final EventQueryCondition condition = new EventQueryCondition();
+        final Source source = new Source();
+        source.setService("order-service");
+        source.setServiceInstance("instance-1");
+        source.setEndpoint("/orders");
+        condition.setSource(source);
+
+        final Tuple2<Stream<String>, Stream<Object>> result = 
dao.buildQuery(condition);
+        final List<String> conditions = 
result._1().collect(Collectors.toList());
+        final List<Object> parameters = 
result._2().collect(Collectors.toList());
+
+        assertThat(conditions).contains(Event.SERVICE + "=?");
+        assertThat(conditions).contains(Event.SERVICE_INSTANCE + "=?");
+        assertThat(conditions).contains(Event.ENDPOINT + "=?");
+        assertThat(parameters).contains("order-service", "instance-1", 
"/orders");
+    }
+
+    @Test
+    void buildQuery_withEventType_shouldIncludeTypeCondition() {
+        final EventQueryCondition condition = new EventQueryCondition();
+        condition.setType(EventType.Normal);
+
+        final Tuple2<Stream<String>, Stream<Object>> result = 
dao.buildQuery(condition);
+        final List<String> conditions = 
result._1().collect(Collectors.toList());
+        final List<Object> parameters = 
result._2().collect(Collectors.toList());
+
+        assertThat(conditions).contains(Event.TYPE + "=?");
+        assertThat(parameters).contains(EventType.Normal.name());
+    }
+
+    @Test
+    void buildQuery_withTableColumnConditionOnlyOnce() {
+        final EventQueryCondition condition = new EventQueryCondition();
+        condition.setUuid("uuid-1");
+
+        final Tuple2<Stream<String>, Stream<Object>> result = 
dao.buildQuery(condition);
+        final List<String> conditions = 
result._1().collect(Collectors.toList());
+
+        final long tableColumnCount = conditions.stream()
+            .filter(c -> c.equals(JDBCTableInstaller.TABLE_COLUMN + " = ?"))
+            .count();
+        assertThat(tableColumnCount).as("TABLE_COLUMN condition should appear 
exactly once").isEqualTo(1);
+    }
+}
diff --git 
a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/test/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/common/dao/JDBCProfileThreadSnapshotQueryDAOTest.java
 
b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/test/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/common/dao/JDBCProfileThreadSnapshotQueryDAOTest.java
new file mode 100644
index 0000000000..808d2e4a17
--- /dev/null
+++ 
b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/test/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/common/dao/JDBCProfileThreadSnapshotQueryDAOTest.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.oap.server.storage.plugin.jdbc.common.dao;
+
+import 
org.apache.skywalking.oap.server.core.profiling.trace.ProfileThreadSnapshotRecord;
+import 
org.apache.skywalking.oap.server.library.client.jdbc.hikaricp.JDBCClient;
+import 
org.apache.skywalking.oap.server.storage.plugin.jdbc.common.JDBCTableInstaller;
+import org.apache.skywalking.oap.server.storage.plugin.jdbc.common.TableHelper;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.mockito.junit.jupiter.MockitoSettings;
+import org.mockito.quality.Strictness;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.concurrent.atomic.AtomicReference;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doAnswer;
+
+@ExtendWith(MockitoExtension.class)
+@MockitoSettings(strictness = Strictness.LENIENT)
+class JDBCProfileThreadSnapshotQueryDAOTest {
+
+    private static final String TABLE = ProfileThreadSnapshotRecord.INDEX_NAME;
+
+    @Mock
+    private JDBCClient jdbcClient;
+    @Mock
+    private TableHelper tableHelper;
+
+    private JDBCProfileThreadSnapshotQueryDAO dao;
+
+    @BeforeEach
+    void setUp() {
+        dao = new JDBCProfileThreadSnapshotQueryDAO(jdbcClient, tableHelper);
+    }
+
+    @Test
+    void querySegments_shouldContainTableColumnCondition() throws SQLException 
{
+        final AtomicReference<String> capturedSql = new AtomicReference<>();
+        doAnswer(invocation -> {
+            capturedSql.set(invocation.getArgument(0));
+            return new ArrayList<>();
+        }).when(jdbcClient).executeQuery(anyString(), any(), 
any(Object[].class));
+
+        dao.querySegments("task-1", TABLE);
+
+        assertThat(capturedSql.get()).contains(JDBCTableInstaller.TABLE_COLUMN 
+ " = ?");
+    }
+
+    @Test
+    void querySegments_shouldFilterByTaskId() throws SQLException {
+        final AtomicReference<String> capturedSql = new AtomicReference<>();
+        doAnswer(invocation -> {
+            capturedSql.set(invocation.getArgument(0));
+            return new ArrayList<>();
+        }).when(jdbcClient).executeQuery(anyString(), any(), 
any(Object[].class));
+
+        dao.querySegments("task-abc", TABLE);
+
+        
assertThat(capturedSql.get()).contains(ProfileThreadSnapshotRecord.TASK_ID + " 
= ?");
+    }
+
+    @Test
+    void querySegments_shouldFilterBySequenceZero() throws SQLException {
+        final AtomicReference<String> capturedSql = new AtomicReference<>();
+        doAnswer(invocation -> {
+            capturedSql.set(invocation.getArgument(0));
+            return new ArrayList<>();
+        }).when(jdbcClient).executeQuery(anyString(), any(), 
any(Object[].class));
+
+        dao.querySegments("task-1", TABLE);
+
+        
assertThat(capturedSql.get()).contains(ProfileThreadSnapshotRecord.SEQUENCE + " 
= 0");
+    }
+}

Reply via email to