From e38aca8134570513435c003c25dc05f1ae51c9c9 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期四, 08 十月 2026 13:56:28 +0800
Subject: [PATCH] 实现 Ticket04:采集器辅助测量与登记入口,拆除开发模拟器

---
 battery-device-neware/src/test/java/com/battery/device/neware/ReadOnlyVendorDataSourceTest.java |   33 +++++++++++++++++++++++++++++++++
 1 files changed, 33 insertions(+), 0 deletions(-)

diff --git a/battery-device-neware/src/test/java/com/battery/device/neware/ReadOnlyVendorDataSourceTest.java b/battery-device-neware/src/test/java/com/battery/device/neware/ReadOnlyVendorDataSourceTest.java
index 9141429..b78ac57 100644
--- a/battery-device-neware/src/test/java/com/battery/device/neware/ReadOnlyVendorDataSourceTest.java
+++ b/battery-device-neware/src/test/java/com/battery/device/neware/ReadOnlyVendorDataSourceTest.java
@@ -158,4 +158,37 @@
         assertTrue(database.statements().isEmpty());
         assertEquals(3, dataSource.audit().rejectedStatements().size());
     }
+
+    /** 加锁读以 select 开头却是真的会阻塞厂商写入,所以必须在到达驱动之前被单独拒绝。 */
+    @Test
+    void lockingReadsAreRejectedBeforeTheyReachTheDriver()
+    {
+        FakeVendorDatabase database = new FakeVendorDatabase();
+        ReadOnlyVendorDataSource dataSource = dataSourceOver(database);
+        for (String sql : List.of("select dev_uid from channel for update",
+                "select dev_uid from channel FOR SHARE",
+                "select dev_uid from channel lock in share mode",
+                "select dev_uid from channel with (updlock)",
+                "/* probe */ select dev_uid from channel with (tablock, holdlock)"))
+        {
+            assertTrue(ReadOnlyVendorDataSource.isQuery(sql), "加锁读仍然以查询开头:" + sql);
+            assertTrue(ReadOnlyVendorDataSource.containsLockingClause(sql), "应当识别为加锁读:" + sql);
+            assertThrows(NonQueryStatementException.class,
+                    () -> dataSource.getConnection().prepareStatement(sql), sql);
+        }
+        assertTrue(database.statements().isEmpty(), "加锁读不得到达驱动");
+        assertTrue(!ReadOnlyVendorDataSource.containsLockingClause("select dev_uid from channel"));
+        assertTrue(!ReadOnlyVendorDataSource.containsLockingClause(""));
+    }
+
+    /** 连接超时与读取超时都必须由我们显式给出,且不得写入只读事务参数(5.5 不支持)。 */
+    @Test
+    void vendorJdbcUrlCarriesBothTimeoutsAndNoReadOnlySessionVariable()
+    {
+        String url = NewareMysqlAdapterFactory.jdbcUrl("26.1.2.3", 3306, "bts63");
+
+        assertTrue(url.contains("connectTimeout="), url);
+        assertTrue(url.contains("socketTimeout="), url);
+        assertTrue(!url.contains("transaction_read_only"), url);
+    }
 }

--
Gitblit v1.7.1