Example #1
0
        public void Corrupt_Volume_Read(string compress, int pgsz, int cnt)
        {
            var ms   = new MemoryStream();
            var meta = VolumeMetadataBuilder.Make("String archive", StringArchiveAppender.CONTENT_TYPE_STRING)
                       .SetVersion(1, 0)
                       .SetDescription("Testing string messages")
                       .SetChannel(Atom.Encode("dvop"))
                       .SetCompressionScheme(compress);

            var volume = new DefaultVolume(NOPApplication.Instance.SecurityManager.Cryptography, meta, ms)
            {
                PageSizeBytes = pgsz
            };

            using (var appender = new StringArchiveAppender(volume, NOPApplication.Instance.TimeSource, new Atom(65), "*****@*****.**"))
            {
                for (var i = 0; i < cnt; i++)
                {
                    appender.Append("string-data--------------------------------------------------------" + i.ToString());
                }
            }

            "Volume size is {0:n0} bytes".SeeArgs(ms.Length);

            var reader = new StringArchiveReader(volume);

            var allCount = reader.All.Count();

            Aver.AreEqual(cnt, allCount);

            reader.All.ForEach((s, i) => Aver.IsTrue(s.EndsWith("---" + i.ToString())));

            var pageCount = reader.GetPagesStartingAt(0).Count();

            Aver.IsTrue(pageCount > 0);

            "Before corruption: there are {0:n0} total records in {1:n0} pages".SeeArgs(allCount, pageCount);

            var midPoint = ms.Length / 2;

            ms.Position = midPoint;
            for (var j = 0; j < pgsz * 2; j++)
            {
                ms.WriteByte(0x00);                  //corruption
            }
            "-------------- corrupted {0:n0} bytes of {1:n0} total at {2:n0} position -----------  ".SeeArgs(pgsz * 2, ms.Length, midPoint);

            var allCount2 = reader.GetEntriesStartingAt(new Bookmark(), skipCorruptPages: true).Count();

            Aver.IsTrue(allCount > allCount2);

            var pageCount2 = reader.GetPagesStartingAt(0, skipCorruptPages: true).Count();

            Aver.IsTrue(pageCount > pageCount2);

            "After corruption: there are {0:n0} total records in {1:n0} pages".SeeArgs(allCount2, pageCount2);

            volume.Dispose();
        }
Example #2
0
        public void Write_Read_Compare_PageSplit(int pc, int vsz, int pgsize, string compress, string encrypt, int count, int sz)
        {
            var expected = Enumerable.Range(0, count).Select(_ => new string(' ', sz)).ToArray();
            var ms       = new MemoryStream();

            var meta = VolumeMetadataBuilder.Make("String archive", StringArchiveAppender.CONTENT_TYPE_STRING)
                       .SetVersion(1, 0)
                       .SetDescription("Testing string messages")
                       .SetChannel(Atom.Encode("dvop"))
                       .SetCompressionScheme(compress)
                       .SetEncryptionScheme(encrypt);

            var volume = new DefaultVolume(CryptoMan, meta, ms);

            volume.PageSizeBytes = pgsize;

            using (var appender = new StringArchiveAppender(volume,
                                                            NOPApplication.Instance.TimeSource,
                                                            NOPApplication.Instance.AppId, "dima@zhaba"))
            {
                for (var i = 0; i < count; i++)
                {
                    appender.Append(expected[i]);
                }
            }

            "Volume data stream is {0:n0} bytes".SeeArgs(ms.Length);
            Aver.IsTrue(ms.Length < vsz);

            //   ms.GetBuffer().ToHexDump().See();

            var reader = new StringArchiveReader(volume);

            //   reader.Pages(0).Select(p => (p.State, p.Entries.Count())).See("PAGES/Entries: ");


            var pageCount = reader.GetPagesStartingAt(0).Count();

            "Volume page count is: {0}".SeeArgs(pageCount);
            Aver.AreEqual(pc, pageCount);



            var got = reader.All.ToArray();

            Aver.AreEqual(expected.Length, got.Length);
            for (int i = 0; i < count; i++)
            {
                Aver.AreEqual(expected[i], got[i]);
            }

            volume.Dispose();
        }