/*6 * To change this template, choose Tools | Templates * and open the template in the editor. */ package se.sics.kompics; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import java.net.InetAddress; import java.net.InetSocketAddress; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import se.sics.gvod.common.msgs.DataMsg; import se.sics.gvod.net.VodAddress; import se.sics.gvod.common.VodDescriptor; import se.sics.gvod.config.BaseCommandLineConfig; import se.sics.gvod.bootstrap.msgs.BootstrapMsg; import se.sics.gvod.bootstrap.msgs.BootstrapMsgFactory; import se.sics.gvod.common.msgs.DataMsgFactory; import se.sics.gvod.common.msgs.DataOfferMsg; import se.sics.gvod.common.msgs.DataOfferMsgFactory; import se.sics.gvod.common.msgs.Encodable; import se.sics.gvod.common.msgs.LeaveMsg; import se.sics.gvod.common.msgs.LeaveMsgFactory; import se.sics.gvod.common.msgs.MessageDecodingException; import se.sics.gvod.common.msgs.MessageEncodingException; import se.sics.gvod.gradient.msgs.SetsExchangeMsg; import se.sics.gvod.gradient.msgs.SetsExchangeMsgFactory; import se.sics.gvod.common.msgs.UploadingRateMsg; import se.sics.gvod.common.msgs.UploadingRateMsgFactory; import se.sics.gvod.net.Nat; import se.sics.gvod.address.Address; import se.sics.gvod.bootstrap.msgs.MonitorMsg; import se.sics.gvod.bootstrap.msgs.MonitorMsgFactory; import se.sics.gvod.common.UtilityVod; import se.sics.gvod.config.VodConfig; import se.sics.gvod.interas.msgs.InterAsGossipMsg; import se.sics.gvod.interas.msgs.InterAsGossipMsgFactory; import se.sics.gvod.common.hp.HPMechanism; import se.sics.gvod.common.hp.HPRole; import se.sics.gvod.common.msgs.DirectMsgNetty; import se.sics.gvod.common.msgs.DirectMsgNettyFactory; import se.sics.gvod.common.msgs.NatReportMsgFactory; import se.sics.gvod.common.msgs.RelayMsgNetty; import se.sics.gvod.net.VodMsgFrameDecoder; import se.sics.gvod.net.msgs.NatMsg; import se.sics.gvod.net.util.UserTypesDecoderFactory; import se.sics.gvod.net.util.UserTypesEncoderFactory; import se.sics.gvod.net.util.VideoTypesDecoderFactory; import se.sics.gvod.net.util.VideoTypesEncoderFactory; import se.sics.gvod.timer.TimeoutId; import se.sics.gvod.timer.UUID; import se.sics.gvod.video.msgs.*; /** * * @author jdowling */ public class EncodingDecodingTest { private static Address src, dest; private static InetSocketAddress inetSrc, inetDest; private static VodAddress gSrc, gDest; private static int overlay = 120; private static UtilityVod utility = new UtilityVod(1, 12, 123); private static TimeoutId id = UUID.nextUUID(); private static int age = 200; private static int freshness = 100; private static int remoteClientId = 12123454; private static HPMechanism hpMechanism = HPMechanism.PRP_PRC; private static HPRole hpRole = HPRole.PRC_RESPONDER; private static Nat nat; private static VodDescriptor nodeDescriptor; private static List<VodDescriptor> descriptors = new ArrayList<VodDescriptor>(); private static byte[] availableChunks = new byte[2031]; private static byte[][] availablePieces = new byte[52][19]; public EncodingDecodingTest() { System.setProperty("java.net.preferIPv4Stack", "true"); } @BeforeClass public static void setUpClass() throws Exception { // InetAddress self = InetAddress.getLocalHost(); InetAddress self = InetAddress.getByName("127.0.0.1"); src = new Address(self, 58027, 123); dest = new Address(self, 65535, 123); inetSrc = new InetSocketAddress(self, 58027); inetDest = new InetSocketAddress(self, 65535); gSrc = new VodAddress(src, VodConfig.SYSTEM_OVERLAY_ID); gDest = new VodAddress(dest, VodConfig.SYSTEM_OVERLAY_ID); nodeDescriptor = new VodDescriptor(gSrc, utility, age, BaseCommandLineConfig.DEFAULT_MTU); descriptors.add(nodeDescriptor); nat = new Nat(Nat.Type.NAT, Nat.MappingPolicy.HOST_DEPENDENT, Nat.AllocationPolicy.PORT_PRESERVATION, Nat.FilteringPolicy.PORT_DEPENDENT, 1, 100 * 1000l); DirectMsgNettyFactory.Base.setMsgFrameDecoder(VodMsgFrameDecoder.class); } @AfterClass public static void tearDownClass() throws Exception { } @Before public void setUp() { } @After public void tearDown() { } // TODO add test methods here. // The methods must be annotated with annotation @Test. For example: // @Test public void unsignedIntTwoBytesNetty() throws MessageEncodingException, MessageDecodingException { ByteBuf buffer = Unpooled.buffer(2); int t1 = 32231; UserTypesEncoderFactory.writeUnsignedintAsTwoBytes(buffer, t1); int t2 = UserTypesDecoderFactory.readUnsignedIntAsTwoBytes(buffer); assert (t1 == t2); t1 = 65535; UserTypesEncoderFactory.writeUnsignedintAsTwoBytes(buffer, t1); t2 = UserTypesDecoderFactory.readUnsignedIntAsTwoBytes(buffer); assert (t1 == t2); } @Test public void unsignedIntOneByteNetty() throws MessageEncodingException, MessageDecodingException { ByteBuf buffer = Unpooled.buffer(1); int t1 = 255; UserTypesEncoderFactory.writeUnsignedintAsOneByte(buffer, t1); int t2 = UserTypesDecoderFactory.readUnsignedIntAsOneByte(buffer); assert (t1 == t2); t1 = 0; UserTypesEncoderFactory.writeUnsignedintAsOneByte(buffer, t1); t2 = UserTypesDecoderFactory.readUnsignedIntAsOneByte(buffer); assert (t1 == t2); t1 = 1; UserTypesEncoderFactory.writeUnsignedintAsOneByte(buffer, t1); t2 = UserTypesDecoderFactory.readUnsignedIntAsOneByte(buffer); assert (t1 == t2); } @Test public void booleanNetty() throws MessageEncodingException, MessageDecodingException { boolean yes = true; ByteBuf buffer = Unpooled.buffer(1); UserTypesEncoderFactory.writeBoolean(buffer, yes); boolean id2 = UserTypesDecoderFactory.readBoolean(buffer); assert (yes == id2); } @Test public void stringNetty() throws MessageEncodingException, MessageDecodingException { String str = "Jim Dowling"; ByteBuf buffer = Unpooled.buffer(str.length()); UserTypesEncoderFactory.writeStringLength256(buffer, str); String str2 = UserTypesDecoderFactory.readStringLength256(buffer); assert (str.equals(str2)); str = "Jim Dowling Jim Dowling Jim Dowling Jim Dowling Jim Dowling "; UserTypesEncoderFactory.writeStringLength256(buffer, str); str2 = UserTypesDecoderFactory.readStringLength256(buffer); assert (str.equals(str2)); } private void opCodeCorrect(ByteBuf buffer, Encodable msg) { byte type = buffer.readByte(); assert (type == msg.getOpcode()); } @Test public void bootstrapRequest() { TimeoutId id = UUID.nextUUID(); BootstrapMsg.GetPeersRequest msg = new BootstrapMsg.GetPeersRequest(gSrc, gDest, overlay, utility.getChunk()); msg.setTimeoutId(id); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); BootstrapMsg.GetPeersRequest res = BootstrapMsgFactory.GetPeersRequest.fromBuffer(buffer); assert (true); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } @Test public void bootstrapResponse() { TimeoutId id = UUID.nextUUID(); BootstrapMsg.GetPeersResponse msg = new BootstrapMsg.GetPeersResponse(gSrc, gDest, id, 23, descriptors); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); BootstrapMsg.GetPeersResponse res = BootstrapMsgFactory.GetPeersResponse.fromBuffer(buffer); assert (true); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } @Test public void dataOffer() { List<VodAddress> listChildren = new ArrayList<VodAddress>(); listChildren.add(gSrc); DataOfferMsg msg = new DataOfferMsg(gSrc, gDest, utility, availableChunks); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); DataOfferMsg res = DataOfferMsgFactory.fromBuffer(buffer); assert (true); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } @Test public void leaveMsg() { LeaveMsg msg = new LeaveMsg(gSrc, gSrc); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); LeaveMsg res = LeaveMsgFactory.fromBuffer(buffer); assert (true); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } @Test public void setsExchangeRequestMsg() { SetsExchangeMsg.Request msg = new SetsExchangeMsg.Request( gSrc, gSrc, gSrc.getId(), gSrc.getId(), id); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); SetsExchangeMsg.Request res = SetsExchangeMsgFactory.Request.fromBuffer(buffer); assert (true); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } @Test public void setsExchangeResponseMsg() { SetsExchangeMsg.Response msg = new SetsExchangeMsg.Response( gSrc, gSrc, gSrc.getId(), gSrc.getId(), gDest, id, descriptors, descriptors); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); SetsExchangeMsg.Response res = SetsExchangeMsgFactory.Response.fromBuffer(buffer); assert (true); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } @Test public void uploadingRateRequestMsg() { UploadingRateMsg.Request msg = new UploadingRateMsg.Request( gSrc, gDest, gSrc); msg.setTimeoutId(UUID.nextUUID()); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); UploadingRateMsg.Request res = UploadingRateMsgFactory.Request.fromBuffer(buffer); compareNatMsgs(msg, res); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } @Test public void dataRequestMsg() { DataMsg.Request msg = new DataMsg.Request(gSrc, gSrc, id, 222, 12, 1000); // called by MsgRetryComponent msg.setTimeoutId(UUID.nextUUID()); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); DataMsg.Request res = DataMsgFactory.Request.fromBuffer(buffer); assert (msg.getTimeoutId().equals(res.getTimeoutId())); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } @Test public void dataResponseMsg() { DataMsg.Response msg = new DataMsg.Response(gSrc, gSrc, id, id, availableChunks, 12, 2222, 1000, 103); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); DataMsg.Response res = DataMsgFactory.Response.fromBuffer(buffer); assert (true); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } @Test public void PieceNotAvailableMsg() { DataMsg.PieceNotAvailable msg = new DataMsg.PieceNotAvailable(gSrc, gSrc, availableChunks, utility, 1212, availablePieces); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); DataMsg.PieceNotAvailable res = DataMsgFactory.PieceNotAvailable.fromBuffer(buffer); assert (true); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } @Test public void saturatedMsg() { DataMsg.Saturated msg = new DataMsg.Saturated(gSrc, gSrc, age, 23); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); DataMsg.Saturated res = DataMsgFactory.Saturated.fromBuffer(buffer); assert (true); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } @Test public void hashRequestMsg() { DataMsg.HashRequest msg = new DataMsg.HashRequest(gSrc, gDest, 23); msg.setTimeoutId(UUID.nextUUID()); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); DataMsg.HashRequest res = DataMsgFactory.HashRequest.fromBuffer(buffer); compareNatMsgs(msg, res); assert (msg.getChunk() == res.getChunk()); assert (msg.getPart() == res.getPart()); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } @Test public void hashResponseMsg() { DataMsg.HashResponse msg = new DataMsg.HashResponse(gSrc, gSrc, id, 23, availableChunks, 0, 1); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); DataMsg.HashRequest res = DataMsgFactory.HashRequest.fromBuffer(buffer); assert (true); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } @Test public void ackMsg() { DataMsg.Ack msg = new DataMsg.Ack(gSrc, gSrc, id, 23); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); DataMsg.Ack res = DataMsgFactory.Ack.fromBuffer(buffer); assert (true); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } @Test public void addOverlayRequest() { BootstrapMsg.AddOverlayReq msg = new BootstrapMsg.AddOverlayReq(gSrc, gDest, "name", 12, "desc", new byte[]{'a', 'd'}, null, 0, 1); msg.setTimeoutId(UUID.nextUUID()); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); BootstrapMsg.AddOverlayReq res = BootstrapMsgFactory.AddOverlayReq.fromBuffer(buffer); assert (true); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } @Test public void addOverlayResponse() { BootstrapMsg.AddOverlayResp msg = new BootstrapMsg.AddOverlayResp(gSrc, gDest, 12, true, true, UUID.nextUUID()); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); BootstrapMsg.AddOverlayResp res = BootstrapMsgFactory.AddOverlayResp.fromBuffer(buffer); assert (true); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } @Test public void bootstrapHeartbeatTest() { BootstrapMsg.Heartbeat msg = new BootstrapMsg.Heartbeat(gSrc, gSrc, true, (short)1500, new HashSet<Integer>(), new HashMap<Integer,Integer>()); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); BootstrapMsg.Heartbeat res = BootstrapMsgFactory.Heartbeat.fromBuffer(buffer); compareNatMsgs(msg, res); assert(msg.isHelper() == res.isHelper()); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } @Test public void helperHbMsgTest() { BootstrapMsg.HelperHeartbeat msg = new BootstrapMsg.HelperHeartbeat(gSrc, gSrc, true); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); BootstrapMsg.HelperHeartbeat res = BootstrapMsgFactory.HelperHeartbeat.fromBuffer(buffer); compareNatMsgs(msg, res); assert(msg.isSpace() == res.isSpace()); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } @Test public void helperDownloadReqTest() { BootstrapMsg.HelperDownload msg = new BootstrapMsg.HelperDownload(gSrc, gSrc, "gvod://myvideo/torrent.data"); // msg.setTimeoutId(UUID.nextUUID()); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); BootstrapMsg.HelperDownload res = BootstrapMsgFactory.HelperDownload.fromBuffer(buffer); compareNatMsgs(msg, res); assert(msg.getUrl().compareTo(res.getUrl()) == 0); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } // @Test // public void helperDownloadRespTest() { // BootstrapMsg.HelperDownloadResponse msg = // new BootstrapMsg.HelperDownloadResponse(gSrc, gSrc, true, UUID.nextUUID()); // try { // ByteBuf buffer = msg.toByteArray(); // opCodeCorrect(buffer, msg); // BootstrapMsg.HelperDownloadResponse res = // BootstrapMsgFactory.HelperDownloadResponse.fromBuffer(buffer); // compareNatMsgs(msg, res); // assert(msg.isSuccess() == res.isSuccess()); // } catch (MessageDecodingException ex) { // Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); // assert (false); // } catch (MessageEncodingException ex) { // Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); // assert (false); // } // } @Test public void monitorMsg() { Map<String, String> attrs = new HashMap<String, String>(); attrs.put("k", "v"); attrs.put("y", "z"); MonitorMsg msg = new MonitorMsg(gSrc, gDest, attrs); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); MonitorMsg res = MonitorMsgFactory.fromBuffer(buffer); assert (res.getAttrValues().size() == attrs.size()); assert (res.getAttrValues().keySet().iterator().next().equals( attrs.keySet().iterator().next())); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } @Test public void interAsRequestMsg() { InterAsGossipMsg.Request msg = new InterAsGossipMsg.Request( gSrc, gSrc, id); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); InterAsGossipMsg.Request req = InterAsGossipMsgFactory.Request.fromBuffer(buffer); assert (true); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } @Test public void interAsResponseMsg() { InterAsGossipMsg.Response msg = new InterAsGossipMsg.Response( gSrc, gSrc, gDest, id, descriptors); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); InterAsGossipMsg.Response res = InterAsGossipMsgFactory.Response.fromBuffer(buffer); assert (true); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } @Test public void videoConnectionMsgRequest() { boolean randomRequest = false; VideoConnectionMsg.Request msg = new VideoConnectionMsg.Request(gSrc, gDest, randomRequest); msg.setTimeoutId(UUID.nextUUID()); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); VideoConnectionMsg.Request req = VideoConnectionMsgFactory.Request.fromBuffer(buffer); assert (randomRequest == req.isRandomRequest()); compareNatMsgs(msg, req); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } @Test public void videoConnectionMsgResponse() { boolean randomRequest = false; boolean acceptConnection = true; VideoConnectionMsg.Response msg = new VideoConnectionMsg.Response(gSrc, gDest, UUID.nextUUID(), randomRequest, acceptConnection); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); VideoConnectionMsg.Response res = VideoConnectionMsgFactory.Response.fromBuffer(buffer); assert (randomRequest == res.wasRandomRequest()); assert (acceptConnection == res.connectionAccepted()); assert (true); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } @Test public void longSet() { ByteBuf buffer = Unpooled.buffer(2); Set<Long> longs = new HashSet<Long>(); longs.add(1L); Set<Long> processedLongs = null; try { UserTypesEncoderFactory.writeLongSet(buffer, longs); processedLongs = UserTypesDecoderFactory.readLongSet(buffer); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); } assert (longs.size() == processedLongs.size()); Iterator<Long> longsIt = longs.iterator(); Iterator<Long> processedLongsIt = processedLongs.iterator(); while (longsIt.hasNext() || processedLongsIt.hasNext()) { assert (longsIt.next() == processedLongsIt.next()); } } @Test public void videoPieceMsgAdvertisement() { Set<Integer> pieceIds = new HashSet<Integer>(); for (int i = 0; i < 100; i++) { pieceIds.add(i * 17); } VideoPieceMsg.Advertisement msg = new VideoPieceMsg.Advertisement(gSrc, gDest, pieceIds); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); VideoPieceMsg.Advertisement adv = VideoPieceMsgFactory.Advertisement.fromBuffer(buffer); assert (true); assert (pieceIds.size() == adv.getAdvertisedPiecesIds().size()); assert (adv.getAdvertisedPiecesIds().containsAll(pieceIds)); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } @Test public void videoPieceMsgRequest() { Set<Integer> pieceIds = new HashSet<Integer>(); for (int i = 0; i < 100; i++) { pieceIds.add(i * 13); } VideoPieceMsg.Request msg = new VideoPieceMsg.Request(gSrc, gDest, pieceIds); msg.setTimeoutId(UUID.nextUUID()); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); VideoPieceMsg.Request request = VideoPieceMsgFactory.Request.fromBuffer(buffer); compareNatMsgs(msg, request); assert (pieceIds.size() == request.getPiecesIds().size()); assert (request.getPiecesIds().containsAll(pieceIds)); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } @Test public void encodedSubPieceSet() { int globalIndex = 0; ByteBuf buffer = Unpooled.buffer(3 * 16 * 1024); Set<EncodedSubPiece> pieces = new HashSet<EncodedSubPiece>(); Random random = new Random(); for (int i = 0; i < 3; i++) { byte[] data = new byte[1316]; random.nextBytes(data); EncodedSubPiece piece = new EncodedSubPiece(globalIndex++, i, data, 1); pieces.add(piece); } Set<EncodedSubPiece> processedPieces = null; try { VideoTypesEncoderFactory.writeEncodedSubPieceSet(buffer, pieces); processedPieces = VideoTypesDecoderFactory.readEncodedSubPieceSet(buffer); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); } assert (pieces.size() == processedPieces.size()); Map<Integer, EncodedSubPiece> processedPieceMap = new HashMap<Integer, EncodedSubPiece>(); for (EncodedSubPiece p : processedPieces) { processedPieceMap.put(p.getEncodedIndex(), p); } for (EncodedSubPiece p : pieces) { EncodedSubPiece processedPiece = processedPieceMap.get(p.getEncodedIndex()); assert (processedPiece != null); assert (p.getEncodedIndex() == processedPiece.getEncodedIndex()); assert (p.getData().length == processedPiece.getData().length); for (int i = 0; i < p.getData().length; i++) { assert (p.getData()[i] == processedPiece.getData()[i]); } } } @Test public void videoPieceMsgResponse() { Random random = new Random(); byte[] data = new byte[1316]; random.nextBytes(data); EncodedSubPiece esp = new EncodedSubPiece(1, 1, data, 0); VideoPieceMsg.Response msg = new VideoPieceMsg.Response(gSrc, gDest, UUID.nextUUID(), esp); try { ByteBuf buffer = msg.toByteArray(); opCodeCorrect(buffer, msg); VideoPieceMsg.Response response = VideoPieceMsgFactory.Response.fromBuffer(buffer); assert (true); assert (response.getEncodedSubPiece().equals(esp)); } catch (MessageDecodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } catch (MessageEncodingException ex) { Logger.getLogger(EncodingDecodingTest.class.getName()).log(Level.SEVERE, null, ex); assert (false); } } private void compareNatMsgs(NatMsg a, NatMsg b) { if (a instanceof DirectMsgNetty.Oneway == false && a instanceof RelayMsgNetty.Oneway == false && a instanceof DirectMsgNetty.SystemOneway == false) { assert (a.getTimeoutId().equals(b.getTimeoutId())); } assert (a.getVodSource().equals(b.getVodSource())); assert (a.getVodDestination().equals(b.getVodDestination())); // Note, we don't compare Address objects, as they have // their ip and port set by the NettyHandler object. // ip is null and port is 0 after the factory deserializes // objects. It is up to NettyHandler to set ip and port. } }