Inheritance: DataOutput
Beispiel #1
0
 public ReverseBytesReaderAnonymousInner(BytesStore outerInstance)
 {
     this.outerInstance = outerInstance;
     current            = outerInstance.blocks.Count == 0 ? null : outerInstance.blocks[0];
     nextBuffer         = -1;
     nextRead           = 0;
 }
Beispiel #2
0
 public ReverseBytesReaderAnonymousInner(BytesStore outerInstance)
 {
     this.OuterInstance = outerInstance;
     outerInstance.Current = outerInstance.Blocks.Count == 0 ? null : outerInstance.Blocks[0];
     nextBuffer = -1;
     nextRead = 0;
 }
Beispiel #3
0
 public ForwardBytesReaderAnonymousInner(BytesStore outerInstance)
 {
     this.OuterInstance = outerInstance;
     nextRead = outerInstance.BlockSize;
 }
Beispiel #4
0
        public virtual void TestRandom()
        {
            int iters = AtLeast(10);
            for (int iter = 0; iter < iters; iter++)
            {
                int numBytes = TestUtil.NextInt(Random(), 1, 200000);
                sbyte[] expected = new sbyte[numBytes];
                int blockBits = TestUtil.NextInt(Random(), 8, 15);
                BytesStore bytes = new BytesStore(blockBits);
                if (VERBOSE)
                {
                    Console.WriteLine("TEST: iter=" + iter + " numBytes=" + numBytes + " blockBits=" + blockBits);
                }

                int pos = 0;
                while (pos < numBytes)
                {
                    int op = Random().Next(8);
                    if (VERBOSE)
                    {
                        Console.WriteLine("  cycle pos=" + pos);
                    }
                    switch (op)
                    {

                        case 0:
                            {
                                // write random byte
                                sbyte b = (sbyte)Random().Next(256);
                                if (VERBOSE)
                                {
                                    Console.WriteLine("    writeByte b=" + b);
                                }

                                expected[pos++] = b;
                                bytes.WriteByte(b);
                            }
                            break;

                        case 1:
                            {
                                // write random byte[]
                                int len = Random().Next(Math.Min(numBytes - pos, 100));
                                sbyte[] temp = new sbyte[len];
                                Random().NextBytes(temp);
                                if (VERBOSE)
                                {
                                    Console.WriteLine("    writeBytes len=" + len + " bytes=" + Arrays.ToString(temp));
                                }
                                Array.Copy(temp, 0, expected, pos, temp.Length);
                                bytes.WriteBytes(temp, 0, temp.Length);
                                pos += len;
                            }
                            break;

                        case 2:
                            {
                                // write int @ absolute pos
                                if (pos > 4)
                                {
                                    int x = Random().Next();
                                    int randomPos = Random().Next(pos - 4);
                                    if (VERBOSE)
                                    {
                                        Console.WriteLine("    abs writeInt pos=" + randomPos + " x=" + x);
                                    }
                                    bytes.writeInt(randomPos, x);
                                    expected[randomPos++] = (sbyte)(x >> 24);
                                    expected[randomPos++] = (sbyte)(x >> 16);
                                    expected[randomPos++] = (sbyte)(x >> 8);
                                    expected[randomPos++] = (sbyte)x;
                                }
                            }
                            break;

                        case 3:
                            {
                                // reverse bytes
                                if (pos > 1)
                                {
                                    int len = TestUtil.NextInt(Random(), 2, Math.Min(100, pos));
                                    int start;
                                    if (len == pos)
                                    {
                                        start = 0;
                                    }
                                    else
                                    {
                                        start = Random().Next(pos - len);
                                    }
                                    int end = start + len - 1;
                                    if (VERBOSE)
                                    {
                                        Console.WriteLine("    reverse start=" + start + " end=" + end + " len=" + len + " pos=" + pos);
                                    }
                                    bytes.reverse(start, end);

                                    while (start <= end)
                                    {
                                        sbyte b = expected[end];
                                        expected[end] = expected[start];
                                        expected[start] = b;
                                        start++;
                                        end--;
                                    }
                                }
                            }
                            break;

                        case 4:
                            {
                                // abs write random byte[]
                                if (pos > 2)
                                {
                                    int randomPos = Random().Next(pos - 1);
                                    int len = TestUtil.NextInt(Random(), 1, Math.Min(pos - randomPos - 1, 100));
                                    sbyte[] temp = new sbyte[len];
                                    Random().NextBytes(temp);
                                    if (VERBOSE)
                                    {
                                        Console.WriteLine("    abs writeBytes pos=" + randomPos + " len=" + len + " bytes=" + Arrays.ToString(temp));
                                    }
                                    Array.Copy(temp, 0, expected, randomPos, temp.Length);
                                    bytes.WriteBytes(randomPos, temp, 0, temp.Length);
                                }
                            }
                            break;

                        case 5:
                            {
                                // copyBytes
                                if (pos > 1)
                                {
                                    int src = Random().Next(pos - 1);
                                    int dest = TestUtil.NextInt(Random(), src + 1, pos - 1);
                                    int len = TestUtil.NextInt(Random(), 1, Math.Min(300, pos - dest));
                                    if (VERBOSE)
                                    {
                                        Console.WriteLine("    copyBytes src=" + src + " dest=" + dest + " len=" + len);
                                    }
                                    Array.Copy(expected, src, expected, dest, len);
                                    bytes.copyBytes(src, dest, len);
                                }
                            }
                            break;

                        case 6:
                            {
                                // skip
                                int len = Random().Next(Math.Min(100, numBytes - pos));

                                if (VERBOSE)
                                {
                                    Console.WriteLine("    skip len=" + len);
                                }

                                pos += len;
                                bytes.skipBytes(len);

                                // NOTE: must fill in zeros in case truncate was
                                // used, else we get false fails:
                                if (len > 0)
                                {
                                    sbyte[] zeros = new sbyte[len];
                                    bytes.WriteBytes(pos - len, zeros, 0, len);
                                }
                            }
                            break;

                        case 7:
                            {
                                // absWriteByte
                                if (pos > 0)
                                {
                                    int dest = Random().Next(pos);
                                    sbyte b = (sbyte)Random().Next(256);
                                    expected[dest] = b;
                                    bytes.WriteByte(dest, b);
                                }
                                break;
                            }
                    }

                    Assert.AreEqual(pos, bytes.Position);

                    if (pos > 0 && Random().Next(50) == 17)
                    {
                        // truncate
                        int len = TestUtil.NextInt(Random(), 1, Math.Min(pos, 100));
                        bytes.truncate(pos - len);
                        pos -= len;
                        Arrays.fill(expected, pos, pos + len, (sbyte)0);
                        if (VERBOSE)
                        {
                            Console.WriteLine("    truncate len=" + len + " newPos=" + pos);
                        }
                    }

                    if ((pos > 0 && Random().Next(200) == 17))
                    {
                        Verify(bytes, expected, pos);
                    }
                }

                BytesStore bytesToVerify;

                if (Random().NextBoolean())
                {
                    if (VERBOSE)
                    {
                        Console.WriteLine("TEST: save/load final bytes");
                    }
                    Directory dir = NewDirectory();
                    IndexOutput @out = dir.CreateOutput("bytes", IOContext.DEFAULT);
                    bytes.writeTo(@out);
                    @out.Dispose();
                    IndexInput @in = dir.OpenInput("bytes", IOContext.DEFAULT);
                    bytesToVerify = new BytesStore(@in, numBytes, TestUtil.NextInt(Random(), 256, int.MaxValue));
                    @in.Dispose();
                    dir.Dispose();
                }
                else
                {
                    bytesToVerify = bytes;
                }

                Verify(bytesToVerify, expected, numBytes);
            }
        }
