package hudson.cli; import static org.junit.Assert.*; import hudson.remoting.FastPipedInputStream; import hudson.remoting.FastPipedOutputStream; import org.codehaus.groovy.runtime.Security218; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import java.io.IOException; /** * @author Kohsuke Kawaguchi */ public class ConnectionTest { Throwable e; private Connection c1; private Connection c2; @Before public void setUp() throws IOException { FastPipedInputStream i = new FastPipedInputStream(); FastPipedInputStream j = new FastPipedInputStream(); c1 = new Connection(i,new FastPipedOutputStream(j)); c2 = new Connection(j,new FastPipedOutputStream(i)); } @Test public void testEncrypt() throws Throwable { final SecretKey sessionKey = new SecretKeySpec(new byte[16],"AES"); Thread t1 = new Thread() { @Override public void run() { try { c1.encryptConnection(sessionKey,"AES/CFB8/NoPadding").writeUTF("Hello"); } catch (Throwable x) { e = x; } } }; t1.start(); Thread t2 = new Thread() { @Override public void run() { try { String data = c2.encryptConnection(sessionKey,"AES/CFB8/NoPadding").readUTF(); assertEquals("Hello", data); } catch (Throwable x) { e = x; } } }; t2.start(); t1.join(9999); t2.join(9999); if (e != null) { throw e; } if (t1.isAlive() || t2.isAlive()) { t1.interrupt(); t2.interrupt(); throw new Error("thread is still alive"); } } @Test public void testSecurity218() throws Exception { c1.writeObject(new Security218()); try { c2.readObject(); fail(); } catch (SecurityException e) { assertTrue(e.getMessage().contains(Security218.class.getName())); } } }