aboutsummaryrefslogtreecommitdiff
path: root/src/cz/crcs/ectester/standalone/test/base
diff options
context:
space:
mode:
authordavidhofman2021-09-15 12:11:14 +0200
committerGitHub2021-09-15 12:11:14 +0200
commitbd9de73be52f738b6346e5003b79114d212666bc (patch)
treea09e5e5e11547f9e58e237ecd1f5ff7bfc173ee0 /src/cz/crcs/ectester/standalone/test/base
parent69ce36e4537be52c103e8b5a314cca49cc931d8f (diff)
downloadECTester-bd9de73be52f738b6346e5003b79114d212666bc.tar.gz
ECTester-bd9de73be52f738b6346e5003b79114d212666bc.tar.zst
ECTester-bd9de73be52f738b6346e5003b79114d212666bc.zip
Implement StandalonePerformanceSuite. (#13)
* add PerformanceTest. * Add and implement StandalonePerformanceSuite. * Add author information. * Add missing null check to signature performance tests. * Fix reset method in KeyAgreementTestable.
Diffstat (limited to 'src/cz/crcs/ectester/standalone/test/base')
-rw-r--r--src/cz/crcs/ectester/standalone/test/base/KeyAgreementTestable.java9
-rw-r--r--src/cz/crcs/ectester/standalone/test/base/PerformanceTest.java109
2 files changed, 118 insertions, 0 deletions
diff --git a/src/cz/crcs/ectester/standalone/test/base/KeyAgreementTestable.java b/src/cz/crcs/ectester/standalone/test/base/KeyAgreementTestable.java
index 1382c28..7fd1c5a 100644
--- a/src/cz/crcs/ectester/standalone/test/base/KeyAgreementTestable.java
+++ b/src/cz/crcs/ectester/standalone/test/base/KeyAgreementTestable.java
@@ -4,6 +4,7 @@ import javax.crypto.KeyAgreement;
import javax.crypto.SecretKey;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
import java.security.interfaces.ECPrivateKey;
import java.security.interfaces.ECPublicKey;
import java.security.spec.AlgorithmParameterSpec;
@@ -160,6 +161,14 @@ public class KeyAgreementTestable extends StandaloneTestable<KeyAgreementTestabl
hasRun = true;
}
+ @Override
+ public void reset() {
+ super.reset();
+ try {
+ ka = KeyAgreement.getInstance(ka.getAlgorithm(), ka.getProvider());
+ } catch (NoSuchAlgorithmException e) { }
+ }
+
public enum KeyAgreementStage {
GetPrivate,
GetPublic,
diff --git a/src/cz/crcs/ectester/standalone/test/base/PerformanceTest.java b/src/cz/crcs/ectester/standalone/test/base/PerformanceTest.java
new file mode 100644
index 0000000..258ca12
--- /dev/null
+++ b/src/cz/crcs/ectester/standalone/test/base/PerformanceTest.java
@@ -0,0 +1,109 @@
+package cz.crcs.ectester.standalone.test.base;
+
+import cz.crcs.ectester.common.test.BaseTestable;
+import cz.crcs.ectester.common.test.Result;
+import cz.crcs.ectester.common.test.SimpleTest;
+import cz.crcs.ectester.common.test.TestCallback;
+
+import java.util.Arrays;
+
+/**
+ * @author David Hofman
+ */
+public class PerformanceTest extends SimpleTest<BaseTestable> {
+ private long[] times;
+ private long mean;
+ private long median;
+ private long mode;
+ private final int count;
+ private final String desc;
+
+ private PerformanceTest(BaseTestable testable, int count, String desc) {
+ super(testable, new TestCallback<BaseTestable>() {
+ @Override
+ public Result apply(BaseTestable testable) {
+ return new Result(Result.Value.SUCCESS);
+ }
+ });
+ this.count = count;
+ this.desc = desc;
+ }
+
+ public static PerformanceTest repeat(BaseTestable testable, int count) {
+ return new PerformanceTest(testable, count, null);
+ }
+
+ public static PerformanceTest repeat(BaseTestable testable, String desc, int count) {
+ return new PerformanceTest(testable, count, desc);
+ }
+
+ @Override
+ public String getDescription() {
+ String rest = String.format("Mean = %d ns, Median = %d ns, Mode = %d ns", mean, median, mode);
+ return (desc == null ? rest : desc + " (" + rest + ")");
+ }
+
+ @Override
+ protected void runSelf() {
+
+ times = new long[count];
+ for (int i = 0; i < count; ++i) {
+ times[i] = measureTime();
+ }
+
+ mean = Arrays.stream(times).sum() / count;
+
+ long[] sorted = times.clone();
+ Arrays.sort(sorted);
+ if (count % 2 == 0) {
+ median = (sorted[(count / 2) - 1] + sorted[count / 2]) / 2;
+ } else {
+ median = sorted[count / 2];
+ }
+
+ long max_occurrences = 0;
+ int i = 0;
+ while (i < count) {
+ long current_value = sorted[i];
+ long current_occurrences = 0;
+ while (i < count && sorted[i] == current_value) {
+ i++;
+ current_occurrences++;
+ }
+ if (current_occurrences > max_occurrences) {
+ max_occurrences = current_occurrences;
+ mode = current_value;
+ }
+ }
+ result = callback.apply(testable);
+ }
+
+ public long getCount() {
+ return count;
+ }
+
+ public long[] getTimes() {
+ return times;
+ }
+
+ public long getMean() {
+ return mean;
+ }
+
+ public long getMedian() {
+ return median;
+ }
+
+ public long getMode() {
+ return mode;
+ }
+
+ private long measureTime() {
+ if(testable.hasRun()) {
+ testable.reset();
+ }
+ long startTime = System.nanoTime();
+ testable.run();
+ return System.nanoTime() - startTime;
+ }
+}