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/16 14:45:19 UTC
svn commit: r612453 - in
/mina/sandbox/jvermillard/error-generator/src/org/apache/mina/filter:
errorgenerating/ errorgenerating/ErrorGeneratingFilter.java
errorgenerating/ErrorGeneratorFilter.java errorgenerator/
Author: jvermillard
Date: Wed Jan 16 05:45:17 2008
New Revision: 612453
URL: http://svn.apache.org/viewvc?rev=612453&view=rev
Log:
* renamed ErorrGeneratorFilter to ErrorGeneratingFilter
* fixed zero byte inserted
* added ASL header plus some javadoc
Added:
mina/sandbox/jvermillard/error-generator/src/org/apache/mina/filter/errorgenerating/
- copied from r612440, mina/sandbox/jvermillard/error-generator/src/org/apache/mina/filter/errorgenerator/
mina/sandbox/jvermillard/error-generator/src/org/apache/mina/filter/errorgenerating/ErrorGeneratingFilter.java
- copied, changed from r612440, mina/sandbox/jvermillard/error-generator/src/org/apache/mina/filter/errorgenerator/ErrorGeneratorFilter.java
Removed:
mina/sandbox/jvermillard/error-generator/src/org/apache/mina/filter/errorgenerating/ErrorGeneratorFilter.java
mina/sandbox/jvermillard/error-generator/src/org/apache/mina/filter/errorgenerator/
Copied: mina/sandbox/jvermillard/error-generator/src/org/apache/mina/filter/errorgenerating/ErrorGeneratingFilter.java (from r612440, 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/errorgenerating/ErrorGeneratingFilter.java?p2=mina/sandbox/jvermillard/error-generator/src/org/apache/mina/filter/errorgenerating/ErrorGeneratingFilter.java&p1=mina/sandbox/jvermillard/error-generator/src/org/apache/mina/filter/errorgenerator/ErrorGeneratorFilter.java&r1=612440&r2=612453&rev=612453&view=diff
==============================================================================
--- mina/sandbox/jvermillard/error-generator/src/org/apache/mina/filter/errorgenerator/ErrorGeneratorFilter.java (original)
+++ mina/sandbox/jvermillard/error-generator/src/org/apache/mina/filter/errorgenerating/ErrorGeneratingFilter.java Wed Jan 16 05:45:17 2008
@@ -1,212 +1,269 @@
-package org.apache.mina.filter.errorgenerator;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.mina.filter.errorgenerating;
import java.util.Random;
import org.apache.mina.common.DefaultWriteRequest;
import org.apache.mina.common.IoBuffer;
+import org.apache.mina.common.IoFilter;
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;
+import org.slf4j.LoggerFactory;
-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;
- }
+/**
+ * An {@link IoFilter} implementation generating random bytes and PDU modification in
+ * your communication streams.
+ * It's quite simple to use :
+ * <code>ErrorGeneratingFilter egf = new ErrorGeneratingFilter();</code>
+ * For activate the change of some bytes in your IoBuffer, for a probability of 200 out
+ * of 1000 IoBuffer processed :
+ * <code>egf.setChangeByteProbability(200);</code>
+ * For activate the insertion of some bytes in your IoBuffer, for a
+ * probability of 200 out of 1000 :
+ * <code>egf.setInsertByteProbability(200);</code>
+ * And for the removing of some bytes :
+ * <code>egf.setRemoveByteProbability(200);</code>
+ * You can activate the error generation for write or read with the
+ * following methods :
+ * <code>egf.setManipulateReads(true);
+ * egf.setManipulateWrites(true); </code>
+ *
+ * @author The Apache MINA Project (dev@mina.apache.org)
+ * @version $Rev: 591770 $, $Date: 2007-11-04 13:22:44 +0100 (dim, 04 nov 2007) $
+ */
+public class ErrorGeneratingFilter 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();
+
+ final private Logger logger = LoggerFactory
+ .getLogger(ErrorGeneratingFilter.class);
+
+ @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)) {
+ logger.info(buffer.getHexDump());
+ // where to insert bytes ?
+ int pos = rng.nextInt(buffer.remaining()) - 1;
+
+ // how many byte to insert ?
+ int count = rng.nextInt(maxInsertByte-1)+1;
+
+ 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();
+
+ logger.info("Inserted " + count + " bytes.");
+ logger.info(newBuff.getHexDump());
+ return newBuff;
+ }
+ return null;
+ }
+
+ private void manipulateIoBuffer(IoSession session, IoBuffer buffer) {
+ if (removeByteProbability > rng.nextInt(1000)) {
+ logger.info(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();
+ logger.info("Removed " + count + " bytes at position " + pos + ".");
+ logger.info(buffer.getHexDump());
+ }
+ if (changeByteProbability > rng.nextInt(1000)) {
+ logger.info(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]);
+ }
+ logger.info("Modified " + count + " bytes.");
+ logger.info(buffer.getHexDump());
+ }
+ }
+
+ 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;
+ }
}