From 6dfd17cc8e2376c5b71d66dc419a4869bb146c0f Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Mon, 10 May 2021 21:50:59 +0800 Subject: [PATCH] writing test: face&linkservice --- src/main/java/logicface/LinkService.java | 19 ++- src/main/java/logicface/LogicFace.java | 46 ++++--- src/test/java/logicface/LinkServiceTest.java | 19 +++ src/test/java/logicface/LogicFaceTest.java | 123 +++++++++++++++++++ 4 files changed, 187 insertions(+), 20 deletions(-) create mode 100644 src/test/java/logicface/LinkServiceTest.java create mode 100644 src/test/java/logicface/LogicFaceTest.java diff --git a/src/main/java/logicface/LinkService.java b/src/main/java/logicface/LinkService.java index c97cedf..60414ce 100644 --- a/src/main/java/logicface/LinkService.java +++ b/src/main/java/logicface/LinkService.java @@ -1,9 +1,6 @@ package logicface; -import component.ComponentException; -import component.LpPacketFragmentId; -import component.LpPacketFragmentNum; -import component.LpPacketFragmentSeq; +import component.*; import encoding.*; import mgmt.MgmtException; import packet.*; @@ -17,6 +14,9 @@ import util.ByteHelper; * @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 */ public class LinkService { + // 常量 + private final int LpPacketHeaderMaxSize = 1000; // 默认最长头部长度 + public ITransport transport; // 传输通道 public LogicFace logicFace=new LogicFace();// LinkService关联的logicFace public int mtu; // MTU大小 @@ -36,7 +36,7 @@ public class LinkService { byte[] buf=new byte[Encoder.MaxPacketSize]; lpPacket.setValue(buf); Encoder encoder=new Encoder(); - if(!encoder.encoderReset(new SizeT(Encoder.MaxPacketSize+1000),new SizeT(0))){ + if(!encoder.encoderReset(new SizeT(Encoder.MaxPacketSize+this.LpPacketHeaderMaxSize),new SizeT(0))){ throw new LogicFaceException("LinkService.calculateLpPacketHeadSize: encoderReset error"); } this.lpPacketHeadSize = lpPacket.wireEncode(encoder); @@ -222,4 +222,13 @@ public class LinkService { throw new LogicFaceException("LinkService.sendMINPacket: "+e.getMessage()); } } + + /** + * 打印自己的状态,测试使用。 + */ + public void printSelf(){ + System.out.println("lpPacketHeadSize: "+this.lpPacketHeadSize); + System.out.println("mtu: "+this.mtu); + System.out.println("lpPacketId: "+this.lpPacketId); + } } diff --git a/src/main/java/logicface/LogicFace.java b/src/main/java/logicface/LogicFace.java index 8b6d783..3e6df59 100644 --- a/src/main/java/logicface/LogicFace.java +++ b/src/main/java/logicface/LogicFace.java @@ -1,9 +1,6 @@ package logicface; -import common.LoggerHelper; -import component.ComponentException; import component.Identifier; -import component.IdentifierWrapper; import encoding.TLV; import encoding.VlIntException; import jnr.unixsocket.UnixSocketAddress; @@ -25,6 +22,9 @@ import java.nio.channels.SocketChannel; * @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 */ public class LogicFace { + // 定量区 + public final int DefaultMtuSize = 9000; // 缺省MTU为 9000 字节, 初始化face时会用到 + // LogicFaceType区:LogicFace的类型 public static final int LogicFaceTypeTCP = 0; public static final int LogicFaceTypeUDP = 1; @@ -47,18 +47,24 @@ public class LogicFace { * @param port MIR的TCP端口号,如 13899 * @return */ - public boolean initWithTcp(String ip,String port) throws LogicFaceException { + public boolean initWithTcp(String ip,Integer port) throws LogicFaceException { try { + // Transport SocketChannel channel=SocketChannel.open(); - channel.connect(new InetSocketAddress(ip, Integer.parseInt(port))); - this.linkService=new LinkService(); + channel.connect(new InetSocketAddress(ip, port)); TcpTransport tcpTransport=new TcpTransport(); tcpTransport.init(channel); - this.linkService.init(9000); // 设置MTU为 9000 字节 + + // LinkService + this.linkService=new LinkService(); + this.linkService.init(DefaultMtuSize); this.linkService.logicFace=this; this.linkService.transport=tcpTransport; + tcpTransport.linkService=this.linkService; this.transport=tcpTransport; + + // Others this.logicFaceType=LogicFaceTypeTCP; this.keyChain=null; this.state=true; @@ -74,18 +80,24 @@ public class LogicFace { * @param port MIR的TCP端口号,如 13899 * @return */ - public boolean initWithUdp(String ip,String port) throws LogicFaceException { + public boolean initWithUdp(String ip,Integer port) throws LogicFaceException { try { + // Transport DatagramChannel channel=DatagramChannel.open(); - channel.connect(new InetSocketAddress(ip, Integer.parseInt(port))); - this.linkService=new LinkService(); + channel.connect(new InetSocketAddress(ip, port)); UdpTransport udpTransport=new UdpTransport(); - udpTransport.init(channel,new InetSocketAddress(ip, Integer.parseInt(port))); - this.linkService.init(9000); // 设置MTU为 9000 字节 + udpTransport.init(channel,new InetSocketAddress(ip, port)); + + // LinkService + this.linkService=new LinkService(); + this.linkService.init(DefaultMtuSize); this.linkService.logicFace=this; this.linkService.transport=udpTransport; + udpTransport.linkService=this.linkService; this.transport=udpTransport; + + // Others this.keyChain=null; this.logicFaceType=LogicFaceTypeUDP; this.state=true; @@ -97,23 +109,27 @@ public class LogicFace { /** * 通过unixSocket连接MIR + * 暂时不测 * @param path MIR的unix socket地址,默认是 "/tmp/mir-sock" * @return */ - public boolean initWithUnixSocket(String path) throws LogicFaceException { + private boolean initWithUnixSocket(String path) throws LogicFaceException { try { // 建立 Unix Socket 连接 File unixFile = new File(path); UnixSocketChannel channel=UnixSocketChannel.open(); channel.connect(new UnixSocketAddress(unixFile)); - this.linkService=new LinkService(); UnixStreamTransport unixStreamTransport=new UnixStreamTransport(); unixStreamTransport.init(channel); - this.linkService.init(9000); // 设置MTU为 9000 字节 + + this.linkService=new LinkService(); + this.linkService.init(DefaultMtuSize); this.linkService.logicFace=this; this.linkService.transport=unixStreamTransport; + unixStreamTransport.linkService=this.linkService; this.transport=unixStreamTransport; + this.keyChain=null; this.logicFaceType=LogicFaceTypeUnix; this.state=true; diff --git a/src/test/java/logicface/LinkServiceTest.java b/src/test/java/logicface/LinkServiceTest.java new file mode 100644 index 0000000..f365174 --- /dev/null +++ b/src/test/java/logicface/LinkServiceTest.java @@ -0,0 +1,19 @@ +package logicface; + +import org.junit.Test; + +/* + * @Author: Wang Feng + * @Description: + * @Version: 1.0.0 + * @Date: 20:34 2021/5/10 + * @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 + */ +public class LinkServiceTest { + @Test + public void testIni() throws LogicFaceException { + LinkService linkService=new LinkService(); + linkService.init(9000); + linkService.printSelf(); + } +} diff --git a/src/test/java/logicface/LogicFaceTest.java b/src/test/java/logicface/LogicFaceTest.java new file mode 100644 index 0000000..5793ea9 --- /dev/null +++ b/src/test/java/logicface/LogicFaceTest.java @@ -0,0 +1,123 @@ +package logicface; + +import component.ComponentException; +import component.Identifier; +import org.junit.Test; +import packet.Interest; +import packet.MINPacket; +import util.ByteHelper; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.*; +import java.util.Arrays; + +/* + * @Author: Wang Feng + * @Description: + * @Version: 1.0.0 + * @Date: 16:26 2021/5/10 + * @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 + */ +public class LogicFaceTest { + /** + * 测试初始化&UDP发包 + */ + @Test + public void testIniUdp() throws LogicFaceException, ComponentException { + Interest interest=new Interest(); + interest.ttl.setTtl(Long.MAX_VALUE); + byte[] value={(byte)132,(byte)221,(byte)223,(byte)25}; + interest.payload.setValue(value); + interest.congestionMark.setCongestionLevel(Long.MAX_VALUE); + Identifier name=new Identifier("/pkusz/wefree"); + interest.setName(name); + + LogicFace face=new LogicFace(); + face.initWithUdp("127.0.0.1",50000); + face.sendInterest(interest); + } + + /** + * 测试初始化&TCP发包 + */ + @Test + public void testIniTcp() throws LogicFaceException, ComponentException { + Interest interest=new Interest(); + interest.ttl.setTtl(Long.MAX_VALUE); + byte[] value={(byte)132,(byte)221,(byte)223,(byte)25}; + interest.payload.setValue(value); + interest.congestionMark.setCongestionLevel(Long.MAX_VALUE); + Identifier name=new Identifier("/pkusz/wefree"); + interest.setName(name); + + LogicFace face=new LogicFace(); + face.initWithTcp("127.0.0.1",60000); + face.sendInterest(interest); + } + + /** + * 开启一个tcp服务器,端口号为60000 + */ + @Test + public void startTCPServer() { + ServerSocket socket = null; + OutputStream outputStream = null; + try { + //建立基站 + socket = new ServerSocket(60000); + //开始开启接收模式,接到后返回客户端的socket对象 + Socket client = socket.accept(); + + byte[] bytes = new byte[1500]; + + // 循环接收数据,并打印 + InputStream inputStream = client.getInputStream(); + int len = inputStream.read(bytes); +// inputStream.close(); + System.out.println(Arrays.toString(ByteHelper.getLenBytes(bytes, 0, len))); + + //获取向客户端发送消息的对象流 + outputStream = client.getOutputStream(); + //向客户端写数据 + outputStream.write(ByteHelper.getLenBytes(bytes, 0, len)); + + inputStream.close(); + outputStream.close(); + socket.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 创建一个UDPServer,从而打印出来udp face发送的数据。端口号为50000 + * 测试结果: + * [-15, 0, -6, 25, -52, 4, 4, 5, 6, 7, -15, 0, -5, 15, -15, 0, -4, 1, 1, -15, 0, -3, 1, 1, -15, 0, -2, 1, 0] + */ + @Test + public void startUDPServer() throws IOException { + //1.创建服务端+端口 + DatagramSocket server = new DatagramSocket(50000); + //2.准备接受容器 + byte[] container = new byte[1024]; + //3.封装成包 + DatagramPacket packet = new DatagramPacket(container, container.length); + while(true){ + //4.接受数据 + server.receive(packet); + //5.分析数据 + byte[] data = packet.getData(); + int len = packet.getLength(); + System.out.println("server receive:" + + Arrays.toString(ByteHelper.getLenBytes(data, 0, len))); + SocketAddress remoteHost=packet.getSocketAddress(); + System.out.println("remote host: "+packet.getSocketAddress()); + server.connect(remoteHost); + server.send(packet); + } + //6.释放 +// server.close(); + } +}