diff --git a/build.xml b/build.xml
index d93e2e795..8c51c7707 100644
--- a/build.xml
+++ b/build.xml
@@ -89,6 +89,7 @@
+
@@ -300,4 +301,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/core/java/build.xml b/core/java/build.xml
index 04ce8754e..ffe50e90a 100644
--- a/core/java/build.xml
+++ b/core/java/build.xml
@@ -8,7 +8,7 @@
-
+
@@ -18,6 +18,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/core/java/src/net/i2p/data/i2cp/RequestLeaseSetMessage.java b/core/java/src/net/i2p/data/i2cp/RequestLeaseSetMessage.java
index 1d24eaccf..521bdc836 100644
--- a/core/java/src/net/i2p/data/i2cp/RequestLeaseSetMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/RequestLeaseSetMessage.java
@@ -129,7 +129,7 @@ public class RequestLeaseSetMessage extends I2CPMessageImpl {
RequestLeaseSetMessage msg = (RequestLeaseSetMessage) object;
if (getEndpoints() != msg.getEndpoints()) return false;
for (int i = 0; i < getEndpoints(); i++) {
- if (!DataHelper.eq(getRouter(i), msg.getRouter(i)) || DataHelper.eq(getTunnelId(i), msg.getTunnelId(i)))
+ if (!DataHelper.eq(getRouter(i), msg.getRouter(i)) || !DataHelper.eq(getTunnelId(i), msg.getTunnelId(i)))
return false;
}
return DataHelper.eq(getSessionId(), msg.getSessionId()) && DataHelper.eq(getEndDate(), msg.getEndDate());
diff --git a/core/java/test/net/i2p/AllCoreTests.java b/core/java/test/net/i2p/AllCoreTests.java
new file mode 100644
index 000000000..d53278f74
--- /dev/null
+++ b/core/java/test/net/i2p/AllCoreTests.java
@@ -0,0 +1,30 @@
+package net.i2p;
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain
+ * with no warranty of any kind, either expressed or implied.
+ * It probably won't make your computer catch on fire, or eat
+ * your children, but it might. Use at your own risk.
+ *
+ */
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * @author Comwiz
+ */
+public class AllCoreTests {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite("net.i2p.AllCoreTests");
+
+ suite.addTest(net.i2p.client.I2PClientTestSuite.suite());
+ suite.addTest(net.i2p.crypto.CryptoTestSuite.suite());
+ suite.addTest(net.i2p.data.DataTestSuite.suite());
+ suite.addTest(net.i2p.stat.StatTestSuite.suite());
+ suite.addTest(net.i2p.util.UtilTestSuite.suite());
+
+ return suite;
+ }
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/client/I2PClientTest.java b/core/java/test/net/i2p/client/I2PClientTest.java
new file mode 100644
index 000000000..4d4bc1aa2
--- /dev/null
+++ b/core/java/test/net/i2p/client/I2PClientTest.java
@@ -0,0 +1,37 @@
+package net.i2p.client;
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain
+ * with no warranty of any kind, either expressed or implied.
+ * It probably won't make your computer catch on fire, or eat
+ * your children, but it might. Use at your own risk.
+ *
+ */
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+
+import net.i2p.client.I2PClientFactory;
+import net.i2p.client.I2PClient;
+
+import junit.framework.TestCase;
+
+
+/**
+ *
+ * @author Comwiz
+ *
+ */
+public class I2PClientTest extends TestCase {
+ private I2PClient _client;
+
+ public void setUp(){
+ _client = I2PClientFactory.createClient();
+ }
+
+ public void testI2PClient() throws Exception{
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ _client.createDestination(out);
+ _client.createSession(new ByteArrayInputStream(out.toByteArray()), null);
+ }
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/client/I2PClientTestSuite.java b/core/java/test/net/i2p/client/I2PClientTestSuite.java
new file mode 100644
index 000000000..35678e3a5
--- /dev/null
+++ b/core/java/test/net/i2p/client/I2PClientTestSuite.java
@@ -0,0 +1,30 @@
+package net.i2p.client;
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain
+ * with no warranty of any kind, either expressed or implied.
+ * It probably won't make your computer catch on fire, or eat
+ * your children, but it might. Use at your own risk.
+ *
+ */
+
+import net.i2p.client.datagram.DatagramTest;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * @author Comwiz
+ */
+public class I2PClientTestSuite {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite("net.i2p.client.I2PClientTestSuite");
+
+ suite.addTestSuite(I2PClientTest.class);
+ suite.addTestSuite(I2PSessionTest.class);
+ suite.addTestSuite(DatagramTest.class);
+
+ return suite;
+ }
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/client/I2PSessionTest.java b/core/java/test/net/i2p/client/I2PSessionTest.java
new file mode 100644
index 000000000..616dd3ab0
--- /dev/null
+++ b/core/java/test/net/i2p/client/I2PSessionTest.java
@@ -0,0 +1,98 @@
+package net.i2p.client;
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain
+ * with no warranty of any kind, either expressed or implied.
+ * It probably won't make your computer catch on fire, or eat
+ * your children, but it might. Use at your own risk.
+ *
+ */
+
+import java.util.HashSet;
+import java.util.Set;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+
+import net.i2p.client.I2PSession;
+import net.i2p.client.I2PSessionImpl;
+import net.i2p.client.I2PSessionImpl2;
+import net.i2p.client.I2PSessionException;
+import net.i2p.client.I2PClient;
+import net.i2p.client.I2PClientFactory;
+import net.i2p.client.I2PSessionListener;
+import net.i2p.data.Destination;
+import net.i2p.I2PAppContext;
+
+import junit.framework.TestCase;
+
+
+/**
+ *
+ * @author Comwiz
+ *
+ */
+public class I2PSessionTest extends TestCase implements I2PSessionListener{
+ private Set _s;
+
+
+ public void setUp(){
+ }
+
+ protected void tearDown() {
+ System.gc();
+ }
+
+ public void testSendClosedMessage() throws Exception{
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ Destination d = I2PClientFactory.createClient().createDestination(out);
+ I2PSession session = new I2PSessionImpl2(I2PAppContext.getGlobalContext(), new ByteArrayInputStream(out.toByteArray()), null);
+
+ boolean error = false;
+ try{
+ session.sendMessage(d, out.toByteArray());
+ }catch(I2PSessionException i2pse){
+ error = true;
+ }
+ assertTrue(error);
+ }
+
+ public void testSendAndRecieve() throws Exception{
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ Destination d = I2PClientFactory.createClient().createDestination(out);
+ I2PSession session = new I2PSessionImpl2(I2PAppContext.getGlobalContext(), new ByteArrayInputStream(out.toByteArray()), null);
+ session.connect();
+
+ session.setSessionListener(this);
+
+ _s = new HashSet();
+ _s.add("a");
+ _s.add("b");
+ _s.add("c");
+ _s.add("d");
+
+ session.sendMessage(d, "a".getBytes());
+ session.sendMessage(d, "b".getBytes());
+ session.sendMessage(d, "c".getBytes());
+ session.sendMessage(d, "d".getBytes());
+
+ for(int i = 0; (i < 20)&&(!_s.isEmpty()); i++){
+ Thread.sleep(1000);
+ }
+ assertTrue(_s.isEmpty());
+
+
+ }
+
+ public void disconnected(I2PSession session){}
+ public void errorOccurred(I2PSession session, java.lang.String message, java.lang.Throwable error){}
+ public void messageAvailable(I2PSession session, int msgId, long size){
+ try{
+ String x = new String(session.receiveMessage(msgId));
+ if(_s.contains(x))
+ _s.remove(x);
+ }catch(Exception e){
+ fail();
+ }
+ }
+ public void reportAbuse(I2PSession session, int severity){}
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/client/datagram/DatagramTest.java b/core/java/test/net/i2p/client/datagram/DatagramTest.java
new file mode 100644
index 000000000..2136fd2ca
--- /dev/null
+++ b/core/java/test/net/i2p/client/datagram/DatagramTest.java
@@ -0,0 +1,118 @@
+package net.i2p.client.datagram;
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain
+ * with no warranty of any kind, either expressed or implied.
+ * It probably won't make your computer catch on fire, or eat
+ * your children, but it might. Use at your own risk.
+ *
+ */
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+
+import net.i2p.client.datagram.I2PDatagramMaker;
+import net.i2p.client.datagram.I2PDatagramDissector;
+import net.i2p.client.datagram.I2PInvalidDatagramException;
+import net.i2p.client.I2PClientFactory;
+import net.i2p.client.I2PClient;
+import net.i2p.client.I2PSession;
+import net.i2p.data.DataHelper;
+import net.i2p.data.Hash;
+import net.i2p.data.Destination;
+import net.i2p.data.DataFormatException;
+import net.i2p.crypto.DSAEngine;
+
+import junit.framework.TestCase;
+
+
+/**
+ *
+ * @author Comwiz
+ *
+ */
+public class DatagramTest extends TestCase {
+ private I2PClient _client;
+
+ public void setUp(){
+ }
+
+ protected void tearDown() {
+ System.gc();
+ }
+
+ public void testDatagram() throws Exception{
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ I2PClient client = I2PClientFactory.createClient();
+ Destination d = client.createDestination(out);
+ I2PSession session = client.createSession(new ByteArrayInputStream(out.toByteArray()), null);
+
+ I2PDatagramMaker dm = new I2PDatagramMaker(session);
+ byte[] dg = dm.makeI2PDatagram("What's the deal with 42?".getBytes());
+
+ I2PDatagramDissector dd = new I2PDatagramDissector();
+ dd.loadI2PDatagram(dg);
+ byte[] x = dd.getPayload();
+ assertTrue(DataHelper.eq(x, "What's the deal with 42?".getBytes()));
+
+ x = dd.extractPayload();
+ assertTrue(DataHelper.eq(x, "What's the deal with 42?".getBytes()));
+
+ assertEquals(d, dd.getSender());
+ assertEquals(d, dd.extractSender());
+
+ }
+
+ /*public void testMakeNullDatagram() throws Exception{
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ I2PClient client = I2PClientFactory.createClient();
+ Destination d = client.createDestination(out);
+ I2PSession session = client.createSession(new ByteArrayInputStream(out.toByteArray()), null);
+ I2PDatagramMaker dm = new I2PDatagramMaker(session);
+
+ byte[] dg = dm.makeI2PDatagram(null);
+ assertNull(dg);
+ }*/
+
+ /*public void testExtractNullDatagram() throws Exception{
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ I2PClient client = I2PClientFactory.createClient();
+ Destination d = client.createDestination(out);
+ I2PSession session = client.createSession(new ByteArrayInputStream(out.toByteArray()), null);
+
+ I2PDatagramDissector dd = new I2PDatagramDissector();
+ dd.loadI2PDatagram(null);
+ }*/
+
+ public void testBadagram() throws Exception{
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ I2PClient client = I2PClientFactory.createClient();
+ Destination d = client.createDestination(out);
+ I2PSession session = client.createSession(new ByteArrayInputStream(out.toByteArray()), null);
+ DSAEngine dsaEng = DSAEngine.getInstance();
+
+ ByteArrayOutputStream dout = new ByteArrayOutputStream();
+ d.writeBytes(dout);
+ dsaEng.sign(Hash.FAKE_HASH.toByteArray(), session.getPrivateKey()).writeBytes(dout);
+ dout.write("blah".getBytes());
+
+ byte[] data = dout.toByteArray();
+ I2PDatagramDissector dd = new I2PDatagramDissector();
+ dd.loadI2PDatagram(data);
+
+ boolean error = false;
+ try{
+ dd.getPayload();
+ }catch(I2PInvalidDatagramException i2pide){
+ error = true;
+ }
+
+ error = false;
+ try{
+ dd.getSender();
+ }catch(I2PInvalidDatagramException i2pide){
+ error = true;
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/crypto/AES256Test.java b/core/java/test/net/i2p/crypto/AES256Test.java
new file mode 100644
index 000000000..4464a1d82
--- /dev/null
+++ b/core/java/test/net/i2p/crypto/AES256Test.java
@@ -0,0 +1,77 @@
+package net.i2p.crypto;
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain
+ * with no warranty of any kind, either expressed or implied.
+ * It probably won't make your computer catch on fire, or eat
+ * your children, but it might. Use at your own risk.
+ *
+ */
+
+import net.i2p.data.SessionKey;
+import net.i2p.data.DataHelper;
+import net.i2p.I2PAppContext;
+import net.i2p.util.RandomSource;
+
+import junit.framework.TestCase;
+
+/**
+ * @author Comwiz
+ */
+public class AES256Test extends TestCase{
+ private I2PAppContext _context;
+ private byte[] iv;
+
+ protected void setUp() {
+ _context = new I2PAppContext();
+ }
+
+ public void testMultiple(){
+ for(int i = 0; i < 100; i++){
+
+ SessionKey key = _context.keyGenerator().generateSessionKey();
+
+ byte[] iv = new byte[16];
+ _context.random().nextBytes(iv);
+
+ byte[] plain = new byte[256];
+ _context.random().nextBytes(plain);
+
+ byte[] e = new byte[plain.length];
+ _context.aes().encrypt(plain, 0, e, 0, key, iv, plain.length);
+ byte[] d = new byte[e.length];
+ _context.aes().decrypt(e, 0, d, 0, key, iv, d.length);
+ boolean same = true;
+ assertTrue(DataHelper.eq(plain, d));
+ }
+ }
+
+ public void testLong(){
+ I2PAppContext ctx = new I2PAppContext();
+ SessionKey key = ctx.keyGenerator().generateSessionKey();
+ byte iv[] = new byte[16];
+ RandomSource.getInstance().nextBytes(iv);
+
+
+ byte lbuf[] = new byte[1024];
+ RandomSource.getInstance().nextBytes(lbuf);
+ byte le[] = ctx.aes().safeEncrypt(lbuf, key, iv, 2048);
+ byte ld[] = ctx.aes().safeDecrypt(le, key, iv);
+ assertTrue(DataHelper.eq(ld, lbuf));
+ }
+
+ public void testShort(){
+ I2PAppContext ctx = new I2PAppContext();
+ SessionKey key = ctx.keyGenerator().generateSessionKey();
+ byte iv[] = new byte[16];
+ RandomSource.getInstance().nextBytes(iv);
+
+ byte sbuf[] = new byte[16];
+ RandomSource.getInstance().nextBytes(sbuf);
+ byte se[] = new byte[16];
+ ctx.aes().encrypt(sbuf, 0, se, 0, key, iv, sbuf.length);
+ byte sd[] = new byte[16];
+ ctx.aes().decrypt(se, 0, sd, 0, key, iv, se.length);
+ assertTrue(DataHelper.eq(sd, sbuf));
+ }
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/crypto/AESInputStreamTest.java b/core/java/test/net/i2p/crypto/AESInputStreamTest.java
new file mode 100644
index 000000000..ea18106b7
--- /dev/null
+++ b/core/java/test/net/i2p/crypto/AESInputStreamTest.java
@@ -0,0 +1,111 @@
+package net.i2p.crypto;
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain
+ * with no warranty of any kind, either expressed or implied.
+ * It probably won't make your computer catch on fire, or eat
+ * your children, but it might. Use at your own risk.
+ *
+ */
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.FilterInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import net.i2p.I2PAppContext;
+import net.i2p.data.Base64;
+import net.i2p.data.DataHelper;
+import net.i2p.data.Hash;
+import net.i2p.data.SessionKey;
+import net.i2p.util.Clock;
+import net.i2p.util.Log;
+import net.i2p.util.RandomSource;
+
+import junit.framework.TestCase;
+/**
+ * @author Comwiz
+ */
+public class AESInputStreamTest extends TestCase {
+ public void testMultiple() throws Exception{
+ SessionKey key = KeyGenerator.getInstance().generateSessionKey();
+ byte iv[] = "there once was a".getBytes();
+
+ int[] sizes = {1024 * 32, 20, 3, 0};
+
+ for(int j = 0; j < sizes.length; j++){
+ byte orig[] = new byte[sizes[j]];
+ for (int i = 0; i < 20; i++) {
+ RandomSource.getInstance().nextBytes(orig);
+ runTest(orig, key, iv);
+ }
+ }
+
+ }
+
+ private static void runTest(byte orig[], SessionKey key, byte[] iv) throws Exception{
+ I2PAppContext ctx = I2PAppContext.getGlobalContext();
+
+ ByteArrayOutputStream origStream = new ByteArrayOutputStream(512);
+ AESOutputStream out = new AESOutputStream(ctx, origStream, key, iv);
+ out.write(orig);
+ out.close();
+
+ byte encrypted[] = origStream.toByteArray();
+
+ ByteArrayInputStream encryptedStream = new ByteArrayInputStream(encrypted);
+ AESInputStream sin = new AESInputStream(ctx, encryptedStream, key, iv);
+ ByteArrayOutputStream baos = new ByteArrayOutputStream(512);
+ byte buf[] = new byte[1024 * 32];
+ int read = DataHelper.read(sin, buf);
+ if (read > 0) baos.write(buf, 0, read);
+ sin.close();
+ byte fin[] = baos.toByteArray();
+
+ Hash origHash = SHA256Generator.getInstance().calculateHash(orig);
+ Hash newHash = SHA256Generator.getInstance().calculateHash(fin);
+
+ assertEquals(origHash, newHash);
+ assertTrue(DataHelper.eq(orig, fin));
+ }
+
+ public static void testOffset() throws Exception{
+ I2PAppContext ctx = I2PAppContext.getGlobalContext();
+
+ byte[] orig = new byte[32];
+ RandomSource.getInstance().nextBytes(orig);
+
+ SessionKey key = KeyGenerator.getInstance().generateSessionKey();
+ byte iv[] = "there once was a".getBytes();
+
+ ByteArrayOutputStream origStream = new ByteArrayOutputStream(512);
+ AESOutputStream out = new AESOutputStream(ctx, origStream, key, iv);
+ out.write(orig);
+ out.close();
+
+ byte encrypted[] = origStream.toByteArray();
+
+ byte encryptedSegment[] = new byte[40];
+ System.arraycopy(encrypted, 0, encryptedSegment, 0, 40);
+
+ ByteArrayInputStream encryptedStream = new ByteArrayInputStream(encryptedSegment);
+ AESInputStream sin = new AESInputStream(ctx, encryptedStream, key, iv);
+ ByteArrayOutputStream baos = new ByteArrayOutputStream(512);
+ byte buf[] = new byte[1024 * 32];
+ int read = DataHelper.read(sin, buf);
+ int remaining = sin.remainingBytes();
+ int readyBytes = sin.readyBytes();
+
+ if (read > 0)
+ baos.write(buf, 0, read);
+ sin.close();
+ byte fin[] = baos.toByteArray();
+
+ Hash origHash = SHA256Generator.getInstance().calculateHash(orig);
+ Hash newHash = SHA256Generator.getInstance().calculateHash(fin);
+
+ assertFalse(origHash.equals(newHash));
+ assertFalse(DataHelper.eq(orig, fin));
+ }
+}
diff --git a/core/java/test/net/i2p/crypto/CryptixAESEngineTest.java b/core/java/test/net/i2p/crypto/CryptixAESEngineTest.java
new file mode 100644
index 000000000..2110b6667
--- /dev/null
+++ b/core/java/test/net/i2p/crypto/CryptixAESEngineTest.java
@@ -0,0 +1,118 @@
+package net.i2p.crypto;
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain
+ * with no warranty of any kind, either expressed or implied.
+ * It probably won't make your computer catch on fire, or eat
+ * your children, but it might. Use at your own risk.
+ *
+ */
+
+import java.security.InvalidKeyException;
+
+import net.i2p.I2PAppContext;
+import net.i2p.data.ByteArray;
+import net.i2p.data.DataHelper;
+import net.i2p.data.SessionKey;
+import net.i2p.util.ByteCache;
+import net.i2p.crypto.CryptixAESEngine;
+
+import junit.framework.TestCase;
+
+public class CryptixAESEngineTest extends TestCase{
+ public void testED() {
+ I2PAppContext ctx = I2PAppContext.getGlobalContext();
+ SessionKey key = ctx.keyGenerator().generateSessionKey();
+ byte iv[] = new byte[16];
+ byte orig[] = new byte[128];
+ byte encrypted[] = new byte[128];
+ byte decrypted[] = new byte[128];
+ ctx.random().nextBytes(iv);
+ ctx.random().nextBytes(orig);
+ CryptixAESEngine aes = new CryptixAESEngine(ctx);
+ aes.encrypt(orig, 0, encrypted, 0, key, iv, orig.length);
+ aes.decrypt(encrypted, 0, decrypted, 0, key, iv, encrypted.length);
+ assertTrue(DataHelper.eq(decrypted,orig));
+ }
+
+ public static void testED2() {
+ I2PAppContext ctx = I2PAppContext.getGlobalContext();
+ SessionKey key = ctx.keyGenerator().generateSessionKey();
+ byte iv[] = new byte[16];
+ byte orig[] = new byte[128];
+ byte data[] = new byte[128];
+ ctx.random().nextBytes(iv);
+ ctx.random().nextBytes(orig);
+ CryptixAESEngine aes = new CryptixAESEngine(ctx);
+ aes.encrypt(orig, 0, data, 0, key, iv, data.length);
+ aes.decrypt(data, 0, data, 0, key, iv, data.length);
+ assertTrue(DataHelper.eq(data,orig));
+ }
+
+ public static void testFake() {
+ I2PAppContext ctx = I2PAppContext.getGlobalContext();
+ SessionKey key = ctx.keyGenerator().generateSessionKey();
+ SessionKey wrongKey = ctx.keyGenerator().generateSessionKey();
+ byte iv[] = new byte[16];
+ byte orig[] = new byte[128];
+ byte encrypted[] = new byte[128];
+ byte decrypted[] = new byte[128];
+ ctx.random().nextBytes(iv);
+ ctx.random().nextBytes(orig);
+ CryptixAESEngine aes = new CryptixAESEngine(ctx);
+ aes.encrypt(orig, 0, encrypted, 0, key, iv, orig.length);
+ aes.decrypt(encrypted, 0, decrypted, 0, wrongKey, iv, encrypted.length);
+ assertFalse(DataHelper.eq(decrypted,orig));
+ }
+
+ public static void testNull() {
+ I2PAppContext ctx = I2PAppContext.getGlobalContext();
+ SessionKey key = ctx.keyGenerator().generateSessionKey();
+ SessionKey wrongKey = ctx.keyGenerator().generateSessionKey();
+ byte iv[] = new byte[16];
+ byte orig[] = new byte[128];
+ byte encrypted[] = new byte[128];
+ byte decrypted[] = new byte[128];
+ ctx.random().nextBytes(iv);
+ ctx.random().nextBytes(orig);
+ CryptixAESEngine aes = new CryptixAESEngine(ctx);
+ aes.encrypt(orig, 0, encrypted, 0, key, iv, orig.length);
+
+ boolean error = false;
+ try {
+ aes.decrypt(null, 0, null, 0, wrongKey, iv, encrypted.length);
+ } catch (IllegalArgumentException iae) {
+ error = true;
+ }
+ assertTrue(error);
+ }
+
+ public static void testEDBlock() {
+ I2PAppContext ctx = I2PAppContext.getGlobalContext();
+ SessionKey key = ctx.keyGenerator().generateSessionKey();
+ byte iv[] = new byte[16];
+ byte orig[] = new byte[16];
+ byte encrypted[] = new byte[16];
+ byte decrypted[] = new byte[16];
+ ctx.random().nextBytes(iv);
+ ctx.random().nextBytes(orig);
+ CryptixAESEngine aes = new CryptixAESEngine(ctx);
+ aes.encryptBlock(orig, 0, key, encrypted, 0);
+ aes.decryptBlock(encrypted, 0, key, decrypted, 0);
+ assertTrue(DataHelper.eq(decrypted,orig));
+ }
+
+ public static void testEDBlock2() {
+ I2PAppContext ctx = I2PAppContext.getGlobalContext();
+ SessionKey key = ctx.keyGenerator().generateSessionKey();
+ byte iv[] = new byte[16];
+ byte orig[] = new byte[16];
+ byte data[] = new byte[16];
+ ctx.random().nextBytes(iv);
+ ctx.random().nextBytes(orig);
+ CryptixAESEngine aes = new CryptixAESEngine(ctx);
+ aes.encryptBlock(orig, 0, key, data, 0);
+ aes.decryptBlock(data, 0, key, data, 0);
+ assertTrue(DataHelper.eq(data,orig));
+ }
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/crypto/CryptixRijndael_AlgorithmTest.java b/core/java/test/net/i2p/crypto/CryptixRijndael_AlgorithmTest.java
new file mode 100644
index 000000000..bbc579d6b
--- /dev/null
+++ b/core/java/test/net/i2p/crypto/CryptixRijndael_AlgorithmTest.java
@@ -0,0 +1,43 @@
+package net.i2p.crypto;
+
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain
+ * with no warranty of any kind, either expressed or implied.
+ * It probably won't make your computer catch on fire, or eat
+ * your children, but it might. Use at your own risk.
+ *
+ */
+
+
+import net.i2p.data.DataHelper;
+
+import junit.framework.TestCase;
+
+public class CryptixRijndael_AlgorithmTest extends TestCase {
+ public void testCRA() throws Exception{
+ int[] sizes = {16,24,32};
+ for(int j = 0; j < sizes.length; j++){
+
+ byte[] kb = new byte[sizes[j]];
+ byte[] pt = new byte[16];
+ int i;
+
+ for (i = 0; i < sizes[j]; i++)
+ kb[i] = (byte) i;
+ for (i = 0; i < 16; i++)
+ pt[i] = (byte) i;
+
+
+ Object key = CryptixRijndael_Algorithm.makeKey(kb, 16);
+
+ byte[] ct = new byte[16];
+ CryptixRijndael_Algorithm.blockEncrypt(pt, ct, 0, 0, key, 16);
+
+ byte[] cpt = new byte[16];
+ CryptixRijndael_Algorithm.blockDecrypt(ct, cpt, 0, 0, key, 16);
+
+ assertTrue(DataHelper.eq(pt, cpt));
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/crypto/CryptoTestSuite.java b/core/java/test/net/i2p/crypto/CryptoTestSuite.java
new file mode 100644
index 000000000..a29b8a2ff
--- /dev/null
+++ b/core/java/test/net/i2p/crypto/CryptoTestSuite.java
@@ -0,0 +1,38 @@
+package net.i2p.crypto;
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain
+ * with no warranty of any kind, either expressed or implied.
+ * It probably won't make your computer catch on fire, or eat
+ * your children, but it might. Use at your own risk.
+ *
+ */
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * @author comwiz
+ */
+public class CryptoTestSuite {
+
+ public static Test suite() {
+
+ TestSuite suite = new TestSuite("net.i2p.crypto.CryptoTestSuite");
+
+ suite.addTestSuite(AES256Test.class);
+ suite.addTestSuite(AESInputStreamTest.class);
+ suite.addTestSuite(CryptixAESEngineTest.class);
+ suite.addTestSuite(CryptixRijndael_AlgorithmTest.class);
+ suite.addTestSuite(DHSessionKeyBuilderTest.class);
+ suite.addTestSuite(DSATest.class);
+ suite.addTestSuite(ElGamalTest.class);
+ suite.addTestSuite(HMACSHA256Test.class);
+ suite.addTestSuite(KeyGeneratorTest.class);
+ suite.addTestSuite(SessionEncryptionTest.class);
+ suite.addTestSuite(SHA1HashTest.class);
+ suite.addTestSuite(SHA256Test.class);
+
+ return suite;
+ }
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/crypto/DHSessionKeyBuilderTest.java b/core/java/test/net/i2p/crypto/DHSessionKeyBuilderTest.java
new file mode 100644
index 000000000..416954e43
--- /dev/null
+++ b/core/java/test/net/i2p/crypto/DHSessionKeyBuilderTest.java
@@ -0,0 +1,47 @@
+package net.i2p.crypto;
+
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain
+ * with no warranty of any kind, either expressed or implied.
+ * It probably won't make your computer catch on fire, or eat
+ * your children, but it might. Use at your own risk.
+ *
+ */
+
+import java.math.BigInteger;
+
+import net.i2p.data.DataHelper;
+import net.i2p.data.SessionKey;
+import net.i2p.I2PAppContext;
+import net.i2p.util.RandomSource;
+
+import junit.framework.TestCase;
+
+public class DHSessionKeyBuilderTest extends TestCase {
+ public void testDHSessionKeyBuilder(){
+ I2PAppContext ctx = new I2PAppContext();
+ for (int i = 0; i < 5; i++) {
+ DHSessionKeyBuilder builder1 = new DHSessionKeyBuilder();
+ DHSessionKeyBuilder builder2 = new DHSessionKeyBuilder();
+ BigInteger pub1 = builder1.getMyPublicValue();
+ builder2.setPeerPublicValue(pub1);
+ BigInteger pub2 = builder2.getMyPublicValue();
+ builder1.setPeerPublicValue(pub2);
+ SessionKey key1 = builder1.getSessionKey();
+ SessionKey key2 = builder2.getSessionKey();
+
+ assertEquals(key1, key2);
+
+ byte iv[] = new byte[16];
+ RandomSource.getInstance().nextBytes(iv);
+ String origVal = "1234567890123456"; // 16 bytes max using AESEngine
+ byte enc[] = new byte[16];
+ byte dec[] = new byte[16];
+ ctx.aes().encrypt(origVal.getBytes(), 0, enc, 0, key1, iv, 16);
+ ctx.aes().decrypt(enc, 0, dec, 0, key2, iv, 16);
+ String tranVal = new String(dec);
+ assertEquals(origVal, tranVal);
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/crypto/DSATest.java b/core/java/test/net/i2p/crypto/DSATest.java
new file mode 100644
index 000000000..7d695d3fd
--- /dev/null
+++ b/core/java/test/net/i2p/crypto/DSATest.java
@@ -0,0 +1,44 @@
+package net.i2p.crypto;
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain
+ * with no warranty of any kind, either expressed or implied.
+ * It probably won't make your computer catch on fire, or eat
+ * your children, but it might. Use at your own risk.
+ *
+ */
+
+import java.io.ByteArrayInputStream;
+import net.i2p.data.Signature;
+import net.i2p.data.SigningPrivateKey;
+import net.i2p.data.SigningPublicKey;
+import net.i2p.I2PAppContext;
+
+import junit.framework.TestCase;
+
+public class DSATest extends TestCase{
+ private I2PAppContext _context;
+
+ protected void setUp() {
+ _context = new I2PAppContext();
+ }
+
+ public void testMultiple(){
+ for(int i = 0; i < 100; i++){
+ byte[] message = new byte[256];
+ _context.random().nextBytes(message);
+
+ Object[] keys = KeyGenerator.getInstance().generateSigningKeypair();
+ SigningPublicKey pubkey = (SigningPublicKey)keys[0];
+ SigningPrivateKey privkey = (SigningPrivateKey)keys[1];
+
+ Signature s = DSAEngine.getInstance().sign(message, privkey);
+ Signature s1 = DSAEngine.getInstance().sign(new ByteArrayInputStream(message), privkey);
+
+ assertTrue(DSAEngine.getInstance().verifySignature(s, message, pubkey));
+ assertTrue(DSAEngine.getInstance().verifySignature(s1, new ByteArrayInputStream(message), pubkey));
+ assertTrue(DSAEngine.getInstance().verifySignature(s1, message, pubkey));
+ assertTrue(DSAEngine.getInstance().verifySignature(s, new ByteArrayInputStream(message), pubkey));
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/crypto/ElGamalAESEngineTest.java b/core/java/test/net/i2p/crypto/ElGamalAESEngineTest.java
index 0ee419165..e69de29bb 100644
--- a/core/java/test/net/i2p/crypto/ElGamalAESEngineTest.java
+++ b/core/java/test/net/i2p/crypto/ElGamalAESEngineTest.java
@@ -1,243 +0,0 @@
-package net.i2p.crypto;
-/*
- * free (adj.): unencumbered; not under the control of others
- * Written by jrandom in 2003 and released into the public domain
- * with no warranty of any kind, either expressed or implied.
- * It probably won't make your computer catch on fire, or eat
- * your children, but it might. Use at your own risk.
- *
- */
-
-import net.i2p.I2PAppContext;
-import net.i2p.data.Hash;
-import net.i2p.data.SessionKey;
-import net.i2p.data.PublicKey;
-import net.i2p.data.PrivateKey;
-import net.i2p.data.DataHelper;
-import net.i2p.util.RandomSource;
-import net.i2p.util.Log;
-import net.i2p.util.Clock;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-
-import java.util.Set;
-import java.util.HashSet;
-
-class ElGamalAESEngineTest {
- private final static Log _log = new Log(ElGamalAESEngineTest.class);
- private I2PAppContext _context;
- public ElGamalAESEngineTest(I2PAppContext ctx) {
- _context = ctx;
- }
- public void runRoundtripTest() {
- try {
- Object keys[] = KeyGenerator.getInstance().generatePKIKeypair();
- PublicKey pubKey = (PublicKey)keys[0];
- PrivateKey privKey = (PrivateKey)keys[1];
-
- String msg = "Hello world";
- Set toBeDelivered = new HashSet();
- SessionKey key = _context.sessionKeyManager().getCurrentKey(pubKey);
- if (key == null)
- key = _context.sessionKeyManager().createSession(pubKey);
- byte[] encrypted = _context.elGamalAESEngine().encrypt(msg.getBytes(), pubKey, key, 64);
- byte[] decrypted = _context.elGamalAESEngine().decrypt(encrypted, privKey);
- if (decrypted == null)
- throw new Exception("Failed to decrypt");
- String read = new String(decrypted);
- _log.debug("read: " + read);
- _log.debug("Match? " + msg.equals(read));
- } catch (Exception e) {
- _log.error("Error", e);
- try { Thread.sleep(5000); } catch (InterruptedException ie) {}
- System.exit(0);
- }
- }
-
- public void runLoopTest(int runs) {
- try {
- Object keys[] = KeyGenerator.getInstance().generatePKIKeypair();
- PublicKey pubKey = (PublicKey)keys[0];
- PrivateKey privKey = (PrivateKey)keys[1];
-
- long e0 = 0;
- long d0 = 0;
- long eTot = 0;
- long dTot = 0;
- for (int i = 0; i < runs; i++) {
- long times[] = runMessage(pubKey, privKey);
- _log.debug("E[" + i + "] time: " + times[0] + "ms");
- _log.debug("D["+i+"] time: " + times[1] + "ms");
- if (i == 0) {
- e0 = times[0];
- d0 = times[1];
- }
- eTot += times[0];
- dTot += times[1];
- }
- _log.debug("E average time: " + eTot/runs + "ms");
- _log.debug("D average time: " + dTot/runs + "ms");
- _log.debug("Total time to send and receive " + (runs) + "Kb: " + (eTot+dTot)+"ms");
-
- } catch (Exception e) {
- _log.error("Error", e);
- try { Thread.sleep(5000); } catch (InterruptedException ie) {}
- System.exit(0);
- }
- }
-
- private long[] runMessage(PublicKey pubKey, PrivateKey privKey) throws Exception {
- byte[] msg = new byte[400];
- RandomSource.getInstance().nextBytes(msg);
- SessionKey key = _context.sessionKeyManager().getCurrentKey(pubKey);
- if (key == null)
- key = _context.sessionKeyManager().createSession(pubKey);
-
- long beforeE = Clock.getInstance().now();
- byte[] encrypted = _context.elGamalAESEngine().encrypt(msg, pubKey, key, 1024);
- long afterE = Clock.getInstance().now();
- byte[] decrypted = _context.elGamalAESEngine().decrypt(encrypted, privKey);
- long afterD = Clock.getInstance().now();
- if (!DataHelper.eq(msg, decrypted)) {
- _log.error("WTF, D(E(val)) != val");
- return null;
- }
-
- long rv[] = new long[2];
- rv[0] = afterE - beforeE;
- rv[1] = afterD - afterE;
- return rv;
- }
-
- public void runAESTest() {
- try {
- SessionKey sessionKey = KeyGenerator.getInstance().generateSessionKey();
- Hash h = SHA256Generator.getInstance().calculateHash(sessionKey.getData());
- byte iv[] = new byte[16];
- System.arraycopy(h.getData(), 0, iv, 0, 16);
-
- String msg = "Hello world";
-
- byte encrypted[] = _context.elGamalAESEngine().encryptAESBlock(msg.getBytes(), sessionKey, iv, null, null, 64);
- _log.debug("** Encryption complete. Beginning decryption");
- Set foundTags = new HashSet();
- SessionKey foundKey = new SessionKey();
- byte decrypted[] = _context.elGamalAESEngine().decryptAESBlock(encrypted, 0, encrypted.length, sessionKey, iv, null, foundTags, foundKey);
- if (decrypted == null) throw new Exception("Decryption failed");
- String read = new String(decrypted);
- _log.debug("read: " + read);
- _log.debug("Match? " + msg.equals(read));
- } catch (Exception e) {
- _log.error("Error", e);
- try { Thread.sleep(5000); } catch (InterruptedException ie) {}
- System.exit(0);
- }
- }
-
- public void runBasicAESTest() {
- try {
- SessionKey sessionKey = KeyGenerator.getInstance().generateSessionKey();
- Hash h = SHA256Generator.getInstance().calculateHash(sessionKey.getData());
- byte iv[] = new byte[16];
- System.arraycopy(h.getData(), 0, iv, 0, 16);
-
- String msg = "Hello world01234012345678901234501234567890123450123456789012345";
- h = SHA256Generator.getInstance().calculateHash(msg.getBytes());
- _log.debug("Hash of entire aes block before encryption: \n" + DataHelper.toString(h.getData(), 32));
- byte aesEncr[] = new byte[msg.getBytes().length];
- byte aesDecr[] = new byte[aesEncr.length];
- _context.aes().encrypt(msg.getBytes(), 0, aesEncr, 0, sessionKey, iv, aesEncr.length);
- _context.aes().decrypt(aesEncr, 0, aesDecr, 0, sessionKey, iv, aesEncr.length);
- h = SHA256Generator.getInstance().calculateHash(aesDecr);
- _log.debug("Hash of entire aes block after decryption: \n" + DataHelper.toString(h.getData(), 32));
- if (msg.equals(new String(aesDecr))) {
- _log.debug("**AES Basic test passed!\n\n");
- }
- } catch (Exception e) {
- _log.error("Error", e);
- try { Thread.sleep(5000); } catch (InterruptedException ie) {}
- System.exit(0);
- }
- }
-
- public void runElGamalTest(int numLoops) {
-
- for (int i = 0; i < numLoops; i++) {
- Object keys[] = KeyGenerator.getInstance().generatePKIKeypair();
- PublicKey pubKey = (PublicKey)keys[0];
- PrivateKey privKey = (PrivateKey)keys[1];
- SessionKey key = KeyGenerator.getInstance().generateSessionKey();
-
- runBasicElGamalTest(key, pubKey, privKey);
- }
- }
-
- public void runBasicElGamalTest(SessionKey key, PublicKey pubKey, PrivateKey privKey) {
- try {
- ByteArrayOutputStream elgSrc = new ByteArrayOutputStream(256);
- key.writeBytes(elgSrc);
- byte preIV[] = new byte[32];
- RandomSource.getInstance().nextBytes(preIV);
- elgSrc.write(preIV);
- // byte rnd[] = new byte[191];
- // RandomSource.getInstance().nextBytes(rnd);
- // elgSrc.write(rnd);
- elgSrc.flush();
-
- byte elgEncr[] = _context.elGamalEngine().encrypt(elgSrc.toByteArray(), pubKey);
- byte elgDecr[] = _context.elGamalEngine().decrypt(elgEncr, privKey);
-
- ByteArrayInputStream bais = new ByteArrayInputStream(elgDecr);
- SessionKey nk = new SessionKey();
-
- nk.readBytes(bais);
- byte postpreIV[] = new byte[32];
- int read = bais.read(postpreIV);
- if (read != postpreIV.length) {
- // hmm, this can't really happen...
- throw new Exception("Somehow ElGamal broke and 256 bytes is less than 32 bytes...");
- }
- // ignore the next 192 bytes
- boolean eq = (DataHelper.eq(preIV, postpreIV) && DataHelper.eq(key, nk));
- if (!eq) {
- _log.error("elgEncr.length: " + elgEncr.length + " elgDecr.length: " + elgDecr.length);
- _log.error("Pre IV.................: " + DataHelper.toString(preIV, 32));
- _log.error("Pre IV after decryption: " + DataHelper.toString(postpreIV, 32));
- _log.error("SessionKey.................: " + DataHelper.toString(key.getData(), 32));
- _log.error("SessionKey after decryption: " + DataHelper.toString(nk.getData(), 32));
- _log.error("PublicKey: " + DataHelper.toDecimalString(pubKey.getData(), pubKey.getData().length));
- _log.error("PrivateKey: " + DataHelper.toDecimalString(privKey.getData(), privKey.getData().length));
-
- throw new Exception("Not equal!");
- } else {
- _log.debug("Basic ElG D(E(val)) == val");
- }
-
- } catch (Exception e) {
- _log.error("Error", e);
- try { Thread.sleep(5000); } catch (InterruptedException ie) {}
- System.exit(0);
- }
- }
-
- public static void main(String args[]) {
- I2PAppContext context = new I2PAppContext();
- ElGamalAESEngineTest tst = new ElGamalAESEngineTest(context);
- Object o = YKGenerator.class;
- try { Thread.sleep(120*1000); } catch (InterruptedException ie) {}
-
- tst.runBasicAESTest();
- tst.runAESTest();
- tst.runRoundtripTest();
- tst.runElGamalTest(2);
- // test bug
- for (int i = 0; i < 3; i++)
- tst.runLoopTest(1);
- // test throughput
- tst.runLoopTest(5);
-
- net.i2p.stat.SimpleStatDumper.dumpStats(context, Log.CRIT);
- try { Thread.sleep(5*1000); } catch (InterruptedException ie) {}
- }
-}
diff --git a/core/java/test/net/i2p/crypto/ElGamalTest.java b/core/java/test/net/i2p/crypto/ElGamalTest.java
new file mode 100644
index 000000000..302c9621c
--- /dev/null
+++ b/core/java/test/net/i2p/crypto/ElGamalTest.java
@@ -0,0 +1,383 @@
+package net.i2p.crypto;
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain
+ * with no warranty of any kind, either expressed or implied.
+ * It probably won't make your computer catch on fire, or eat
+ * your children, but it might. Use at your own risk.
+ *
+ */
+
+import net.i2p.I2PAppContext;
+import net.i2p.data.Hash;
+import net.i2p.data.SessionKey;
+import net.i2p.data.Base64;
+import net.i2p.data.PublicKey;
+import net.i2p.data.PrivateKey;
+import net.i2p.data.DataHelper;
+import net.i2p.data.DataFormatException;
+import net.i2p.data.SessionTag;
+import net.i2p.util.RandomSource;
+import net.i2p.util.Log;
+import net.i2p.util.Clock;
+
+import java.io.IOException;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+
+import java.util.Set;
+import java.util.HashSet;
+
+import junit.framework.TestCase;
+
+public class ElGamalTest extends TestCase{
+ private I2PAppContext _context;
+
+ // Following 4 String arrays for use with the testVerify* methods
+
+ private static final String UNENCRYPTED[] = new String[] {
+ "",
+ "hello world",
+ "1234567890123456789012345678901234567890123456789012345678901234567890" +
+ "1234567890123456789012345678901234567890123456789012345678901234567890" +
+ "1234567890123456789012345678901234567890123456789012345678901234567890" +
+ "123456789012",
+ "\0x00",
+ "\0x00\0x00\0x00",
+ "\0x00\0x01\0x02\0x00",
+ };
+ private static final String PUBLIC_KEY = new String(
+ "pOvBUMrSUUeN5awynzbPbCAwe3MqWprhSpp3OR7pvdfm9PhWaNbPoKRLeEmDoUwyNDoHE0" +
+ "E6mcZSG8qPQ8XUZFlczpilOl0MJBvsI9u9SMyi~bEqzSgzh9FNfS-NcGji3q2wI~Ux~q5B" +
+ "KOjGlyMLgd1nxl5R5wIYL4uHKZNaYuArsRYmtV~MgMQPGvDtIbdGTV6aL6UbOYryzQSUMY" +
+ "OuO3S~YoBjA6Nmi0SeJM3tyTxlI6U1EYjR6oQcI4SOFUW4L~8pfYWijcncCODAqpXVN6ZI" +
+ "AJ3a6vjxGu56IDp4xCcKlOEHgdXvqmEC67dR5qf2btH6dtWoB3-Z6QPsS6tPTQ=="
+ );
+ private static final String PRIVATE_KEY = new String(
+ "gMlIhURVXU8uPube20Xr8E1K11g-3qZxOj1riThHqt-rBx72MPq5ivT1rr28cE9mzOmsXi" +
+ "bbsuBuQKYDvF7hGICRB3ROSPePYhcupV3j7XiXUIYjWNw9hvylHXK~nTT7jkpIBazBJZfr" +
+ "LJPcDZTDB0YnCOHOL-KFn4N1R5B22g0iYRABN~O10AUjQmf1epklAXPqYlzmOYeJSfTPBI" +
+ "E44nEccWJp0M0KynhKVbDI0v9VYm6sPFK7WrzRyWwHL~r735wiRkwywuMmKJtA7-PuJjcW" +
+ "NLkJwx6WScH2msMzhzYPi8JSZJBl~PosX934l-L0T-KNV4jg1Ih6yoCnm1748A=="
+ );
+ private static final String ENCRYPTED[] = new String[] {
+ "AMfISa8KvTpaC7KXZzSvC2axyiSk0xPexBAf29yU~IKq21DzaU19wQcGJg-ktpG4hjGSg7" +
+ "u-mJ07b61yo-EGmVGZsv3nYuQYW-GjvsZQa9nm98VljlMtWrxu7TsRXw~SQlWQxMvthqJB" +
+ "1A7Y7Qa~C7-UlRytkD-cpVdgUfM-esuMWmjGs6Vc33N5U-tce5Fywa-9y7PSn3ukBO8KGR" +
+ "wm7T12~H2gvhgxrVeK2roOzsV7f5dGkvBQRZJ309Vg3j0kjaxWutgI3vli0pzDbSK9d5NR" +
+ "-GUDtdOb6IIfLiOckBegcv6I-wlSXjYJe8mIoaK45Ok3rEpHwWKVKS2MeuI7AmsAWgkQmW" +
+ "f8irmZaKc9X910VWSO5GYu6006hSc~r2TL3O7vwtW-Z9Oq~sAam9av1PPVJzAx8A4g~m~1" +
+ "avtNnncwlChsGo6mZHXqz-QMdMJXXP57f4bx36ZomkvpM-ZLlFAn-a~42KQJAApo4LfEyk" +
+ "7DPY2aTXL9ArOCNQIQB4f8QLyjvAvu6M3jzCoGo0wVX6oePfdiokGflriYOcD8rL4NbnCP" +
+ "~MSnVzC8LKyRzQVN1tDYj8~njuFqekls6En8KFJ-qgtL4PiYxbnBQDUPoW6y61m-S9r9e9" +
+ "y8qWd6~YtdAHAxVlw287~HEp9r7kqI-cjdo1337b7~5dm83KK45g5Nfw==",
+
+ "AIrd65mG1FJ~9J-DDSyhryVejJBSIjYOqV3GYmHDWgwLchTwq-bJS7dub3ENk9MZ-C6FIN" +
+ "gjUFRaLBtfwJnySmNf8pIf1srmgdfqGV2h77ufG5Gs0jggKPmPV~7Z1kTcgsqpL8MyrfXr" +
+ "Gi86X5ey-T0SZSFc0X1EhaE-47WlyWaGf-~xth6VOR~KG7clOxaOBpks-7WKZNQf7mpQRE" +
+ "4IsPJyj5p1Rf-MeDbVKbK~52IfXSuUZQ8uZr34KMoy4chjn6e-jBhM4XuaQWhsM~a3Q-zE" +
+ "pV-ea6t0bQTYfsbG9ch7pJuDPHM64o5mF9FS5-JGr7MOtfP7KDNHiYM2~-uC6BIAbiqBN8" +
+ "WSLX1mrHVuhiM-hiJ7U4oq~HYB6N~U980sCIW0dgFBbhalzzQhJQSrC1DFDqGfL5-L25mj" +
+ "ArP8dtvN0JY3LSnbcsm-pT9ttFHCPGomLfaAuP7ohknBoXK0j9e6~splg5sUA9TfLeBfqc" +
+ "Lr0Sf8b3l~PvmrVkbVcaE8yUqSS6JFdt3pavjyyAQSmSlb2jVNKGPlrov5QLzlbH7G~AUv" +
+ "IehsbGQX5ptRROtSojN~iYx3WQTOa-JLEC-AL7RbRu6B62p9I0pD0JgbUfCc4C4l9E9W~s" +
+ "MuaJLAXxh0b2miF7C5bzZHxbt~MtZ7Ho5qpZMitXyoE3icb43B6Y1sbA==",
+
+ "ACjb0FkTIQbnEzCZlYXGxekznfJad5uW~F5Mbu~0wtsI1O2veqdr7Mb0N754xdIz7929Ti" +
+ "1Kz-CxVEAkb3RBbVNcYHLfjy23oQ4BCioDKQaJcdkJqXa~Orm7Ta2tbkhM1Mx05MDrQaVF" +
+ "gCVXtwTsPSLVK8VwScjPIFLXgQqqZ5osq~WhaMcYe2I2RCQLOx2VzaKbT21MMbtF70a-nK" +
+ "WovkRUNfJEPeJosFwF2duAD0BHHrPiryK9BPDhyOiyN82ahOi2uim1Nt5yhlP3xo7cLV2p" +
+ "6kTlR1BNC5pYjtsvetZf6wk-solNUrJWIzcuc18uRDNH5K90GTL6FXPMSulM~E4ATRQfhZ" +
+ "fkW9xCrBIaIQM49ms2wONsp7fvI07b1r0rt7ZwCFOFit1HSAKl8UpsAYu-EsIO1qAK7vvO" +
+ "UV~0OuBXkMZEyJT-uIVfbE~xrwPE0zPYE~parSVQgi~yNQBxukUM1smAM5xXVvJu8GjmE-" +
+ "kJZw1cxaYLGsJjDHDk4HfEsyQVVPZ0V3bQvhB1tg5cCsTH~VNjts4taDTPWfDZmjtVaxxr" +
+ "PRII4NEDKqEzg3JBevM~yft-RDfMc8RVlm-gCGANrRQORFii7uD3o9~y~4P2tLnO7Fy3m5" +
+ "rdjRsOsWnCQZzw37mcBoT9rEZPrVpD8pjebJ1~HNc764xIpXDWVt8CbA==",
+
+ "AHDZBKiWeaIYQS9R1l70IlRnoplwKTkLP2dLlXmVh1gB33kx65uX8OMb3hdZEO0Bbzxkkx" +
+ "quqlNn5w166nJO4nPbpEzVfgtY4ClUuv~W4H4CXBr0FcZM1COAkd6rtp6~lUp7cZ8FAkpH" +
+ "spl95IxlFM-F1HwiPcbmTjRO1AwCal4sH8S5WmJCvBU6jH6pBPo~9B9vAtP7vX1EwsG2Jf" +
+ "CQXkVkfvbWpSicbsWn77aECedS3HkIMrXrxojp7gAiPgQhX4NR387rcUPFsMHGeUraTUPZ" +
+ "D7ctk5tpUuYYwRQc5cRKHa4zOq~AQyljx5w5~FByLda--6yCe7qDcILyTygudJ4AHRs1pJ" +
+ "RU3uuRTHZx0XJQo~cPsoQ2piAOohITX9~yMCimCgv2EIhY3Z-mAgo8qQ4iMbItoE1cl93I" +
+ "u2YV2n4wMq9laBx0shuKOJqO3rjRnszzCbqMuFAXfc3KgGDEaCpI7049s3i2yIcv4vT9uU" +
+ "AlrM-dsrdw0JgJiFYl0JXh~TO0IyrcVcLpgZYgRhEvTAdkDNwTs-2GK4tzdPEd34os4a2c" +
+ "DPL8joh3jhp~eGoRzrpcdRekxENdzheL4w3wD1fJ9W2-leil1FH6EPc3FSL6e~nqbw69gN" +
+ "bsuXAMQ6CobukJdJEy37uKmEw4v6WPyfYMUUacchv1JoNfkHLpnAWifQ==",
+
+ "AGwvKAMJcPAliP-n7F0Rrj0JMRaFGjww~zvBjyzc~SPJrBF831cMqZFRmMHotgA7S5BrH2" +
+ "6CL8okI2N-7as0F2l7OPx50dFEwSVSjqBjVV6SGRFC8oS-ii1FURMz2SCHSaj6kazAYq4s" +
+ "DwyqR7vnUrOtPnZujHSU~a02jinyn-QOaHkxRiUp-Oo0jlZiU5xomXgLdkhtuz6725WUDj" +
+ "3uVlMtIYfeKQsTdasujHe1oQhUmp58jfg5vgZ8g87cY8rn4p9DRwDBBuo6vi5on7T13sGx" +
+ "tY9wz6HTpwzDhEqpNrj~h4JibElfi0Jo8ZllmNTO1ZCNpUQgASoTtyFLD5rk6cIAMK0R7A" +
+ "7hjB0aelKM-V7AHkj-Fhrcm8xIgWhKaLn2wKbVNpAkllkiLALyfWJ9dhJ804RWQTMPE-GD" +
+ "kBMIFOOJ9MhpEN533OBQDwUKcoxMjl0zOMNCLx8IdCE6cLtUDKJXLB0atnDpLkBer6FwXP" +
+ "81EvKDYhtp1GsbiKvZDt8LSPJQnm2EdA3Pr9fpAisJ5Ocaxlfa6~uQCuqGA9nJ9n6w03u-" +
+ "ZpSMhSh4zm2s1MqijmaJRc-QNKmN~u1hh3R2hwWNi7FoStMA87sutEBXMdFI8un7StHNSE" +
+ "iCYwmmW2Nu3djkM-X8gGjSsdrphTU7uOXbwazmguobFGxI0JujYruM5Q==",
+
+ "ALFYtPSwEEW3eTO4hLw6PZNlBKoSIseQNBi034gq6FwYEZsJOAo-1VXcvMviKw2MCP9ZkH" +
+ "lTNBfzc79ms2TU8kXxc7zwUc-l2HJLWh6dj2tIQLR8bbWM7U0iUx4XB1B-FEvdhbjz7dsu" +
+ "6SBXVhxo2ulrk7Q7vX3kPrePhZZldcNZcS0t65DHYYwL~E~ROjQwOO4Cb~8FgiIUjb8CCN" +
+ "w5zxJpBaEt7UvZffkVwj-EWTzFy3DIjWIRizxnsI~mUI-VspPE~xlmFX~TwPS9UbwJDpm8" +
+ "-WzINFcehSzF3y9rzSMX-KbU8m4YZj07itZOiIbWgLeulTUB-UgwEkfJBG0xiSUAspZf2~" +
+ "t~NthBlpcdrBLADXTJ7Jmkk4MIfysV~JpDB7IVg0v4WcUUwF3sYMmBCdPCwyYf0hTrl2Yb" +
+ "L6kmm4u97WgQqf0TyzXtVZYwjct4LzZlyH591y6O6AQ4Fydqos9ABInzu-SbXq6S1Hi6vr" +
+ "aNWU3mcy2myie32EEXtkX7P8eXWY35GCv9ThPEYHG5g1qKOk95ZCTYYwlpgeyaMKsnN3C~" +
+ "x9TJA8K8T44v7vE6--Nw4Z4zjepwkIOht9iQsA6D6wRUQpeYX8bjIyYDPC7GUHq0WhXR6E" +
+ "6Ojc9k8V5uh0SZ-rCQX6sccdk3JbyRhjGP4rSKr6MmvxVVsqBjcbpxsg=="
+ };
+
+ protected void setUp() {
+ _context = new I2PAppContext();
+ Object o = YKGenerator.class;
+ }
+
+ public void testBasicAES(){
+ SessionKey sessionKey = KeyGenerator.getInstance().generateSessionKey();
+ Hash h = SHA256Generator.getInstance().calculateHash(sessionKey.getData());
+ byte iv[] = new byte[16];
+ System.arraycopy(h.getData(), 0, iv, 0, 16);
+
+ String msg = "Hello world01234012345678901234501234567890123450123456789012345";
+ h = SHA256Generator.getInstance().calculateHash(msg.getBytes());
+
+ byte aesEncr[] = new byte[msg.getBytes().length];
+ byte aesDecr[] = new byte[aesEncr.length];
+ _context.aes().encrypt(msg.getBytes(), 0, aesEncr, 0, sessionKey, iv, aesEncr.length);
+ _context.aes().decrypt(aesEncr, 0, aesDecr, 0, sessionKey, iv, aesEncr.length);
+ h = SHA256Generator.getInstance().calculateHash(aesDecr);
+
+ assertEquals(msg, new String(aesDecr));
+ }
+
+ public void testAES(){
+ SessionKey sessionKey = KeyGenerator.getInstance().generateSessionKey();
+ Hash h = SHA256Generator.getInstance().calculateHash(sessionKey.getData());
+ byte iv[] = new byte[16];
+ System.arraycopy(h.getData(), 0, iv, 0, 16);
+
+ String msg = "Hello world";
+
+ byte encrypted[] = _context.elGamalAESEngine().encryptAESBlock(msg.getBytes(), sessionKey, iv, null, null, 64);
+ Set foundTags = new HashSet();
+ SessionKey foundKey = new SessionKey();
+ byte decrypted[] = null;
+ try{
+ decrypted = _context.elGamalAESEngine().decryptAESBlock(encrypted, 0, encrypted.length, sessionKey, iv, null, foundTags, foundKey);
+ }catch(DataFormatException dfe){
+ dfe.printStackTrace();
+ fail();
+ }
+ assertNotNull(decrypted);
+ String read = new String(decrypted);
+ assertEquals(msg, read);
+ }
+
+ public void testRoundTrip(){
+ Object keys[] = KeyGenerator.getInstance().generatePKIKeypair();
+ PublicKey pubKey = (PublicKey)keys[0];
+ PrivateKey privKey = (PrivateKey)keys[1];
+
+ String msg = "Hello world";
+ Set toBeDelivered = new HashSet();
+ SessionKey key = _context.sessionKeyManager().getCurrentKey(pubKey);
+ if (key == null)
+ key = _context.sessionKeyManager().createSession(pubKey);
+ byte[] encrypted = _context.elGamalAESEngine().encrypt(msg.getBytes(), pubKey, key, 64);
+ byte[] decrypted = null;
+ try{
+ decrypted = _context.elGamalAESEngine().decrypt(encrypted, privKey);
+ }catch(DataFormatException dfe){
+ dfe.printStackTrace();
+ fail();
+ }
+ assertNotNull(decrypted);
+ String read = new String(decrypted);
+ assertEquals(msg, read);
+ }
+
+ public void testElGamal(){
+ for (int i = 0; i < 2; i++) {
+ Object keys[] = KeyGenerator.getInstance().generatePKIKeypair();
+ PublicKey pubKey = (PublicKey)keys[0];
+ PrivateKey privKey = (PrivateKey)keys[1];
+ SessionKey key = KeyGenerator.getInstance().generateSessionKey();
+
+ ByteArrayOutputStream elgSrc = new ByteArrayOutputStream(256);
+ try{
+ key.writeBytes(elgSrc);
+ }catch(DataFormatException dfe){
+ dfe.printStackTrace();
+ fail();
+ }catch(IOException ioe){
+ ioe.printStackTrace();
+ fail();
+ }
+
+ byte preIV[] = new byte[32];
+ RandomSource.getInstance().nextBytes(preIV);
+ try{
+ elgSrc.write(preIV);
+ elgSrc.flush();
+ }catch(IOException ioe){
+ ioe.printStackTrace();
+ fail();
+ }
+
+
+ byte elgEncr[] = _context.elGamalEngine().encrypt(elgSrc.toByteArray(), pubKey);
+ byte elgDecr[] = _context.elGamalEngine().decrypt(elgEncr, privKey);
+
+ ByteArrayInputStream bais = new ByteArrayInputStream(elgDecr);
+ SessionKey nk = new SessionKey();
+
+ try{
+ nk.readBytes(bais);
+ }catch(DataFormatException dfe){
+ dfe.printStackTrace();
+ fail();
+ }catch(IOException ioe){
+ ioe.printStackTrace();
+ fail();
+ }
+ byte postpreIV[] = new byte[32];
+
+ int read = 0;
+ try{
+ read = bais.read(postpreIV);
+ }catch(IOException ioe){
+ ioe.printStackTrace();
+ fail();
+ }
+
+ assertEquals(read, postpreIV.length);
+
+
+ assertTrue(DataHelper.eq(preIV, postpreIV));
+ assertEquals(key, nk);
+ }
+ }
+
+ public void testLoop(){
+ for(int i = 0; i < 5; i++){
+ Object keys[] = KeyGenerator.getInstance().generatePKIKeypair();
+ PublicKey pubKey = (PublicKey)keys[0];
+ PrivateKey privKey = (PrivateKey)keys[1];
+
+ byte[] msg = new byte[400];
+ RandomSource.getInstance().nextBytes(msg);
+ SessionKey key = _context.sessionKeyManager().getCurrentKey(pubKey);
+ if (key == null)
+ key = _context.sessionKeyManager().createSession(pubKey);
+
+ byte[] encrypted = _context.elGamalAESEngine().encrypt(msg, pubKey, key, 1024);
+ byte[] decrypted = null;
+ try{
+ decrypted = _context.elGamalAESEngine().decrypt(encrypted, privKey);
+ }catch(DataFormatException dfe){
+ dfe.printStackTrace();
+ fail();
+ }
+
+ assertTrue(DataHelper.eq(msg, decrypted));
+ }
+ }
+
+ public void testVerifySelf(){
+ Object keypair[] = _context.keyGenerator().generatePKIKeypair();
+ PublicKey pub = (PublicKey)keypair[0];
+ PrivateKey priv = (PrivateKey)keypair[1];
+
+ for (int i = 0; i < UNENCRYPTED.length; i++) {
+ byte orig[] = UNENCRYPTED[i].getBytes();
+
+ byte encrypted[] = _context.elGamalEngine().encrypt(orig, pub);
+ byte decrypted[] = _context.elGamalEngine().decrypt(encrypted, priv);
+
+ assertTrue(DataHelper.eq(decrypted, orig));
+ }
+ }
+
+ public void testVerifyCompatability(){
+ PublicKey pub = new PublicKey();
+ PrivateKey priv = new PrivateKey();
+ try{
+ pub.fromBase64(PUBLIC_KEY);
+ priv.fromBase64(PRIVATE_KEY);
+ }catch(DataFormatException dfe){
+ dfe.printStackTrace();
+ fail();
+ }
+
+ for (int i = 0; i < ENCRYPTED.length; i++) {
+ byte enc[] = Base64.decode(ENCRYPTED[i]);
+ byte decrypted[] = _context.elGamalEngine().decrypt(enc, priv);
+
+ assertTrue(DataHelper.eq(decrypted, UNENCRYPTED[i].getBytes()));
+ }
+ }
+
+ public void testMultiple(){
+ Object[] keys = KeyGenerator.getInstance().generatePKIKeypair();
+ byte[] message = new byte[222];
+ for (int x = 0; x < 25; x++) {
+ _context.random().nextBytes(message);
+ keys = KeyGenerator.getInstance().generatePKIKeypair();
+ PublicKey pubkey = (PublicKey)keys[0];
+ PrivateKey privkey = (PrivateKey)keys[1];
+
+ byte[] e = _context.elGamalEngine().encrypt(message, pubkey);
+ byte[] d = _context.elGamalEngine().decrypt(e, privkey);
+
+ assertTrue(DataHelper.eq(d, message));
+ }
+ }
+
+ public void testElGamalAESEngine() throws Exception{
+ I2PAppContext ctx = new I2PAppContext();
+ ElGamalAESEngine e = new ElGamalAESEngine(ctx);
+ Object kp[] = ctx.keyGenerator().generatePKIKeypair();
+ PublicKey pubKey = (PublicKey)kp[0];
+ PrivateKey privKey = (PrivateKey)kp[1];
+ SessionKey sessionKey = ctx.keyGenerator().generateSessionKey();
+ for (int i = 0; i < 10; i++) {
+ Set tags = new HashSet(5);
+ if (i == 0) {
+ for (int j = 0; j < 5; j++)
+ tags.add(new SessionTag(true));
+ }
+ byte encrypted[] = e.encrypt("blah".getBytes(), pubKey, sessionKey, tags, 1024);
+ byte decrypted[] = e.decrypt(encrypted, privKey);
+ assertEquals("blah", new String(decrypted));
+
+ ctx.sessionKeyManager().tagsDelivered(pubKey, sessionKey, tags);
+ }
+ }
+
+ public void testElGamalEngine(){
+ int numRuns = 100;
+ RandomSource.getInstance().nextBoolean();
+ I2PAppContext context = new I2PAppContext();
+
+ for (int i = 0; i < numRuns; i++) {
+ Object pair[] = KeyGenerator.getInstance().generatePKIKeypair();
+
+ PublicKey pubkey = (PublicKey) pair[0];
+ PrivateKey privkey = (PrivateKey) pair[1];
+ byte buf[] = new byte[128];
+ RandomSource.getInstance().nextBytes(buf);
+ byte encr[] = context.elGamalEngine().encrypt(buf, pubkey);
+ byte decr[] = context.elGamalEngine().decrypt(encr, privkey);
+
+ assertTrue(DataHelper.eq(decr, buf));
+ }
+ }
+
+ public void testYKGen(){
+ RandomSource.getInstance().nextBoolean();
+ for (int i = 0; i < 5; i++) {
+ YKGenerator.getNextYK();
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/crypto/ElGamalVerify.java b/core/java/test/net/i2p/crypto/ElGamalVerify.java
index ad98d18f4..e69de29bb 100644
--- a/core/java/test/net/i2p/crypto/ElGamalVerify.java
+++ b/core/java/test/net/i2p/crypto/ElGamalVerify.java
@@ -1,206 +0,0 @@
-package net.i2p.crypto;
-
-import net.i2p.I2PAppContext;
-import net.i2p.data.Base64;
-import net.i2p.data.DataHelper;
-import net.i2p.data.PrivateKey;
-import net.i2p.data.PublicKey;
-
-/**
- * Unit test verifying the ElGamal encryption/decryption with some test
- * data. The keys generated & data stored were generated by jrandom on
- * a pentium4 w/ an optimized jbigi installed and verified with pure java.
- *
- */
-public class ElGamalVerify {
- private I2PAppContext _context;
-
- private static final String UNENCRYPTED[] = new String[] {
- "",
- "hello world",
- "1234567890123456789012345678901234567890123456789012345678901234567890" +
- "1234567890123456789012345678901234567890123456789012345678901234567890" +
- "1234567890123456789012345678901234567890123456789012345678901234567890" +
- "123456789012",
- "\0x00",
- "\0x00\0x00\0x00",
- "\0x00\0x01\0x02\0x00",
- };
- private static final String PUBLIC_KEY = new String(
- "pOvBUMrSUUeN5awynzbPbCAwe3MqWprhSpp3OR7pvdfm9PhWaNbPoKRLeEmDoUwyNDoHE0" +
- "E6mcZSG8qPQ8XUZFlczpilOl0MJBvsI9u9SMyi~bEqzSgzh9FNfS-NcGji3q2wI~Ux~q5B" +
- "KOjGlyMLgd1nxl5R5wIYL4uHKZNaYuArsRYmtV~MgMQPGvDtIbdGTV6aL6UbOYryzQSUMY" +
- "OuO3S~YoBjA6Nmi0SeJM3tyTxlI6U1EYjR6oQcI4SOFUW4L~8pfYWijcncCODAqpXVN6ZI" +
- "AJ3a6vjxGu56IDp4xCcKlOEHgdXvqmEC67dR5qf2btH6dtWoB3-Z6QPsS6tPTQ=="
- );
- private static final String PRIVATE_KEY = new String(
- "gMlIhURVXU8uPube20Xr8E1K11g-3qZxOj1riThHqt-rBx72MPq5ivT1rr28cE9mzOmsXi" +
- "bbsuBuQKYDvF7hGICRB3ROSPePYhcupV3j7XiXUIYjWNw9hvylHXK~nTT7jkpIBazBJZfr" +
- "LJPcDZTDB0YnCOHOL-KFn4N1R5B22g0iYRABN~O10AUjQmf1epklAXPqYlzmOYeJSfTPBI" +
- "E44nEccWJp0M0KynhKVbDI0v9VYm6sPFK7WrzRyWwHL~r735wiRkwywuMmKJtA7-PuJjcW" +
- "NLkJwx6WScH2msMzhzYPi8JSZJBl~PosX934l-L0T-KNV4jg1Ih6yoCnm1748A=="
- );
- private static final String ENCRYPTED[] = new String[] {
- "AMfISa8KvTpaC7KXZzSvC2axyiSk0xPexBAf29yU~IKq21DzaU19wQcGJg-ktpG4hjGSg7" +
- "u-mJ07b61yo-EGmVGZsv3nYuQYW-GjvsZQa9nm98VljlMtWrxu7TsRXw~SQlWQxMvthqJB" +
- "1A7Y7Qa~C7-UlRytkD-cpVdgUfM-esuMWmjGs6Vc33N5U-tce5Fywa-9y7PSn3ukBO8KGR" +
- "wm7T12~H2gvhgxrVeK2roOzsV7f5dGkvBQRZJ309Vg3j0kjaxWutgI3vli0pzDbSK9d5NR" +
- "-GUDtdOb6IIfLiOckBegcv6I-wlSXjYJe8mIoaK45Ok3rEpHwWKVKS2MeuI7AmsAWgkQmW" +
- "f8irmZaKc9X910VWSO5GYu6006hSc~r2TL3O7vwtW-Z9Oq~sAam9av1PPVJzAx8A4g~m~1" +
- "avtNnncwlChsGo6mZHXqz-QMdMJXXP57f4bx36ZomkvpM-ZLlFAn-a~42KQJAApo4LfEyk" +
- "7DPY2aTXL9ArOCNQIQB4f8QLyjvAvu6M3jzCoGo0wVX6oePfdiokGflriYOcD8rL4NbnCP" +
- "~MSnVzC8LKyRzQVN1tDYj8~njuFqekls6En8KFJ-qgtL4PiYxbnBQDUPoW6y61m-S9r9e9" +
- "y8qWd6~YtdAHAxVlw287~HEp9r7kqI-cjdo1337b7~5dm83KK45g5Nfw==",
-
- "AIrd65mG1FJ~9J-DDSyhryVejJBSIjYOqV3GYmHDWgwLchTwq-bJS7dub3ENk9MZ-C6FIN" +
- "gjUFRaLBtfwJnySmNf8pIf1srmgdfqGV2h77ufG5Gs0jggKPmPV~7Z1kTcgsqpL8MyrfXr" +
- "Gi86X5ey-T0SZSFc0X1EhaE-47WlyWaGf-~xth6VOR~KG7clOxaOBpks-7WKZNQf7mpQRE" +
- "4IsPJyj5p1Rf-MeDbVKbK~52IfXSuUZQ8uZr34KMoy4chjn6e-jBhM4XuaQWhsM~a3Q-zE" +
- "pV-ea6t0bQTYfsbG9ch7pJuDPHM64o5mF9FS5-JGr7MOtfP7KDNHiYM2~-uC6BIAbiqBN8" +
- "WSLX1mrHVuhiM-hiJ7U4oq~HYB6N~U980sCIW0dgFBbhalzzQhJQSrC1DFDqGfL5-L25mj" +
- "ArP8dtvN0JY3LSnbcsm-pT9ttFHCPGomLfaAuP7ohknBoXK0j9e6~splg5sUA9TfLeBfqc" +
- "Lr0Sf8b3l~PvmrVkbVcaE8yUqSS6JFdt3pavjyyAQSmSlb2jVNKGPlrov5QLzlbH7G~AUv" +
- "IehsbGQX5ptRROtSojN~iYx3WQTOa-JLEC-AL7RbRu6B62p9I0pD0JgbUfCc4C4l9E9W~s" +
- "MuaJLAXxh0b2miF7C5bzZHxbt~MtZ7Ho5qpZMitXyoE3icb43B6Y1sbA==",
-
- "ACjb0FkTIQbnEzCZlYXGxekznfJad5uW~F5Mbu~0wtsI1O2veqdr7Mb0N754xdIz7929Ti" +
- "1Kz-CxVEAkb3RBbVNcYHLfjy23oQ4BCioDKQaJcdkJqXa~Orm7Ta2tbkhM1Mx05MDrQaVF" +
- "gCVXtwTsPSLVK8VwScjPIFLXgQqqZ5osq~WhaMcYe2I2RCQLOx2VzaKbT21MMbtF70a-nK" +
- "WovkRUNfJEPeJosFwF2duAD0BHHrPiryK9BPDhyOiyN82ahOi2uim1Nt5yhlP3xo7cLV2p" +
- "6kTlR1BNC5pYjtsvetZf6wk-solNUrJWIzcuc18uRDNH5K90GTL6FXPMSulM~E4ATRQfhZ" +
- "fkW9xCrBIaIQM49ms2wONsp7fvI07b1r0rt7ZwCFOFit1HSAKl8UpsAYu-EsIO1qAK7vvO" +
- "UV~0OuBXkMZEyJT-uIVfbE~xrwPE0zPYE~parSVQgi~yNQBxukUM1smAM5xXVvJu8GjmE-" +
- "kJZw1cxaYLGsJjDHDk4HfEsyQVVPZ0V3bQvhB1tg5cCsTH~VNjts4taDTPWfDZmjtVaxxr" +
- "PRII4NEDKqEzg3JBevM~yft-RDfMc8RVlm-gCGANrRQORFii7uD3o9~y~4P2tLnO7Fy3m5" +
- "rdjRsOsWnCQZzw37mcBoT9rEZPrVpD8pjebJ1~HNc764xIpXDWVt8CbA==",
-
- "AHDZBKiWeaIYQS9R1l70IlRnoplwKTkLP2dLlXmVh1gB33kx65uX8OMb3hdZEO0Bbzxkkx" +
- "quqlNn5w166nJO4nPbpEzVfgtY4ClUuv~W4H4CXBr0FcZM1COAkd6rtp6~lUp7cZ8FAkpH" +
- "spl95IxlFM-F1HwiPcbmTjRO1AwCal4sH8S5WmJCvBU6jH6pBPo~9B9vAtP7vX1EwsG2Jf" +
- "CQXkVkfvbWpSicbsWn77aECedS3HkIMrXrxojp7gAiPgQhX4NR387rcUPFsMHGeUraTUPZ" +
- "D7ctk5tpUuYYwRQc5cRKHa4zOq~AQyljx5w5~FByLda--6yCe7qDcILyTygudJ4AHRs1pJ" +
- "RU3uuRTHZx0XJQo~cPsoQ2piAOohITX9~yMCimCgv2EIhY3Z-mAgo8qQ4iMbItoE1cl93I" +
- "u2YV2n4wMq9laBx0shuKOJqO3rjRnszzCbqMuFAXfc3KgGDEaCpI7049s3i2yIcv4vT9uU" +
- "AlrM-dsrdw0JgJiFYl0JXh~TO0IyrcVcLpgZYgRhEvTAdkDNwTs-2GK4tzdPEd34os4a2c" +
- "DPL8joh3jhp~eGoRzrpcdRekxENdzheL4w3wD1fJ9W2-leil1FH6EPc3FSL6e~nqbw69gN" +
- "bsuXAMQ6CobukJdJEy37uKmEw4v6WPyfYMUUacchv1JoNfkHLpnAWifQ==",
-
- "AGwvKAMJcPAliP-n7F0Rrj0JMRaFGjww~zvBjyzc~SPJrBF831cMqZFRmMHotgA7S5BrH2" +
- "6CL8okI2N-7as0F2l7OPx50dFEwSVSjqBjVV6SGRFC8oS-ii1FURMz2SCHSaj6kazAYq4s" +
- "DwyqR7vnUrOtPnZujHSU~a02jinyn-QOaHkxRiUp-Oo0jlZiU5xomXgLdkhtuz6725WUDj" +
- "3uVlMtIYfeKQsTdasujHe1oQhUmp58jfg5vgZ8g87cY8rn4p9DRwDBBuo6vi5on7T13sGx" +
- "tY9wz6HTpwzDhEqpNrj~h4JibElfi0Jo8ZllmNTO1ZCNpUQgASoTtyFLD5rk6cIAMK0R7A" +
- "7hjB0aelKM-V7AHkj-Fhrcm8xIgWhKaLn2wKbVNpAkllkiLALyfWJ9dhJ804RWQTMPE-GD" +
- "kBMIFOOJ9MhpEN533OBQDwUKcoxMjl0zOMNCLx8IdCE6cLtUDKJXLB0atnDpLkBer6FwXP" +
- "81EvKDYhtp1GsbiKvZDt8LSPJQnm2EdA3Pr9fpAisJ5Ocaxlfa6~uQCuqGA9nJ9n6w03u-" +
- "ZpSMhSh4zm2s1MqijmaJRc-QNKmN~u1hh3R2hwWNi7FoStMA87sutEBXMdFI8un7StHNSE" +
- "iCYwmmW2Nu3djkM-X8gGjSsdrphTU7uOXbwazmguobFGxI0JujYruM5Q==",
-
- "ALFYtPSwEEW3eTO4hLw6PZNlBKoSIseQNBi034gq6FwYEZsJOAo-1VXcvMviKw2MCP9ZkH" +
- "lTNBfzc79ms2TU8kXxc7zwUc-l2HJLWh6dj2tIQLR8bbWM7U0iUx4XB1B-FEvdhbjz7dsu" +
- "6SBXVhxo2ulrk7Q7vX3kPrePhZZldcNZcS0t65DHYYwL~E~ROjQwOO4Cb~8FgiIUjb8CCN" +
- "w5zxJpBaEt7UvZffkVwj-EWTzFy3DIjWIRizxnsI~mUI-VspPE~xlmFX~TwPS9UbwJDpm8" +
- "-WzINFcehSzF3y9rzSMX-KbU8m4YZj07itZOiIbWgLeulTUB-UgwEkfJBG0xiSUAspZf2~" +
- "t~NthBlpcdrBLADXTJ7Jmkk4MIfysV~JpDB7IVg0v4WcUUwF3sYMmBCdPCwyYf0hTrl2Yb" +
- "L6kmm4u97WgQqf0TyzXtVZYwjct4LzZlyH591y6O6AQ4Fydqos9ABInzu-SbXq6S1Hi6vr" +
- "aNWU3mcy2myie32EEXtkX7P8eXWY35GCv9ThPEYHG5g1qKOk95ZCTYYwlpgeyaMKsnN3C~" +
- "x9TJA8K8T44v7vE6--Nw4Z4zjepwkIOht9iQsA6D6wRUQpeYX8bjIyYDPC7GUHq0WhXR6E" +
- "6Ojc9k8V5uh0SZ-rCQX6sccdk3JbyRhjGP4rSKr6MmvxVVsqBjcbpxsg=="
- };
-
- public static void main(String args[]) {
- ElGamalVerify verify = new ElGamalVerify();
- verify.verifySelf();
- verify.verifyCompatability();
- if (args.length > 0)
- verify.generateEncrypted();
- }
-
- public ElGamalVerify() {
- _context = new I2PAppContext();
- }
-
- /** verify that we can decrypt what we encrypt */
- private void verifySelf() {
- try {
- Object keypair[] = _context.keyGenerator().generatePKIKeypair();
- PublicKey pub = (PublicKey)keypair[0];
- PrivateKey priv = (PrivateKey)keypair[1];
-
- for (int i = 0; i < UNENCRYPTED.length; i++) {
- byte orig[] = UNENCRYPTED[i].getBytes();
-
- byte encrypted[] = _context.elGamalEngine().encrypt(orig, pub);
- byte decrypted[] = _context.elGamalEngine().decrypt(encrypted, priv);
-
- if (DataHelper.eq(decrypted, orig))
- log("OK : verifySelf[" + i + "] passed");
- else
- log("ERROR: verifySelf[" + i + "] failed");
- }
- } catch (Exception e) {
- log("ERROR: verifySelf blew up: " + e.getMessage());
- e.printStackTrace();
- }
- }
-
- /** verify that we can decrypt what other people encrypt */
- private void verifyCompatability() {
- verifyDecrypt();
- }
-
- private void verifyDecrypt() {
- try {
- PublicKey pub = new PublicKey();
- PrivateKey priv = new PrivateKey();
- pub.fromBase64(PUBLIC_KEY);
- priv.fromBase64(PRIVATE_KEY);
-
- for (int i = 0; i < ENCRYPTED.length; i++) {
- byte enc[] = Base64.decode(ENCRYPTED[i]);
- byte decrypted[] = _context.elGamalEngine().decrypt(enc, priv);
-
- if (DataHelper.eq(decrypted, UNENCRYPTED[i].getBytes()))
- log("OK : verifyDecrypt[" + i + "] passed");
- else
- log("ERROR: verifyDecrypt[" + i + "] failed");
- }
- } catch (Exception e) {
- log("ERROR: generateEncrypted blew up: " + e.getMessage());
- e.printStackTrace();
- }
- }
- private void generateEncrypted() {
- try {
- Object keypair[] = _context.keyGenerator().generatePKIKeypair();
- PublicKey pub = (PublicKey)keypair[0];
- PrivateKey priv = (PrivateKey)keypair[1];
-
- log("PUBLIC : " + pub.toBase64());
- log("PRIVATE: " + priv.toBase64());
-
- for (int i = 0; i < UNENCRYPTED.length; i++) {
- byte orig[] = UNENCRYPTED[i].getBytes();
-
- byte encrypted[] = _context.elGamalEngine().encrypt(orig, pub);
-
- System.out.println("Encrypted [" + i + "]: ");
- String enc = Base64.encode(encrypted);
- for (int j = 0; j < enc.length(); j++) {
- int remaining = enc.length() - j*70;
- if (remaining > 0) {
- String cur = enc.substring(j * 70, remaining > 70 ? (j+1)*70 : enc.length());
- System.out.println(cur);
- }
- }
- }
- } catch (Exception e) {
- log("ERROR: generateEncrypted blew up: " + e.getMessage());
- e.printStackTrace();
- }
- }
-
- private void log(String msg) {
- System.out.println(msg);
- }
-}
diff --git a/core/java/test/net/i2p/crypto/HMACSHA256Test.java b/core/java/test/net/i2p/crypto/HMACSHA256Test.java
new file mode 100644
index 000000000..57e94f78e
--- /dev/null
+++ b/core/java/test/net/i2p/crypto/HMACSHA256Test.java
@@ -0,0 +1,35 @@
+package net.i2p.crypto;
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain
+ * with no warranty of any kind, either expressed or implied.
+ * It probably won't make your computer catch on fire, or eat
+ * your children, but it might. Use at your own risk.
+ *
+ */
+
+import net.i2p.I2PAppContext;
+import net.i2p.data.SessionKey;
+
+import junit.framework.TestCase;
+
+public class HMACSHA256Test extends TestCase{
+ private I2PAppContext _context;
+
+ protected void setUp() {
+ _context = new I2PAppContext();
+ }
+
+ public void testMultiple(){
+ int size = 1;
+ for(int i = 0; i < 24; i++){
+ SessionKey key = _context.keyGenerator().generateSessionKey();
+
+ byte[] message = new byte[size];
+ size*=2;
+ _context.random().nextBytes(message);
+
+ _context.hmac().calculate(key, message);
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/crypto/KeyGeneratorTest.java b/core/java/test/net/i2p/crypto/KeyGeneratorTest.java
new file mode 100644
index 000000000..3815e0763
--- /dev/null
+++ b/core/java/test/net/i2p/crypto/KeyGeneratorTest.java
@@ -0,0 +1,50 @@
+package net.i2p.crypto;
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain
+ * with no warranty of any kind, either expressed or implied.
+ * It probably won't make your computer catch on fire, or eat
+ * your children, but it might. Use at your own risk.
+ *
+ */
+
+import net.i2p.I2PAppContext;
+import net.i2p.util.RandomSource;
+import net.i2p.data.SigningPrivateKey;
+import net.i2p.data.SigningPublicKey;
+import net.i2p.data.DataHelper;
+import net.i2p.data.Signature;
+import net.i2p.data.PublicKey;
+import net.i2p.data.PrivateKey;
+
+import junit.framework.TestCase;
+
+public class KeyGeneratorTest extends TestCase{
+ public void testKeyGen(){
+ RandomSource.getInstance().nextBoolean();
+ byte src[] = new byte[200];
+ RandomSource.getInstance().nextBytes(src);
+
+ I2PAppContext ctx = new I2PAppContext();
+ for (int i = 0; i < 10; i++) {
+ Object keys[] = KeyGenerator.getInstance().generatePKIKeypair();
+ byte ctext[] = ctx.elGamalEngine().encrypt(src, (PublicKey) keys[0]);
+ byte ptext[] = ctx.elGamalEngine().decrypt(ctext, (PrivateKey) keys[1]);
+ assertTrue(DataHelper.eq(ptext, src));
+ }
+
+ Object obj[] = KeyGenerator.getInstance().generateSigningKeypair();
+ SigningPublicKey fake = (SigningPublicKey) obj[0];
+ for (int i = 0; i < 10; i++) {
+ Object keys[] = KeyGenerator.getInstance().generateSigningKeypair();
+
+ Signature sig = DSAEngine.getInstance().sign(src, (SigningPrivateKey) keys[1]);
+ assertTrue(DSAEngine.getInstance().verifySignature(sig, src, (SigningPublicKey) keys[0]));
+ assertFalse(DSAEngine.getInstance().verifySignature(sig, src, fake));
+ }
+
+ for (int i = 0; i < 1000; i++) {
+ KeyGenerator.getInstance().generateSessionKey();
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/crypto/SHA1HashTest.java b/core/java/test/net/i2p/crypto/SHA1HashTest.java
new file mode 100644
index 000000000..72e9f0aa4
--- /dev/null
+++ b/core/java/test/net/i2p/crypto/SHA1HashTest.java
@@ -0,0 +1,146 @@
+package net.i2p.crypto;
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain
+ * with no warranty of any kind, either expressed or implied.
+ * It probably won't make your computer catch on fire, or eat
+ * your children, but it might. Use at your own risk.
+ *
+ */
+
+/* @(#)SHA1Test.java 1.10 2004-04-24
+ * This file was freely contributed to the LimeWire project and is covered
+ * by its existing GPL licence, but it may be used individually as a public
+ * domain implementation of a published algorithm (see below for references).
+ * It was also freely contributed to the Bitzi public domain sources.
+ * @author Philippe Verdy
+ */
+
+/* Sun may wish to change the following package name, if integrating this
+ * class in the Sun JCE Security Provider for Java 1.5 (code-named Tiger).
+ */
+//package com.bitzi.util;
+
+import java.security.*;
+
+import junit.framework.TestCase;
+
+public class SHA1HashTest extends TestCase{
+
+ private final SHA1 hash = new SHA1();
+
+ public void testSHA1() throws Exception{
+ tst(1, 1,"abc","A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D");
+
+ tst(1, 2,"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
+ "84983E44 1C3BD26e BAAE4AA1 F95129E5 E54670F1");
+ tst(1, 3, 1000000, "a",
+ "34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F");
+
+ tst(2, 2, new byte[] {/* 8 bits, i.e. 1 byte */
+ (byte)0x5e},
+ "5e6f80a3 4a9798ca fc6a5db9 6cc57ba4 c4db59c2");
+ tst(2, 4, new byte[] {/* 128 bits, i.e. 16 bytes */
+ (byte)0x9a,(byte)0x7d,(byte)0xfd,(byte)0xf1,(byte)0xec,(byte)0xea,(byte)0xd0,(byte)0x6e,
+ (byte)0xd6,(byte)0x46,(byte)0xaa,(byte)0x55,(byte)0xfe,(byte)0x75,(byte)0x71,(byte)0x46},
+ "82abff66 05dbe1c1 7def12a3 94fa22a8 2b544a35");
+
+ tst(3, 2, new byte[] {/* 1304 bits, i.e. 163 bytes */
+ (byte)0xf7,(byte)0x8f,(byte)0x92,(byte)0x14,(byte)0x1b,(byte)0xcd,(byte)0x17,(byte)0x0a,
+ (byte)0xe8,(byte)0x9b,(byte)0x4f,(byte)0xba,(byte)0x15,(byte)0xa1,(byte)0xd5,(byte)0x9f,
+ (byte)0x3f,(byte)0xd8,(byte)0x4d,(byte)0x22,(byte)0x3c,(byte)0x92,(byte)0x51,(byte)0xbd,
+ (byte)0xac,(byte)0xbb,(byte)0xae,(byte)0x61,(byte)0xd0,(byte)0x5e,(byte)0xd1,(byte)0x15,
+ (byte)0xa0,(byte)0x6a,(byte)0x7c,(byte)0xe1,(byte)0x17,(byte)0xb7,(byte)0xbe,(byte)0xea,
+ (byte)0xd2,(byte)0x44,(byte)0x21,(byte)0xde,(byte)0xd9,(byte)0xc3,(byte)0x25,(byte)0x92,
+ (byte)0xbd,(byte)0x57,(byte)0xed,(byte)0xea,(byte)0xe3,(byte)0x9c,(byte)0x39,(byte)0xfa,
+ (byte)0x1f,(byte)0xe8,(byte)0x94,(byte)0x6a,(byte)0x84,(byte)0xd0,(byte)0xcf,(byte)0x1f,
+ (byte)0x7b,(byte)0xee,(byte)0xad,(byte)0x17,(byte)0x13,(byte)0xe2,(byte)0xe0,(byte)0x95,
+ (byte)0x98,(byte)0x97,(byte)0x34,(byte)0x7f,(byte)0x67,(byte)0xc8,(byte)0x0b,(byte)0x04,
+ (byte)0x00,(byte)0xc2,(byte)0x09,(byte)0x81,(byte)0x5d,(byte)0x6b,(byte)0x10,(byte)0xa6,
+ (byte)0x83,(byte)0x83,(byte)0x6f,(byte)0xd5,(byte)0x56,(byte)0x2a,(byte)0x56,(byte)0xca,
+ (byte)0xb1,(byte)0xa2,(byte)0x8e,(byte)0x81,(byte)0xb6,(byte)0x57,(byte)0x66,(byte)0x54,
+ (byte)0x63,(byte)0x1c,(byte)0xf1,(byte)0x65,(byte)0x66,(byte)0xb8,(byte)0x6e,(byte)0x3b,
+ (byte)0x33,(byte)0xa1,(byte)0x08,(byte)0xb0,(byte)0x53,(byte)0x07,(byte)0xc0,(byte)0x0a,
+ (byte)0xff,(byte)0x14,(byte)0xa7,(byte)0x68,(byte)0xed,(byte)0x73,(byte)0x50,(byte)0x60,
+ (byte)0x6a,(byte)0x0f,(byte)0x85,(byte)0xe6,(byte)0xa9,(byte)0x1d,(byte)0x39,(byte)0x6f,
+ (byte)0x5b,(byte)0x5c,(byte)0xbe,(byte)0x57,(byte)0x7f,(byte)0x9b,(byte)0x38,(byte)0x80,
+ (byte)0x7c,(byte)0x7d,(byte)0x52,(byte)0x3d,(byte)0x6d,(byte)0x79,(byte)0x2f,(byte)0x6e,
+ (byte)0xbc,(byte)0x24,(byte)0xa4,(byte)0xec,(byte)0xf2,(byte)0xb3,(byte)0xa4,(byte)0x27,
+ (byte)0xcd,(byte)0xbb,(byte)0xfb},
+ "cb0082c8 f197d260 991ba6a4 60e76e20 2bad27b3");
+
+ {
+ final int RETRIES = 10;
+ final int ITERATIONS = 2000;
+ final int BLOCKSIZE = 65536;
+ byte[] input = new byte[BLOCKSIZE];
+ for (int i = BLOCKSIZE; --i >= 0; )
+ input[i] = (byte)i;
+
+
+
+ for (int retry = 0; retry < RETRIES; retry++) {
+ for (int i = ITERATIONS; --i >= 0; );
+ for (int i = ITERATIONS; --i >= 0; )
+ hash.engineUpdate(input, 0, BLOCKSIZE);
+ }
+ hash.engineReset();
+
+
+ MessageDigest md = MessageDigest.getInstance("SHA");
+ for (int retry = 0; retry < RETRIES; retry++) {
+ for (int i = ITERATIONS; --i >= 0; );
+ for (int i = ITERATIONS; --i >= 0; )
+ md.update(input, 0, BLOCKSIZE);
+ }
+ md.reset();
+ }
+ }
+
+ private final void tst(final int set, final int vector,
+ final String source,
+ final String expect) {
+ byte[] input = new byte[source.length()];
+ for (int i = 0; i < input.length; i++)
+ input[i] = (byte)source.charAt(i);
+ tst(set, vector, input, expect);
+ }
+
+ private final void tst(final int set, final int vector,
+ final byte[] input,
+ final String expect) {
+
+ hash.engineUpdate(input, 0, input.length);
+ tstResult(expect);
+ }
+
+ private final void tst(final int set, final int vector,
+ final int times, final String source,
+ final String expect) {
+ byte[] input = new byte[source.length()];
+ for (int i = 0; i < input.length; i++)
+ input[i] = (byte)source.charAt(i);
+ for (int i = 0; i < times; i++)
+ hash.engineUpdate(input, 0, input.length);
+ tstResult(expect);
+ }
+
+ private final void tstResult(String expect) {
+ final String result = toHex(hash.engineDigest());
+ expect = expect.toUpperCase();
+ assertEquals(expect, result);
+
+ }
+
+ private final String toHex(final byte[] bytes) {
+ StringBuffer buf = new StringBuffer(bytes.length * 2);
+ for (int i = 0; i < bytes.length; i++) {
+ if ((i & 3) == 0 && i != 0)
+ buf.append(' ');
+ buf.append(HEX.charAt((bytes[i] >> 4) & 0xF))
+ .append(HEX.charAt( bytes[i] & 0xF));
+ }
+ return buf.toString();
+ }
+ private static final String HEX = "0123456789ABCDEF";
+}
diff --git a/core/java/test/net/i2p/crypto/SHA256Test.java b/core/java/test/net/i2p/crypto/SHA256Test.java
new file mode 100644
index 000000000..c800f60ee
--- /dev/null
+++ b/core/java/test/net/i2p/crypto/SHA256Test.java
@@ -0,0 +1,100 @@
+package net.i2p.crypto;
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain
+ * with no warranty of any kind, either expressed or implied.
+ * It probably won't make your computer catch on fire, or eat
+ * your children, but it might. Use at your own risk.
+ *
+ */
+
+import net.i2p.I2PAppContext;
+import net.i2p.data.DataHelper;
+import net.i2p.data.Hash;
+
+import org.bouncycastle.crypto.digests.SHA256Digest;
+
+import junit.framework.TestCase;
+/**
+ * @author Comwiz
+ */
+public class SHA256Test extends TestCase{
+ private I2PAppContext _context;
+
+ protected void setUp() {
+ _context = new I2PAppContext();
+ }
+
+ public void testMultiple(){
+ int size = 1;
+ for(int i = 0; i < 24; i++){
+ byte[] message = new byte[size];
+ size*=2;
+ _context.random().nextBytes(message);
+
+ SHA256Generator.getInstance().calculateHash(message);
+ }
+ }
+
+ public void testCopyConstructor(){
+ SHA256Digest orig = new SHA256Digest();
+ byte[] message = "update this!".getBytes();
+ orig.update(message, 0, message.length);
+
+ SHA256Digest copy = new SHA256Digest(orig);
+
+ byte[] origData = new byte[32];
+ orig.doFinal(origData, 0);
+ byte[] copyData = new byte[32];
+ copy.doFinal(copyData, 0);
+
+ assertTrue(DataHelper.eq(origData, copyData));
+
+ }
+
+ public void testCheckName(){
+ SHA256Digest digest = new SHA256Digest();
+ assertEquals("SHA-256", digest.getAlgorithmName());
+ }
+
+ public void testManualUpdate(){
+ byte[] data = "deathnotronic".getBytes();
+
+ SHA256Digest one = new SHA256Digest();
+ for(int i = 0; i < data.length; i++){
+ one.update(data[i]);
+ }
+
+ SHA256Digest two = new SHA256Digest();
+ two.update(data[0]);
+ two.update(data, 1, data.length-1);
+
+ byte[] oneData = new byte[32];
+ one.doFinal(oneData, 0);
+ byte[] twoData = new byte[32];
+ two.doFinal(twoData, 0);
+
+ assertTrue(DataHelper.eq(oneData, twoData));
+ }
+
+ public void test14Words(){
+ byte message[] = new byte[56];
+ _context.random().nextBytes(message);
+ SHA256Digest orig = new SHA256Digest();
+ orig.update(message, 0, message.length);
+ orig.doFinal(new byte[32], 0);
+ }
+
+ public void testSHA(){
+ I2PAppContext ctx = I2PAppContext.getGlobalContext();
+ byte orig[] = new byte[4096];
+ ctx.random().nextBytes(orig);
+ Hash old = ctx.sha().calculateHash(orig);
+ SHA256Digest d = new SHA256Digest();
+ d.update(orig, 0, orig.length);
+ byte out[] = new byte[Hash.HASH_LENGTH];
+ d.doFinal(out, 0);
+ assertTrue(DataHelper.eq(out, old.getData()));
+ }
+
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/crypto/SessionEncryptionTest.java b/core/java/test/net/i2p/crypto/SessionEncryptionTest.java
index a6ed0fdaf..d1d614a98 100644
--- a/core/java/test/net/i2p/crypto/SessionEncryptionTest.java
+++ b/core/java/test/net/i2p/crypto/SessionEncryptionTest.java
@@ -13,6 +13,7 @@ import net.i2p.data.PrivateKey;
import net.i2p.data.SessionKey;
import net.i2p.data.SessionTag;
import net.i2p.data.DataHelper;
+import net.i2p.data.DataFormatException;
import net.i2p.util.Log;
import net.i2p.util.Clock;
@@ -21,72 +22,49 @@ import net.i2p.I2PAppContext;
import java.util.HashSet;
import java.util.Set;
+import junit.framework.TestCase;
+
/**
*
* session key management unit tests:
*
- * Run tagsIncluded useTag rekey
- * // no sessions
- * 1 no no no
- * 2 no no no
- * // session
- * 3 yes (2) no no
- * 4 no yes no
- * 5 yes (2) yes no
- * 6 no yes no
- * 7 no yes no
- * // rekeying
- * 8 yes (2) no no
- * 9 no yes no
- * 10 yes (2) yes yes
- * 11 no yes no
- * 12 no yes no
- * // long session
- * 13-1000 20 tags every 10 messages, rekey every 50
*/
-public class SessionEncryptionTest {
- private final static Log _log = new Log(SessionEncryptionTest.class);
+public class SessionEncryptionTest extends TestCase{
private static I2PAppContext _context = new I2PAppContext();
- public static void main(String args[]) {
- SessionEncryptionTest test = new SessionEncryptionTest();
- try {
- //test.testNoSessions();
- //test.testSessions();
- //test.testRekeying();
- test.testLongSession();
- } catch (Throwable t) {
- _log.error("Error running tests", t);
- }
- try { Thread.sleep(60*1000); } catch (InterruptedException ie) {}
+
+ protected void setUp(){
+ _context = new I2PAppContext();
}
- /**
- * Run tagsIncluded useTag rekey
- * 1 no no no
- * 2 no no no
- */
- public void testNoSessions() throws Exception {
+ protected void tearDown() {
+ System.gc();
+ }
+
+
+ public void testNoSessions1() throws Exception{
Object keys[] = KeyGenerator.getInstance().generatePKIKeypair();
PublicKey pubKey = (PublicKey)keys[0];
PrivateKey privKey = (PrivateKey)keys[1];
SessionKey curKey = _context.sessionKeyManager().createSession(pubKey);
- byte[] msg1 = "msg 1".getBytes();
- byte[] msg2 = "msg 2".getBytes();
+ byte[] msg = "msg 1".getBytes();
- byte emsg1[] = _context.elGamalAESEngine().encrypt(msg1, pubKey, curKey, 64);
- byte dmsg1[] = _context.elGamalAESEngine().decrypt(emsg1, privKey);
- if (DataHelper.eq(dmsg1, msg1))
- _log.info("PASSED: No sessions msg 1");
- else
- _log.error("FAILED: No sessions msg 1");
+ byte emsg[] = _context.elGamalAESEngine().encrypt(msg, pubKey, curKey, 64);
+ byte dmsg[] = _context.elGamalAESEngine().decrypt(emsg, privKey);
+ assertTrue(DataHelper.eq(dmsg, msg));
+ }
+
+ public void testNoSessions2() throws Exception{
+ Object keys[] = KeyGenerator.getInstance().generatePKIKeypair();
+ PublicKey pubKey = (PublicKey)keys[0];
+ PrivateKey privKey = (PrivateKey)keys[1];
+ SessionKey curKey = _context.sessionKeyManager().createSession(pubKey);
- byte emsg2[] = _context.elGamalAESEngine().encrypt(msg2, pubKey, curKey, 64);
- byte dmsg2[] = _context.elGamalAESEngine().decrypt(emsg2, privKey);
- if (DataHelper.eq(dmsg2, msg2))
- _log.info("PASSED: No sessions msg 2");
- else
- _log.error("FAILED: No sessions msg 2");
+ byte[] msg = "msg 2".getBytes();
+
+ byte emsg[] = _context.elGamalAESEngine().encrypt(msg, pubKey, curKey, 64);
+ byte dmsg[] = _context.elGamalAESEngine().decrypt(emsg, privKey);
+ assertTrue(DataHelper.eq(dmsg, msg));
}
/**
@@ -97,7 +75,7 @@ public class SessionEncryptionTest {
* 4 no yes no
* 5 no yes no
*/
- public void testSessions() throws Exception {
+ public void testSessions() throws Exception{
Object keys[] = KeyGenerator.getInstance().generatePKIKeypair();
PublicKey pubKey = (PublicKey)keys[0];
PrivateKey privKey = (PrivateKey)keys[1];
@@ -123,96 +101,66 @@ public class SessionEncryptionTest {
byte[] msg5 = "msg 5".getBytes();
byte emsg1[] = _context.elGamalAESEngine().encrypt(msg1, pubKey, curKey, firstTags, 64);
+
byte dmsg1[] = _context.elGamalAESEngine().decrypt(emsg1, privKey);
- if (DataHelper.eq(dmsg1, msg1))
- _log.info("PASSED: Sessions msg 1");
- else {
- _log.error("FAILED: Sessions msg 1");
- return;
- }
+ assertTrue(DataHelper.eq(dmsg1, msg1));
+
+
_context.sessionKeyManager().tagsDelivered(pubKey, curKey, firstTags);
curKey = _context.sessionKeyManager().getCurrentKey(pubKey);
SessionTag curTag = _context.sessionKeyManager().consumeNextAvailableTag(pubKey, curKey);
- if (curTag == null) {
- _log.error("Not able to consume next tag for message 2");
- return;
- }
+
+ assertNotNull(curTag);
byte emsg2[] = _context.elGamalAESEngine().encrypt(msg2, pubKey, curKey, null, curTag, 64);
+
byte dmsg2[] = _context.elGamalAESEngine().decrypt(emsg2, privKey);
- if (DataHelper.eq(dmsg2, msg2))
- _log.info("PASSED: Sessions msg 2");
- else {
- _log.error("FAILED: Sessions msg 2");
- return;
- }
+ assertTrue(DataHelper.eq(dmsg2, msg2));
+
+
+
curKey = _context.sessionKeyManager().getCurrentKey(pubKey);
curTag = _context.sessionKeyManager().consumeNextAvailableTag(pubKey, curKey);
- if (curTag == null) {
- _log.error("Not able to consume next tag for message 3");
- return;
- }
- if (curKey == null) {
- _log.error("Not able to consume next KEY for message 3");
- return;
- }
+ assertNotNull(curTag);
+ assertNotNull(curKey);
byte emsg3[] = _context.elGamalAESEngine().encrypt(msg3, pubKey, curKey, secondTags, curTag, 64);
+
byte dmsg3[] = _context.elGamalAESEngine().decrypt(emsg3, privKey);
- if (DataHelper.eq(dmsg3, msg3))
- _log.info("PASSED: Sessions msg 3");
- else {
- _log.error("FAILED: Sessions msg 3");
- return;
- }
+ assertTrue(DataHelper.eq(dmsg3, msg3));
+
+
_context.sessionKeyManager().tagsDelivered(pubKey, curKey, secondTags);
curKey = _context.sessionKeyManager().getCurrentKey(pubKey);
curTag = _context.sessionKeyManager().consumeNextAvailableTag(pubKey, curKey);
- if (curTag == null) {
- _log.error("Not able to consume next tag for message 4");
- return;
- }
- if (curKey == null) {
- _log.error("Not able to consume next KEY for message 4");
- return;
- }
+ assertNotNull(curTag);
+ assertNotNull(curKey);
byte emsg4[] = _context.elGamalAESEngine().encrypt(msg4, pubKey, curKey, null, curTag, 64);
+
byte dmsg4[] = _context.elGamalAESEngine().decrypt(emsg4, privKey);
- if (DataHelper.eq(dmsg4, msg4))
- _log.info("PASSED: Sessions msg 4");
- else {
- _log.error("FAILED: Sessions msg 4");
- return;
- }
+ assertTrue(DataHelper.eq(dmsg4, msg4));
+
curKey = _context.sessionKeyManager().getCurrentKey(pubKey);
curTag = _context.sessionKeyManager().consumeNextAvailableTag(pubKey, curKey);
- if (curTag == null) {
- _log.error("Not able to consume next tag for message 5");
- return;
- }
- if (curKey == null) {
- _log.error("Not able to consume next KEY for message 5");
- return;
- }
+ assertNotNull(curTag);
+ assertNotNull(curKey);
byte emsg5[] = _context.elGamalAESEngine().encrypt(msg5, pubKey, curKey, null, curTag, 64);
+
byte dmsg5[] = _context.elGamalAESEngine().decrypt(emsg5, privKey);
- if (DataHelper.eq(dmsg5, msg5))
- _log.info("PASSED: Sessions msg 5");
- else {
- _log.error("FAILED: Sessions msg 5");
- return;
- }
+ assertTrue(DataHelper.eq(dmsg5, msg5));
+
+
}
/**
@@ -223,7 +171,7 @@ public class SessionEncryptionTest {
* 4 no yes no
* 5 no yes no
*/
- public void testRekeying() throws Exception {
+ public void testRekeying() throws Exception{
Object keys[] = KeyGenerator.getInstance().generatePKIKeypair();
PublicKey pubKey = (PublicKey)keys[0];
PrivateKey privKey = (PrivateKey)keys[1];
@@ -250,119 +198,80 @@ public class SessionEncryptionTest {
byte[] msg5 = "msg 5".getBytes();
byte emsg1[] = _context.elGamalAESEngine().encrypt(msg1, pubKey, curKey, firstTags, 64);
+
byte dmsg1[] = _context.elGamalAESEngine().decrypt(emsg1, privKey);
- if (DataHelper.eq(dmsg1, msg1))
- _log.info("PASSED: Sessions msg 1");
- else {
- _log.error("FAILED: Sessions msg 1");
- return;
- }
+ assertTrue(DataHelper.eq(dmsg1, msg1));
+
+
_context.sessionKeyManager().tagsDelivered(pubKey, curKey, firstTags);
curKey = _context.sessionKeyManager().getCurrentKey(pubKey);
SessionTag curTag = _context.sessionKeyManager().consumeNextAvailableTag(pubKey, curKey);
- if (curTag == null) {
- _log.error("Not able to consume next tag for message 2");
- return;
- }
+
+ assertNotNull(curTag);
byte emsg2[] = _context.elGamalAESEngine().encrypt(msg2, pubKey, curKey, null, curTag, 64);
+
byte dmsg2[] = _context.elGamalAESEngine().decrypt(emsg2, privKey);
- if (DataHelper.eq(dmsg2, msg2))
- _log.info("PASSED: Sessions msg 2");
- else {
- _log.error("FAILED: Sessions msg 2");
- return;
- }
+ assertTrue(DataHelper.eq(dmsg2, msg2));
+
+
curKey = _context.sessionKeyManager().getCurrentKey(pubKey);
curTag = _context.sessionKeyManager().consumeNextAvailableTag(pubKey, curKey);
- if (curTag == null) {
- _log.error("Not able to consume next tag for message 3");
- return;
- }
- if (curKey == null) {
- _log.error("Not able to consume next KEY for message 3");
- return;
- }
+ assertNotNull(curTag);
+ assertNotNull(curKey);
byte emsg3[] = _context.elGamalAESEngine().encrypt(msg3, pubKey, curKey, secondTags, curTag, nextKey, 64);
+
byte dmsg3[] = _context.elGamalAESEngine().decrypt(emsg3, privKey);
- if (DataHelper.eq(dmsg3, msg3))
- _log.info("PASSED: Sessions msg 3");
- else {
- _log.error("FAILED: Sessions msg 3");
- return;
- }
+ assertTrue(DataHelper.eq(dmsg3, msg3));
+
+
_context.sessionKeyManager().tagsDelivered(pubKey, nextKey, secondTags); // note nextKey not curKey
curKey = _context.sessionKeyManager().getCurrentKey(pubKey);
curTag = _context.sessionKeyManager().consumeNextAvailableTag(pubKey, curKey);
- if (curTag == null) {
- _log.error("Not able to consume next tag for message 4");
- return;
- }
- if (curKey == null) {
- _log.error("Not able to consume next KEY for message 4");
- return;
- }
+ assertNotNull(curTag);
+ assertNotNull(curKey);
byte emsg4[] = _context.elGamalAESEngine().encrypt(msg4, pubKey, curKey, null, curTag, 64);
+
byte dmsg4[] = _context.elGamalAESEngine().decrypt(emsg4, privKey);
- if (DataHelper.eq(dmsg4, msg4))
- _log.info("PASSED: Sessions msg 4");
- else {
- _log.error("FAILED: Sessions msg 4");
- return;
- }
+ assertTrue(DataHelper.eq(dmsg4, msg4));
+
+
curKey = _context.sessionKeyManager().getCurrentKey(pubKey);
curTag = _context.sessionKeyManager().consumeNextAvailableTag(pubKey, curKey);
- if (curTag == null) {
- _log.error("Not able to consume next tag for message 5");
- return;
- }
- if (curKey == null) {
- _log.error("Not able to consume next KEY for message 5");
- return;
- }
+ assertNotNull(curTag);
+ assertNotNull(curKey);
byte emsg5[] = _context.elGamalAESEngine().encrypt(msg5, pubKey, curKey, null, curTag, 64);
+
byte dmsg5[] = _context.elGamalAESEngine().decrypt(emsg5, privKey);
- if (DataHelper.eq(dmsg5, msg5))
- _log.info("PASSED: Sessions msg 5");
- else {
- _log.error("FAILED: Sessions msg 5");
- return;
- }
+ assertTrue(DataHelper.eq(dmsg5, msg5));
+
+
+
}
/**
* 20 tags every 10 messages, rekey every 50
*/
- public void testLongSession() throws Exception {
- int num = 1000;
- long start = Clock.getInstance().now();
- testLongSession(num);
- long end = Clock.getInstance().now();
- long time = end - start;
- float msEach = (float)num / time;
- _log.error("Test long session duration: " + num + " messages in " + time + "ms (or " + msEach + "ms each)");
- }
-
- public void testLongSession(int numMsgs) throws Exception {
+ public void testLongSession() throws Exception{
Object keys[] = KeyGenerator.getInstance().generatePKIKeypair();
PublicKey pubKey = (PublicKey)keys[0];
PrivateKey privKey = (PrivateKey)keys[1];
SessionKey curKey = _context.sessionKeyManager().createSession(pubKey);
- for (int i = 0; i < numMsgs; i++) {
+ for (int i = 0; i < 1000; i++) {
Set tags = null;
SessionKey nextKey = null;
curKey = _context.sessionKeyManager().getCurrentKey(pubKey);
@@ -371,23 +280,16 @@ public class SessionEncryptionTest {
int availTags = _context.sessionKeyManager().getAvailableTags(pubKey, curKey);
if ((availTags < 1)) {
tags = generateNewTags(50);
- _log.info("Generating new tags");
- } else {
- _log.info("Tags already available: " + availTags + " curTag: " + curTag);
- }
+ }
if (i % 50 == 0)
nextKey = KeyGenerator.getInstance().generateSessionKey();
byte[] msg = ("msg " + i).getBytes();
byte emsg[] = _context.elGamalAESEngine().encrypt(msg, pubKey, curKey, tags, curTag, nextKey, 64);
+
byte dmsg[] = _context.elGamalAESEngine().decrypt(emsg, privKey);
- if (DataHelper.eq(dmsg, msg))
- _log.info("PASSED: Long session msg " + i);
- else {
- _log.error("FAILED: Long session msg " + i);
- return;
- }
+ assertTrue(DataHelper.eq(dmsg, msg));
if ( (tags != null) && (tags.size() > 0) ) {
if (nextKey == null) {
diff --git a/core/java/test/net/i2p/data/AbuseReasonTest.java b/core/java/test/net/i2p/data/AbuseReasonTest.java
index eebe5f9ac..b9a45023a 100644
--- a/core/java/test/net/i2p/data/AbuseReasonTest.java
+++ b/core/java/test/net/i2p/data/AbuseReasonTest.java
@@ -17,10 +17,7 @@ import net.i2p.data.i2cp.AbuseReason;
*
* @author jrandom
*/
-class AbuseReasonTest extends StructureTest {
- static {
- TestData.registerTest(new AbuseReasonTest(), "AbuseReason");
- }
+public class AbuseReasonTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
AbuseReason res = new AbuseReason();
res.setReason("Because they're mean");
diff --git a/core/java/test/net/i2p/data/AbuseSeverityTest.java b/core/java/test/net/i2p/data/AbuseSeverityTest.java
index ffdb1b063..7eacc7488 100644
--- a/core/java/test/net/i2p/data/AbuseSeverityTest.java
+++ b/core/java/test/net/i2p/data/AbuseSeverityTest.java
@@ -17,10 +17,7 @@ import net.i2p.data.i2cp.AbuseSeverity;
*
* @author jrandom
*/
-class AbuseSeverityTest extends StructureTest {
- static {
- TestData.registerTest(new AbuseSeverityTest(), "AbuseSeverity");
- }
+public class AbuseSeverityTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
AbuseSeverity sev = new AbuseSeverity();
sev.setSeverity(64);
diff --git a/core/java/test/net/i2p/data/Base64Test.java b/core/java/test/net/i2p/data/Base64Test.java
new file mode 100644
index 000000000..fc7dbea21
--- /dev/null
+++ b/core/java/test/net/i2p/data/Base64Test.java
@@ -0,0 +1,28 @@
+package net.i2p.data;
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain
+ * with no warranty of any kind, either expressed or implied.
+ * It probably won't make your computer catch on fire, or eat
+ * your children, but it might. Use at your own risk.
+ *
+ */
+
+import junit.framework.TestCase;
+
+public class Base64Test extends TestCase{
+ public void testBase64(){
+ String orig = "you smell";
+ String encoded = Base64.encode(orig.getBytes());
+ byte decoded[] = Base64.decode(encoded);
+ String transformed = new String(decoded);
+ assertTrue(orig.equals(transformed));
+
+ byte all[] = new byte[256];
+ for (int i = 0; i < all.length; i++)
+ all[i] = (byte) (0xFF & i);
+ encoded = Base64.encode(all);
+ decoded = Base64.decode(encoded);
+ assertTrue(DataHelper.eq(decoded, all));
+ }
+}
diff --git a/core/java/test/net/i2p/data/BooleanTest.java b/core/java/test/net/i2p/data/BooleanTest.java
index aa6c4a03c..761ba5178 100644
--- a/core/java/test/net/i2p/data/BooleanTest.java
+++ b/core/java/test/net/i2p/data/BooleanTest.java
@@ -9,6 +9,7 @@ package net.i2p.data;
*/
import java.io.ByteArrayOutputStream;
+import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -16,44 +17,30 @@ import net.i2p.data.DataFormatException;
import net.i2p.data.DataHelper;
import net.i2p.util.Log;
+import junit.framework.TestCase;
+
/**
* Test harness for the boolean structure
*
* @author jrandom
*/
-class BooleanTest implements TestDataGenerator, TestDataPrinter {
- static {
- TestData.registerGenerator(new BooleanTest(), "Boolean");
- TestData.registerPrinter(new BooleanTest(), "Boolean");
- }
- private static final Log _log = new Log(BooleanTest.class);
+public class BooleanTest extends TestCase{
- public byte[] getData() {
+ public void testBoolean() throws Exception{
+ byte[] temp = null;
+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
- try {
- DataHelper.writeBoolean(baos, Boolean.TRUE);
- return baos.toByteArray();
- } catch (DataFormatException dfe) {
- _log.error("Error writing the boolean", dfe);
- return null;
- } catch (IOException ioe) {
- _log.error("Error writing the boolean", ioe);
- return null;
- }
+
+ DataHelper.writeBoolean(baos, Boolean.TRUE);
+ temp = baos.toByteArray();
+
+
+ Boolean b = null;
+ ByteArrayInputStream bais = new ByteArrayInputStream(temp);
+
+ b = DataHelper.readBoolean(bais);
+
+ assertEquals(Boolean.TRUE, b);
}
- public String testData(InputStream inputStream) {
- try {
- Boolean b = DataHelper.readBoolean(inputStream);
- return ""+b;
- } catch (DataFormatException dfe) {
- _log.error("Error reading the boolean", dfe);
- return null;
- } catch (IOException ioe) {
- _log.error("Error reading the boolean", ioe);
- return null;
- }
- }
-
-
-}
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/data/CertificateTest.java b/core/java/test/net/i2p/data/CertificateTest.java
index df39ec9e2..98315667d 100644
--- a/core/java/test/net/i2p/data/CertificateTest.java
+++ b/core/java/test/net/i2p/data/CertificateTest.java
@@ -17,10 +17,7 @@ import net.i2p.data.DataStructure;
*
* @author jrandom
*/
-class CertificateTest extends StructureTest {
- static {
- TestData.registerTest(new CertificateTest(), "Certificate");
- }
+public class CertificateTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
Certificate cert = new Certificate();
byte data[] = new byte[32];
diff --git a/core/java/test/net/i2p/data/CreateLeaseSetMessageTest.java b/core/java/test/net/i2p/data/CreateLeaseSetMessageTest.java
index e2150ff45..875f92cf9 100644
--- a/core/java/test/net/i2p/data/CreateLeaseSetMessageTest.java
+++ b/core/java/test/net/i2p/data/CreateLeaseSetMessageTest.java
@@ -21,15 +21,12 @@ import net.i2p.data.i2cp.SessionId;
*
* @author jrandom
*/
-class CreateLeaseSetMessageTest extends StructureTest {
- static {
- TestData.registerTest(new CreateLeaseSetMessageTest(), "CreateLeaseSetMessage");
- }
+public class CreateLeaseSetMessageTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
CreateLeaseSetMessage msg = new CreateLeaseSetMessage();
- msg.setPrivateKey((PrivateKey)(new PrivateKeyTest()).createDataStructure());
- msg.setSigningPrivateKey((SigningPrivateKey)(new SigningPrivateKeyTest()).createDataStructure());
- msg.setLeaseSet((LeaseSet)(new LeaseSetTest()).createDataStructure());
+ msg.setPrivateKey((PrivateKey)(new PrivateKeyTest()).createDataStructure());
+ msg.setSigningPrivateKey((SigningPrivateKey)(new SigningPrivateKeyTest()).createDataStructure());
+ msg.setLeaseSet((LeaseSet)(new LeaseSetTest()).createDataStructure());
msg.setSessionId((SessionId)(new SessionIdTest()).createDataStructure());
return msg;
}
diff --git a/core/java/test/net/i2p/data/CreateSessionMessageTest.java b/core/java/test/net/i2p/data/CreateSessionMessageTest.java
index 8ba444bee..431162fe8 100644
--- a/core/java/test/net/i2p/data/CreateSessionMessageTest.java
+++ b/core/java/test/net/i2p/data/CreateSessionMessageTest.java
@@ -18,10 +18,7 @@ import net.i2p.data.i2cp.SessionConfig;
*
* @author jrandom
*/
-class CreateSessionMessageTest extends StructureTest {
- static {
- TestData.registerTest(new CreateSessionMessageTest(), "CreateSessionMessage");
- }
+public class CreateSessionMessageTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
CreateSessionMessage msg = new CreateSessionMessage();
msg.setSessionConfig((SessionConfig)(new SessionConfigTest()).createDataStructure());
diff --git a/core/java/test/net/i2p/data/DataHelperTest.java b/core/java/test/net/i2p/data/DataHelperTest.java
index 05f21bbc7..1f15276e4 100644
--- a/core/java/test/net/i2p/data/DataHelperTest.java
+++ b/core/java/test/net/i2p/data/DataHelperTest.java
@@ -7,88 +7,60 @@ import java.util.Date;
import java.util.TimeZone;
import net.i2p.I2PAppContext;
-import net.i2p.util.Log;
+
+import junit.framework.TestCase;
/**
* basic unit tests for the DataHelper
*
*/
-public class DataHelperTest {
+public class DataHelperTest extends TestCase{
private I2PAppContext _context;
- private Log _log;
- public DataHelperTest(I2PAppContext ctx) {
- _context = ctx;
- _log = ctx.logManager().getLog(DataHelperTest.class);
- }
-
- public void runTests() {
- // compress
- testCompress();
- // long (read/write/to/from)
- testLong();
- // date (read/write/to/from)
- testDate();
- // string
- // properties
- // boolean
- // readline
+ protected void setUp() {
+ _context = I2PAppContext.getGlobalContext();
}
/**
* Test to/from/read/writeLong with every 1, 2, and 4 byte value, as
* well as some 8 byte values.
*/
- public void testLong() {
- for (int i = 0; i <= 0xFF; i++)
- testLong(1, i);
- System.out.println("Test 1byte passed");
- for (long i = 0; i <= 0xFFFF; i++)
- testLong(2, i);
- System.out.println("Test 2byte passed");
- for (long i = 0; i <= 0xFFFFFF; i ++)
- testLong(3, i);
- System.out.println("Test 3byte passed");
- for (long i = 0; i <= 0xFFFFFFFF; i++)
- testLong(4, i);
- System.out.println("Test 4byte passed");
+ public void testLong() throws Exception{
+ for (int i = 0; i <= 0xFF; i+=4)
+ checkLong(1, i);
+ for (long i = 0; i <= 0xFFFF; i+=16)
+ checkLong(2, i);
+ for (long i = 0; i <= 0xFFFFFF; i +=128)
+ checkLong(3, i);
+ for (long i = 0; i <= 0xFFFFFFFFl; i+=512)
+ checkLong(4, i);
// i know, doesnt test (2^63)-(2^64-1)
for (long i = Long.MAX_VALUE - 0xFFFFFFl; i < Long.MAX_VALUE; i++)
- testLong(8, i);
- System.out.println("Test 8byte passed");
+ checkLong(8, i);
}
- private static void testLong(int numBytes, long value) {
- try {
- ByteArrayOutputStream baos = new ByteArrayOutputStream(numBytes);
- DataHelper.writeLong(baos, numBytes, value);
- byte written[] = baos.toByteArray();
- byte extract[] = DataHelper.toLong(numBytes, value);
- if (extract.length != numBytes)
- throw new RuntimeException("testLong("+numBytes+","+value+") FAILED (len="+extract.length+")");
- if (!DataHelper.eq(written, extract))
- throw new RuntimeException("testLong("+numBytes+","+value+") FAILED");
- byte extract2[] = new byte[numBytes];
- DataHelper.toLong(extract2, 0, numBytes, value);
- if (!DataHelper.eq(extract, extract2))
- throw new RuntimeException("testLong("+numBytes+","+value+") FAILED on toLong");
-
- long read = DataHelper.fromLong(extract, 0, numBytes);
- if (read != value)
- throw new RuntimeException("testLong("+numBytes+","+value+") FAILED on read (" + read + ")");
-
- ByteArrayInputStream bais = new ByteArrayInputStream(written);
- read = DataHelper.readLong(bais, numBytes);
- if (read != value)
- throw new RuntimeException("testLong("+numBytes+","+value+") FAILED on readLong (" + read + ")");
- read = DataHelper.fromLong(written, 0, numBytes);
- if (read != value)
- throw new RuntimeException("testLong("+numBytes+","+value+") FAILED on fromLong (" + read + ")");
- } catch (Exception e) {
- throw new RuntimeException("test(" + numBytes +","+ value +"): " + e.getMessage());
- }
+ private static void checkLong(int numBytes, long value) throws Exception {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream(numBytes);
+ DataHelper.writeLong(baos, numBytes, value);
+ byte written[] = baos.toByteArray();
+ byte extract[] = DataHelper.toLong(numBytes, value);
+ assertTrue(extract.length == numBytes);
+ assertTrue(DataHelper.eq(written, extract));
+ byte extract2[] = new byte[numBytes];
+ DataHelper.toLong(extract2, 0, numBytes, value);
+ assertTrue(DataHelper.eq(extract, extract2));
+
+ long read = DataHelper.fromLong(extract, 0, numBytes);
+ assertTrue(read == value);
+
+ ByteArrayInputStream bais = new ByteArrayInputStream(written);
+ read = DataHelper.readLong(bais, numBytes);
+ assertTrue(read == value);
+ read = DataHelper.fromLong(written, 0, numBytes);
+ assertTrue(read == value);
+
}
- private void testDate() {
+ public void testDate() throws Exception{
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
cal.set(Calendar.YEAR, 1970);
@@ -97,10 +69,10 @@ public class DataHelperTest {
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
- testDate(cal.getTime());
+ checkDate(cal.getTime());
cal.set(Calendar.SECOND, 1);
- testDate(cal.getTime());
+ checkDate(cal.getTime());
cal.set(Calendar.YEAR, 1999);
cal.set(Calendar.MONTH, 11);
@@ -108,7 +80,7 @@ public class DataHelperTest {
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
- testDate(cal.getTime());
+ checkDate(cal.getTime());
cal.set(Calendar.YEAR, 2000);
cal.set(Calendar.MONTH, 0);
@@ -116,68 +88,47 @@ public class DataHelperTest {
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
- testDate(cal.getTime());
+ checkDate(cal.getTime());
cal.setTimeInMillis(System.currentTimeMillis());
- testDate(cal.getTime());
+ checkDate(cal.getTime());
cal.set(Calendar.SECOND, cal.get(Calendar.SECOND)+10);
- testDate(cal.getTime());
+ checkDate(cal.getTime());
- try {
- cal.set(Calendar.YEAR, 1969);
- cal.set(Calendar.MONTH, 11);
- cal.set(Calendar.DAY_OF_MONTH, 31);
- cal.set(Calendar.HOUR_OF_DAY, 23);
- cal.set(Calendar.MINUTE, 59);
- cal.set(Calendar.SECOND, 59);
- testDate(cal.getTime());
- System.err.println("foo! this should fail");
- } catch (RuntimeException re) {
- // should fail on dates prior to the epoch
+ cal.set(Calendar.YEAR, 1969);
+ cal.set(Calendar.MONTH, 11);
+ cal.set(Calendar.DAY_OF_MONTH, 31);
+ cal.set(Calendar.HOUR_OF_DAY, 23);
+ cal.set(Calendar.MINUTE, 59);
+ cal.set(Calendar.SECOND, 59);
+ boolean error = false;
+ try{
+ checkDate(cal.getTime());
+ }catch(Exception e){
+ error = true;
}
+ assertTrue(error);
}
- private void testDate(Date when) {
- try {
- byte buf[] = new byte[DataHelper.DATE_LENGTH];
- DataHelper.toDate(buf, 0, when.getTime());
- byte tbuf[] = DataHelper.toDate(when);
- if (!DataHelper.eq(tbuf, buf))
- throw new RuntimeException("testDate("+when.toString()+") failed on toDate");
- Date time = DataHelper.fromDate(buf, 0);
- if (when.getTime() != time.getTime())
- throw new RuntimeException("testDate("+when.toString()+") failed (" + time.toString() + ")");
- System.out.println("eq: " + time);
- } catch (Exception e) {
- throw new RuntimeException(e.getMessage());
- }
+ private void checkDate(Date when) throws Exception{
+ byte buf[] = new byte[DataHelper.DATE_LENGTH];
+ DataHelper.toDate(buf, 0, when.getTime());
+ byte tbuf[] = DataHelper.toDate(when);
+ assertTrue(DataHelper.eq(tbuf, buf));
+ Date time = DataHelper.fromDate(buf, 0);
+ assertEquals(when.getTime(), time.getTime());
}
- private void testCompress() {
- for (int i = 0; i < 32*1024; i++)
- testCompress(i);
- }
-
- private void testCompress(int size) {
- byte data[] = new byte[size];
- _context.random().nextBytes(data);
- byte compressed[] = DataHelper.compress(data);
- try {
+ public void testCompress() throws Exception{
+ for (int size = 0; size < 32*1024; size+=32){ // Original had size++, changed value because
+ // speed was a problem. -Comwiz
+ byte data[] = new byte[size];
+ _context.random().nextBytes(data);
+ byte compressed[] = DataHelper.compress(data);
byte decompressed[] = DataHelper.decompress(compressed);
- boolean ok = DataHelper.eq(data, decompressed);
- if (!ok)
- throw new RuntimeException("failed match at size=" + size);
- else
- System.out.println("Match at size=" + size);
- } catch (java.io.IOException ioe) {
- ioe.printStackTrace();
- throw new RuntimeException("Error at size=" + size +":" + ioe.getMessage());
+ assertTrue(DataHelper.eq(data, decompressed));
+
}
}
-
- public static void main(String args[]) {
- DataHelperTest test = new DataHelperTest(I2PAppContext.getGlobalContext());
- test.runTests();
- }
}
diff --git a/core/java/test/net/i2p/data/DataStructureImplTest.java b/core/java/test/net/i2p/data/DataStructureImplTest.java
new file mode 100644
index 000000000..e30602863
--- /dev/null
+++ b/core/java/test/net/i2p/data/DataStructureImplTest.java
@@ -0,0 +1,76 @@
+package net.i2p.data;
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain
+ * with no warranty of any kind, either expressed or implied.
+ * It probably won't make your computer catch on fire, or eat
+ * your children, but it might. Use at your own risk.
+ *
+ */
+
+import java.io.OutputStream;
+import java.io.InputStream;
+import java.io.IOException;
+
+import net.i2p.data.DataFormatException;
+import net.i2p.data.DataStructure;
+import net.i2p.data.DataStructureImpl;
+
+import junit.framework.TestCase;
+
+/**
+ * @author Comwiz
+ */
+public class DataStructureImplTest extends TestCase{
+ DataStructure _struct;
+
+ protected void setUp(){
+ _struct = new DataStructureImpl(){
+ private int x = 0;
+ public void writeBytes(OutputStream out) throws IOException, DataFormatException{
+ if(x++==0)
+ throw new DataFormatException("let it enfold you", new Exception());
+ else
+ throw new IOException();
+ }
+ public void readBytes(InputStream in) throws IOException{
+ throw new IOException();
+ }
+ };
+ }
+
+ public void testNulls() throws Exception{
+ assertNull(_struct.toBase64());
+
+ boolean error = false;
+ try{
+ _struct.fromBase64(null);
+ }catch(DataFormatException dfe){
+ error = true;
+ }
+ assertTrue(error);
+
+ assertNull(_struct.calculateHash());
+
+ error = false;
+ try{
+ _struct.fromByteArray(null);
+ }catch(DataFormatException dfe){
+ error = true;
+ }
+ assertTrue(error);
+ }
+
+ public void testErrors() throws Exception{
+ boolean error = false;
+ try{
+ _struct.fromByteArray("water is poison".getBytes());
+ }catch(DataFormatException dfe){
+ error = true;
+ }
+ assertTrue(error);
+
+ assertNull(_struct.toByteArray());
+ assertNull(_struct.toByteArray());
+ }
+}
diff --git a/core/java/test/net/i2p/data/DataTestSuite.java b/core/java/test/net/i2p/data/DataTestSuite.java
new file mode 100644
index 000000000..dc1d7e824
--- /dev/null
+++ b/core/java/test/net/i2p/data/DataTestSuite.java
@@ -0,0 +1,56 @@
+package net.i2p.data;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class DataTestSuite {
+
+ public static Test suite() {
+
+ TestSuite suite = new TestSuite("net.i2p.data.DataTestSuite");
+
+ suite.addTestSuite(AbuseReasonTest.class);
+ suite.addTestSuite(AbuseSeverityTest.class);
+ suite.addTestSuite(Base64Test.class);
+ suite.addTestSuite(BooleanTest.class);
+ suite.addTestSuite(CertificateTest.class);
+ suite.addTestSuite(CreateLeaseSetMessageTest.class);
+ suite.addTestSuite(CreateSessionMessageTest.class);
+ suite.addTestSuite(DataHelperTest.class);
+ suite.addTestSuite(DataStructureImplTest.class);
+ suite.addTestSuite(DateTest.class);
+ suite.addTestSuite(DestinationTest.class);
+ suite.addTestSuite(DestroySessionMessageTest.class);
+ suite.addTestSuite(DisconnectMessageTest.class);
+ suite.addTestSuite(HashTest.class);
+ suite.addTestSuite(LeaseSetTest.class);
+ suite.addTestSuite(LeaseTest.class);
+ suite.addTestSuite(MappingTest.class);
+ suite.addTestSuite(MessageIdTest.class);
+ suite.addTestSuite(MessagePayloadMessageTest.class);
+ suite.addTestSuite(MessageStatusMessageTest.class);
+ suite.addTestSuite(PayloadTest.class);
+ suite.addTestSuite(PrivateKeyTest.class);
+ suite.addTestSuite(PublicKeyTest.class);
+ suite.addTestSuite(ReceiveMessageBeginMessageTest.class);
+ suite.addTestSuite(ReceiveMessageEndMessageTest.class);
+ suite.addTestSuite(ReportAbuseMessageTest.class);
+ suite.addTestSuite(RequestLeaseSetMessageTest.class);
+ suite.addTestSuite(RouterAddressTest.class);
+ suite.addTestSuite(RouterIdentityTest.class);
+ suite.addTestSuite(RouterInfoTest.class);
+ suite.addTestSuite(SendMessageMessageTest.class);
+ suite.addTestSuite(SessionConfigTest.class);
+ suite.addTestSuite(SessionIdTest.class);
+ suite.addTestSuite(SessionKeyTest.class);
+ suite.addTestSuite(SessionStatusMessageTest.class);
+ suite.addTestSuite(SignatureTest.class);
+ suite.addTestSuite(SigningPrivateKeyTest.class);
+ suite.addTestSuite(SigningPublicKeyTest.class);
+ suite.addTestSuite(StringTest.class);
+ suite.addTestSuite(TunnelIdTest.class);
+ suite.addTestSuite(UnsignedIntegerTest.class);
+
+ return suite;
+ }
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/data/DateTest.java b/core/java/test/net/i2p/data/DateTest.java
index 616a3f279..a5ba6638b 100644
--- a/core/java/test/net/i2p/data/DateTest.java
+++ b/core/java/test/net/i2p/data/DateTest.java
@@ -9,6 +9,7 @@ package net.i2p.data;
*/
import java.io.ByteArrayOutputStream;
+import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
@@ -17,44 +18,31 @@ import net.i2p.data.DataFormatException;
import net.i2p.data.DataHelper;
import net.i2p.util.Log;
+import junit.framework.TestCase;
+
/**
- * Test harness for the boolean structure
+ * Test harness for the date structure
*
* @author jrandom
*/
-class DateTest implements TestDataGenerator, TestDataPrinter {
- static {
- TestData.registerGenerator(new DateTest(), "Date");
- TestData.registerPrinter(new DateTest(), "Date");
- }
- private static final Log _log = new Log(DateTest.class);
+public class DateTest extends TestCase{
- public byte[] getData() {
+ public void testDate() throws Exception{
+ byte[] temp = null;
+
+ Date orig = new Date();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
- try {
- DataHelper.writeDate(baos, new Date());
- return baos.toByteArray();
- } catch (DataFormatException dfe) {
- _log.error("Error writing the date", dfe);
- return null;
- } catch (IOException ioe) {
- _log.error("Error writing the date", ioe);
- return null;
- }
+
+ DataHelper.writeDate(baos, orig);
+ temp = baos.toByteArray();
+
+
+ Date d = null;
+ ByteArrayInputStream bais = new ByteArrayInputStream(temp);
+
+ d = DataHelper.readDate(bais);
+
+ assertEquals(orig, d);
}
- public String testData(InputStream inputStream) {
- try {
- Date d = DataHelper.readDate(inputStream);
- return ""+d;
- } catch (DataFormatException dfe) {
- _log.error("Error reading the date", dfe);
- return null;
- } catch (IOException ioe) {
- _log.error("Error reading the date", ioe);
- return null;
- }
- }
-
-
-}
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/data/DestinationTest.java b/core/java/test/net/i2p/data/DestinationTest.java
index 8d4977639..21df5bec7 100644
--- a/core/java/test/net/i2p/data/DestinationTest.java
+++ b/core/java/test/net/i2p/data/DestinationTest.java
@@ -20,10 +20,7 @@ import net.i2p.data.SigningPublicKey;
*
* @author jrandom
*/
-class DestinationTest extends StructureTest {
- static {
- TestData.registerTest(new DestinationTest(), "Destination");
- }
+public class DestinationTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
Destination dest = new Destination();
StructureTest tst = new CertificateTest();
diff --git a/core/java/test/net/i2p/data/DestroySessionMessageTest.java b/core/java/test/net/i2p/data/DestroySessionMessageTest.java
index 42aedcea1..74c8ee2cd 100644
--- a/core/java/test/net/i2p/data/DestroySessionMessageTest.java
+++ b/core/java/test/net/i2p/data/DestroySessionMessageTest.java
@@ -18,10 +18,7 @@ import net.i2p.data.i2cp.SessionId;
*
* @author jrandom
*/
-class DestroySessionMessageTest extends StructureTest {
- static {
- TestData.registerTest(new DestroySessionMessageTest(), "DestroySessionMessage");
- }
+public class DestroySessionMessageTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
DestroySessionMessage msg = new DestroySessionMessage();
msg.setSessionId((SessionId)(new SessionIdTest()).createDataStructure());
diff --git a/core/java/test/net/i2p/data/DisconnectMessageTest.java b/core/java/test/net/i2p/data/DisconnectMessageTest.java
index 22575fd6d..82e17540f 100644
--- a/core/java/test/net/i2p/data/DisconnectMessageTest.java
+++ b/core/java/test/net/i2p/data/DisconnectMessageTest.java
@@ -17,10 +17,7 @@ import net.i2p.data.i2cp.DisconnectMessage;
*
* @author jrandom
*/
-class DisconnectMessageTest extends StructureTest {
- static {
- TestData.registerTest(new DisconnectMessageTest(), "DisconnectMessage");
- }
+public class DisconnectMessageTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
DisconnectMessage msg = new DisconnectMessage();
msg.setReason("Because I say so");
diff --git a/core/java/test/net/i2p/data/HashTest.java b/core/java/test/net/i2p/data/HashTest.java
index 08f278c00..98d60f0cb 100644
--- a/core/java/test/net/i2p/data/HashTest.java
+++ b/core/java/test/net/i2p/data/HashTest.java
@@ -17,10 +17,7 @@ import net.i2p.data.Hash;
*
* @author jrandom
*/
-class HashTest extends StructureTest {
- static {
- TestData.registerTest(new HashTest(), "Hash");
- }
+public class HashTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
Hash hash = new Hash();
byte data[] = new byte[32];
diff --git a/core/java/test/net/i2p/data/LeaseSetTest.java b/core/java/test/net/i2p/data/LeaseSetTest.java
index 2bfa07c32..385a4c513 100644
--- a/core/java/test/net/i2p/data/LeaseSetTest.java
+++ b/core/java/test/net/i2p/data/LeaseSetTest.java
@@ -21,10 +21,7 @@ import net.i2p.data.SigningPublicKey;
*
* @author jrandom
*/
-class LeaseSetTest extends StructureTest {
- static {
- TestData.registerTest(new LeaseSetTest(), "LeaseSet");
- }
+public class LeaseSetTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
LeaseSet leaseSet = new LeaseSet();
leaseSet.setDestination((Destination)(new DestinationTest()).createDataStructure());
diff --git a/core/java/test/net/i2p/data/LeaseTest.java b/core/java/test/net/i2p/data/LeaseTest.java
index 7f987791c..f508a2dff 100644
--- a/core/java/test/net/i2p/data/LeaseTest.java
+++ b/core/java/test/net/i2p/data/LeaseTest.java
@@ -9,6 +9,7 @@ package net.i2p.data;
*/
import java.util.Date;
+import java.io.ByteArrayOutputStream;
import net.i2p.data.DataFormatException;
import net.i2p.data.DataStructure;
@@ -21,14 +22,10 @@ import net.i2p.data.TunnelId;
*
* @author jrandom
*/
-class LeaseTest extends StructureTest {
- static {
- TestData.registerTest(new LeaseTest(), "Lease");
- }
+public class LeaseTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
Lease lease = new Lease();
lease.setEndDate(new Date(1000*60*2));
- //lease.setStartDate(new Date(1000*60));
byte h[] = new byte[Hash.HASH_LENGTH];
lease.setGateway(new Hash(h));
StructureTest tst = new TunnelIdTest();
@@ -37,4 +34,68 @@ class LeaseTest extends StructureTest {
return lease;
}
public DataStructure createStructureToRead() { return new Lease(); }
+
+ public void testNumSuccessFail() throws Exception{
+ Lease lease = new Lease();
+ lease.setEndDate(new Date(1000*60*2));
+ byte h[] = new byte[Hash.HASH_LENGTH];
+ lease.setGateway(new Hash(h));
+ StructureTest tst = new TunnelIdTest();
+ lease.setTunnelId((TunnelId)tst.createDataStructure());
+
+ lease.getNumSuccess();
+ lease.getNumFailure();
+ }
+
+ public void testExpiration() throws Exception{
+ Lease lease = new Lease();
+ assertTrue(lease.isExpired());
+
+ lease.setEndDate(new Date(1000*60*2));
+ byte h[] = new byte[Hash.HASH_LENGTH];
+ lease.setGateway(new Hash(h));
+ StructureTest tst = new TunnelIdTest();
+ lease.setTunnelId((TunnelId)tst.createDataStructure());
+
+ assertTrue(lease.isExpired());
+ }
+
+ public void testNullWrite() throws Exception{
+ Lease lease = new Lease();
+ lease.setEndDate(new Date(1000*60*2));
+ byte h[] = new byte[Hash.HASH_LENGTH];
+ lease.setGateway(new Hash(h));
+ lease.setTunnelId(null);
+ boolean error = false;
+ try{
+ lease.writeBytes(new ByteArrayOutputStream());
+ }catch(DataFormatException dfe){
+ error = true;
+ }
+ assertTrue(error);
+
+ lease = new Lease();
+ lease.setEndDate(new Date(1000*60*2));
+ h = new byte[Hash.HASH_LENGTH];
+ lease.setGateway(null);
+ StructureTest tst = new TunnelIdTest();
+ lease.setTunnelId((TunnelId)tst.createDataStructure());
+ error = false;
+ try{
+ lease.writeBytes(new ByteArrayOutputStream());
+ }catch(DataFormatException dfe){
+ error = true;
+ }
+ assertTrue(error);
+ }
+
+ public void testNullEquals() throws Exception{
+ Lease lease = new Lease();
+ lease.setEndDate(new Date(1000*60*2));
+ byte h[] = new byte[Hash.HASH_LENGTH];
+ lease.setGateway(new Hash(h));
+ lease.setTunnelId(null);
+ assertFalse(lease.equals(null));
+ }
+
}
diff --git a/core/java/test/net/i2p/data/MappingTest.java b/core/java/test/net/i2p/data/MappingTest.java
index b1b8bf9e0..80aa58219 100644
--- a/core/java/test/net/i2p/data/MappingTest.java
+++ b/core/java/test/net/i2p/data/MappingTest.java
@@ -9,56 +9,42 @@ package net.i2p.data;
*/
import java.io.ByteArrayOutputStream;
+import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import net.i2p.data.DataFormatException;
import net.i2p.data.DataHelper;
-import net.i2p.util.Log;
+
+import junit.framework.TestCase;
/**
- * Test harness for the mapping structure (in java, a Properties map)
+ * Test harness for the date structure
*
* @author jrandom
*/
-class MappingTest implements TestDataGenerator, TestDataPrinter {
- static {
- TestData.registerGenerator(new MappingTest(), "Mapping");
- TestData.registerPrinter(new MappingTest(), "Mapping");
- }
- private static final Log _log = new Log(MappingTest.class);
+public class MappingTest extends TestCase{
- public byte[] getData() {
+ public void testProperties() throws Exception{
+ byte[] temp = null;
+
+ Properties orig = new Properties();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
- Properties options = new Properties();
- options.setProperty("key1", "val1");
- options.setProperty("key2", "val2");
- options.setProperty("key3", "val3");
- try {
- DataHelper.writeProperties(baos, options);
- return baos.toByteArray();
- } catch (DataFormatException dfe) {
- _log.error("Error writing the mapping", dfe);
- return null;
- } catch (IOException ioe) {
- _log.error("Error writing the mapping", ioe);
- return null;
- }
+ orig.setProperty("key1", "val1");
+ orig.setProperty("key2", "val2");
+ orig.setProperty("key3", "val3");
+
+ DataHelper.writeProperties(baos, orig);
+ temp = baos.toByteArray();
+
+
+ Properties p = null;
+ ByteArrayInputStream bais = new ByteArrayInputStream(temp);
+
+ p = DataHelper.readProperties(bais);
+
+ assertEquals(orig, p);
}
- public String testData(InputStream inputStream) {
- try {
- Properties options = DataHelper.readProperties(inputStream);
- return DataHelper.toString(options);
- } catch (DataFormatException dfe) {
- _log.error("Error reading the mapping", dfe);
- return null;
- } catch (IOException ioe) {
- _log.error("Error reading the mapping", ioe);
- return null;
- }
- }
-
-
-}
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/data/MessageIdTest.java b/core/java/test/net/i2p/data/MessageIdTest.java
index e92d26f37..6c78afb91 100644
--- a/core/java/test/net/i2p/data/MessageIdTest.java
+++ b/core/java/test/net/i2p/data/MessageIdTest.java
@@ -17,10 +17,7 @@ import net.i2p.data.i2cp.MessageId;
*
* @author jrandom
*/
-class MessageIdTest extends StructureTest {
- static {
- TestData.registerTest(new MessageIdTest(), "MessageId");
- }
+public class MessageIdTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
MessageId id = new MessageId();
id.setMessageId(101);
diff --git a/core/java/test/net/i2p/data/MessagePayloadMessageTest.java b/core/java/test/net/i2p/data/MessagePayloadMessageTest.java
index 8234a518e..bdd71bf7d 100644
--- a/core/java/test/net/i2p/data/MessagePayloadMessageTest.java
+++ b/core/java/test/net/i2p/data/MessagePayloadMessageTest.java
@@ -10,6 +10,8 @@ package net.i2p.data;
import java.io.IOException;
import java.io.InputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ByteArrayInputStream;
import net.i2p.data.DataFormatException;
import net.i2p.data.DataStructure;
@@ -24,12 +26,8 @@ import net.i2p.util.Log;
*
* @author jrandom
*/
-class MessagePayloadMessageTest extends StructureTest {
- private final static Log _log = new Log(MessagePayloadMessage.class);
-
- static {
- TestData.registerTest(new MessagePayloadMessageTest(), "MessagePayloadMessage");
- }
+
+ public class MessagePayloadMessageTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
MessagePayloadMessage msg = new MessagePayloadMessage();
msg.setMessageId((MessageId)(new MessageIdTest()).createDataStructure());
@@ -37,20 +35,25 @@ class MessagePayloadMessageTest extends StructureTest {
msg.setSessionId((SessionId)(new SessionIdTest()).createDataStructure());
return msg;
}
- public DataStructure createStructureToRead() { return new MessagePayloadMessage(); }
- public String testData(InputStream inputStream) {
- try {
- DataStructure structure = createStructureToRead();
- structure.readBytes(inputStream);
- ((MessagePayloadMessage)structure).getPayload().setUnencryptedData(((MessagePayloadMessage)structure).getPayload().getEncryptedData());
- return structure.toString();
- } catch (DataFormatException dfe) {
- _log.error("Error reading the data structure", dfe);
- return null;
- } catch (IOException ioe) {
- _log.error("Error reading the data structure", ioe);
- return null;
- }
+ public DataStructure createStructureToRead() { return new MessagePayloadMessage(); }
+
+ public void testStructure() throws Exception{
+ byte[] temp = null;
+
+ DataStructure orig;
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ orig = createDataStructure();
+ orig.writeBytes(baos);
+
+ temp = baos.toByteArray();
+
+ DataStructure ds;
+ ByteArrayInputStream bais = new ByteArrayInputStream(temp);
+ ds = createStructureToRead();
+ ds.readBytes(bais);
+ ((MessagePayloadMessage)ds).getPayload().setUnencryptedData(((MessagePayloadMessage)ds).getPayload().getEncryptedData());
+
+ assertEquals(orig, ds);
}
-
-}
+
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/data/MessageStatusMessageTest.java b/core/java/test/net/i2p/data/MessageStatusMessageTest.java
index 7b2db8c99..c042fe918 100644
--- a/core/java/test/net/i2p/data/MessageStatusMessageTest.java
+++ b/core/java/test/net/i2p/data/MessageStatusMessageTest.java
@@ -19,16 +19,14 @@ import net.i2p.data.i2cp.SessionId;
*
* @author jrandom
*/
-class MessageStatusMessageTest extends StructureTest {
- static {
- TestData.registerTest(new MessageStatusMessageTest(), "MessageStatusMessage");
- }
+public class MessageStatusMessageTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
MessageStatusMessage msg = new MessageStatusMessage();
msg.setSessionId((SessionId)(new SessionIdTest()).createDataStructure());
msg.setMessageId((MessageId)(new MessageIdTest()).createDataStructure());
msg.setSize(1024*1024*42L);
msg.setStatus(MessageStatusMessage.STATUS_AVAILABLE);
+ msg.setNonce(1);
return msg;
}
public DataStructure createStructureToRead() { return new MessageStatusMessage(); }
diff --git a/core/java/test/net/i2p/data/PayloadTest.java b/core/java/test/net/i2p/data/PayloadTest.java
index 2fe01de77..b425b0d68 100644
--- a/core/java/test/net/i2p/data/PayloadTest.java
+++ b/core/java/test/net/i2p/data/PayloadTest.java
@@ -10,6 +10,8 @@ package net.i2p.data;
import java.io.IOException;
import java.io.InputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ByteArrayInputStream;
import net.i2p.data.DataFormatException;
import net.i2p.data.DataStructure;
@@ -24,42 +26,45 @@ import net.i2p.util.Log;
*
* @author jrandom
*/
-class PayloadTest extends StructureTest {
- private final static Log _log = new Log(PayloadTest.class);
-
- static {
- TestData.registerTest(new PayloadTest(), "Payload");
- }
+
+ public class PayloadTest extends StructureTest{
+
public DataStructure createDataStructure() throws DataFormatException {
Payload payload = new Payload();
SessionKey key = (SessionKey)(new SessionKeyTest()).createDataStructure();
- //payload.setEncryptionKey(key);
+
byte data[] = "Hello, I2P".getBytes();
payload.setUnencryptedData(data);
Hash hash = (Hash)(new HashTest()).createDataStructure();
- //payload.setHash(hash);
+
Destination target = (Destination)(new DestinationTest()).createDataStructure();
- payload.setEncryptedData(data);
- //payload.encryptPayload(target, 128);
+ payload.setEncryptedData(data);
+
return payload;
}
public DataStructure createStructureToRead() { return new Payload(); }
- public String testData(InputStream inputStream) {
- try {
- DataStructure structure = createStructureToRead();
- structure.readBytes(inputStream);
- Payload payload = (Payload)structure;
- payload.setUnencryptedData(payload.getEncryptedData());
- //((Payload)structure).decryptPayload((PrivateKey)(new PrivateKeyTest()).createDataStructure());
- return structure.toString();
- } catch (DataFormatException dfe) {
- _log.error("Error reading the data structure", dfe);
- return null;
- } catch (IOException ioe) {
- _log.error("Error reading the data structure", ioe);
- return null;
- }
+ public void testStructure() throws Exception{
+ byte[] temp = null;
+
+ DataStructure orig;
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+ orig = createDataStructure();
+ orig.writeBytes(baos);
+
+
+ temp = baos.toByteArray();
+
+ DataStructure ds;
+ ByteArrayInputStream bais = new ByteArrayInputStream(temp);
+
+ ds = createStructureToRead();
+ ds.readBytes(bais);
+ Payload payload = (Payload)ds;
+ payload.setUnencryptedData(payload.getEncryptedData());
+
+ assertEquals(orig, ds);
}
-}
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/data/PrivateKeyTest.java b/core/java/test/net/i2p/data/PrivateKeyTest.java
index 6b78e2610..9aa159e03 100644
--- a/core/java/test/net/i2p/data/PrivateKeyTest.java
+++ b/core/java/test/net/i2p/data/PrivateKeyTest.java
@@ -1,13 +1,17 @@
package net.i2p.data;
/*
* free (adj.): unencumbered; not under the control of others
- * Written by jrandom in 2003 and released into the public domain
+ * Written by jrandom in 2003 and released into the Private domain
* with no warranty of any kind, either expressed or implied.
* It probably won't make your computer catch on fire, or eat
* your children, but it might. Use at your own risk.
*
*/
+
+import java.io.ByteArrayOutputStream;
+import java.io.ByteArrayInputStream;
+import net.i2p.I2PAppContext;
import net.i2p.data.DataFormatException;
import net.i2p.data.DataStructure;
import net.i2p.data.PrivateKey;
@@ -17,10 +21,7 @@ import net.i2p.data.PrivateKey;
*
* @author jrandom
*/
-class PrivateKeyTest extends StructureTest {
- static {
- TestData.registerTest(new PrivateKeyTest(), "PrivateKey");
- }
+public class PrivateKeyTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
PrivateKey privateKey = new PrivateKey();
byte data[] = new byte[PrivateKey.KEYSIZE_BYTES];
@@ -30,4 +31,67 @@ class PrivateKeyTest extends StructureTest {
return privateKey;
}
public DataStructure createStructureToRead() { return new PrivateKey(); }
+
+ public void testBase64Constructor() throws Exception{
+ PrivateKey privateKey = new PrivateKey();
+ byte data[] = new byte[PrivateKey.KEYSIZE_BYTES];
+ for (int i = 0; i < data.length; i++)
+ data[i] = (byte)(i%56);
+ privateKey.setData(data);
+
+ PrivateKey key2 = new PrivateKey(privateKey.toBase64());
+ assertEquals(privateKey, key2);
+ }
+
+ public void testNullEquals(){
+ PrivateKey privateKey = new PrivateKey();
+ byte data[] = new byte[PrivateKey.KEYSIZE_BYTES];
+ for (int i = 0; i < data.length; i++)
+ data[i] = (byte)(i%56);
+ privateKey.setData(data);
+
+ assertFalse(privateKey.equals(null));
+ }
+
+ public void testNullData() throws Exception{
+ PrivateKey privateKey = new PrivateKey();
+ privateKey.toString();
+
+ boolean error = false;
+ try{
+ privateKey.writeBytes(new ByteArrayOutputStream());
+ }catch(DataFormatException dfe){
+ error = true;
+ }
+ assertTrue(error);
+ }
+
+ public void testShortData() throws Exception{
+ PrivateKey privateKey = new PrivateKey();
+ byte data[] = new byte[56];
+ for (int i = 0; i < data.length; i++)
+ data[i] = (byte)(i);
+ privateKey.setData(data);
+
+ boolean error = false;
+ try{
+ privateKey.writeBytes(new ByteArrayOutputStream());
+ }catch(DataFormatException dfe){
+ error = true;
+ }
+ assertTrue(error);
+ }
+
+ public void testShortRead() throws Exception{
+ PrivateKey privateKey = new PrivateKey();
+ ByteArrayInputStream in = new ByteArrayInputStream("six times nine equals forty-two".getBytes());
+ boolean error = false;
+ try{
+ privateKey.readBytes(in);
+ }catch(DataFormatException dfe){
+ error = true;
+ }
+ assertTrue(error);
+ }
+
}
diff --git a/core/java/test/net/i2p/data/PublicKeyTest.java b/core/java/test/net/i2p/data/PublicKeyTest.java
index 8fe78cef6..d1300ad92 100644
--- a/core/java/test/net/i2p/data/PublicKeyTest.java
+++ b/core/java/test/net/i2p/data/PublicKeyTest.java
@@ -8,6 +8,9 @@ package net.i2p.data;
*
*/
+import java.io.ByteArrayOutputStream;
+import java.io.ByteArrayInputStream;
+
import net.i2p.data.DataFormatException;
import net.i2p.data.DataStructure;
import net.i2p.data.PublicKey;
@@ -17,10 +20,7 @@ import net.i2p.data.PublicKey;
*
* @author jrandom
*/
-class PublicKeyTest extends StructureTest {
- static {
- TestData.registerTest(new PublicKeyTest(), "PublicKey");
- }
+public class PublicKeyTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
PublicKey publicKey = new PublicKey();
byte data[] = new byte[PublicKey.KEYSIZE_BYTES];
@@ -30,4 +30,66 @@ class PublicKeyTest extends StructureTest {
return publicKey;
}
public DataStructure createStructureToRead() { return new PublicKey(); }
+
+ public void testBase64Constructor() throws Exception{
+ PublicKey publicKey = new PublicKey();
+ byte data[] = new byte[PublicKey.KEYSIZE_BYTES];
+ for (int i = 0; i < data.length; i++)
+ data[i] = (byte)(i%56);
+ publicKey.setData(data);
+
+ PublicKey key2 = new PublicKey(publicKey.toBase64());
+ assertEquals(publicKey, key2);
+ }
+
+ public void testNullEquals(){
+ PublicKey publicKey = new PublicKey();
+ byte data[] = new byte[PublicKey.KEYSIZE_BYTES];
+ for (int i = 0; i < data.length; i++)
+ data[i] = (byte)(i%56);
+ publicKey.setData(data);
+
+ assertFalse(publicKey.equals(null));
+ }
+
+ public void testNullData() throws Exception{
+ PublicKey publicKey = new PublicKey();
+ publicKey.toString();
+
+ boolean error = false;
+ try{
+ publicKey.writeBytes(new ByteArrayOutputStream());
+ }catch(DataFormatException dfe){
+ error = true;
+ }
+ assertTrue(error);
+ }
+
+ public void testShortData() throws Exception{
+ PublicKey publicKey = new PublicKey();
+ byte data[] = new byte[56];
+ for (int i = 0; i < data.length; i++)
+ data[i] = (byte)(i);
+ publicKey.setData(data);
+
+ boolean error = false;
+ try{
+ publicKey.writeBytes(new ByteArrayOutputStream());
+ }catch(DataFormatException dfe){
+ error = true;
+ }
+ assertTrue(error);
+ }
+
+ public void testShortRead() throws Exception{
+ PublicKey publicKey = new PublicKey();
+ ByteArrayInputStream in = new ByteArrayInputStream("six times nine equals forty-two".getBytes());
+ boolean error = false;
+ try{
+ publicKey.readBytes(in);
+ }catch(DataFormatException dfe){
+ error = true;
+ }
+ assertTrue(error);
+ }
}
diff --git a/core/java/test/net/i2p/data/ReceiveMessageBeginMessageTest.java b/core/java/test/net/i2p/data/ReceiveMessageBeginMessageTest.java
index 140a9b807..9bb09a9da 100644
--- a/core/java/test/net/i2p/data/ReceiveMessageBeginMessageTest.java
+++ b/core/java/test/net/i2p/data/ReceiveMessageBeginMessageTest.java
@@ -19,10 +19,7 @@ import net.i2p.data.i2cp.SessionId;
*
* @author jrandom
*/
-class ReceiveMessageBeginMessageTest extends StructureTest {
- static {
- TestData.registerTest(new ReceiveMessageBeginMessageTest(), "ReceiveMessageBeginMessage");
- }
+public class ReceiveMessageBeginMessageTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
ReceiveMessageBeginMessage msg = new ReceiveMessageBeginMessage();
msg.setSessionId((SessionId)(new SessionIdTest()).createDataStructure());
diff --git a/core/java/test/net/i2p/data/ReceiveMessageEndMessageTest.java b/core/java/test/net/i2p/data/ReceiveMessageEndMessageTest.java
index c1c34b5d1..6402dcee3 100644
--- a/core/java/test/net/i2p/data/ReceiveMessageEndMessageTest.java
+++ b/core/java/test/net/i2p/data/ReceiveMessageEndMessageTest.java
@@ -19,10 +19,7 @@ import net.i2p.data.i2cp.SessionId;
*
* @author jrandom
*/
-class ReceiveMessageEndMessageTest extends StructureTest {
- static {
- TestData.registerTest(new ReceiveMessageEndMessageTest(), "ReceiveMessageEndMessage");
- }
+public class ReceiveMessageEndMessageTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
ReceiveMessageEndMessage msg = new ReceiveMessageEndMessage();
msg.setSessionId((SessionId)(new SessionIdTest()).createDataStructure());
diff --git a/core/java/test/net/i2p/data/ReportAbuseMessageTest.java b/core/java/test/net/i2p/data/ReportAbuseMessageTest.java
index 769694635..b666fb44f 100644
--- a/core/java/test/net/i2p/data/ReportAbuseMessageTest.java
+++ b/core/java/test/net/i2p/data/ReportAbuseMessageTest.java
@@ -21,10 +21,7 @@ import net.i2p.data.i2cp.SessionId;
*
* @author jrandom
*/
-class ReportAbuseMessageTest extends StructureTest {
- static {
- TestData.registerTest(new ReportAbuseMessageTest(), "ReportAbuseMessage");
- }
+public class ReportAbuseMessageTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
ReportAbuseMessage msg = new ReportAbuseMessage();
msg.setMessageId((MessageId)(new MessageIdTest()).createDataStructure());
diff --git a/core/java/test/net/i2p/data/RequestLeaseSetMessageTest.java b/core/java/test/net/i2p/data/RequestLeaseSetMessageTest.java
index 726201e35..a3b6ba0d9 100644
--- a/core/java/test/net/i2p/data/RequestLeaseSetMessageTest.java
+++ b/core/java/test/net/i2p/data/RequestLeaseSetMessageTest.java
@@ -22,10 +22,7 @@ import net.i2p.data.i2cp.SessionId;
*
* @author jrandom
*/
-class RequestLeaseSetMessageTest extends StructureTest {
- static {
- TestData.registerTest(new RequestLeaseSetMessageTest(), "RequestLeaseSetMessage");
- }
+public class RequestLeaseSetMessageTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
RequestLeaseSetMessage msg = new RequestLeaseSetMessage();
msg.setSessionId((SessionId)(new SessionIdTest()).createDataStructure());
diff --git a/core/java/test/net/i2p/data/RouterAddressTest.java b/core/java/test/net/i2p/data/RouterAddressTest.java
index 6c48d53f1..b4075ce8f 100644
--- a/core/java/test/net/i2p/data/RouterAddressTest.java
+++ b/core/java/test/net/i2p/data/RouterAddressTest.java
@@ -7,7 +7,8 @@ package net.i2p.data;
* your children, but it might. Use at your own risk.
*
*/
-
+
+import java.io.ByteArrayOutputStream;
import java.util.Date;
import java.util.Properties;
@@ -20,10 +21,7 @@ import net.i2p.data.RouterAddress;
*
* @author jrandom
*/
-class RouterAddressTest extends StructureTest {
- static {
- TestData.registerTest(new RouterAddressTest(), "RouterAddress");
- }
+public class RouterAddressTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
RouterAddress addr = new RouterAddress();
byte data[] = new byte[32];
@@ -39,4 +37,45 @@ class RouterAddressTest extends StructureTest {
return addr;
}
public DataStructure createStructureToRead() { return new RouterAddress(); }
+
+ public void testBadWrite() throws Exception{
+ RouterAddress addr = new RouterAddress();
+ boolean error = true;
+ try{
+ addr.writeBytes(new ByteArrayOutputStream());
+ }catch(DataFormatException dfe){
+ error = true;
+ }
+ assertTrue(error);
+ }
+
+ public void testNullEquals(){
+ RouterAddress addr = new RouterAddress();
+ byte data[] = new byte[32];
+ for (int i = 0; i < data.length; i++)
+ data[i] = (byte)(i%16);
+ addr.setCost(42);
+ addr.setExpiration(new Date(1000*60*60*24)); // jan 2 1970
+ Properties options = new Properties();
+ options.setProperty("hostname", "localhost");
+ options.setProperty("portnum", "1234");
+ addr.setOptions(options);
+ addr.setTransportStyle("Blah");
+ assertFalse(addr.equals(null));
+ }
+
+ public void testToString(){
+ RouterAddress addr = new RouterAddress();
+ byte data[] = new byte[32];
+ for (int i = 0; i < data.length; i++)
+ data[i] = (byte)(i%16);
+ addr.setCost(42);
+ addr.setExpiration(new Date(1000*60*60*24)); // jan 2 1970
+ Properties options = new Properties();
+ options.setProperty("hostname", "localhost");
+ options.setProperty("portnum", "1234");
+ addr.setOptions(options);
+ addr.setTransportStyle("Blah");
+ addr.toString();
+ }
}
diff --git a/core/java/test/net/i2p/data/RouterIdentityTest.java b/core/java/test/net/i2p/data/RouterIdentityTest.java
index 82a8e6cd8..1b74dffdb 100644
--- a/core/java/test/net/i2p/data/RouterIdentityTest.java
+++ b/core/java/test/net/i2p/data/RouterIdentityTest.java
@@ -8,6 +8,8 @@ package net.i2p.data;
*
*/
+import java.io.ByteArrayOutputStream;
+
import net.i2p.data.Certificate;
import net.i2p.data.DataFormatException;
import net.i2p.data.DataStructure;
@@ -20,10 +22,7 @@ import net.i2p.data.SigningPublicKey;
*
* @author jrandom
*/
-class RouterIdentityTest extends StructureTest {
- static {
- TestData.registerTest(new RouterIdentityTest(), "RouterIdentity");
- }
+public class RouterIdentityTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
RouterIdentity ident = new RouterIdentity();
Certificate cert = (Certificate)(new CertificateTest()).createDataStructure();
@@ -35,4 +34,84 @@ class RouterIdentityTest extends StructureTest {
return ident;
}
public DataStructure createStructureToRead() { return new RouterIdentity(); }
+
+ public void testNullCert() throws Exception{
+ RouterIdentity ident = new RouterIdentity();
+ ident.setCertificate(null);
+ PublicKey pk = (PublicKey)(new PublicKeyTest()).createDataStructure();
+ ident.setPublicKey(pk);
+ SigningPublicKey k = (SigningPublicKey)(new SigningPublicKeyTest()).createDataStructure();
+ ident.setSigningPublicKey(k);
+
+ boolean error = false;
+ try{
+ ident.writeBytes(new ByteArrayOutputStream());
+ }catch(DataFormatException dfe){
+ error = true;
+ }
+ assertTrue(error);
+ }
+
+ public void testNullPublicKey() throws Exception{
+ RouterIdentity ident = new RouterIdentity();
+ Certificate cert = (Certificate)(new CertificateTest()).createDataStructure();
+ ident.setCertificate(cert);
+ ident.setPublicKey(null);
+ SigningPublicKey k = (SigningPublicKey)(new SigningPublicKeyTest()).createDataStructure();
+ ident.setSigningPublicKey(k);
+
+ boolean error = false;
+ try{
+ ident.writeBytes(new ByteArrayOutputStream());
+ }catch(DataFormatException dfe){
+ error = true;
+ }
+ assertTrue(error);
+
+ }
+
+ public void testNullSigningKey() throws Exception{
+ RouterIdentity ident = new RouterIdentity();
+ Certificate cert = (Certificate)(new CertificateTest()).createDataStructure();
+ ident.setCertificate(cert);
+ PublicKey pk = (PublicKey)(new PublicKeyTest()).createDataStructure();
+ ident.setPublicKey(pk);
+ ident.setSigningPublicKey(null);
+
+ boolean error = false;
+ try{
+ ident.writeBytes(new ByteArrayOutputStream());
+ }catch(DataFormatException dfe){
+ error = true;
+ }
+ assertTrue(error);
+ }
+
+ public void testNullEquals() throws Exception{
+ RouterIdentity ident = new RouterIdentity();
+ assertFalse(ident.equals(null));
+ }
+
+ public void testCalculatedHash() throws Exception{
+ RouterIdentity ident = new RouterIdentity();
+ Certificate cert = (Certificate)(new CertificateTest()).createDataStructure();
+ ident.setCertificate(cert);
+ PublicKey pk = (PublicKey)(new PublicKeyTest()).createDataStructure();
+ ident.setPublicKey(pk);
+ SigningPublicKey k = (SigningPublicKey)(new SigningPublicKeyTest()).createDataStructure();
+ ident.setSigningPublicKey(k);
+
+ ident.calculateHash();
+ ident.calculateHash();
+ ident.calculateHash();
+ ident.calculateHash();
+ ident.calculateHash();
+ }
+
+ public void testBadHash() throws Exception{
+ RouterIdentity ident = new RouterIdentity();
+ ident.getHash();
+ }
+
+
}
diff --git a/core/java/test/net/i2p/data/RouterInfoTest.java b/core/java/test/net/i2p/data/RouterInfoTest.java
index 00dad4a01..4e26fbf4b 100644
--- a/core/java/test/net/i2p/data/RouterInfoTest.java
+++ b/core/java/test/net/i2p/data/RouterInfoTest.java
@@ -30,9 +30,6 @@ import net.i2p.util.Log;
*/
public class RouterInfoTest extends StructureTest {
private final static Log _log = new Log(RouterInfoTest.class);
- static {
- TestData.registerTest(new RouterInfoTest(), "RouterInfo");
- }
public DataStructure createDataStructure() throws DataFormatException {
RouterInfo info = new RouterInfo();
HashSet addresses = new HashSet();
@@ -40,32 +37,32 @@ public class RouterInfoTest extends StructureTest {
addresses.add(structure);
info.setAddresses(addresses);
- PublicKey pubKey = null;
- SigningPublicKey signingPubKey = null;
- PrivateKey privKey = null;
- SigningPrivateKey signingPrivKey = null;
-
- Object obj[] = KeyGenerator.getInstance().generatePKIKeypair();
- pubKey = (PublicKey)obj[0];
- privKey = (PrivateKey)obj[1];
- obj = KeyGenerator.getInstance().generateSigningKeypair();
- signingPubKey = (SigningPublicKey)obj[0];
- signingPrivKey = (SigningPrivateKey)obj[1];
-
- _log.debug("SigningPublicKey: " + signingPubKey);
- _log.debug("SigningPrivateKey: " + signingPrivKey);
-
- RouterIdentity ident = new RouterIdentity();
- ident.setCertificate(new Certificate(Certificate.CERTIFICATE_TYPE_NULL, null));
- ident.setPublicKey(pubKey);
- ident.setSigningPublicKey(signingPubKey);
-
+ PublicKey pubKey = null;
+ SigningPublicKey signingPubKey = null;
+ PrivateKey privKey = null;
+ SigningPrivateKey signingPrivKey = null;
+
+ Object obj[] = KeyGenerator.getInstance().generatePKIKeypair();
+ pubKey = (PublicKey)obj[0];
+ privKey = (PrivateKey)obj[1];
+ obj = KeyGenerator.getInstance().generateSigningKeypair();
+ signingPubKey = (SigningPublicKey)obj[0];
+ signingPrivKey = (SigningPrivateKey)obj[1];
+
+ _log.debug("SigningPublicKey: " + signingPubKey);
+ _log.debug("SigningPrivateKey: " + signingPrivKey);
+
+ RouterIdentity ident = new RouterIdentity();
+ ident.setCertificate(new Certificate(Certificate.CERTIFICATE_TYPE_NULL, null));
+ ident.setPublicKey(pubKey);
+ ident.setSigningPublicKey(signingPubKey);
+
info.setIdentity(ident);
Properties options = new Properties();
- for (int i = 0; i < 16; i++) {
- options.setProperty("option." + i, "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890$:." + i);
- }
+ for (int i = 0; i < 16; i++) {
+ options.setProperty("option." + i, "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890$:." + i);
+ }
options.setProperty("netConnectionSpeed", "OC12");
info.setOptions(options);
@@ -73,12 +70,12 @@ public class RouterInfoTest extends StructureTest {
structure = (new HashTest()).createDataStructure();
peers.add(structure);
info.setPeers(peers);
- info.setPublished(System.currentTimeMillis());
-
- //info.setVersion(69);
-
- info.sign(signingPrivKey);
-
+ info.setPublished(System.currentTimeMillis());
+
+ //info.setVersion(69);
+
+ info.sign(signingPrivKey);
+
return info;
}
public DataStructure createStructureToRead() { return new RouterInfo(); }
diff --git a/core/java/test/net/i2p/data/SendMessageMessageTest.java b/core/java/test/net/i2p/data/SendMessageMessageTest.java
index 019147ba9..e0ff9f68a 100644
--- a/core/java/test/net/i2p/data/SendMessageMessageTest.java
+++ b/core/java/test/net/i2p/data/SendMessageMessageTest.java
@@ -10,6 +10,8 @@ package net.i2p.data;
import java.io.IOException;
import java.io.InputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ByteArrayInputStream;
import net.i2p.data.DataFormatException;
import net.i2p.data.DataStructure;
@@ -24,33 +26,39 @@ import net.i2p.util.Log;
*
* @author jrandom
*/
-class SendMessageMessageTest extends StructureTest {
- private final static Log _log = new Log(SendMessageMessageTest.class);
-
- static {
- TestData.registerTest(new SendMessageMessageTest(), "SendMessageMessage");
- }
+
+ public class SendMessageMessageTest extends StructureTest {
+
public DataStructure createDataStructure() throws DataFormatException {
SendMessageMessage msg = new SendMessageMessage();
msg.setDestination((Destination)(new DestinationTest()).createDataStructure());
msg.setPayload((Payload)(new PayloadTest()).createDataStructure());
msg.setSessionId((SessionId)(new SessionIdTest()).createDataStructure());
+ msg.setNonce(1);
return msg;
}
- public DataStructure createStructureToRead() { return new SendMessageMessage(); }
- public String testData(InputStream inputStream) {
- try {
- DataStructure structure = createStructureToRead();
- structure.readBytes(inputStream);
- ((SendMessageMessage)structure).getPayload().setUnencryptedData(((SendMessageMessage)structure).getPayload().getEncryptedData());
- return structure.toString();
- } catch (DataFormatException dfe) {
- _log.error("Error reading the data structure", dfe);
- return null;
- } catch (IOException ioe) {
- _log.error("Error reading the data structure", ioe);
- return null;
- }
+ public DataStructure createStructureToRead() { return new SendMessageMessage(); }
+
+ public void testStructure() throws Exception{
+ byte[] temp = null;
+
+ DataStructure orig;
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+ orig = createDataStructure();
+ orig.writeBytes(baos);
+
+
+ temp = baos.toByteArray();
+
+ DataStructure ds;
+ ByteArrayInputStream bais = new ByteArrayInputStream(temp);
+
+ ds = createStructureToRead();
+ ds.readBytes(bais);
+ ((SendMessageMessage)ds).getPayload().setUnencryptedData(((SendMessageMessage)ds).getPayload().getEncryptedData());
+
+ assertEquals(orig, ds);
}
-
-}
+
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/data/SessionConfigTest.java b/core/java/test/net/i2p/data/SessionConfigTest.java
index 3a568dcb0..ecd24dc3f 100644
--- a/core/java/test/net/i2p/data/SessionConfigTest.java
+++ b/core/java/test/net/i2p/data/SessionConfigTest.java
@@ -22,10 +22,7 @@ import net.i2p.data.i2cp.SessionConfig;
*
* @author jrandom
*/
-class SessionConfigTest extends StructureTest {
- static {
- TestData.registerTest(new SessionConfigTest(), "SessionConfig");
- }
+public class SessionConfigTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
SessionConfig cfg = new SessionConfig((Destination)(new DestinationTest()).createDataStructure());
cfg.setSignature((Signature)(new SignatureTest()).createDataStructure());
diff --git a/core/java/test/net/i2p/data/SessionIdTest.java b/core/java/test/net/i2p/data/SessionIdTest.java
index 2be8a9f14..36ba16d7a 100644
--- a/core/java/test/net/i2p/data/SessionIdTest.java
+++ b/core/java/test/net/i2p/data/SessionIdTest.java
@@ -17,10 +17,7 @@ import net.i2p.data.i2cp.SessionId;
*
* @author jrandom
*/
-class SessionIdTest extends StructureTest {
- static {
- TestData.registerTest(new SessionIdTest(), "SessionId");
- }
+public class SessionIdTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
SessionId id = new SessionId();
id.setSessionId(7);
diff --git a/core/java/test/net/i2p/data/SessionKeyTest.java b/core/java/test/net/i2p/data/SessionKeyTest.java
index 862056e9e..d07bbf039 100644
--- a/core/java/test/net/i2p/data/SessionKeyTest.java
+++ b/core/java/test/net/i2p/data/SessionKeyTest.java
@@ -17,10 +17,7 @@ import net.i2p.data.SessionKey;
*
* @author jrandom
*/
-class SessionKeyTest extends StructureTest {
- static {
- TestData.registerTest(new SessionKeyTest(), "SessionKey");
- }
+public class SessionKeyTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
SessionKey key = new SessionKey();
byte data[] = new byte[SessionKey.KEYSIZE_BYTES];
diff --git a/core/java/test/net/i2p/data/SessionStatusMessageTest.java b/core/java/test/net/i2p/data/SessionStatusMessageTest.java
index 0626272db..1dfa4ff47 100644
--- a/core/java/test/net/i2p/data/SessionStatusMessageTest.java
+++ b/core/java/test/net/i2p/data/SessionStatusMessageTest.java
@@ -18,10 +18,7 @@ import net.i2p.data.i2cp.SessionStatusMessage;
*
* @author jrandom
*/
-class SessionStatusMessageTest extends StructureTest {
- static {
- TestData.registerTest(new SessionStatusMessageTest(), "SessionStatusMessage");
- }
+public class SessionStatusMessageTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
SessionStatusMessage msg = new SessionStatusMessage();
msg.setSessionId((SessionId)(new SessionIdTest()).createDataStructure());
diff --git a/core/java/test/net/i2p/data/SignatureTest.java b/core/java/test/net/i2p/data/SignatureTest.java
index f49eb1586..ece90332f 100644
--- a/core/java/test/net/i2p/data/SignatureTest.java
+++ b/core/java/test/net/i2p/data/SignatureTest.java
@@ -17,10 +17,7 @@ import net.i2p.data.Signature;
*
* @author jrandom
*/
-class SignatureTest extends StructureTest {
- static {
- TestData.registerTest(new SignatureTest(), "Signature");
- }
+public class SignatureTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
Signature sig = new Signature();
byte data[] = new byte[Signature.SIGNATURE_BYTES];
diff --git a/core/java/test/net/i2p/data/SigningPrivateKeyTest.java b/core/java/test/net/i2p/data/SigningPrivateKeyTest.java
index e89193a9f..fd7c5f922 100644
--- a/core/java/test/net/i2p/data/SigningPrivateKeyTest.java
+++ b/core/java/test/net/i2p/data/SigningPrivateKeyTest.java
@@ -7,7 +7,11 @@ package net.i2p.data;
* your children, but it might. Use at your own risk.
*
*/
+
+import java.io.ByteArrayOutputStream;
+import java.io.ByteArrayInputStream;
+import net.i2p.I2PAppContext;
import net.i2p.data.DataFormatException;
import net.i2p.data.DataStructure;
import net.i2p.data.SigningPrivateKey;
@@ -17,17 +21,78 @@ import net.i2p.data.SigningPrivateKey;
*
* @author jrandom
*/
-class SigningPrivateKeyTest extends StructureTest {
- static {
- TestData.registerTest(new SigningPrivateKeyTest(), "SigningPrivateKey");
- }
+public class SigningPrivateKeyTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
- SigningPrivateKey privateKey = new SigningPrivateKey();
+ SigningPrivateKey signingPrivateKey = new SigningPrivateKey();
byte data[] = new byte[SigningPrivateKey.KEYSIZE_BYTES];
for (int i = 0; i < data.length; i++)
data[i] = (byte)(i%16);
- privateKey.setData(data);
- return privateKey;
+ signingPrivateKey.setData(data);
+ return signingPrivateKey;
}
public DataStructure createStructureToRead() { return new SigningPrivateKey(); }
+
+ public void testBase64Constructor() throws Exception{
+ SigningPrivateKey signingPrivateKey = new SigningPrivateKey();
+ byte data[] = new byte[SigningPrivateKey.KEYSIZE_BYTES];
+ for (int i = 0; i < data.length; i++)
+ data[i] = (byte)(i%56);
+ signingPrivateKey.setData(data);
+
+ SigningPrivateKey key2 = new SigningPrivateKey(signingPrivateKey.toBase64());
+ assertEquals(signingPrivateKey, key2);
+ }
+
+ public void testNullEquals(){
+ SigningPrivateKey signingPrivateKey = new SigningPrivateKey();
+ byte data[] = new byte[SigningPrivateKey.KEYSIZE_BYTES];
+ for (int i = 0; i < data.length; i++)
+ data[i] = (byte)(i%56);
+ signingPrivateKey.setData(data);
+
+ assertFalse(signingPrivateKey.equals(null));
+ }
+
+ public void testNullData() throws Exception{
+ SigningPrivateKey signingPrivateKey = new SigningPrivateKey();
+ signingPrivateKey.toString();
+
+ boolean error = false;
+ try{
+ signingPrivateKey.writeBytes(new ByteArrayOutputStream());
+ }catch(DataFormatException dfe){
+ error = true;
+ }
+ assertTrue(error);
+ }
+
+ public void testShortData() throws Exception{
+ SigningPrivateKey signingPrivateKey = new SigningPrivateKey();
+ byte data[] = new byte[56];
+ for (int i = 0; i < data.length; i++)
+ data[i] = (byte)(i);
+ signingPrivateKey.setData(data);
+
+ boolean error = false;
+ try{
+ signingPrivateKey.writeBytes(new ByteArrayOutputStream());
+ }catch(DataFormatException dfe){
+ error = true;
+ }
+ assertTrue(error);
+ }
+
+ public void testShortRead() throws Exception{
+ SigningPrivateKey signingPrivateKey = new SigningPrivateKey();
+ ByteArrayInputStream in = new ByteArrayInputStream("short".getBytes());
+ boolean error = false;
+ try{
+ signingPrivateKey.readBytes(in);
+ }catch(DataFormatException dfe){
+ error = true;
+ }
+ assertTrue(error);
+ }
+
+
}
diff --git a/core/java/test/net/i2p/data/SigningPublicKeyTest.java b/core/java/test/net/i2p/data/SigningPublicKeyTest.java
index 72129cf3b..d424c392d 100644
--- a/core/java/test/net/i2p/data/SigningPublicKeyTest.java
+++ b/core/java/test/net/i2p/data/SigningPublicKeyTest.java
@@ -8,6 +8,9 @@ package net.i2p.data;
*
*/
+import java.io.ByteArrayOutputStream;
+import java.io.ByteArrayInputStream;
+
import net.i2p.data.DataFormatException;
import net.i2p.data.DataStructure;
import net.i2p.data.SigningPublicKey;
@@ -17,10 +20,7 @@ import net.i2p.data.SigningPublicKey;
*
* @author jrandom
*/
-class SigningPublicKeyTest extends StructureTest {
- static {
- TestData.registerTest(new SigningPublicKeyTest(), "SigningPublicKey");
- }
+public class SigningPublicKeyTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
SigningPublicKey publicKey = new SigningPublicKey();
byte data[] = new byte[SigningPublicKey.KEYSIZE_BYTES];
@@ -30,4 +30,67 @@ class SigningPublicKeyTest extends StructureTest {
return publicKey;
}
public DataStructure createStructureToRead() { return new SigningPublicKey(); }
+
+ public void testBase64Constructor() throws Exception{
+ SigningPublicKey publicKey = new SigningPublicKey();
+ byte data[] = new byte[SigningPublicKey.KEYSIZE_BYTES];
+ for (int i = 0; i < data.length; i++)
+ data[i] = (byte)(i%56);
+ publicKey.setData(data);
+
+ SigningPublicKey key2 = new SigningPublicKey(publicKey.toBase64());
+ assertEquals(publicKey, key2);
+ }
+
+ public void testNullEquals(){
+ SigningPublicKey publicKey = new SigningPublicKey();
+ byte data[] = new byte[SigningPublicKey.KEYSIZE_BYTES];
+ for (int i = 0; i < data.length; i++)
+ data[i] = (byte)(i%56);
+ publicKey.setData(data);
+
+ assertFalse(publicKey.equals(null));
+ }
+
+ public void testNullData() throws Exception{
+ SigningPublicKey publicKey = new SigningPublicKey();
+ publicKey.toString();
+
+ boolean error = false;
+ try{
+ publicKey.writeBytes(new ByteArrayOutputStream());
+ }catch(DataFormatException dfe){
+ error = true;
+ }
+ assertTrue(error);
+ }
+
+ public void testShortData() throws Exception{
+ SigningPublicKey publicKey = new SigningPublicKey();
+ byte data[] = new byte[56];
+ for (int i = 0; i < data.length; i++)
+ data[i] = (byte)(i);
+ publicKey.setData(data);
+
+ boolean error = false;
+ try{
+ publicKey.writeBytes(new ByteArrayOutputStream());
+ }catch(DataFormatException dfe){
+ error = true;
+ }
+ assertTrue(error);
+ }
+
+ public void testShortRead() throws Exception{
+ SigningPublicKey publicKey = new SigningPublicKey();
+ ByteArrayInputStream in = new ByteArrayInputStream("six times nine equals forty-two".getBytes());
+ boolean error = false;
+ try{
+ publicKey.readBytes(in);
+ }catch(DataFormatException dfe){
+ error = true;
+ }
+ assertTrue(error);
+ }
+
}
diff --git a/core/java/test/net/i2p/data/StringTest.java b/core/java/test/net/i2p/data/StringTest.java
index 7647666a0..099fa5853 100644
--- a/core/java/test/net/i2p/data/StringTest.java
+++ b/core/java/test/net/i2p/data/StringTest.java
@@ -9,6 +9,7 @@ package net.i2p.data;
*/
import java.io.ByteArrayOutputStream;
+import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -16,44 +17,30 @@ import net.i2p.data.DataFormatException;
import net.i2p.data.DataHelper;
import net.i2p.util.Log;
+import junit.framework.TestCase;
+
/**
- * Test harness for the boolean structure
+ * Test harness for the date structure
*
* @author jrandom
*/
-class StringTest implements TestDataGenerator, TestDataPrinter {
- static {
- TestData.registerGenerator(new StringTest(), "String");
- TestData.registerPrinter(new StringTest(), "String");
- }
- private static final Log _log = new Log(StringTest.class);
+public class StringTest extends TestCase{
- public byte[] getData() {
+ public void testString() throws Exception{
+ byte[] temp = null;
+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
- try {
- DataHelper.writeString(baos, "Hello, I2P");
- return baos.toByteArray();
- } catch (DataFormatException dfe) {
- _log.error("Error writing the string", dfe);
- return null;
- } catch (IOException ioe) {
- _log.error("Error writing the string", ioe);
- return null;
- }
+
+ DataHelper.writeString(baos, "Hello, I2P");
+ temp = baos.toByteArray();
+
+
+ String s = null;
+ ByteArrayInputStream bais = new ByteArrayInputStream(temp);
+
+ s = DataHelper.readString(bais);
+
+ assertEquals(s, "Hello, I2P");
}
- public String testData(InputStream inputStream) {
- try {
- String str = DataHelper.readString(inputStream);
- return ""+str;
- } catch (DataFormatException dfe) {
- _log.error("Error reading the string", dfe);
- return null;
- } catch (IOException ioe) {
- _log.error("Error reading the string", ioe);
- return null;
- }
- }
-
-
-}
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/data/StructureTest.java b/core/java/test/net/i2p/data/StructureTest.java
index 2a511d5ae..8159764cb 100644
--- a/core/java/test/net/i2p/data/StructureTest.java
+++ b/core/java/test/net/i2p/data/StructureTest.java
@@ -9,6 +9,7 @@ package net.i2p.data;
*/
import java.io.ByteArrayOutputStream;
+import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -17,46 +18,38 @@ import net.i2p.data.DataStructure;
import net.i2p.util.Log;
import net.i2p.I2PAppContext;
+import junit.framework.TestCase;
+
/**
* Utility class for wrapping data structure tests
*
* @author jrandom
*/
-public abstract class StructureTest implements TestDataGenerator, TestDataPrinter {
- private static final Log _log = new Log(StructureTest.class);
- protected static I2PAppContext _context = I2PAppContext.getGlobalContext();
+
+public abstract class StructureTest extends TestCase{
public abstract DataStructure createDataStructure() throws DataFormatException;
public abstract DataStructure createStructureToRead();
-
- public byte[] getData() {
+
+ public void testStructure() throws Exception{
+ byte[] temp = null;
+
+ DataStructure orig;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
- try {
- DataStructure structure = createDataStructure();
- structure.writeBytes(baos);
- } catch (DataFormatException dfe) {
- _log.error("Error writing the data structure", dfe);
- return null;
- } catch (IOException ioe) {
- _log.error("Error writing the data structure", ioe);
- return null;
- }
- return baos.toByteArray();
+
+ orig = createDataStructure();
+ orig.writeBytes(baos);
+
+
+ temp = baos.toByteArray();
+
+ DataStructure ds;
+ ByteArrayInputStream bais = new ByteArrayInputStream(temp);
+
+ ds = createStructureToRead();
+ ds.readBytes(bais);
+
+ assertEquals(orig, ds);
}
- public String testData(InputStream inputStream) {
- try {
- DataStructure structure = createStructureToRead();
- structure.readBytes(inputStream);
- return structure.toString() + "\n\nIn base 64: " + structure.toBase64();
- } catch (DataFormatException dfe) {
- _log.error("Error reading the data structure", dfe);
- return null;
- } catch (IOException ioe) {
- _log.error("Error reading the data structure", ioe);
- return null;
- }
- }
-
-
-}
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/data/TestData.java b/core/java/test/net/i2p/data/TestData.java
index aecc0b1ad..e69de29bb 100644
--- a/core/java/test/net/i2p/data/TestData.java
+++ b/core/java/test/net/i2p/data/TestData.java
@@ -1,150 +0,0 @@
-package net.i2p.data;
-/*
- * free (adj.): unencumbered; not under the control of others
- * Written by jrandom in 2003 and released into the public domain
- * with no warranty of any kind, either expressed or implied.
- * It probably won't make your computer catch on fire, or eat
- * your children, but it might. Use at your own risk.
- *
- */
-
-import java.util.HashMap;
-import java.util.Iterator;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.io.IOException;
-
-import net.i2p.util.Log;
-
-/**
- * Test harness for loading / storing data structures
- *
- * @author jrandom
- */
-public class TestData {
- private final static Log _log = new Log(TestData.class);
- private final static String HELP = "\nUsage: TestData generate objectType outFile\n" +
- " TestData display objectType inFile\n" +
- " TestData test objectType tempFile\n" +
- "Known types: ";
-
- private final static String OP_GENERATE = "generate";
- private final static String OP_DISPLAY = "display";
- private final static String OP_TEST = "test";
-
- private final static HashMap _generators;
- private final static HashMap _printers;
- static {
- _generators = new HashMap();
- _generators.put("NullType", new TestDataGenerator() { public byte[] getData() { return new byte[1]; } });
-
- _printers = new HashMap();
- _printers.put("NullType", new TestDataPrinter() { public String testData(InputStream in) { return "Null data read successfully"; } });
- }
-
- public static void registerTest(StructureTest test, String name) {
- registerGenerator(test, name);
- registerPrinter(test, name);
- }
- public static void registerGenerator(TestDataGenerator test, String name) {
- _generators.put(name, test);
- }
- public static void registerPrinter(TestDataPrinter test, String name) {
- _printers.put(name, test);
- }
-
- public static void main(String args[]) {
- if (args.length < 1) {
- showHelp();
- return;
- }
-
- if (OP_GENERATE.equalsIgnoreCase(args[0])) {
- validateTest(args[1]);
- if (args.length != 3) {
- showHelp();
- return;
- }
- generate(args[1], args[2]);
- return;
- } else if (OP_DISPLAY.equalsIgnoreCase(args[0])) {
- validateTest(args[1]);
- if (args.length != 3) {
- showHelp();
- return;
- }
- display(args[1], args[2]);
- } else if (OP_TEST.equalsIgnoreCase(args[0])) {
- validateTest(args[1]);
- if (args.length != 3) {
- showHelp();
- return;
- }
- generate(args[1], args[2]);
- display(args[1], args[2]);
- } else {
- showHelp();
- }
- try { Thread.sleep(2000); } catch (InterruptedException ie) {}
- }
-
- private static void validateTest(String objectType) {
- try {
- String clsName = TestData.class.getPackage().getName() + "." + objectType + "Test";
- Class.forName(clsName);
- } catch (Throwable t) {
- _log.error("Error validating the object type", t);
- }
- }
-
- public static void generate(String objectType, String outFile) {
- TestDataGenerator gen = (TestDataGenerator)_generators.get(objectType);
- byte[] data = gen.getData();
- if (data == null) {
- _log.error("Error generating the data. fail");
- return;
- }
- try {
- File f = new File(outFile);
- FileOutputStream out = new FileOutputStream(f);
- out.write(data);
- out.flush();
- out.close();
- _log.debug("Wrote the file out to " + f.getAbsolutePath());
- } catch (IOException ioe) {
- _log.error("Error writing out the object", ioe);
- }
- }
-
- public static void display(String type, String inFile) {
- try {
- File f = new File(inFile);
- FileInputStream in = new FileInputStream(f);
- TestDataPrinter printer = (TestDataPrinter)_printers.get(type);
- String display = printer.testData(in);
- in.close();
- _log.info("Displaying " + inFile + " of type: " + type);
- _log.info(display);
- } catch (IOException ioe) {
- _log.error("Error reading the file to display", ioe);
- }
- }
-
- private static String listTypes() {
- StringBuffer buf = new StringBuffer();
- for (Iterator iter = _generators.keySet().iterator(); iter.hasNext(); ) {
- String type = (String)iter.next();
- buf.append(type);
- if (iter.hasNext())
- buf.append(", ");
- }
- return buf.toString();
- }
-
- public static void showHelp() {
- _log.info(HELP+listTypes());
- }
-}
diff --git a/core/java/test/net/i2p/data/TestDataGenerator.java b/core/java/test/net/i2p/data/TestDataGenerator.java
index 371b72d6c..e69de29bb 100644
--- a/core/java/test/net/i2p/data/TestDataGenerator.java
+++ b/core/java/test/net/i2p/data/TestDataGenerator.java
@@ -1,16 +0,0 @@
-package net.i2p.data;
-/*
- * free (adj.): unencumbered; not under the control of others
- * Written by jrandom in 2003 and released into the public domain
- * with no warranty of any kind, either expressed or implied.
- * It probably won't make your computer catch on fire, or eat
- * your children, but it might. Use at your own risk.
- *
- */
-
-/**
- * Defines a method to create the serialization of an object
- */
-public interface TestDataGenerator {
- public byte[] getData();
-}
diff --git a/core/java/test/net/i2p/data/TestDataPrinter.java b/core/java/test/net/i2p/data/TestDataPrinter.java
index b95ac8531..e69de29bb 100644
--- a/core/java/test/net/i2p/data/TestDataPrinter.java
+++ b/core/java/test/net/i2p/data/TestDataPrinter.java
@@ -1,18 +0,0 @@
-package net.i2p.data;
-/*
- * free (adj.): unencumbered; not under the control of others
- * Written by jrandom in 2003 and released into the public domain
- * with no warranty of any kind, either expressed or implied.
- * It probably won't make your computer catch on fire, or eat
- * your children, but it might. Use at your own risk.
- *
- */
-
-import java.io.InputStream;
-
-/**
- * Defines a method to read the serialization of an object and display it
- */
-public interface TestDataPrinter {
- public String testData(InputStream stream);
-}
diff --git a/core/java/test/net/i2p/data/TunnelIdTest.java b/core/java/test/net/i2p/data/TunnelIdTest.java
index 0dbf8c3ee..12655f238 100644
--- a/core/java/test/net/i2p/data/TunnelIdTest.java
+++ b/core/java/test/net/i2p/data/TunnelIdTest.java
@@ -17,10 +17,7 @@ import net.i2p.data.TunnelId;
*
* @author jrandom
*/
-class TunnelIdTest extends StructureTest {
- static {
- TestData.registerTest(new TunnelIdTest(), "TunnelId");
- }
+public class TunnelIdTest extends StructureTest {
public DataStructure createDataStructure() throws DataFormatException {
TunnelId id = new TunnelId();
id.setTunnelId(42);
diff --git a/core/java/test/net/i2p/data/UnsignedIntegerTest.java b/core/java/test/net/i2p/data/UnsignedIntegerTest.java
index 50ace12c3..1fbcd8f36 100644
--- a/core/java/test/net/i2p/data/UnsignedIntegerTest.java
+++ b/core/java/test/net/i2p/data/UnsignedIntegerTest.java
@@ -9,51 +9,38 @@ package net.i2p.data;
*/
import java.io.ByteArrayOutputStream;
+import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.util.Date;
import net.i2p.data.DataFormatException;
import net.i2p.data.DataHelper;
import net.i2p.util.Log;
+import junit.framework.TestCase;
+
/**
- * Test harness for the numerical structure (in java, an UnsignedInteger)
+ * Test harness for the date structure
*
* @author jrandom
*/
-class UnsignedIntegerTest implements TestDataGenerator, TestDataPrinter {
- static {
- TestData.registerGenerator(new UnsignedIntegerTest(), "UnsignedInteger");
- TestData.registerPrinter(new UnsignedIntegerTest(), "UnsignedInteger");
- }
- private static final Log _log = new Log(UnsignedIntegerTest.class);
+public class UnsignedIntegerTest extends TestCase{
- public byte[] getData() {
+ public void testLong() throws Exception{
+ byte[] temp = null;
+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
- try {
- DataHelper.writeLong(baos, 4, 42);
- return baos.toByteArray();
- } catch (DataFormatException dfe) {
- _log.error("Error writing the integer", dfe);
- return null;
- } catch (IOException ioe) {
- _log.error("Error writing the integer", ioe);
- return null;
- }
+
+ DataHelper.writeLong(baos, 4, 42);
+ temp = baos.toByteArray();
+
+
+ long l;
+ ByteArrayInputStream bais = new ByteArrayInputStream(temp);
+
+ l = DataHelper.readLong(bais, 4);
+
+ assertEquals(42, l);
}
-
- public String testData(InputStream inputStream) {
- try {
- long val = DataHelper.readLong(inputStream, 4);
- return ""+val;
- } catch (DataFormatException dfe) {
- _log.error("Error reading the integer", dfe);
- return null;
- } catch (IOException ioe) {
- _log.error("Error reading the integer", ioe);
- return null;
- }
- }
-
-
-}
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/stat/RateStatTest.java b/core/java/test/net/i2p/stat/RateStatTest.java
new file mode 100644
index 000000000..a3869bdc6
--- /dev/null
+++ b/core/java/test/net/i2p/stat/RateStatTest.java
@@ -0,0 +1,33 @@
+package net.i2p.stat;
+
+import java.util.Properties;
+
+import junit.framework.TestCase;
+
+
+public class RateStatTest extends TestCase {
+ public void testRateStat() throws Exception{
+ RateStat rs = new RateStat("moo", "moo moo moo", "cow trueisms", new long[] { 60 * 1000, 60 * 60 * 1000,
+ 24 * 60 * 60 * 1000});
+ for (int i = 0; i < 50; i++) {
+ Thread.sleep(20);
+ rs.addData(i * 100, 20);
+ }
+ rs.coalesceStats();
+ java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(2048);
+
+ rs.store(baos, "rateStat.test");
+ byte data[] = baos.toByteArray();
+
+ Properties props = new Properties();
+ props.load(new java.io.ByteArrayInputStream(data));
+
+ RateStat loadedRs = new RateStat("moo", "moo moo moo", "cow trueisms", new long[] { 60 * 1000,
+ 60 * 60 * 1000,
+ 24 * 60 * 60 * 1000});
+ loadedRs.load(props, "rateStat.test", true);
+
+ assertEquals(rs, loadedRs);
+
+ }
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/stat/RateTest.java b/core/java/test/net/i2p/stat/RateTest.java
new file mode 100644
index 000000000..fd565054a
--- /dev/null
+++ b/core/java/test/net/i2p/stat/RateTest.java
@@ -0,0 +1,28 @@
+package net.i2p.stat;
+
+import java.util.Properties;
+
+import junit.framework.TestCase;
+
+
+public class RateTest extends TestCase {
+ public void testRate() throws Exception{
+ Rate rate = new Rate(1000);
+ for (int i = 0; i < 50; i++) {
+ Thread.sleep(20);
+ rate.addData(i * 100, 20);
+ }
+ rate.coalesce();
+ StringBuffer buf = new StringBuffer(1024);
+
+ rate.store("rate.test", buf);
+ byte data[] = buf.toString().getBytes();
+
+ Properties props = new Properties();
+ props.load(new java.io.ByteArrayInputStream(data));
+
+ Rate r = new Rate(props, "rate.test", true);
+
+ assertEquals(r, rate);
+ }
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/stat/StatTestSuite.java b/core/java/test/net/i2p/stat/StatTestSuite.java
new file mode 100644
index 000000000..146fe5088
--- /dev/null
+++ b/core/java/test/net/i2p/stat/StatTestSuite.java
@@ -0,0 +1,27 @@
+package net.i2p.stat;
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain
+ * with no warranty of any kind, either expressed or implied.
+ * It probably won't make your computer catch on fire, or eat
+ * your children, but it might. Use at your own risk.
+ *
+ */
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * @author Comwiz
+ */
+public class StatTestSuite {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite("net.i2p.stat.StatTestSuite");
+
+ suite.addTestSuite(RateStatTest.class);
+ suite.addTestSuite(RateTest.class);
+
+ return suite;
+ }
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/util/LogSettings.java b/core/java/test/net/i2p/util/LogSettings.java
index f40c809b2..e69de29bb 100644
--- a/core/java/test/net/i2p/util/LogSettings.java
+++ b/core/java/test/net/i2p/util/LogSettings.java
@@ -1,55 +0,0 @@
-package net.i2p.util;
-
-import java.util.Properties;
-import java.io.File;
-import java.io.FileOutputStream;
-import net.i2p.I2PAppContext;
-import net.i2p.data.DataHelper;
-
-/**
- * Check to make sure the updates to the logger.config are
- * honored.
- *
- */
-public class LogSettings {
- private static I2PAppContext _context;
-
- public static void main(String args[]) {
- _context = I2PAppContext.getGlobalContext();
- Log log = _context.logManager().getLog(LogSettings.class);
- for (int i = 0; i < 2; i++) {
- setLevel(Log.DEBUG);
- test("DEBUG", log);
- setLevel(Log.INFO);
- test("INFO", log);
- setLevel(Log.WARN);
- test("WARN", log);
- setLevel(Log.ERROR);
- test("ERROR", log);
- setLevel(Log.CRIT);
- test("CRIT", log);
- }
- }
-
- private static void setLevel(int level) {
- try {
- Properties p = new Properties();
- File f = new File("logger.config");
- DataHelper.loadProps(p, f);
- p.setProperty("logger.record.net.i2p.util.LogSettings", Log.toLevelString(level));
- DataHelper.storeProps(p, f);
- try { Thread.sleep(90*1000); } catch (InterruptedException ie) {}
- //_context.logManager().rereadConfig();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- private static void test(String setting, Log log) {
- log.debug(setting + ": debug");
- log.info(setting + ": info");
- log.warn(setting + ": warn");
- log.error(setting + ": error");
- log.log(Log.CRIT, setting + ": crit");
- }
-}
diff --git a/core/java/test/net/i2p/util/LogSettingsTest.java b/core/java/test/net/i2p/util/LogSettingsTest.java
new file mode 100644
index 000000000..d3194a50a
--- /dev/null
+++ b/core/java/test/net/i2p/util/LogSettingsTest.java
@@ -0,0 +1,249 @@
+package net.i2p.util;
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain
+ * with no warranty of any kind, either expressed or implied.
+ * It probably won't make your computer catch on fire, or eat
+ * your children, but it might. Use at your own risk.
+ *
+ */
+
+import java.util.Properties;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.PrintStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.IOException;
+
+import net.i2p.I2PAppContext;
+import net.i2p.data.DataHelper;
+
+import junit.framework.TestCase;
+
+
+/**
+ * @author Comwiz
+ */
+public class LogSettingsTest extends TestCase {
+
+
+ private Properties p;
+ private Log log;
+ private I2PAppContext _context;
+ private File f;
+
+ private String origMinimumOnScreenLevel;
+ private String origLogSettings;
+
+
+ /**
+ * Sets up the test fixture.
+ *
+ * Called before every test case method.
+ */
+ protected void setUp() throws IOException {
+
+ _context = I2PAppContext.getGlobalContext();
+ log = _context.logManager().getLog(LogSettingsTest.class);
+ p = new Properties();
+ f = new File("logger.config");
+ if(!f.exists()){
+ FileWriter temp = new FileWriter(f);
+ temp.close();
+ }
+ DataHelper.loadProps(p, f);
+ origMinimumOnScreenLevel = p.getProperty("logger.record.net.i2p.util.LogSettings", Log.STR_ERROR);
+ origLogSettings = p.getProperty("logger.minimumOnScreenLevel", Log.STR_CRIT);
+ }
+
+ protected void tearDown() throws IOException{
+ p.setProperty("logger.record.net.i2p.util.LogSettings", origMinimumOnScreenLevel);
+ p.setProperty("logger.minimumOnScreenLevel", origLogSettings);
+ DataHelper.storeProps(p, f);
+
+ System.gc();
+ }
+
+ public void testDebug() throws IOException {
+ p.setProperty("logger.record.net.i2p.util.LogSettings", Log.toLevelString(Log.DEBUG));
+ p.setProperty("logger.minimumOnScreenLevel", Log.toLevelString(Log.DEBUG));
+
+ DataHelper.storeProps(p, f);
+
+ _context.logManager().rereadConfig();
+
+ PipedInputStream pin = new PipedInputStream();
+ BufferedReader in = new BufferedReader(new InputStreamReader(pin));
+
+ PrintStream systemOut = System.out;
+ PrintStream pout = new PrintStream(new PipedOutputStream(pin));
+
+ System.setOut(pout);
+
+ log.debug("DEBUG" + ": debug");
+ log.info("DEBUG" + ": info");
+ log.warn("DEBUG" + ": warn");
+ log.error("DEBUG" + ": error");
+ log.log(Log.CRIT, "DEBUG" + ": crit");
+ _context.logManager().shutdown();
+
+ String l1 = in.readLine();
+ String l2 = in.readLine();
+ String l3 = in.readLine();
+ String l4 = in.readLine();
+ String l5 = in.readLine();
+
+ assertTrue(
+ l1.matches(".*DEBUG: debug") &&
+ l2.matches(".*DEBUG: info") &&
+ l3.matches(".*DEBUG: warn") &&
+ l4.matches(".*DEBUG: error") &&
+ l5.matches(".*DEBUG: crit")
+ );
+
+ System.setOut(systemOut);
+
+ }
+
+ public void testInfo() throws IOException {
+ p.setProperty("logger.record.net.i2p.util.LogSettings", Log.toLevelString(Log.INFO));
+ p.setProperty("logger.minimumOnScreenLevel", Log.toLevelString(Log.DEBUG));
+
+ DataHelper.storeProps(p, f);
+ _context.logManager().rereadConfig();
+
+ PipedInputStream pin = new PipedInputStream();
+ BufferedReader in = new BufferedReader(new InputStreamReader(pin));
+
+ PrintStream systemOut = System.out;
+ PrintStream pout = new PrintStream(new PipedOutputStream(pin));
+
+ System.setOut(pout);
+
+ log.debug("INFO" + ": debug");
+ log.info("INFO" + ": info");
+ log.warn("INFO" + ": warn");
+ log.error("INFO" + ": error");
+ log.log(Log.CRIT, "INFO" + ": crit");
+ _context.logManager().shutdown();
+
+ String l1 = in.readLine();
+ String l2 = in.readLine();
+ String l3 = in.readLine();
+ String l4 = in.readLine();
+
+ assertTrue(
+ l1.matches(".*INFO: info") &&
+ l2.matches(".*INFO: warn") &&
+ l3.matches(".*INFO: error") &&
+ l4.matches(".*INFO: crit")
+ );
+
+ System.setOut(systemOut);
+
+ }
+
+ public void testWarn() throws IOException {
+ p.setProperty("logger.record.net.i2p.util.LogSettings", Log.toLevelString(Log.WARN));
+ p.setProperty("logger.minimumOnScreenLevel", Log.toLevelString(Log.DEBUG));
+
+ DataHelper.storeProps(p, f);
+ _context.logManager().rereadConfig();
+
+ PipedInputStream pin = new PipedInputStream();
+ BufferedReader in = new BufferedReader(new InputStreamReader(pin));
+
+ PrintStream systemOut = System.out;
+ PrintStream pout = new PrintStream(new PipedOutputStream(pin));
+
+ System.setOut(pout);
+
+ log.debug("WARN" + ": debug");
+ log.info("WARN" + ": info");
+ log.warn("WARN" + ": warn");
+ log.error("WARN" + ": error");
+ log.log(Log.CRIT, "WARN" + ": crit");
+ _context.logManager().shutdown();
+
+ String l1 = in.readLine();
+ String l2 = in.readLine();
+ String l3 = in.readLine();
+
+ assertTrue(
+ l1.matches(".*WARN: warn") &&
+ l2.matches(".*WARN: error") &&
+ l3.matches(".*WARN: crit")
+ );
+
+ System.setOut(systemOut);
+ }
+
+ public void testError() throws IOException{
+ p.setProperty("logger.record.net.i2p.util.LogSettings", Log.toLevelString(Log.ERROR));
+ p.setProperty("logger.minimumOnScreenLevel", Log.toLevelString(Log.DEBUG));
+
+ DataHelper.storeProps(p, f);
+ _context.logManager().rereadConfig();
+
+ PipedInputStream pin = new PipedInputStream();
+ BufferedReader in = new BufferedReader(new InputStreamReader(pin));
+
+ PrintStream systemOut = System.out;
+ PrintStream pout = new PrintStream(new PipedOutputStream(pin));
+
+ System.setOut(pout);
+
+ log.debug("ERROR" + ": debug");
+ log.info("ERROR" + ": info");
+ log.warn("ERROR" + ": warn");
+ log.error("ERROR" + ": error");
+ log.log(Log.CRIT, "ERROR" + ": crit");
+ _context.logManager().shutdown();
+
+ String l1 = in.readLine();
+ String l2 = in.readLine();
+
+ assertTrue(
+ l1.matches(".*ERROR: error") &&
+ l2.matches(".*ERROR: crit")
+ );
+
+ System.setOut(systemOut);
+ }
+
+ public void testCrit() throws IOException {
+ p.setProperty("logger.record.net.i2p.util.LogSettings", Log.toLevelString(Log.CRIT));
+ p.setProperty("logger.minimumOnScreenLevel", Log.toLevelString(Log.DEBUG));
+
+ DataHelper.storeProps(p, f);
+ _context.logManager().rereadConfig();
+
+ PipedInputStream pin = new PipedInputStream();
+ BufferedReader in = new BufferedReader(new InputStreamReader(pin));
+
+ PrintStream systemOut = System.out;
+ PrintStream pout = new PrintStream(new PipedOutputStream(pin));
+
+ System.setOut(pout);
+
+ log.debug("CRIT" + ": debug");
+ log.info("CRIT" + ": info");
+ log.warn("CRIT" + ": warn");
+ log.error("CRIT" + ": error");
+ log.log(Log.CRIT, "CRIT" + ": crit");
+ _context.logManager().shutdown();
+
+ String l1 = in.readLine();
+
+ assertTrue(
+ l1.matches(".*CRIT: crit")
+ );
+
+ System.setOut(systemOut);
+ }
+
+
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/util/LookAheadInputStreamTest.java b/core/java/test/net/i2p/util/LookAheadInputStreamTest.java
new file mode 100644
index 000000000..cfde3cc81
--- /dev/null
+++ b/core/java/test/net/i2p/util/LookAheadInputStreamTest.java
@@ -0,0 +1,50 @@
+package net.i2p.util;
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain
+ * with no warranty of any kind, either expressed or implied.
+ * It probably won't make your computer catch on fire, or eat
+ * your children, but it might. Use at your own risk.
+ *
+ */
+
+import java.io.ByteArrayInputStream;
+import java.util.Properties;
+
+import junit.framework.TestCase;
+
+public class LookAheadInputStreamTest extends TestCase {
+ public void testLookAheadInputStream() throws Exception{
+ byte buf[] = new byte[32];
+ for (int i = 0; i < 32; i++)
+ buf[i] = (byte)i;
+ ByteArrayInputStream bais = new ByteArrayInputStream(buf);
+
+ LookaheadInputStream lis = new LookaheadInputStream(8);
+ lis.initialize(bais);
+ byte rbuf[] = new byte[32];
+ int read = lis.read(rbuf);
+ assertEquals(read,24);
+ for (int i = 0; i < 24; i++)
+ assertEquals(rbuf[i],(byte)i);
+ for (int i = 0; i < 8; i++)
+ assertEquals(lis.getFooter()[i],(byte)(i+24));
+
+
+ for (int size = 9; size < 32*1024; size+=100) {
+ buf = new byte[size];
+ new java.util.Random().nextBytes(buf);
+ bais = new ByteArrayInputStream(buf);
+
+ lis = new LookaheadInputStream(8);
+ lis.initialize(bais);
+ rbuf = new byte[size];
+ read = lis.read(rbuf);
+ assertEquals(read,(size-8));
+ for (int i = 0; i < (size-8); i++)
+ assertEquals(rbuf[i],buf[i]);
+ for (int i = 0; i < 8; i++)
+ assertEquals(lis.getFooter()[i],buf[i+(size-8)]);
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/util/ResettableGZIPInputStreamTest.java b/core/java/test/net/i2p/util/ResettableGZIPInputStreamTest.java
new file mode 100644
index 000000000..bb3836ed2
--- /dev/null
+++ b/core/java/test/net/i2p/util/ResettableGZIPInputStreamTest.java
@@ -0,0 +1,68 @@
+package net.i2p.util;
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain
+ * with no warranty of any kind, either expressed or implied.
+ * It probably won't make your computer catch on fire, or eat
+ * your children, but it might. Use at your own risk.
+ *
+ */
+
+import java.io.ByteArrayOutputStream;
+import java.io.ByteArrayInputStream;
+import java.util.zip.GZIPOutputStream;
+
+import net.i2p.data.DataHelper;
+
+import junit.framework.TestCase;
+
+
+public class ResettableGZIPInputStreamTest extends TestCase {
+ public void testResettableGZIPInputStream() throws Exception{
+ for (int size = 129; size < 64*1024; size+=100) {
+ byte b[] = new byte[size];
+ new java.util.Random().nextBytes(b);
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream(size);
+ GZIPOutputStream o = new GZIPOutputStream(baos);
+ o.write(b);
+ o.finish();
+ o.flush();
+ byte compressed[] = baos.toByteArray();
+
+ ResettableGZIPInputStream in = new ResettableGZIPInputStream(new ByteArrayInputStream(compressed));
+ ByteArrayOutputStream baos2 = new ByteArrayOutputStream(size);
+ byte rbuf[] = new byte[512];
+ while (true) {
+ int read = in.read(rbuf);
+ if (read == -1)
+ break;
+ baos2.write(rbuf, 0, read);
+ }
+ byte rv[] = baos2.toByteArray();
+ assertEquals(rv.length,b.length);
+
+ assertTrue(DataHelper.eq(rv, 0, b, 0, b.length));
+
+ }
+
+ byte orig[] = "ho ho ho, merry christmas".getBytes();
+ ByteArrayOutputStream baos = new ByteArrayOutputStream(64);
+ GZIPOutputStream o = new GZIPOutputStream(baos);
+ o.write(orig);
+ o.finish();
+ o.flush();
+ o.close();
+ byte compressed[] = baos.toByteArray();
+
+ ResettableGZIPInputStream i = new ResettableGZIPInputStream();
+ i.initialize(new ByteArrayInputStream(compressed));
+ byte readBuf[] = new byte[128];
+ int read = i.read(readBuf);
+ assertEquals(read,orig.length);
+ for (int j = 0; j < read; j++)
+ assertEquals(readBuf[j],orig[j]);
+ assertEquals(-1,i.read());
+
+ }
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/util/ResettableGZIPOutputStreamTest.java b/core/java/test/net/i2p/util/ResettableGZIPOutputStreamTest.java
new file mode 100644
index 000000000..106f71818
--- /dev/null
+++ b/core/java/test/net/i2p/util/ResettableGZIPOutputStreamTest.java
@@ -0,0 +1,46 @@
+package net.i2p.util;
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain
+ * with no warranty of any kind, either expressed or implied.
+ * It probably won't make your computer catch on fire, or eat
+ * your children, but it might. Use at your own risk.
+ *
+ */
+
+import java.io.ByteArrayOutputStream;
+import java.io.ByteArrayInputStream;
+import java.util.zip.GZIPOutputStream;
+import java.util.zip.GZIPInputStream;
+
+import net.i2p.data.DataHelper;
+
+import junit.framework.TestCase;
+
+
+public class ResettableGZIPOutputStreamTest extends TestCase {
+ public void testResettableGZIPOutputStream() throws Exception{
+ byte b[] = "hi, how are you today?".getBytes();
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ResettableGZIPOutputStream o = new ResettableGZIPOutputStream(baos);
+ o.write(b);
+ o.finish();
+ o.flush();
+ byte compressed[] = baos.toByteArray();
+
+ /*ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
+ GZIPOutputStream gzo = new GZIPOutputStream(baos2);
+ gzo.write(b);
+ gzo.finish();
+ gzo.flush();
+ byte compressed2[] = baos2.toByteArray();
+
+ assertTrue(DataHelper.eq(compressed, compressed2));*/
+
+ GZIPInputStream in = new GZIPInputStream(new ByteArrayInputStream(compressed));
+ byte rv[] = new byte[128];
+ int read = in.read(rv);
+ assertTrue(DataHelper.eq(rv, 0, b, 0, b.length));
+
+ }
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/util/ReusableGZIPInputStreamTest.java b/core/java/test/net/i2p/util/ReusableGZIPInputStreamTest.java
new file mode 100644
index 000000000..e6a5dbaa2
--- /dev/null
+++ b/core/java/test/net/i2p/util/ReusableGZIPInputStreamTest.java
@@ -0,0 +1,65 @@
+package net.i2p.util;
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain
+ * with no warranty of any kind, either expressed or implied.
+ * It probably won't make your computer catch on fire, or eat
+ * your children, but it might. Use at your own risk.
+ *
+ */
+
+import java.io.ByteArrayOutputStream;
+import java.io.ByteArrayInputStream;
+import java.util.zip.GZIPOutputStream;
+import java.util.zip.GZIPInputStream;
+
+import net.i2p.data.DataHelper;
+
+import junit.framework.TestCase;
+
+
+public class ReusableGZIPInputStreamTest extends TestCase {
+ public void testReusableGZIPInputStream() throws Exception{
+ {
+ byte b[] = "hi, how are you today?".getBytes();
+ ByteArrayOutputStream baos = new ByteArrayOutputStream(64);
+ GZIPOutputStream o = new GZIPOutputStream(baos);
+ o.write(b);
+ o.finish();
+ o.flush();
+ byte compressed[] = baos.toByteArray();
+
+ ReusableGZIPInputStream in = ReusableGZIPInputStream.acquire();
+ in.initialize(new ByteArrayInputStream(compressed));
+ byte rv[] = new byte[128];
+ int read = in.read(rv);
+ assertTrue(DataHelper.eq(rv, 0, b, 0, b.length));
+ ReusableGZIPInputStream.release(in);
+ }
+
+ for (int size = 0; size < 64*1024; size+=100) {
+ byte b[] = new byte[size];
+ new java.util.Random().nextBytes(b);
+
+ ReusableGZIPOutputStream o = ReusableGZIPOutputStream.acquire();
+ o.write(b);
+ o.finish();
+ o.flush();
+ byte compressed[] = o.getData();
+ ReusableGZIPOutputStream.release(o);
+
+ GZIPInputStream in = new GZIPInputStream(new ByteArrayInputStream(compressed));
+ ByteArrayOutputStream baos2 = new ByteArrayOutputStream(256*1024);
+ byte rbuf[] = new byte[128];
+ while (true) {
+ int read = in.read(rbuf);
+ if (read == -1)
+ break;
+ baos2.write(rbuf, 0, read);
+ }
+ byte rv[] = baos2.toByteArray();
+ assertTrue(DataHelper.eq(rv, 0, b, 0, b.length));
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/util/ReusableGZIPOutputStreamTest.java b/core/java/test/net/i2p/util/ReusableGZIPOutputStreamTest.java
new file mode 100644
index 000000000..4e8f16da1
--- /dev/null
+++ b/core/java/test/net/i2p/util/ReusableGZIPOutputStreamTest.java
@@ -0,0 +1,62 @@
+package net.i2p.util;
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain
+ * with no warranty of any kind, either expressed or implied.
+ * It probably won't make your computer catch on fire, or eat
+ * your children, but it might. Use at your own risk.
+ *
+ */
+
+import java.io.ByteArrayOutputStream;
+import java.io.ByteArrayInputStream;
+import java.util.zip.GZIPOutputStream;
+import java.util.zip.GZIPInputStream;
+
+import net.i2p.data.DataHelper;
+
+import junit.framework.TestCase;
+
+
+public class ReusableGZIPOutputStreamTest extends TestCase {
+ public void testReusableGZIPOutputStream() throws Exception{
+ {
+ byte b[] = "hi, how are you today?".getBytes();
+ ReusableGZIPOutputStream o = ReusableGZIPOutputStream.acquire();
+ o.write(b);
+ o.finish();
+ o.flush();
+ byte compressed[] = o.getData();
+ ReusableGZIPOutputStream.release(o);
+
+ GZIPInputStream in = new GZIPInputStream(new ByteArrayInputStream(compressed));
+ byte rv[] = new byte[128];
+ int read = in.read(rv);
+ assertTrue(DataHelper.eq(rv, 0, b, 0, b.length));
+ }
+
+ for (int size = 500; size < 64*1024; size+=100) {
+ byte b[] = new byte[size];
+ new java.util.Random().nextBytes(b);
+
+ ReusableGZIPOutputStream o = ReusableGZIPOutputStream.acquire();
+ o.write(b);
+ o.finish();
+ o.flush();
+ byte compressed[] = o.getData();
+ ReusableGZIPOutputStream.release(o);
+
+ GZIPInputStream in = new GZIPInputStream(new ByteArrayInputStream(compressed));
+ ByteArrayOutputStream baos2 = new ByteArrayOutputStream(256*1024);
+ byte rbuf[] = new byte[128];
+ while (true) {
+ int read = in.read(rbuf);
+ if (read == -1)
+ break;
+ baos2.write(rbuf, 0, read);
+ }
+ byte rv[] = baos2.toByteArray();
+ assertTrue(DataHelper.eq(rv, 0, b, 0, b.length));
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/util/UtilTestSuite.java b/core/java/test/net/i2p/util/UtilTestSuite.java
new file mode 100644
index 000000000..4bffcffb0
--- /dev/null
+++ b/core/java/test/net/i2p/util/UtilTestSuite.java
@@ -0,0 +1,25 @@
+package net.i2p.util;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * Test suite for all available tests in the net.i2p.util package
+ *
+ * @author comwiz
+ */
+public class UtilTestSuite {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite("net.i2p.util.UtilTestSuite");
+
+ suite.addTestSuite(LogSettingsTest.class);
+ suite.addTestSuite(LookAheadInputStreamTest.class);
+ suite.addTestSuite(ResettableGZIPInputStreamTest.class);
+ suite.addTestSuite(ResettableGZIPOutputStreamTest.class);
+ suite.addTestSuite(ReusableGZIPInputStreamTest.class);
+ suite.addTestSuite(ReusableGZIPOutputStreamTest.class);
+
+ return suite;
+ }
+}
\ No newline at end of file
diff --git a/router/java/build.xml b/router/java/build.xml
index 3b8c6f8ed..43e969ae3 100644
--- a/router/java/build.xml
+++ b/router/java/build.xml
@@ -8,7 +8,7 @@
-
+