Beispiel #5
0
        private void Verify(BytesStore bytes, sbyte[] expected, int totalLength)
        {
            Assert.AreEqual(totalLength, bytes.Position);
            if (totalLength == 0)
            {
                return;
            }
            if (VERBOSE)
            {
                Console.WriteLine("  verify...");
            }

            // First verify whole thing in one blast:
            sbyte[] actual = new sbyte[totalLength];
            if (Random().NextBoolean())
            {
                if (VERBOSE)
                {
                    Console.WriteLine("    bulk: reversed");
                }
                // reversed
                FST.BytesReader r = bytes.ReverseReader;
                Assert.IsTrue(r.reversed());
                r.Position = totalLength - 1;
                r.ReadBytes(actual, 0, actual.Length);
                int start = 0;
                int end = totalLength - 1;
                while (start < end)
                {
                    sbyte b = actual[start];
                    actual[start] = actual[end];
                    actual[end] = b;
                    start++;
                    end--;
                }
            }
            else
            {
                // forward
                if (VERBOSE)
                {
                    Console.WriteLine("    bulk: forward");
                }
                FST.BytesReader r = bytes.ForwardReader;
                Assert.IsFalse(r.reversed());
                r.ReadBytes(actual, 0, actual.Length);
            }

            for (int i = 0; i < totalLength; i++)
            {
                Assert.AreEqual("byte @ index=" + i, expected[i], actual[i]);
            }

            FST.BytesReader r;

            // Then verify ops:
            bool reversed = Random().NextBoolean();
            if (reversed)
            {
                if (VERBOSE)
                {
                    Console.WriteLine("    ops: reversed");
                }
                r = bytes.ReverseReader;
            }
            else
            {
                if (VERBOSE)
                {
                    Console.WriteLine("    ops: forward");
                }
                r = bytes.ForwardReader;
            }

            if (totalLength > 1)
            {
                int numOps = TestUtil.NextInt(Random(), 100, 200);
                for (int op = 0; op < numOps; op++)
                {

                    int numBytes = Random().Next(Math.Min(1000, totalLength - 1));
                    int pos;
                    if (reversed)
                    {
                        pos = TestUtil.NextInt(Random(), numBytes, totalLength - 1);
                    }
                    else
                    {
                        pos = Random().Next(totalLength - numBytes);
                    }
                    if (VERBOSE)
                    {
                        Console.WriteLine("    op iter=" + op + " reversed=" + reversed + " numBytes=" + numBytes + " pos=" + pos);
                    }
                    sbyte[] temp = new sbyte[numBytes];
                    r.Position = pos;
                    Assert.AreEqual(pos, r.Position);
                    r.ReadBytes(temp, 0, temp.Length);
                    for (int i = 0; i < numBytes; i++)
                    {
                        sbyte expectedByte;
                        if (reversed)
                        {
                            expectedByte = expected[pos - i];
                        }
                        else
                        {
                            expectedByte = expected[pos + i];
                        }
                        Assert.AreEqual("byte @ index=" + i, expectedByte, temp[i]);
                    }

                    int left;
                    int expectedPos;

                    if (reversed)
                    {
                        expectedPos = pos - numBytes;
                        left = (int)r.Position;
                    }
                    else
                    {
                        expectedPos = pos + numBytes;
                        left = (int)(totalLength - r.Position);
                    }
                    Assert.AreEqual(expectedPos, r.Position);

                    if (left > 4)
                    {
                        int skipBytes = Random().Next(left - 4);

                        int expectedInt = 0;
                        if (reversed)
                        {
                            expectedPos -= skipBytes;
                            expectedInt |= (expected[expectedPos--] & 0xFF) << 24;
                            expectedInt |= (expected[expectedPos--] & 0xFF) << 16;
                            expectedInt |= (expected[expectedPos--] & 0xFF) << 8;
                            expectedInt |= (expected[expectedPos--] & 0xFF);
                        }
                        else
                        {
                            expectedPos += skipBytes;
                            expectedInt |= (expected[expectedPos++] & 0xFF) << 24;
                            expectedInt |= (expected[expectedPos++] & 0xFF) << 16;
                            expectedInt |= (expected[expectedPos++] & 0xFF) << 8;
                            expectedInt |= (expected[expectedPos++] & 0xFF);
                        }

                        if (VERBOSE)
                        {
                            Console.WriteLine("    skip numBytes=" + skipBytes);
                            Console.WriteLine("    readInt");
                        }

                        r.skipBytes(skipBytes);
                        Assert.AreEqual(expectedInt, r.readInt());
                    }
                }
            }
        }
