单元测试

This commit is contained in:
waner 2025-06-05 09:30:32 +08:00
parent e2c8695f47
commit 9fbcd1baad
4 changed files with 62 additions and 52 deletions

View File

@ -259,11 +259,10 @@ public class Test4Jemter extends AbstractJavaSamplerClient {
//detach验签 //detach验签
boolean ver1 = api.get().detachedVerify(orgData, detachedSign); boolean ver1 = api.get().detachedVerify(orgData, detachedSign);
// testImportCert();
testImportCert();
} }
public void testImportCert() { private void testImportCert() {
String cert = "-----BEGIN CERTIFICATE-----\n" + String cert = "-----BEGIN CERTIFICATE-----\n" +
"MIICMDCCAdagAwIBAgIJAOWoGwJCnjlLMAoGCCqBHM9VAYN1MGcxCzAJBgNVBAYT\n" + "MIICMDCCAdagAwIBAgIJAOWoGwJCnjlLMAoGCCqBHM9VAYN1MGcxCzAJBgNVBAYT\n" +
"AkNOMRAwDgYDVQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdIYWlEaWFuMRMwEQYDVQQK\n" + "AkNOMRAwDgYDVQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdIYWlEaWFuMRMwEQYDVQQK\n" +
@ -278,18 +277,18 @@ public class Test4Jemter extends AbstractJavaSamplerClient {
"BggqgRzPVQGDdQNIADBFAiEA4kgTdn/iA/XYfjTEeOcELwBXd0tTFghkpfP8DhBF\n" + "BggqgRzPVQGDdQNIADBFAiEA4kgTdn/iA/XYfjTEeOcELwBXd0tTFghkpfP8DhBF\n" +
"KFQCIAXZTL6VPtW67tM/DF4ZgFt5S/YIiFombKa2bWOfL81u\n" + "KFQCIAXZTL6VPtW67tM/DF4ZgFt5S/YIiFombKa2bWOfL81u\n" +
"-----END CERTIFICATE-----"; "-----END CERTIFICATE-----";
List<String> masterNodes = new ArrayList<>();
masterNodes.add("172.1.41.139:8889");
int timeout = 1000;
Map<String, String> map = new HashMap<>(); Map<String, String> map = new HashMap<>();
map.put("snmp.target.ip", "172.1.41.191"); map.put("snmp.target.ip", "172.1.41.191");
map.put("snmp.target.port", "162"); map.put("snmp.target.port", "162");
map.put("enterprise.oid", "1.3.6.1.4.1.9999"); map.put("enterprise.oid", "1.3.6.1.4.1.9999");
map.put("snmp.community", "public"); map.put("snmp.community", "public");
map.put("snmp.version", "1"); map.put("snmp.version", "1");
List<String> masterNodes = new ArrayList<>();
masterNodes.add("172.1.41.139:8889");
String snmpConfig = new Gson().toJson(map); String snmpConfig = new Gson().toJson(map);
SydApi4j sydApi4j = new SydApi4j(); SydApi4j sydApi4j = new SydApi4j();
sydApi4j.importCertToServers(masterNodes, 100, cert, "12345678", snmpConfig); sydApi4j.importCertToServers(masterNodes, timeout, cert, "12345678", snmpConfig);
} }
/** /**

View File

@ -138,7 +138,7 @@ public class SydApiException extends RuntimeException{
} }
public SydApiException(String msg, int retCode, boolean flag){ public SydApiException(String msg, int retCode, boolean flag){
super(String.format(" %04X", retCode) + ":" + ( null == msg ? transMsg(retCode) : msg )); super(null == msg ? transMsg(retCode) : msg);
this.retCode = retCode; this.retCode = retCode;
if (null == msg || "".equals(msg)){ if (null == msg || "".equals(msg)){
transMsg(); transMsg();

View File

@ -1,6 +1,7 @@
package racal.sunyard.main; package racal.sunyard.main;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Assert;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
import com.sunyard.RetWrap; import com.sunyard.RetWrap;
@ -85,8 +86,6 @@ public class SydApi4j implements SydApi {
private final Object reqLock = new Object(); private final Object reqLock = new Object();
private final Lock connectLock = new ReentrantLock();
/** --------------------------主备切换字段--------------------------------------------*/ /** --------------------------主备切换字段--------------------------------------------*/
// 网络失败时重试次数 // 网络失败时重试次数
@ -128,7 +127,7 @@ public class SydApi4j implements SydApi {
* @param ip2 * @param ip2
* @param port * @param port
* @param timeout * @param timeout
* todo 不应该这样使用 * todo 目前主备切换只适配了安徽农信接口
* @return * @return
*/ */
public static int SYD_Set_Parameter_HA( public static int SYD_Set_Parameter_HA(
@ -137,12 +136,13 @@ public class SydApi4j implements SydApi {
int port, int port,
int timeout int timeout
) { ) {
Assert.notBlank(ip1, "主机IP不能为空");
Assert.notBlank(ip2, "备机IP不能为空");
Assert.notNull(port, "端口不能为空");
SydApi4j.ha_ip1 = ip1; SydApi4j.ha_ip1 = ip1;
SydApi4j.ha_ip2 = ip2; SydApi4j.ha_ip2 = ip2;
SydApi4j.ha_port = port; SydApi4j.ha_port = port;
SydApi4j.ha_timeout = timeout; SydApi4j.ha_timeout = timeout;
return 0; return 0;
} }
@ -713,7 +713,7 @@ public class SydApi4j implements SydApi {
ByteBuffer readData = null; ByteBuffer readData = null;
int maxRetries = 2; int maxRetries = 2;
int retryCount = 0; int retryCount = 0;
while (retryCount <= maxRetries) { while (retryCount < maxRetries) {
try { try {
synchronized(reqLock) { synchronized(reqLock) {
byte[] sentData = this.syncSend(data); byte[] sentData = this.syncSend(data);
@ -858,10 +858,11 @@ public class SydApi4j implements SydApi {
data.put("returnSign$option", 0); data.put("returnSign$option", 0);
ByteBuffer bb = proto.rend(packet); ByteBuffer bb = proto.rend(packet);
synchronized(this) { // synchronized(this) {
byte[] b = this.syncSend(bb); // byte[] b = this.syncSend(bb);
bb = this.syncRead(b); // bb = this.syncRead(b);
} // }
bb = sendAndGetResponse(bb);
Packet p = proto.parse(bb, packet); Packet p = proto.parse(bb, packet);
Map<String, Object> ret = p.toMap(); Map<String, Object> ret = p.toMap();
@ -1397,6 +1398,10 @@ public class SydApi4j implements SydApi {
} catch (Exception e) { } catch (Exception e) {
log.warn("snmp告警消息发送失败:{}", e.getMessage()); log.warn("snmp告警消息发送失败:{}", e.getMessage());
} }
// Map<String, String> msgMap = new HashMap<>();
// msgMap.put("alarmMsg", message);
// msgMap.put("certDn", dn);
// throw new SydApiException(gson.toJson(msgMap) ,56300, true);
} }
return dn; return dn;
} }
@ -2357,14 +2362,14 @@ public class SydApi4j implements SydApi {
// 优先尝试主节点 // 优先尝试主节点
if (!usingBackup.get()) { if (!usingBackup.get()) {
if (tryConnect(ha_ip1)) { if (tryConnect(ha_ip1)) {
System.out.println("连接到主节点: " + ha_ip1); // System.out.println("连接到主节点: " + ha_ip1);
return; return;
} }
} }
// 连接到备节点 // 连接到备节点
if (tryConnect(ha_ip2)) { if (tryConnect(ha_ip2)) {
System.out.println("连接到备节点: " + ha_ip2); // System.out.println("连接到备节点: " + ha_ip2);
usingBackup.set(true); usingBackup.set(true);
return; return;
} }
@ -2382,12 +2387,10 @@ public class SydApi4j implements SydApi {
if (ha_timeout > 0) { if (ha_timeout > 0) {
newSocket.connect(address, ha_timeout); newSocket.connect(address, ha_timeout);
newSocket.setSoTimeout(ha_timeout);
} else { } else {
newSocket.connect(address); newSocket.connect(address);
} }
newSocket.setSoTimeout(ha_timeout);
// 关闭旧socket如果存在 // 关闭旧socket如果存在
safeClose(); safeClose();
this.socket = newSocket; this.socket = newSocket;
@ -2400,31 +2403,29 @@ public class SydApi4j implements SydApi {
private synchronized void handleNetworkFailure(Exception e, int retryCount, int maxRetries) { private synchronized void handleNetworkFailure(Exception e, int retryCount, int maxRetries) {
if (retryCount > maxRetries) { if (retryCount > maxRetries) {
System.out.println(Thread.currentThread().getName() + "重试次数耗尽");
return; return;
} }
// System.out.printf("线程[%s]网络故障,尝试切换节点 (重试: %d/%d)%n",
System.out.printf("线程[%s]网络故障,尝试切换节点 (重试: %d/%d)%n", // Thread.currentThread().getName(), retryCount + 1, maxRetries);
Thread.currentThread().getName(), retryCount + 1, maxRetries);
boolean currentState = usingBackup.get(); boolean currentState = usingBackup.get();
boolean newState = !currentState; boolean newState = !currentState;
if (usingBackup.compareAndSet(currentState, newState)) { if (usingBackup.compareAndSet(currentState, newState)) {
String targetIp = newState ? ha_ip2 : ha_ip1; String targetIp = newState ? ha_ip2 : ha_ip1;
System.out.println("全局节点切换: " + (currentState ? "备机" : "主机") + "" + // System.out.println("全局节点切换: " + (currentState ? "备机" : "主机") + "" +
(newState ? "备机" : "主机")); // (newState ? "备机" : "主机"));
try { try {
safeClose(); safeClose();
connect(targetIp, ha_port, ha_timeout); connect(targetIp, ha_port, ha_timeout);
System.out.println("线程[" + Thread.currentThread().getName() + "]连接重建成功"); // System.out.println("线程[" + Thread.currentThread().getName() + "]连接重建成功");
} catch (Exception ex) { } catch (Exception ex) {
System.out.println("线程[" + Thread.currentThread().getName() + "]节点切换失败: " + ex.getMessage()); // System.out.println("线程[" + Thread.currentThread().getName() + "]节点切换失败: " + ex.getMessage());
usingBackup.compareAndSet(newState, currentState); usingBackup.compareAndSet(newState, currentState);
} }
} else { } else {
System.out.println("线程[" + Thread.currentThread().getName() + "]节点已被其他线程切换,使用新节点"); System.err.println("线程[" + Thread.currentThread().getName() + "]节点已被其他线程切换,使用新节点");
} }
} }
@ -2433,7 +2434,7 @@ public class SydApi4j implements SydApi {
try { try {
socket.close(); socket.close();
} catch (IOException e) { } catch (IOException e) {
System.out.println("关闭连接异常: " + e.getMessage()); System.err.println("关闭连接异常: " + e.getMessage());
} }
socket = null; socket = null;
} }
@ -2633,15 +2634,16 @@ public class SydApi4j implements SydApi {
private void connect(String ip, int port, int timeout) { private void connect(String ip, int port, int timeout) {
synchronized (reqLock) { synchronized (reqLock) {
safeClose(); safeClose();
try { try {
Socket newSocket = new Socket(); Socket newSocket = new Socket();
SocketAddress address = new InetSocketAddress(ip, port); SocketAddress address = new InetSocketAddress(ip, port);
if (timeout > 0) {
newSocket.connect(address, timeout); newSocket.connect(address, timeout);
newSocket.setSoTimeout(timeout); newSocket.setSoTimeout(timeout);
} else {
newSocket.connect(address);
}
this.socket = newSocket; this.socket = newSocket;
System.out.printf("线程[%s]连接到%s:%d%n",
Thread.currentThread().getName(), ip, port);
} catch (IOException e) { } catch (IOException e) {
throw new SydApiException("连接失败: " + ip + ":" + port, -2, e); throw new SydApiException("连接失败: " + ip + ":" + port, -2, e);
} }
@ -2660,10 +2662,10 @@ public class SydApi4j implements SydApi {
try { try {
if (timeout > 0) { if (timeout > 0) {
socket.connect(address, timeout); socket.connect(address, timeout);
socket.setSoTimeout(timeout);
} else { } else {
socket.connect(address); socket.connect(address);
} }
socket.setSoTimeout(timeout);
} catch (Exception e) { } catch (Exception e) {
socket = reConnect(new SydApiException(-2, e)); socket = reConnect(new SydApiException(-2, e));
} }
@ -2739,7 +2741,6 @@ public class SydApi4j implements SydApi {
while (this.retryWhenNetError > 0) { while (this.retryWhenNetError > 0) {
try { try {
println("Net error retry on " + this.retryWhenNetError); println("Net error retry on " + this.retryWhenNetError);
System.out.println("Net error retry on ");
Socket socket = new Socket(); Socket socket = new Socket();
SocketAddress address = new InetSocketAddress(ip, port); SocketAddress address = new InetSocketAddress(ip, port);

View File

@ -1,13 +1,10 @@
package sample; package sample;
import cn.hutool.core.date.StopWatch; import cn.hutool.core.date.StopWatch;
import cn.hutool.core.date.Week;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.sunyard.SydApiException; import com.sunyard.SydApiException;
import com.sunyard.proto.Util; import com.sunyard.proto.Util;
import com.sunyard.snmp.SnmpTrapSender;
import com.sunyard.util.IpLockUtils; import com.sunyard.util.IpLockUtils;
import org.bouncycastle.util.encoders.Hex;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -56,8 +53,9 @@ public class Test4NongxinCW {
@Test @Test
public void testHA() { public void testHA() {
for (int i = 0; i < 10000; i++) { for (int i = 0; i < 100000; i++) {
byte[] nakedSign = api.SYD_NakedSign(orgData,SM2dn); byte[] nakedSign = api.SYD_NakedSign(orgData,SM2dn);
// System.out.println("SM2签名"+ Util.bytes2HexString(nakedSign));
} }
} }
@ -261,8 +259,13 @@ public class Test4NongxinCW {
List<Thread> threads = new ArrayList<>(); List<Thread> threads = new ArrayList<>();
// 创建100个线程 // 创建100个线程
for (int i = 0; i < 200; i++) { for (int i = 0; i < 20; i++) {
Thread thread = new Thread(this::importAllCert); Thread thread = new Thread(() -> {
for (int j = 0; j < 1000; j++) {
api.SYD_NakedSign(orgData,SM2dn);
importAllCert();
}
});
thread.start(); thread.start();
threads.add(thread); threads.add(thread);
} }
@ -272,7 +275,7 @@ public class Test4NongxinCW {
thread.join(); thread.join();
} }
System.out.println(IpLockUtils.getLockStatus("172.1.41.96:8889")); System.out.println(IpLockUtils.getLockStatus("172.1.41.139:8889"));
System.out.println("所有线程执行完毕"); System.out.println("所有线程执行完毕");
} }
@ -319,9 +322,9 @@ public class Test4NongxinCW {
// masterNodes.add("172.16.18.99:8889"); // masterNodes.add("172.16.18.99:8889");
// masterNodes.add("172.16.18.5:8889"); // masterNodes.add("172.16.18.5:8889");
masterNodes.add("172.1.41.139:8889"); masterNodes.add("172.1.41.139:8889");
masterNodes.add("172.1.41.96:8889"); // masterNodes.add("172.1.41.96:8889");
// masterNodes.add("172.16.18.8:8889"); // masterNodes.add("172.16.18.8:8889");
int timeout = 1; int timeout = 1000;
Map<String, String> map = new HashMap<>(); Map<String, String> map = new HashMap<>();
map.put("snmp.target.ip", "172.1.41.191"); map.put("snmp.target.ip", "172.1.41.191");
map.put("snmp.target.port", "162"); map.put("snmp.target.port", "162");
@ -330,7 +333,14 @@ public class Test4NongxinCW {
map.put("snmp.version", "1"); map.put("snmp.version", "1");
String snmpConfig = new Gson().toJson(map); String snmpConfig = new Gson().toJson(map);
SydApi4j sydApi4j = new SydApi4j(); SydApi4j sydApi4j = new SydApi4j();
sydApi4j.importCertToServers(masterNodes, timeout, cert1, "12345678", snmpConfig); sydApi4j.importCertToServers(masterNodes, timeout, cert, "12345678", snmpConfig);
// try {
// sydApi4j.importCertToServers(masterNodes, timeout, cert1, "12345678", snmpConfig);
// } catch (SydApiException e) {
//// if (e.getRetCode() == 56300) {
//// System.out.println(e.getMessage());
//// }
// }
stopWatch.stop(); stopWatch.stop();
System.out.println(stopWatch.getTotalTimeSeconds()); System.out.println(stopWatch.getTotalTimeSeconds());
} }
@ -359,8 +369,8 @@ public class Test4NongxinCW {
@Test @Test
public void selCert() { public void selCert() {
String sign = "3045022100F2C494D20823AB12D9D4D23FA12C7D856D4993BE122089D86A515F217CF51C0C02207E06F505F4E70893226F7B22B34E6578570E2813CB0CF1A6775A7782C7C45F7B"; String data = "MIIDyQYKKoEcz1UGAQQCAqCCA7kwggO1AgEBMQ4wDAYIKoEcz1UBgxEFADAMBgoqgRzPVQYBBAIBoIICujCCArYwggJboAMCAQICBSBhWZmSMAwGCCqBHM9VAYN1BQAwXTELMAkGA1UEBhMCQ04xMDAuBgNVBAoMJ0NoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEcMBoGA1UEAwwTQ0ZDQSBURVNUIFNNMiBPQ0ExMTAeFw0yMjEwMjQwMTM4NDdaFw0yNTEwMjQxNTU5NTlaMG0xCzAJBgNVBAYTAmNuMRUwEwYDVQQKDAxDRkNBIFRFU1QgQ0ExDjAMBgNVBAsMBUNOQVBTMRQwEgYDVQQLDAtFbnRlcnByaXNlczEhMB8GA1UEAwwYMDQxQFowMDAwQG5wYzAyQDAwMDAwMDU3MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEogTVy1LIqW7BXiOoNkMZ3h3IsWFXQ7MUOvGuXzsneZTLKxAEUsyzQg+Q1lOwGhU8GzcWs4TFWe0o4xGJZch0zqOB9TCB8jAfBgNVHSMEGDAWgBS+pn5NPXyPoFXmwS8JLiwgQ7NCfzBIBgNVHSAEQTA/MD0GCGCBHIbvKgECMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2ZjYS5jb20uY24vdXMvdXMtMTUuaHRtMDoGA1UdHwQzMDEwL6AtoCuGKWh0dHA6Ly8yMTAuNzQuNDIuMy9PQ0ExMS9TTTIvY3JsMjI5OTAuY3JsMAsGA1UdDwQEAwID6DAdBgNVHQ4EFgQUoOXRJpClT9Q3Gnq/VZhoryt8VNEwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMAwGCCqBHM9VAYN1BQADRwAwRAIgThN7q4hMTNFDM3LcI4BuLpqLjNQA2psZLHBW9/18I74CIHCa1Sfy3DX/IZr0JbDH1EhzArj4ZWtblKC0M/8C38yYMYHTMIHQAgEBMGYwXTELMAkGA1UEBhMCQ04xMDAuBgNVBAoMJ0NoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEcMBoGA1UEAwwTQ0ZDQSBURVNUIFNNMiBPQ0ExMQIFIGFZmZIwDAYIKoEcz1UBgxEFADANBgkqgRzPVQGCLQEFAARGMEQCIAdiCAIN/KNfW1SlsBfs1FCkDTBCG6Xbt42JvXxLLEO/AiBaAN1AT7JLWxHLz0YcmbB9wkkUy4kZOFXxaVU+qbleHQ==";
String s = api.getCertBySign(sign); String s = api.getCertBySign(data);
System.out.println(s); System.out.println(s);
} }