/** SKI ptest dumper. */ public void SKIPtestDumper() { gen.start(); // Generate network traffic - async method System.out.printf("tmpFile=%s\n", tmpFile.getAbsoluteFile()); Pcap pcap = Pcap.openLive(device, snaplen, promisc, oneSecond, errbuf); assertNotNull(errbuf.toString(), pcap); PcapDumper dumper = pcap.dumpOpen(tmpFile.getAbsolutePath()); assertNotNull(pcap.getErr(), dumper); PcapHandler<PcapDumper> dumpHandler = new PcapHandler<PcapDumper>() { public void nextPacket( PcapDumper dumper, long seconds, int useconds, int caplen, int len, ByteBuffer buffer) { dumper.dump(seconds, useconds, caplen, len, buffer); } }; pcap.loop(10, dumpHandler, dumper); assertTrue("Empty dump file " + tmpFile.getAbsolutePath(), tmpFile.length() > 0); // System.out.printf("Temp dumpfile size=%s\n", tmpFile.length()); pcap.close(); }
/** Test filter compile and set filter. */ public void testFilterCompileAndSetFilter() { PcapBpfProgram bpf = new PcapBpfProgram(); String str = "host 192.168.101"; // System.out.println("trying to compiler the filter() OK\n"); // System.out.flush(); Pcap pcap = Pcap.openOffline(fname, errbuf); // System.out.println("filter was compiled OK\n"); System.out.flush(); assertNotNull(errbuf.toString(), pcap); int r = pcap.compile(bpf, str, 0, 0); assertEquals(pcap.getErr(), 0, r); PcapHandler<String> handler = new PcapHandler<String>() { public void nextPacket( String user, long seconds, int useconds, int caplen, int len, ByteBuffer buffer) { // System.out.printf("%s, ts=%s caplen=%d len=%d capacity=%d\n", user // .toString(), new Date(seconds * 1000).toString(), caplen, len, // buffer.capacity()); } }; // System.out.println("trying to set the filter() OK\n"); // System.out.flush(); assertEquals(OK, pcap.setFilter(bpf)); // System.out.println("filter was set OK\n"); System.out.flush(); assertEquals(OK, pcap.loop(10, handler, str)); Pcap.freecode(bpf); pcap.close(); }
/** * Test case in response to <code> * Bug #1767744 - PcapHandler object ptr error in loop() and dispatch()</code>. The bug was that * PcapHandler jobject ptr in JNI jnetpcap.cpp, was set incorrectly to jobject of the parent which * is the Pcap object itself. The neccessary method "nextPacket" was looked up correctly using the * proper object but method execution was based on the parent Pcap object not the PcapHandler * object passed in. Therefore Java code when it was setting and accessing properties within the * PcapHandler sub-class, it was actually clobering data within the Pcap object. Both object's * states were terribly incosinstent, private fields had bogus values, that changed for no reason, * etc... Very easy fix, the jobject for 'jhandler' was substituted for jobject 'obj' that was * used to fix this problem. The problem was both in dispatch() and loop() methods since they are * nearly an identical copy of each other. * * <p>To test this we have to create a PcapHandler object set private fields within it, we'll use * an anonymous class, then read in the contents of the entire contents of a test datafile, while * updating the value of the field. Then at the end we should have consitent value in that private * field. Since the problem seemed complex, but was actually a very easy fix, this should never * really break again, but we will check for it anyhow. */ public void testPcapHandlerParentOverrideBugUsingDispatch() { Pcap pcap = Pcap.openOffline(fname, errbuf); if (pcap == null) { fail("Unable to open test data file because " + errbuf.toString()); } final Pcap parent = pcap; // Tracking variable #1 final AtomicInteger pcapCount = new AtomicInteger(); final PcapHandler<?> handler = new PcapHandler<Object>() { // Tracking variable #2 private int count = 0; public void nextPacket( Object userObject, long seconds, int useconds, int caplen, int len, ByteBuffer buffer) { pcapCount.addAndGet(1); count++; if (pcapCount.get() != count) { parent.breakloop(); // We exit with breakloop which means FAIL } } }; int r = pcap.dispatch(Pcap.DISPATCH_BUFFER_FULL, handler, null); if (r == Pcap.LOOP_INTERRUPTED) { /* * Tracking variables are used to make sure they can sustain their * assigned values. The bug caused fields and object state to be overriden * by object of PcapHandler type. */ fail("Handler indicates that 2 tracking variables in 2 objects, " + "did not match"); } else if (r != Pcap.OK) { fail("Error occured: " + pcap.getErr()); } pcap.close(); }
/** Test pcap dumper using dispatch. */ public void testPcapDumperUsingDispatch() { Pcap pcap = Pcap.openOffline(fname, errbuf); assertNotNull(errbuf.toString(), pcap); PcapDumper dumper = pcap.dumpOpen(tmpFile.getPath()); assertNotNull(pcap.getErr(), dumper); PcapHandler<PcapDumper> handler = new PcapHandler<PcapDumper>() { public void nextPacket( PcapDumper dumper, long seconds, int useconds, int caplen, int len, ByteBuffer buffer) { dumper.dump(seconds, useconds, caplen, len, buffer); } }; /* * Our test file is small, about 24K bytes in size, should fit inside a * buffer full. */ int r = pcap.dispatch(Pcap.DISPATCH_BUFFER_FULL, handler, dumper); assertTrue("Something happened in dispatch", r == Pcap.OK); dumper.close(); pcap.close(); // System.out.printf("%s: tmp=%d, source=%d\n", tmpFile.getName(), tmpFile // .length(), new File(fname).length()); // assertEquals( "dumped file and source file lengths don't match", tmpFile.length(), new File(fname).length()); }
/** Test pcap dumper using loop. */ public void testPcapDumperUsingLoop() { Pcap pcap = Pcap.openOffline(fname, errbuf); assertNotNull(errbuf.toString(), pcap); PcapDumper dumper = pcap.dumpOpen(tmpFile.getPath()); assertNotNull(pcap.getErr(), dumper); PcapHandler<PcapDumper> handler = new PcapHandler<PcapDumper>() { public void nextPacket( PcapDumper dumper, long seconds, int useconds, int caplen, int len, ByteBuffer buffer) { dumper.dump(seconds, useconds, caplen, len, buffer); } }; int r = pcap.loop(Pcap.LOOP_INFINATE, handler, dumper); assertTrue("Something happened in the loop", r == Pcap.OK); dumper.close(); pcap.close(); // System.out.printf("%s: tmp=%d, source=%d\n", tmpFile.getName(), tmpFile // .length(), new File(fname).length()); // assertEquals( "dumped file and source file lengths don't match", tmpFile.length(), new File(fname).length()); }