diff --git a/pom.xml b/pom.xml
index e1a1e14..7bf461d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
com.sunyard.sge.database
sydapi-database
- 1.26
+ 1.28
sydapi-database
diff --git a/src/main/java/com/sunyard/sge/database/SydApi4Database.java b/src/main/java/com/sunyard/sge/database/SydApi4Database.java
index b2e5d8f..480c661 100644
--- a/src/main/java/com/sunyard/sge/database/SydApi4Database.java
+++ b/src/main/java/com/sunyard/sge/database/SydApi4Database.java
@@ -152,7 +152,7 @@ public class SydApi4Database extends SydApiBaseFunction {
}
if ( iKeyIndex.length != pcData.size() ) {
- throw new IllegalArgumentException("批量输入数据密钥和数据数量不等");
+ throw new SydApiException("批量输入数据密钥和数据数量不等", 0x01000001);
}
if ( 0 == iKeyIndex.length ) {
diff --git a/src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java b/src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java
index eac85db..261c65b 100644
--- a/src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java
+++ b/src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java
@@ -20,6 +20,8 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import static com.sunyard.sge.database.SydApiConfig.BATCH_SIZE;
+
/**
* 上海黄金交易所 - 数据库加密方案
*/
@@ -575,80 +577,7 @@ public class SydApiBaseFunction implements SydApi {
@Override
public List SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData) {
-
- if (log.isDebugEnabled()) {
- log.debug("SYD_SM4Mac_BatchData:iKeyIndex:{},pcData元素个数为:{}", iKeyIndex, pcData.size());
- }
-
- if (pcData.isEmpty()) {
- return new ArrayList<>();
- }
-
- if (null == this.hsms || this.hsms.length < 1) {
- throw new SydApiException(-1);
- }
-
- String[] keys = new String[iKeyIndex.length];
- updateLastUseTime();
- for (int i = 0; i < iKeyIndex.length; i++) {
- if (iKeyIndex[i] < 0) {
- throw new SydApiException(0x01000001);
- }
- keys[i] = "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", String.format("%08d", iKeyIndex[i]));
- }
- SydApiException le = new SydApiException(-1);
- for (SydApi4j api : this.hsms) {
- if (null == api) {
- continue;
- }
- if (isShortLinkMode) {
- try {
- List list = api.SYMEncryptDecryptBatchData(8, 2, null, keys, 1, pcData);
- List ret = new ArrayList<>(list.size());
- for (int i = 0; i < list.size(); i++) {
- byte[] mac = new byte[16];
- byte[] buff = list.get(i);
- System.arraycopy(buff, buff.length - 16, mac, 0, 16);
- ret.add(mac);
- }
- return ret;
-
- } catch (SydApiException e) {
- le = e;
- if (e.getRetCode() < 0) {
- log.error("HA 重试");
- continue;
- }
- throw e;
- }
- } else {
- synchronized (api) {
- try {
- List list = api.SYMEncryptDecryptBatchData(8, 2, null, keys, 1, pcData);
- List ret = new ArrayList<>(list.size());
- for (int i = 0; i < list.size(); i++) {
- byte[] mac = new byte[16];
- byte[] buff = list.get(i);
- System.arraycopy(buff, buff.length - 16, mac, 0, 16);
- ret.add(mac);
- }
- return ret;
-
- } catch (SydApiException e) {
- le = e;
- if (e.getRetCode() < 0) {
- log.error("HA 重试");
- continue;
- }
- throw e;
- }
- }
- }
- }
- if (!this.isShortLinkMode) {
- this.oip.setError();
- }
- throw le;
+ return sm4Mac_BatchData(iKeyIndex, pcData, true);
}
@Override
@@ -662,6 +591,12 @@ public class SydApiBaseFunction implements SydApi {
return new boolean[0];
}
+ for (byte[] pcdata : pcData) {
+ if (pcdata.length > 1040) {
+ throw new SydApiException("数据长度错误",0x01000001);
+ }
+ }
+
if (null == this.hsms || this.hsms.length < 1) {
throw new SydApiException(-1);
}
@@ -1095,8 +1030,8 @@ public class SydApiBaseFunction implements SydApi {
return new ArrayList<>();
}
- List enDatas = SYD_SM4_BatchData(iEncKeyIndex, pcData, Consts.ECB_ENC);
- List macs = SYD_SM4Mac_BatchData(iMacKeyIndex, enDatas);
+ List enDatas = my_SYD_SM4_BatchData(iEncKeyIndex, pcData, Consts.ECB_ENC);
+ List macs = my_SYD_SM4Mac_BatchData(iMacKeyIndex, enDatas);
List ret = new ArrayList();
for (int i = 0; i < enDatas.size(); i++) {
DataAndMac dam = new DataAndMac(enDatas.get(i), macs.get(i));
@@ -1105,6 +1040,278 @@ public class SydApiBaseFunction implements SydApi {
return ret;
}
+ private List my_SYD_SM4_BatchData(int[] iKeyIndex, List pcData, int iFlag) {
+
+ if ( null == iKeyIndex || null == pcData ) {
+ throw new IllegalArgumentException("批量输入数据为 null");
+ }
+
+ if ( iKeyIndex.length != pcData.size() ) {
+ throw new SydApiException("批量输入数据密钥和数据数量不等", 0x01000001);
+ }
+
+ if ( 0 == iKeyIndex.length ) {
+ return new ArrayList<>();
+ }
+
+ // 将数据进行分组,防止超长。
+ List> dataGroups = new ArrayList<>();
+ List> keyGroups = new ArrayList<>();
+ int totalLen = 0;
+
+ List curDataGroup = new ArrayList<>();
+ List curKeyGroup = new ArrayList<>();
+
+ for (int i = 0; i < pcData.size(); i++) {
+ byte[] data = pcData.get(i);
+ if (null == data) {
+ data = new byte[0];
+ }
+ if (
+ curDataGroup.size() > 9 // 分组小于等于 9 个
+ || (totalLen + data.length > BATCH_SIZE) // 总大小小于 BATCH_SIZE
+ ) { // 扩展包
+ dataGroups.add(curDataGroup);
+ keyGroups.add(curKeyGroup);
+
+ curDataGroup = new ArrayList<>();
+ curKeyGroup = new ArrayList<>();
+ totalLen = 0;
+ }
+
+
+ curDataGroup.add(data);
+ curKeyGroup.add(iKeyIndex[i]);
+
+ totalLen += data.length;
+
+ }
+
+ dataGroups.add(curDataGroup);
+ keyGroups.add(curKeyGroup);
+
+ // 排队处理
+ List ret = new ArrayList<>();
+ for (int i = 0; i < dataGroups.size(); i++) {
+ ret.addAll(SYD_SM4_BatchData(toIntArray(keyGroups.get(i)), dataGroups.get(i), iFlag));
+ }
+
+ return ret;
+ }
+
+ private List my_SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData) {
+
+ if ( null == iKeyIndex || null == pcData ) {
+ throw new IllegalArgumentException("批量输入数据为 null");
+ }
+
+ if ( iKeyIndex.length != pcData.size() ) {
+ throw new IllegalArgumentException("批量输入数据密钥和数据数量不等");
+ }
+
+ if ( 0 == iKeyIndex.length ) {
+ return new ArrayList<>();
+ }
+
+ // 将数据进行分组,防止超长。
+ List> dataGroups = new ArrayList<>();
+ List> keyGroups = new ArrayList<>();
+ int totalLen = 0;
+
+ List curDataGroup = new ArrayList<>();
+ List curKeyGroup = new ArrayList<>();
+
+ for (int i = 0; i < pcData.size(); i++) {
+ byte[] data = pcData.get(i);
+ if (null == data) {
+ data = new byte[0];
+ }
+ if (
+ curDataGroup.size() > 9 // 分组小于等于 9 个
+ || (totalLen + data.length > BATCH_SIZE) // 总大小小于 BATCH_SIZE
+ ) {// 扩展包
+ dataGroups.add(curDataGroup);
+ keyGroups.add(curKeyGroup);
+
+ curDataGroup = new ArrayList<>();
+ curKeyGroup = new ArrayList<>();
+ totalLen = 0;
+ }
+
+ curDataGroup.add(data);
+ curKeyGroup.add(iKeyIndex[i]);
+
+ totalLen += data.length;
+ }
+
+ dataGroups.add(curDataGroup);
+ keyGroups.add(curKeyGroup);
+
+ // 排队处理
+ List ret = new ArrayList<>();
+ for (int i = 0; i < dataGroups.size(); i++) {
+ List macs = sm4Mac_BatchData(toIntArray(keyGroups.get(i)), dataGroups.get(i), false);
+ ret.addAll(macs);
+ }
+ return ret;
+ }
+
+ private boolean[] my_SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData, List pcMac) {
+
+ if ( null == iKeyIndex || null == pcData ) {
+ throw new IllegalArgumentException("批量输入数据为 null");
+ }
+
+ if ( iKeyIndex.length != pcData.size() ) {
+ throw new IllegalArgumentException("批量输入数据密钥和数据数量不等");
+ }
+
+ if ( 0 == iKeyIndex.length ) {
+ return new boolean[0];
+ }
+
+ // 将数据进行分组,防止超长。
+ List> dataGroups = new ArrayList<>();
+ List> keyGroups = new ArrayList<>();
+ List> macGroups = new ArrayList<>();
+ int totalLen = 0;
+
+ List curDataGroup = new ArrayList<>();
+ List curKeyGroup = new ArrayList<>();
+ List curMacGroup = new ArrayList<>();
+
+ for (int i = 0; i < pcData.size(); i++) {
+ byte[] data = pcData.get(i);
+ if (null == data) {
+ data = new byte[0];
+ }
+ if (
+ curDataGroup.size() > 9 // 分组小于等于 9 个
+ || (totalLen + data.length > BATCH_SIZE) // 总大小小于 BATCH_SIZE
+ ) {
+ // 扩展包
+ dataGroups.add(curDataGroup);
+ keyGroups.add(curKeyGroup);
+ macGroups.add(curMacGroup);
+
+ curDataGroup = new ArrayList<>();
+ curKeyGroup = new ArrayList<>();
+ curMacGroup = new ArrayList<>();
+ totalLen = 0;
+ }
+
+
+ curDataGroup.add(data);
+ curKeyGroup.add(iKeyIndex[i]);
+ curMacGroup.add(pcMac.get(i));
+ totalLen += data.length;
+ }
+
+ dataGroups.add(curDataGroup);
+ keyGroups.add(curKeyGroup);
+ macGroups.add(curMacGroup);
+
+ // 排队处理
+ List ret = new ArrayList<>();
+ for (int i = 0; i < dataGroups.size(); i++) {
+
+ boolean[] rets = SYD_SM4Mac_BatchData(
+ toIntArray(keyGroups.get(i)),
+ dataGroups.get(i),
+ macGroups.get(i)
+ );
+ for (boolean r : rets) {
+ ret.add(r);
+ }
+ }
+ return toBoolArray(ret);
+ }
+
+ private List sm4Mac_BatchData(int[] iKeyIndex, List pcData, boolean isLimit) {
+ if (log.isDebugEnabled()) {
+ log.debug("SYD_SM4Mac_BatchData:iKeyIndex:{},pcData元素个数为:{}", iKeyIndex, pcData.size());
+ }
+
+ if (pcData.isEmpty()) {
+ return new ArrayList<>();
+ }
+
+ //是否限制1024字节长度
+ if(isLimit){
+ for(byte[] data : pcData){
+ if (data.length > 1024) {
+ throw new SydApiException("数据长度超过限制", 0x01000001);
+ }
+ }
+ }
+
+ if (null == this.hsms || this.hsms.length < 1) {
+ throw new SydApiException(-1);
+ }
+
+ String[] keys = new String[iKeyIndex.length];
+ updateLastUseTime();
+ for (int i = 0; i < iKeyIndex.length; i++) {
+ if (iKeyIndex[i] < 0) {
+ throw new SydApiException(0x01000001);
+ }
+ keys[i] = "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", String.format("%08d", iKeyIndex[i]));
+ }
+ SydApiException le = new SydApiException(-1);
+ for (SydApi4j api : this.hsms) {
+ if (null == api) {
+ continue;
+ }
+ if (isShortLinkMode) {
+ try {
+ List list = api.SYMEncryptDecryptBatchData(8, 2, null, keys, 1, pcData);
+ List ret = new ArrayList<>(list.size());
+ for (int i = 0; i < list.size(); i++) {
+ byte[] mac = new byte[16];
+ byte[] buff = list.get(i);
+ System.arraycopy(buff, buff.length - 16, mac, 0, 16);
+ ret.add(mac);
+ }
+ return ret;
+
+ } catch (SydApiException e) {
+ le = e;
+ if (e.getRetCode() < 0) {
+ log.error("HA 重试");
+ continue;
+ }
+ throw e;
+ }
+ } else {
+ synchronized (api) {
+ try {
+ List list = api.SYMEncryptDecryptBatchData(8, 2, null, keys, 1, pcData);
+ List ret = new ArrayList<>(list.size());
+ for (int i = 0; i < list.size(); i++) {
+ byte[] mac = new byte[16];
+ byte[] buff = list.get(i);
+ System.arraycopy(buff, buff.length - 16, mac, 0, 16);
+ ret.add(mac);
+ }
+ return ret;
+
+ } catch (SydApiException e) {
+ le = e;
+ if (e.getRetCode() < 0) {
+ log.error("HA 重试");
+ continue;
+ }
+ throw e;
+ }
+ }
+ }
+ }
+ if (!this.isShortLinkMode) {
+ this.oip.setError();
+ }
+ throw le;
+ }
+
@Override
public List SYD_SM4_CheckMacAndDecrypt_BatchData(int[] iEncKeyIndex, int[] iMacKeyIndex, List pcData) {
@@ -1142,7 +1349,7 @@ public class SydApiBaseFunction implements SydApi {
// }
// 批量执行MAC校验
- boolean[] macCheck = SYD_SM4Mac_BatchData(iMacKeyIndex, datas, macs);
+ boolean[] macCheck = my_SYD_SM4Mac_BatchData(iMacKeyIndex, datas, macs);
// 分离通过和未通过MAC校验的数据
List validIndices = new ArrayList<>();
@@ -1167,7 +1374,7 @@ public class SydApiBaseFunction implements SydApi {
.mapToInt(Integer::intValue)
.toArray();
// 使用过滤后的密钥索引和数据
- decryptedData = SYD_SM4_BatchData(validKeysArray, validData, Consts.ECB_DEC);
+ decryptedData = my_SYD_SM4_BatchData(validKeysArray, validData, Consts.ECB_DEC);
}
// 构建结果集
diff --git a/src/test/java/test/FuncTest.java b/src/test/java/test/FuncTest.java
index 9d6c0f7..4725b55 100644
--- a/src/test/java/test/FuncTest.java
+++ b/src/test/java/test/FuncTest.java
@@ -7,7 +7,6 @@ import com.sunyard.proto.Util;
import com.sunyard.sge.database.*;
import com.sunyard.sge.log.LogbackFactory;
-
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -1049,7 +1048,7 @@ public class FuncTest {
} catch (SydApiException e){
printException("数据长度大于1024,校验失败", e);
} catch (Exception e){
- System.out.println("数据长度大于1024 异常: " + e.getMessage());
+ e.printStackTrace();
}
printEnd();
@@ -1060,7 +1059,7 @@ public class FuncTest {
} catch (SydApiException e){
printException("pcMac为空,校验失败", e);
} catch (Exception e){
- System.out.println("pcMac为空 异常: " + e.getMessage());
+ e.printStackTrace();
}
printEnd();
@@ -1341,7 +1340,7 @@ public class FuncTest {
} catch (SydApiException e){
printException("包序号为2时,pcProcData无输入,SM4MAC长数据校验失败",e);
} catch (Exception e){
- System.out.println("包序号为2时,pcProcData无输入 异常: " + e.getMessage());
+ e.printStackTrace();
}
try{
@@ -1360,7 +1359,7 @@ public class FuncTest {
} catch (SydApiException e){
printException("包序号为3时,pcProcData无输入,SM4MAC长数据校验失败",e);
} catch (Exception e){
- System.out.println("包序号为3时,pcProcData无输入 异常: " + e.getMessage());
+ e.printStackTrace();
}
printEnd();
@@ -1445,7 +1444,7 @@ public class FuncTest {
} catch (SydApiException e){
printException("输入包序号不为0-3,SM4MAC长数据计算失败",e);
} catch (Exception e){
- System.out.println("输入包序号不为0-3 异常: " + e.getMessage());
+ e.printStackTrace();
}
printEnd();
@@ -1463,7 +1462,7 @@ public class FuncTest {
} catch (SydApiException e){
printException("输入包序号不为0-3,SM4MAC长数据校验失败",e);
} catch (Exception e){
- System.out.println("输入包序号不为0-3 异常: " + e.getMessage());
+ e.printStackTrace();
}
printEnd();
@@ -1476,7 +1475,7 @@ public class FuncTest {
} catch (SydApiException e){
printException("输入大于4064的数据长度,SM4MAC长数据计算失败",e);
} catch (Exception e){
- System.out.println("输入大于4064的数据长度 异常: " + e.getMessage());
+ e.printStackTrace();
}
printEnd();
@@ -1496,7 +1495,7 @@ public class FuncTest {
} catch (SydApiException e){
printException("输入大于4064的数据长度,SM4MAC长数据校验失败",e);
} catch (Exception e){
- System.out.println("输入大于4064的数据长度 异常: " + e.getMessage());
+ e.printStackTrace();
}
printEnd();
@@ -1985,7 +1984,7 @@ public class FuncTest {
List s = api.SYD_SM4Mac_BatchData(keyIdx_insufficient, data);
System.out.println("索引个数与明文个数不一致,mac计算成功");
} catch (Exception e){
- System.out.println("索引个数与明文个数不一致,mac计算 异常:" + e.getMessage());
+ System.out.println("索引个数与明文个数不一致,mac计算失败 " + e.getMessage());
}
printEnd();
@@ -2052,6 +2051,8 @@ public class FuncTest {
}
} catch (SydApiException e){
printException("输入正确入参,计算失败", e);
+ } catch (Exception e){
+ e.printStackTrace();
}
printEnd();
@@ -2325,23 +2326,24 @@ public class FuncTest {
printBegin();
try{
- if(false){
- int max = 7;
- List data_test = new ArrayList<>();
- int[] keytest = new int[max];
- for(int i=0; i en_test = api.SYD_SM4_EncryptAndMac_BatchData(keytest, keytest, data_test);
- System.out.println("计算成功!!! " + en_test.size());
+ int max = 1024;
+ List data_test = new ArrayList<>();
+ int[] keytest = new int[max];
+ for(int i=0; i en_data = api.SYD_SM4_EncryptAndMac_BatchData(keyEnc, keyMac, data);
- List de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData(keyEnc, keyMac, en_data);
+ List en_data = api.SYD_SM4_EncryptAndMac_BatchData(keytest, keytest, data_test);
+ List de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData(keytest, keytest, en_data);
for(int i=0; i data_test = new ArrayList<>();
+ int[] keytest = new int[max];
+ for(int i=0; i en_data = api.SYD_SM4_EncryptAndMac_BatchData(keyEnc, keyMac, data);
- List de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData(keyEnc, keyMac, en_data);
+ List en_data = api.SYD_SM4_EncryptAndMac_BatchData(keytest, keytest, data_test);
+ List de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData(keytest, keytest, en_data);
for(int i=0; i tests = Arrays.asList(
- this::zc_sm3ShortFunc,
- this::zc_sm3LongFunc,
- this::zc_sm4ShortFunc,
- this::zc_sm4LongFunc,
- this::zc_sm4macShortFunc,
- this::zc_sm4macLongFunc,
- this::zc_sm4BatchFunc,
- this::zc_sm4macBatchFunc,
- this::zc_sm4ShortMacFunc,
- this::zc_sm4BatchMacFunc,
- this::zc_sm4ShortMacFunc_check,
- this::zc_sm4BatchMacFunc_check,
- this::zc_sm4macLongFunc_ISM4Mac,
- this::zc_sm4LongFunc_ISM4,
- this::zc_sm3LongFunc_ISM3
- );
-
-// this.changeConnect(true); //设置成短连接把相关功能测试下
-// executeTestsWithIsolation(tests);
-
- this.changeConnect(false); //设置成长连接把相关功能测试下
- executeTestsWithIsolation(tests);
- }
-
public void funcMenu(Config config, Choise choise, FuncTest test) throws Exception {
boolean flag = true;
diff --git a/src/test/java/test/TestAll.java b/src/test/java/test/TestAll.java
index 44212db..5f80545 100644
--- a/src/test/java/test/TestAll.java
+++ b/src/test/java/test/TestAll.java
@@ -7,7 +7,10 @@ import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;
-import java.util.concurrent.*;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class TestAll {
@@ -867,73 +870,6 @@ public class TestAll {
}
}
- public static void perfMenu_wending(Config config, Choise choise, TestAll testAll){
- System.out.println("请输入想要运行的时间(小时)");
- int time = choise.getAsInt();
- System.out.println("请输入想要运行的线程数量");
- int numThread = choise.getAsInt();
-
- System.out.println("-------- 稳定性测试开始 --------");
-
- boolean isSuc = true;
- for(int i=0; i<100000; i++){
- System.out.println("-------- 循环: --------" + i);
- try {
- FuncTest funcTest = new FuncTest(config);
- funcTest.zc_funcAll();
- } catch (Exception e){
- //防止程序异常后运行结束
- e.printStackTrace();
- testAll.writeToPerformanceFile("Exception: " + e.getMessage());
- }
-
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- testAll.writeToPerformanceFile("Exception: " + e.getMessage());
- }
- }
- if(isSuc){
- System.out.println("-------- 稳定性测试结束 --------");
- return;
- }
-
-
- testAll.writeToPerformanceFile("time:" + time );
-
- int num = 1;
- long start = System.currentTimeMillis();
- while (true){
- testAll.writeToPerformanceFile("循环: " + (num++) + " " + testAll.getTime());
-
- ExecutorService poolDec = Executors.newFixedThreadPool(numThread);
- for (int i = 0; i < numThread; i++) {
- poolDec.submit(() -> {
- try {
- FuncTest funcTest = new FuncTest(config);
- funcTest.zc_funcAll();
- } catch (Exception e){
- //防止程序异常后运行结束
- testAll.writeToPerformanceFile("Exception: " + e.getMessage());
- }
- });
- }
- poolDec.shutdown();
- try {
- poolDec.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
- } catch (InterruptedException e) {
- testAll.writeToPerformanceFile("Exception: " + e.getMessage());
- }
-
- long end = System.currentTimeMillis();
- if( (end-start) > (time*60*60*1000) ){
- break;
- }
- }
-
- System.out.println("-------- 稳定性测试结束 --------");
- }
-
public void sm4ShortEndes1() throws InterruptedException {
System.out.println("-------- SM4短数据加解密性能测试开始 --------");
sm4ShortEnde1(1, config.getTotal(), 1024);
@@ -1606,7 +1542,7 @@ public class TestAll {
private static final AtomicInteger successCount = new AtomicInteger(0);
private static final AtomicInteger errorCount = new AtomicInteger(0);
- private static final int MAX_ERRORS = 100;
+ private static final int MAX_ERRORS = 10;
private static final long TEST_DURATION_HOURS = 72;
public static void longLinkTestWD(TestAll test){