Beispiel #6
0
 public ForwardBytesReaderAnonymousInner(BytesStore outerInstance)
 {
     this.outerInstance = outerInstance;
     nextRead           = outerInstance.blockSize;
 }
Beispiel #7
0
        public virtual void TestRandom()
        {
            int iters = AtLeast(10);

            for (int iter = 0; iter < iters; iter++)
            {
                int        numBytes  = TestUtil.NextInt32(Random, 1, 200000);
                byte[]     expected  = new byte[numBytes];
                int        blockBits = TestUtil.NextInt32(Random, 8, 15);
                BytesStore bytes     = new BytesStore(blockBits);
                if (VERBOSE)
                {
                    Console.WriteLine("TEST: iter=" + iter + " numBytes=" + numBytes + " blockBits=" + blockBits);
                }

                int pos = 0;
                while (pos < numBytes)
                {
                    int op = Random.Next(8);
                    if (VERBOSE)
                    {
                        Console.WriteLine("  cycle pos=" + pos);
                    }
                    switch (op)
                    {
                    case 0:
                    {
                        // write random byte
                        byte b = (byte)Random.Next(256);
                        if (VERBOSE)
                        {
                            Console.WriteLine("    writeByte b=" + b);
                        }

                        expected[pos++] = b;
                        bytes.WriteByte(b);
                    }
                    break;

                    case 1:
                    {
                        // write random byte[]
                        int    len  = Random.Next(Math.Min(numBytes - pos, 100));
                        byte[] temp = new byte[len];
                        Random.NextBytes(temp);
                        if (VERBOSE)
                        {
                            Console.WriteLine("    writeBytes len=" + len + " bytes=" + Arrays.ToString(temp));
                        }
                        Array.Copy(temp, 0, expected, pos, temp.Length);
                        bytes.WriteBytes(temp, 0, temp.Length);
                        pos += len;
                    }
                    break;

                    case 2:
                    {
                        // write int @ absolute pos
                        if (pos > 4)
                        {
                            int x         = Random.Next();
                            int randomPos = Random.Next(pos - 4);
                            if (VERBOSE)
                            {
                                Console.WriteLine("    abs writeInt pos=" + randomPos + " x=" + x);
                            }
                            bytes.WriteInt32(randomPos, x);
                            expected[randomPos++] = (byte)(x >> 24);
                            expected[randomPos++] = (byte)(x >> 16);
                            expected[randomPos++] = (byte)(x >> 8);
                            expected[randomPos++] = (byte)x;
                        }
                    }
                    break;

                    case 3:
                    {
                        // reverse bytes
                        if (pos > 1)
                        {
                            int len = TestUtil.NextInt32(Random, 2, Math.Min(100, pos));
                            int start;
                            if (len == pos)
                            {
                                start = 0;
                            }
                            else
                            {
                                start = Random.Next(pos - len);
                            }
                            int end = start + len - 1;
                            if (VERBOSE)
                            {
                                Console.WriteLine("    reverse start=" + start + " end=" + end + " len=" + len + " pos=" + pos);
                            }
                            bytes.Reverse(start, end);

                            while (start <= end)
                            {
                                byte b = expected[end];
                                expected[end]   = expected[start];
                                expected[start] = b;
                                start++;
                                end--;
                            }
                        }
                    }
                    break;

                    case 4:
                    {
                        // abs write random byte[]
                        if (pos > 2)
                        {
                            int    randomPos = Random.Next(pos - 1);
                            int    len       = TestUtil.NextInt32(Random, 1, Math.Min(pos - randomPos - 1, 100));
                            byte[] temp      = new byte[len];
                            Random.NextBytes(temp);
                            if (VERBOSE)
                            {
                                Console.WriteLine("    abs writeBytes pos=" + randomPos + " len=" + len + " bytes=" + Arrays.ToString(temp));
                            }
                            Array.Copy(temp, 0, expected, randomPos, temp.Length);
                            bytes.WriteBytes(randomPos, temp, 0, temp.Length);
                        }
                    }
                    break;

                    case 5:
                    {
                        // copyBytes
                        if (pos > 1)
                        {
                            int src  = Random.Next(pos - 1);
                            int dest = TestUtil.NextInt32(Random, src + 1, pos - 1);
                            int len  = TestUtil.NextInt32(Random, 1, Math.Min(300, pos - dest));
                            if (VERBOSE)
                            {
                                Console.WriteLine("    copyBytes src=" + src + " dest=" + dest + " len=" + len);
                            }
                            Array.Copy(expected, src, expected, dest, len);
                            bytes.CopyBytes(src, dest, len);
                        }
                    }
                    break;

                    case 6:
                    {
                        // skip
                        int len = Random.Next(Math.Min(100, numBytes - pos));

                        if (VERBOSE)
                        {
                            Console.WriteLine("    skip len=" + len);
                        }

                        pos += len;
                        bytes.SkipBytes(len);

                        // NOTE: must fill in zeros in case truncate was
                        // used, else we get false fails:
                        if (len > 0)
                        {
                            byte[] zeros = new byte[len];
                            bytes.WriteBytes(pos - len, zeros, 0, len);
                        }
                    }
                    break;

                    case 7:
                    {
                        // absWriteByte
                        if (pos > 0)
                        {
                            int  dest = Random.Next(pos);
                            byte b    = (byte)Random.Next(256);
                            expected[dest] = b;
                            bytes.WriteByte(dest, b);
                        }
                        break;
                    }
                    }

                    Assert.AreEqual(pos, bytes.Position);

                    if (pos > 0 && Random.Next(50) == 17)
                    {
                        // truncate
                        int len = TestUtil.NextInt32(Random, 1, Math.Min(pos, 100));
                        bytes.Truncate(pos - len);
                        pos -= len;
                        Arrays.Fill(expected, pos, pos + len, (byte)0);
                        if (VERBOSE)
                        {
                            Console.WriteLine("    truncate len=" + len + " newPos=" + pos);
                        }
                    }

                    if ((pos > 0 && Random.Next(200) == 17))
                    {
                        Verify(bytes, expected, pos);
                    }
                }

                BytesStore bytesToVerify;

                if (Random.NextBoolean())
                {
                    if (VERBOSE)
                    {
                        Console.WriteLine("TEST: save/load final bytes");
                    }
                    Directory   dir  = NewDirectory();
                    IndexOutput @out = dir.CreateOutput("bytes", IOContext.DEFAULT);
                    bytes.WriteTo(@out);
                    @out.Dispose();
                    IndexInput @in = dir.OpenInput("bytes", IOContext.DEFAULT);
                    bytesToVerify = new BytesStore(@in, numBytes, TestUtil.NextInt32(Random, 256, int.MaxValue));
                    @in.Dispose();
                    dir.Dispose();
                }
                else
                {
                    bytesToVerify = bytes;
                }

                Verify(bytesToVerify, expected, numBytes);
            }
        }
