package com.iwebpp.wspp.tests;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Date;
import android.util.Log;
import com.iwebpp.crypto.NaclCert;
import com.iwebpp.crypto.TweetNaclFast;
import com.iwebpp.node.NodeContext;
import com.iwebpp.node.NodeContext.IntervalListener;
import com.iwebpp.wspp.SecureWebSocket;
import com.iwebpp.wspp.WebSocket;
import com.iwebpp.wspp.SecureWebSocketServer;
import com.iwebpp.wspp.WebSocket.ErrorEvent;
import com.iwebpp.wspp.WebSocket.MessageEvent;
import com.iwebpp.wspp.WebSocket.OpenEvent;
import com.iwebpp.wspp.WebSocket.onmessageListener;
import com.iwebpp.wspp.WebSocket.onopenListener;
import com.iwebpp.wspp.WebSocketServer;
import junit.framework.TestCase;
public final class SecureWebSocketServerTest extends TestCase {
private static final String TAG = "SecureWebSocketServerTest";
private NodeContext ctx;
public void testConnectPair() throws Exception {
WebSocketServer.Options wssopt = new WebSocketServer.Options();
wssopt.port = 6668;
wssopt.path = "/wspp";
TweetNaclFast.Box.KeyPair kp = TweetNaclFast.Box.keyPair();
SecureWebSocket.SecInfo sec = new SecureWebSocket.SecInfo(kp.getPublicKey(), kp.getSecretKey());
SecureWebSocketServer wss = new SecureWebSocketServer(ctx, wssopt, new WebSocketServer.ListeningCallback() {
@Override
public void onListening() throws Exception {
Log.d(TAG, "websocket server listening ...");
TweetNaclFast.Box.KeyPair kp = TweetNaclFast.Box.keyPair();
SecureWebSocket.SecInfo sec = new SecureWebSocket.SecInfo(kp.getPublicKey(), kp.getSecretKey());
final SecureWebSocket ws = new SecureWebSocket(ctx, "ws://localhost:6668/wspp", new WebSocket.Options(), sec);
ws.onmessage(new onmessageListener(){
@Override
public void onMessage(MessageEvent event) throws Exception {
Log.d(TAG, "\n\tmessage: "+event.toString());
if (event.isBinary()) {
Log.d(TAG, "binary message: "+event.getData().toString());
ByteBuffer mb = (ByteBuffer)event.getData();
String ms = new String(mb.array(), "utf-8");
Log.d(TAG, "binary message parsed: "+ms);
} else {
Log.d(TAG, "text message: "+(String)(event.getData()));
}
}
});
ws.onerror(new WebSocket.onerrorListener() {
@Override
public void onError(ErrorEvent event) throws Exception {
Log.d(TAG, "ws error:"+event.getCode()+",message:"+event.getError());
fail("ws error:"+event.getCode()+",message:"+event.getError());
}
});
ws.onopen(new onopenListener(){
@Override
public void onOpen(OpenEvent event) throws Exception {
ws.send("Hello, tom zhou".getBytes("utf-8"), new WebSocket.SendOptions(true, false), null);
ctx.setInterval(new IntervalListener(){
@Override
public void onInterval() throws Exception {
ws.send(("Hello, tom zhou @"+new Date()).getBytes("utf-8"), new WebSocket.SendOptions(true, true), null);
}
}, 3000);
}
});
}
}, sec);
wss.onconnection(new SecureWebSocketServer.onconnectionListener() {
@Override
public void onConnection(final SecureWebSocket socket) throws Exception {
Log.d(TAG, "new ws client:"+socket);
socket.onmessage(new WebSocket.onmessageListener() {
@Override
public void onMessage(MessageEvent event) throws Exception {
Log.d(TAG, "\n\tclient message: "+event.toString());
if (event.isBinary()) {
Log.d(TAG, "binary message: "+event.getData().toString());
ByteBuffer mb = (ByteBuffer)event.getData();
String ms = new String(mb.array(), "utf-8");
Log.d(TAG, "binary message parsed: "+ms);
socket.send(event.getData(), new WebSocket.SendOptions(true, true), null);
} else {
Log.d(TAG, "text message: "+(String)(event.getData()));
socket.send((event.getData().toString()+"@srv").getBytes("utf-8"), new WebSocket.SendOptions(true, false), null);
}
}
});
socket.send("Hello@srv".getBytes("utf-8"), new WebSocket.SendOptions(true, false), null);
}
});
}
public void testConnectPairOverUDP() throws Exception {
WebSocketServer.Options wssopt = new WebSocketServer.Options();
wssopt.port = 6668;
wssopt.path = "/wspp";
wssopt.httpp = true;
TweetNaclFast.Box.KeyPair kp = TweetNaclFast.Box.keyPair();
SecureWebSocket.SecInfo sec = new SecureWebSocket.SecInfo(kp.getPublicKey(), kp.getSecretKey());
SecureWebSocketServer wss = new SecureWebSocketServer(ctx, wssopt, new WebSocketServer.ListeningCallback() {
@Override
public void onListening() throws Exception {
Log.d(TAG, "httpp websocket server listening ...");
WebSocket.Options wsopt = new WebSocket.Options();
wsopt.httpp = true;
final WebSocket ws = new WebSocket(ctx, "ws://localhost:6668/wspp", null, wsopt);
ws.onmessage(new onmessageListener(){
@Override
public void onMessage(MessageEvent event) throws Exception {
Log.d(TAG, "\n\thttpp message: "+event.toString());
if (event.isBinary()) {
Log.d(TAG, "httpp binary message: "+event.getData().toString());
ByteBuffer mb = (ByteBuffer)event.getData();
String ms = new String(mb.array(), "utf-8");
Log.d(TAG, "binary message parsed: "+ms);
} else {
Log.d(TAG, "httpp text message: "+(String)(event.getData()));
}
}
});
ws.onerror(new WebSocket.onerrorListener() {
@Override
public void onError(ErrorEvent event) throws Exception {
Log.d(TAG, "httpp ws error:"+event.getCode()+",message:"+event.getError());
fail("httpp ws error:"+event.getCode()+",message:"+event.getError());
}
});
ws.onopen(new onopenListener(){
@Override
public void onOpen(OpenEvent event) throws Exception {
ws.send("Hello, tom zhou".getBytes("utf-8"), new WebSocket.SendOptions(true, false), null);
ctx.setInterval(new IntervalListener(){
@Override
public void onInterval() throws Exception {
ws.send(("Hello, tom zhou @"+new Date()).getBytes("utf-8"), new WebSocket.SendOptions(true, true), null);
}
}, 3000);
}
});
}
}, sec);
wss.onconnection(new SecureWebSocketServer.onconnectionListener() {
@Override
public void onConnection(final SecureWebSocket socket) throws Exception {
Log.d(TAG, "httpp new ws client:"+socket);
socket.onmessage(new WebSocket.onmessageListener() {
@Override
public void onMessage(MessageEvent event) throws Exception {
Log.d(TAG, "\n\thttpp client message: "+event.toString());
if (event.isBinary()) {
Log.d(TAG, "httpp binary message: "+event.getData().toString());
ByteBuffer mb = (ByteBuffer)event.getData();
String ms = new String(mb.array(), "utf-8");
Log.d(TAG, "binary message parsed: "+ms);
socket.send(event.getData(), new WebSocket.SendOptions(true, true), null);
} else {
Log.d(TAG, "httpp text message: "+(String)(event.getData()));
socket.send(event.getData().toString()+"@srv httpp", new WebSocket.SendOptions(false, false), null);
}
}
});
socket.send("httpp Hello@srv", new WebSocket.SendOptions(false, false), null);
}
});
}
// V2 NACL CERT test
public void testConnectPairV2() throws Exception {
WebSocketServer.Options wssopt = new WebSocketServer.Options();
wssopt.port = 6688;
wssopt.path = "/wspp";
// generate rootCA, Cert
NaclCert.CAInfo info = new NaclCert.CAInfo();
info.ca = "iwebpp.com";
info.tte = System.currentTimeMillis() + 3600000L*24*365000; // 1000 years
final NaclCert.CAInfo rootCA = NaclCert.generateCA(info);
TweetNaclFast.Box.KeyPair kp = TweetNaclFast.Box.keyPair();
// prepare reqdesc
NaclCert.ReqDescSignByCa desc = new NaclCert.ReqDescSignByCa();
desc.version = "1.0";
desc.type = "ca";
desc.tte = System.currentTimeMillis() + 3600000L*24*365;
desc.publickey = kp.getPublicKey();
// domains
desc.names = new ArrayList<String>();
desc.names.add("51dese.com");
desc.names.add("ruyier.com");
desc.names.add("localhost");
// ips
desc.ips = new ArrayList<String>();
desc.ips.add("127.0.0.1");
desc.ips.add("10.1.1.1");
NaclCert.Cert cert = NaclCert.generate(desc, rootCA);
SecureWebSocket.SecInfo secinfo = new SecureWebSocket.SecInfo(
kp.getPublicKey(), kp.getSecretKey(),
cert, rootCA.cert, true);
SecureWebSocketServer wss = new SecureWebSocketServer(ctx, wssopt, new WebSocketServer.ListeningCallback() {
@Override
public void onListening() throws Exception {
Log.d(TAG, "V2 websocket server listening ...");
TweetNaclFast.Box.KeyPair kp = TweetNaclFast.Box.keyPair();
// prepare reqdesc
NaclCert.ReqDescSignByCa desc = new NaclCert.ReqDescSignByCa();
desc.version = "1.0";
desc.type = "ca";
desc.tte = System.currentTimeMillis() + 3600000L*24*365;
desc.publickey = kp.getPublicKey();
// domains
desc.names = new ArrayList<String>();
desc.names.add("51dese.com");
desc.names.add("ruyier.com");
desc.names.add("localhost");
// ips
desc.ips = new ArrayList<String>();
desc.ips.add("127.0.0.1");
desc.ips.add("10.1.1.1");
NaclCert.Cert cert = NaclCert.generate(desc, rootCA);
SecureWebSocket.SecInfo secinfo = new SecureWebSocket.SecInfo(
kp.getPublicKey(), kp.getSecretKey(),
cert, rootCA.cert, true);
final SecureWebSocket ws = new SecureWebSocket(ctx, "ws://localhost:6688/wspp", new WebSocket.Options(), secinfo);
ws.onmessage(new onmessageListener(){
@Override
public void onMessage(MessageEvent event) throws Exception {
Log.d(TAG, "\n\tV2 message: "+event.toString());
if (event.isBinary()) {
Log.d(TAG, "V2 binary message: "+event.getData().toString());
ByteBuffer mb = (ByteBuffer)event.getData();
String ms = new String(mb.array(), "utf-8");
Log.d(TAG, "V2 binary message parsed: "+ms);
} else {
Log.d(TAG, "V2 text message: "+(String)(event.getData()));
}
}
});
ws.onerror(new WebSocket.onerrorListener() {
@Override
public void onError(ErrorEvent event) throws Exception {
Log.d(TAG, "V2 ws error:"+event.getCode()+",message:"+event.getError());
fail("V2 ws error:"+event.getCode()+",message:"+event.getError());
}
});
ws.onopen(new onopenListener(){
@Override
public void onOpen(OpenEvent event) throws Exception {
ws.send("V2 Hello, tom zhou".getBytes("utf-8"), new WebSocket.SendOptions(true, false), null);
ctx.setInterval(new IntervalListener(){
@Override
public void onInterval() throws Exception {
ws.send(("V2 Hello, tom zhou @"+new Date()).getBytes("utf-8"), new WebSocket.SendOptions(true, true), null);
}
}, 3000);
}
});
}
}, secinfo);
wss.onconnection(new SecureWebSocketServer.onconnectionListener() {
@Override
public void onConnection(final SecureWebSocket socket) throws Exception {
Log.d(TAG, "V2 new ws client:"+socket);
socket.onmessage(new WebSocket.onmessageListener() {
@Override
public void onMessage(MessageEvent event) throws Exception {
Log.d(TAG, "\n\tV2 client message: "+event.toString());
if (event.isBinary()) {
Log.d(TAG, "V2 binary message: "+event.getData().toString());
ByteBuffer mb = (ByteBuffer)event.getData();
String ms = new String(mb.array(), "utf-8");
Log.d(TAG, "V2 binary message parsed: "+ms);
socket.send(event.getData(), new WebSocket.SendOptions(true, true), null);
} else {
Log.d(TAG, "V2 text message: "+(String)(event.getData()));
socket.send((event.getData().toString()+"@srv").getBytes("utf-8"), new WebSocket.SendOptions(true, false), null);
}
}
});
socket.send("V2 Hello@srv".getBytes("utf-8"), new WebSocket.SendOptions(true, false), null);
}
});
}
@Override
protected void setUp() throws Exception {
super.setUp();
this.ctx = new NodeContext();
}
}