You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by jv...@apache.org on 2008/01/09 18:14:24 UTC
svn commit: r610469 - in /mina/sandbox/jvermillard/error-generator/src: ./
org/ org/apache/ org/apache/mina/ org/apache/mina/filter/
org/apache/mina/filter/errorgenerator/
org/apache/mina/filter/errorgenerator/ErrorGeneratorFilter.java
Author: jvermillard
Date: Wed Jan 9 09:14:11 2008
New Revision: 610469
URL: http://svn.apache.org/viewvc?rev=610469&view=rev
Log:
filter for generate various communication corruption
Added:
mina/sandbox/jvermillard/error-generator/src/
mina/sandbox/jvermillard/error-generator/src/org/
mina/sandbox/jvermillard/error-generator/src/org/apache/
mina/sandbox/jvermillard/error-generator/src/org/apache/mina/
mina/sandbox/jvermillard/error-generator/src/org/apache/mina/filter/
mina/sandbox/jvermillard/error-generator/src/org/apache/mina/filter/errorgenerator/
mina/sandbox/jvermillard/error-generator/src/org/apache/mina/filter/errorgenerator/ErrorGeneratorFilter.java
Added: mina/sandbox/jvermillard/error-generator/src/org/apache/mina/filter/errorgenerator/ErrorGeneratorFilter.java
URL: http://svn.apache.org/viewvc/mina/sandbox/jvermillard/error-generator/src/org/apache/mina/filter/errorgenerator/ErrorGeneratorFilter.java?rev=610469&view=auto
==============================================================================
--- mina/sandbox/jvermillard/error-generator/src/org/apache/mina/filter/errorgenerator/ErrorGeneratorFilter.java (added)
+++ mina/sandbox/jvermillard/error-generator/src/org/apache/mina/filter/errorgenerator/ErrorGeneratorFilter.java Wed Jan 9 09:14:11 2008
@@ -0,0 +1,212 @@
+package org.apache.mina.filter.errorgenerator;
+
+import java.util.Random;
+
+import org.apache.mina.common.DefaultWriteRequest;
+import org.apache.mina.common.IoBuffer;
+import org.apache.mina.common.IoFilterAdapter;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.common.IoSessionLogger;
+import org.apache.mina.common.WriteRequest;
+import org.slf4j.Logger;
+
+public class ErrorGeneratorFilter extends IoFilterAdapter {
+ private int removeByteProbability=0;
+ private int insertByteProbability=0;
+ private int changeByteProbability=0;
+ private int removePduProbability=0;
+ private int duplicatePduProbability=0;
+ private int resendPduLasterProbability=0;
+ private int maxInsertByte=10;
+ private boolean manipulateWrites=false;
+ private boolean manipulateReads=false;
+ private Random rng=new Random();
+
+ @Override
+ public void filterWrite(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception {
+ if(manipulateWrites) {
+ // manipulate bytes
+ if(writeRequest.getMessage() instanceof IoBuffer) {
+ manipulateIoBuffer(session,(IoBuffer)writeRequest.getMessage());
+ IoBuffer buffer=insertBytesToNewIoBuffer(session,(IoBuffer)writeRequest.getMessage());
+ if(buffer!=null) {
+ writeRequest=new DefaultWriteRequest(buffer,writeRequest.getFuture(),writeRequest.getDestination());
+ }
+ // manipulate PDU
+ } else {
+ if(duplicatePduProbability > rng.nextInt()) {
+ nextFilter.filterWrite(session, writeRequest);
+ }
+ if(resendPduLasterProbability > rng.nextInt()) {
+ // store it somewhere and trigger a write execution for later
+ // TODO
+ }
+ if(removePduProbability > rng.nextInt()) {
+ return;
+ }
+ }
+ }
+ nextFilter.filterWrite(session, writeRequest);
+ }
+
+ @Override
+ public void messageReceived(NextFilter nextFilter, IoSession session, Object message) throws Exception {
+ if(manipulateReads) {
+ if(message instanceof IoBuffer) {
+ // manipulate bytes
+ manipulateIoBuffer(session,(IoBuffer)message);
+ IoBuffer buffer=insertBytesToNewIoBuffer(session,(IoBuffer)message);
+ if(buffer!=null) {
+ message=buffer;
+ }
+ } else {
+ // manipulate PDU
+ }
+ }
+ nextFilter.messageReceived(session, message);
+ }
+
+ private IoBuffer insertBytesToNewIoBuffer(IoSession session,IoBuffer buffer) {
+ if(insertByteProbability > rng.nextInt(1000)) {
+ System.err.println(buffer.getHexDump());
+ // where to insert bytes ?
+ int pos=rng.nextInt(buffer.remaining())-1;
+
+ // how many byte to insert ?
+ int count=rng.nextInt(maxInsertByte);
+
+ IoBuffer newBuff=IoBuffer.allocate(buffer.remaining()+count);
+ for(int i=0;i<pos;i++)
+ newBuff.put(buffer.get());
+ for(int i=0;i<count;i++) {
+ newBuff.put((byte) (rng.nextInt(256)));
+ }
+ while(buffer.remaining()>0) {
+ newBuff.put(buffer.get());
+ }
+ newBuff.flip();
+
+ System.err.println("Inserted "+count+" bytes.");
+ System.err.println(newBuff.getHexDump());
+ return newBuff;
+ }
+ return null;
+ }
+
+ private void manipulateIoBuffer(IoSession session,IoBuffer buffer) {
+ if(removeByteProbability > rng.nextInt(1000)) {
+ System.err.println(buffer.getHexDump());
+ // where to remove bytes ?
+ int pos=rng.nextInt(buffer.remaining());
+ // how many byte to remove ?
+ int count=rng.nextInt( buffer.remaining()-pos)+1;
+ if(count==buffer.remaining())
+ count=buffer.remaining()-1;
+
+ IoBuffer newBuff=IoBuffer.allocate(buffer.remaining()-count);
+ for(int i=0;i<pos;i++)
+ newBuff.put(buffer.get());
+
+ buffer.skip(count); // hole
+ while(newBuff.remaining()>0)
+ newBuff.put(buffer.get());
+ newBuff.flip();
+ // copy the new buffer in the old one
+ buffer.rewind();
+ buffer.put(newBuff);
+ buffer.flip();
+ System.err.println("Removed "+count+" bytes at position "+pos+".");
+ System.err.println(buffer.getHexDump());
+ }
+ if(changeByteProbability > rng.nextInt(1000)) {
+ System.err.println(buffer.getHexDump());
+ // how many byte to change ?
+ int count=rng.nextInt(buffer.remaining()-1)+1;
+
+ byte[] values=new byte[count];
+ rng.nextBytes(values);
+ for(int i=0;i<values.length;i++) {
+ int pos=rng.nextInt(buffer.remaining());
+ buffer.put(pos, values[i]);
+ }
+ System.err.println("Modified "+count+" bytes.");
+ System.err.println(buffer.getHexDump());
+ }
+ }
+
+ private Logger getLogger(IoSession session) {
+ return IoSessionLogger.getLogger(session);
+ }
+
+ public int getChangeByteProbability() {
+ return changeByteProbability;
+ }
+
+ public void setChangeByteProbability(int changeByteProbability) {
+ this.changeByteProbability = changeByteProbability;
+ }
+
+ public int getDuplicatePduProbability() {
+ return duplicatePduProbability;
+ }
+
+ public void setDuplicatePduProbability(int duplicatePduProbability) {
+ this.duplicatePduProbability = duplicatePduProbability;
+ }
+
+ public int getInsertByteProbability() {
+ return insertByteProbability;
+ }
+
+ public void setInsertByteProbability(int insertByteProbability) {
+ this.insertByteProbability = insertByteProbability;
+ }
+
+ public boolean isManipulateReads() {
+ return manipulateReads;
+ }
+
+ public void setManipulateReads(boolean manipulateReads) {
+ this.manipulateReads = manipulateReads;
+ }
+
+ public boolean isManipulateWrites() {
+ return manipulateWrites;
+ }
+
+ public void setManipulateWrites(boolean manipulateWrites) {
+ this.manipulateWrites = manipulateWrites;
+ }
+
+ public int getRemoveByteProbability() {
+ return removeByteProbability;
+ }
+
+ public void setRemoveByteProbability(int removeByteProbability) {
+ this.removeByteProbability = removeByteProbability;
+ }
+
+ public int getRemovePduProbability() {
+ return removePduProbability;
+ }
+
+ public void setRemovePduProbability(int removePduProbability) {
+ this.removePduProbability = removePduProbability;
+ }
+
+ public int getResendPduLasterProbability() {
+ return resendPduLasterProbability;
+ }
+
+ public void setResendPduLasterProbability(int resendPduLasterProbability) {
+ this.resendPduLasterProbability = resendPduLasterProbability;
+ }
+
+ public int getMaxInsertByte() {
+ return maxInsertByte;
+ }
+
+ public void setMaxInsertByte(int maxInsertByte) {
+ this.maxInsertByte = maxInsertByte;
+ }
+}
\ No newline at end of file