Beispiel #8
0
        private void Verify(BytesStore bytes, byte[] expected, int totalLength)
        {
            Assert.AreEqual(totalLength, bytes.Position);
            if (totalLength == 0)
            {
                return;
            }
            if (VERBOSE)
            {
                Console.WriteLine("  verify...");
            }

            // First verify whole thing in one blast:
            byte[] actual = new byte[totalLength];
            if (Random.NextBoolean())
            {
                if (VERBOSE)
                {
                    Console.WriteLine("    bulk: reversed");
                }
                // reversed
                FST.BytesReader r2 = bytes.GetReverseReader();
                Assert.IsTrue(r2.IsReversed);
                r2.Position = totalLength - 1;
                r2.ReadBytes(actual, 0, actual.Length);
                int start = 0;
                int end   = totalLength - 1;
                while (start < end)
                {
                    byte b = actual[start];
                    actual[start] = actual[end];
                    actual[end]   = b;
                    start++;
                    end--;
                }
            }
            else
            {
                // forward
                if (VERBOSE)
                {
                    Console.WriteLine("    bulk: forward");
                }
                FST.BytesReader r3 = bytes.GetForwardReader();
                Assert.IsFalse(r3.IsReversed);
                r3.ReadBytes(actual, 0, actual.Length);
            }

            for (int i = 0; i < totalLength; i++)
            {
                assertEquals("byte @ index=" + i, expected[i], actual[i]);
            }

            FST.BytesReader r;

            // Then verify ops:
            bool reversed = Random.NextBoolean();

            if (reversed)
            {
                if (VERBOSE)
                {
                    Console.WriteLine("    ops: reversed");
                }
                r = bytes.GetReverseReader();
            }
            else
            {
                if (VERBOSE)
                {
                    Console.WriteLine("    ops: forward");
                }
                r = bytes.GetForwardReader();
            }

            if (totalLength > 1)
            {
                int numOps = TestUtil.NextInt32(Random, 100, 200);
                for (int op = 0; op < numOps; op++)
                {
                    int numBytes = Random.Next(Math.Min(1000, totalLength - 1));
                    int pos;
                    if (reversed)
                    {
                        pos = TestUtil.NextInt32(Random, numBytes, totalLength - 1);
                    }
                    else
                    {
                        pos = Random.Next(totalLength - numBytes);
                    }
                    if (VERBOSE)
                    {
                        Console.WriteLine("    op iter=" + op + " reversed=" + reversed + " numBytes=" + numBytes + " pos=" + pos);
                    }
                    byte[] temp = new byte[numBytes];
                    r.Position = pos;
                    Assert.AreEqual(pos, r.Position);
                    r.ReadBytes(temp, 0, temp.Length);
                    for (int i = 0; i < numBytes; i++)
                    {
                        byte expectedByte;
                        if (reversed)
                        {
                            expectedByte = expected[pos - i];
                        }
                        else
                        {
                            expectedByte = expected[pos + i];
                        }
                        assertEquals("byte @ index=" + i, expectedByte, temp[i]);
                    }

                    int left;
                    int expectedPos;

                    if (reversed)
                    {
                        expectedPos = pos - numBytes;
                        left        = (int)r.Position;
                    }
                    else
                    {
                        expectedPos = pos + numBytes;
                        left        = (int)(totalLength - r.Position);
                    }
                    Assert.AreEqual(expectedPos, r.Position);

                    if (left > 4)
                    {
                        int skipBytes = Random.Next(left - 4);

                        int expectedInt = 0;
                        if (reversed)
                        {
                            expectedPos -= skipBytes;
                            expectedInt |= (expected[expectedPos--] & 0xFF) << 24;
                            expectedInt |= (expected[expectedPos--] & 0xFF) << 16;
                            expectedInt |= (expected[expectedPos--] & 0xFF) << 8;
                            expectedInt |= (expected[expectedPos--] & 0xFF);
                        }
                        else
                        {
                            expectedPos += skipBytes;
                            expectedInt |= (expected[expectedPos++] & 0xFF) << 24;
                            expectedInt |= (expected[expectedPos++] & 0xFF) << 16;
                            expectedInt |= (expected[expectedPos++] & 0xFF) << 8;
                            expectedInt |= (expected[expectedPos++] & 0xFF);
                        }

                        if (VERBOSE)
                        {
                            Console.WriteLine("    skip numBytes=" + skipBytes);
                            Console.WriteLine("    readInt");
                        }

                        r.SkipBytes(skipBytes);
                        Assert.AreEqual(expectedInt, r.ReadInt32());
                    }
                }
            }
        }