public void TestMutationalChange()
        {
            MutationalChange c = new MutationalChange()
            {
                AppendByte   = new FromToValue <byte>((byte)'A'),
                RemoveLength = new FromToValue <ushort>(1),
                AppendLength = new FromToValue <ushort>(1),
            };

            PatchChange ret = c.Process(0);

            ret = c.Process(0);
            ret = c.Process(0);
        }
Exemple #2
0
        public override int Read(byte[] buffer, int offset, int count)
        {
            if (count <= 0 || _ReadedAll)
            {
                return(0);
            }

            int lee;

            if (Config == null)
            {
                // No fuzzing
                lee = ReadFromOriginal(_Source, buffer, ref offset, count);
            }
            else
            {
                // Read buffer first
                lee = ReadBuffer(ref buffer, ref offset, ref count);

                // Perform mutations (byte peer byte)
                while (count > 0)
                {
                    PatchChange log = null;

                    // If no buffer are available (FUZZ!)
                    if (_Buffer.Count == 0)
                    {
                        log = Config.Get(this);
                    }

                    // If change!
                    if (log != null)
                    {
                        // Add to log
                        _Log.Add(log);

                        // Add to buffer
                        if (log.Append != null)
                        {
                            _Buffer.AddRange(log.Append);
                        }

                        // Remove from source
                        if (log.Remove > 0)
                        {
                            int    ix  = 0;
                            byte[] r   = new byte[log.Remove];
                            int    ret = ReadFromOriginal(_Source, r, ref ix, log.Remove);
                            if (ret <= 0)
                            {
                                break;
                            }
                        }
                    }

                    int c = 1;
                    // Read buffer first (if available)
                    int d = ReadBuffer(ref buffer, ref offset, ref c);
                    if (d <= 0)
                    {
                        // Peek one byte if not from buffer
                        d = ReadFromOriginal(_Source, buffer, ref offset, 1);
                        if (d <= 0)
                        {
                            break;
                        }
                    }

                    lee   += d;
                    count -= d;
                }
            }

            return(lee);
        }