Esempio n. 1
0
        public void Lz4BinFormatsToStream()
        {
            var test = TestResourceFactory.CreateRandom() as MockClassC;
            var bson = new BSONFormatter();
            var zip = new LZ4ZipFormatter(bson);

            var bytes = bson.FormatObjStream(test);

            var binFormatted = zip.Format(bytes);
            var buffer = zip.Unformat(binFormatted);

            var unformatted = bson.UnformatObj<MockClassA>(buffer) as MockClassC;

            Assert.AreEqual(unformatted.Id, test.Id);
            Assert.AreEqual(unformatted.Name, test.Name);
            Assert.AreEqual(unformatted.GetSomeCheckSum[0], test.GetSomeCheckSum[0]);
            Assert.AreEqual(unformatted.Location.X, test.Location.X);
            Assert.AreEqual(unformatted.Location.Y, test.Location.Y);
            Assert.AreEqual(unformatted.Location.Z, test.Location.Z);
            Assert.AreEqual(unformatted.Location.W, test.Location.W);
            Assert.AreEqual(unformatted.ReferenceCode, test.ReferenceCode);
            Assert.AreEqual(unformatted.ReplicationID, test.ReplicationID);
        }
        public void PubSubNeverPicksUpOwnTransactions()
        {
            _testName = System.Reflection.MethodInfo.GetCurrentMethod().Name.GetHashCode().ToString();

            using (var fLock = new ManagedFileLock(_testName))
            {
                Cleanup();

                using (var pdb1 = new Database<Guid, MockClassA>(_testName + ".subscriber" + ".database", "ReplicationID", new FileCore<Guid, long>())
                    .WithPublishing("Test", new FilePublisher<Guid, MockClassA>(Path.Combine(Environment.CurrentDirectory, _testName)))
                    .WithSubscription("Test", new FileSubscriber<Guid, MockClassA>(Path.Combine(Environment.CurrentDirectory, _testName), new TimeSpan(0, 0, 0, 0, 500))))
                {
                    pdb1.Load();
                    pdb1.Clear();

                    using (var t = pdb1.BeginTransaction())
                    {
                        pdb1.Delete(o => o != null);

                        t.Commit();
                    }

                    Assert.IsTrue(Directory.Exists(Path.Combine(Environment.CurrentDirectory, _testName)));

                    var objects = TestResourceFactory.GetMockClassAObjects(25).OfType<MockClassC>().ToList();
                    var negativeObjects = TestResourceFactory.GetMockClassAObjects(25).OfType<MockClassC>().ToList();

                    using (var t = pdb1.BeginTransaction())
                    {
                        objects.ForEach(o => pdb1.Add(o));

                        t.Commit();
                    }

                    var testTran = new MockTransaction<Guid, MockClassA>(
                        new TransactionManager<Guid, MockClassA>(
                            new MockTransactionFactory<Guid, MockClassA>()
                            , new TransactionSynchronizer<Guid, MockClassA>()));

                    testTran.Source = pdb1.TransactionSource;

                    foreach (var no in negativeObjects)
                        testTran.Enlist(Action.Create, no.ReplicationID, (MockClassA)no);

                    testTran.Commit();

                    var formatter = new BSONFormatter();

                    using (var fs = new FileStream(
                        Path.Combine(Environment.CurrentDirectory, _testName, testTran.Id.ToString() + ".trans")
                        , FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None, 4096, false))
                    {
                        var s = formatter.FormatObjStream(testTran);

                        s.WriteAllTo(fs);

                        fs.Flush();
                        fs.Close();
                    }

                    Thread.Sleep(750);

                    var sw = new Stopwatch();
                    sw.Start();

                    while (pdb1.FileFlushQueueActive && sw.ElapsedMilliseconds < 3000)
                        Thread.Sleep(100);

                    Assert.AreEqual(25, pdb1.Length);
                }
            }
        }
        public void FormatterCompressesVeryLargeFiles()
        {
            var test = new Mocks.MockImageContainer(testRes.IronAsteroid_NRM) { Name = "IronAsteroid_NRM" };

            var bson = new BSONFormatter();
            var zip = new LZ4ZipFormatter(bson);

            var bytes = bson.FormatObjStream(test);

            var binFormatted = zip.Format(bytes);

            var buffer = zip.Unformat(binFormatted);

            var unformatted = bson.UnformatObj<ResourceContainer>(buffer) as MockImageContainer;

            Assert.AreEqual(unformatted.Name, test.Name);
            Assert.AreEqual(unformatted.GetResource<Bitmap>().Size.Width, test.GetResource<Bitmap>().Size.Width);
        }
        public void FormatterCompressesVeryLargeFileStreams()
        {
            var test = new Mocks.MockStreamContainer(new MemoryStream(testRes.MiscAngelic)) { Name = "MiscAngelic" };

            var bson = new BSONFormatter();
            var zip = new LZ4ZipFormatter(bson);

            var bytes = bson.FormatObjStream(test);

            var binFormatted = zip.Format(bytes);

            var buffer = zip.Unformat(binFormatted);

            var unformatted = bson.UnformatObj<ResourceStreamContainer>(buffer) as MockStreamContainer;

            Assert.AreEqual(unformatted.Name, test.Name);
            Assert.AreEqual(unformatted.GetResource<Stream>().Length, test.GetResource<Stream>().Length);
        }
Esempio n. 5
0
        public void BSONWritesJObjectToStream()
        {
            var arraySettings = BSONFormatter.GetDefaultSettings();
            arraySettings.TypeNameHandling = BESSy.Json.TypeNameHandling.Objects;

            var test = TestResourceFactory.CreateRandom() as MockClassC;

            var bson = new BSONFormatter(arraySettings);

            var stream = bson.FormatObjStream(test);
            var len = stream.Length;

            var copy = new MemoryStream();
            stream.Position = 0;
            stream.CopyTo(copy);

            var unformatted = bson.Parse(stream);

            var formatted = bson.Unparse(unformatted);

            copy.Position = formatted.Position = 0;

            var orig = new StreamReader(copy).ReadToEnd();
            var unparsed = new StreamReader(formatted).ReadToEnd();

            //Console.Write(b);
            //Console.WriteLine();
            //Console.Write(unparsed);

            Assert.AreEqual(copy.Length, formatted.Length);

            var reformatted = bson.Parse(formatted);

            Assert.AreEqual(unformatted, reformatted);

            MockClassC.Validate(unformatted.ToObject<MockClassC>(), reformatted.ToObject<MockClassC>());

            Stream os;
            bson.TryUnparse(reformatted, out os);

            Assert.AreEqual(len, os.Length);
        }
Esempio n. 6
0
        public void BSONParsesJObjectFromStream()
        {
            var arraySettings = BSONFormatter.GetDefaultSettings();
            arraySettings.TypeNameHandling = BESSy.Json.TypeNameHandling.Objects;

            var test = TestResourceFactory.CreateRandom() as MockClassC;

            var bson = new BSONFormatter(arraySettings);

            var stream = bson.FormatObjStream(test);

            var unformatted = bson.Parse(stream);

            var con = bson.AsQueryableObj(test);

            Assert.AreEqual(unformatted.Value<int>("Id"), test.Id);
            Assert.AreEqual(unformatted.Value<string>("Name"), test.Name);
            Assert.AreEqual((double)unformatted["GetSomeCheckSum"][0], test.GetSomeCheckSum[0]);
            Assert.AreEqual((double)unformatted["Location"]["X"], test.Location.X);
            Assert.AreEqual((double)unformatted["Location"]["Y"], test.Location.Y);
            Assert.AreEqual((double)unformatted["Location"]["Z"], test.Location.Z);
            Assert.AreEqual((double)unformatted["Location"]["W"], test.Location.W);
            Assert.AreEqual((string)unformatted["ReferenceCode"], test.ReferenceCode);
            Assert.AreEqual((Guid)unformatted["ReplicationID"], test.ReplicationID);
        }
        public void AfmRebuildsWithNewSeedSize()
        {
            _testName = MethodInfo.GetCurrentMethod().Name.GetHashCode().ToString();
            Cleanup();
            var formatter = new BSONFormatter();
            var core = new FileCore<int, long>() { IdSeed = new Seed32(999), SegmentSeed = new Seed64(), MinimumCoreStride = 512 };
            var addEntities = TestResourceFactory.GetMockClassAObjects(20480).ToList();

            foreach (var entity in addEntities)
                entity.Id = core.IdSeed.Increment();

            var updateEntities = new List<MockClassC>();

            IDictionary<int, long> returnSegments = null;
            IDictionary<int, long> deletedSegments = new Dictionary<int, long>();

            using (var afm = new AtomicFileManager<MockClassA>(_testName + ".database", core))
            {
                afm.Load<int>();

                using (var manager = new TransactionManager<int, MockClassA>
                    (new MockTransactionFactory<int, MockClassA>()
                    , new TransactionSynchronizer<int, MockClassA>()))
                {
                    manager.TransactionCommitted += new TransactionCommit<int, MockClassA>(
                        delegate(ITransaction<int, MockClassA> tranny)
                        {
                            returnSegments = afm.CommitTransaction(tranny, new Dictionary<int, long>());

                            while (afm.FileFlushQueueActive)
                                Thread.Sleep(100);

                            tranny.MarkComplete();

                            afm.SaveCore<int>();
                        });

                    using (var tLock = manager.BeginTransaction())
                    {
                        addEntities.ForEach(delegate(MockClassA entity)
                        {
                            tLock.Transaction.Enlist(Action.Create, entity.Id, entity);
                        });

                        Assert.AreEqual(20480, tLock.Transaction.EnlistCount);

                        tLock.Transaction.Commit();

                        Assert.AreEqual(20480, afm.Length);
                    }
                }
            }

            using (var afm = new AtomicFileManager<MockClassA>(_testName + ".database", core))
            {
                afm.Load<int>();

                Assert.AreEqual(20480, afm.Length);

                using (var manager = new TransactionManager<int, MockClassA>
                    (new MockTransactionFactory<int, MockClassA>()
                    , new TransactionSynchronizer<int, MockClassA>()))
                {
                    manager.TransactionCommitted += new TransactionCommit<int, MockClassA>(
                        delegate(ITransaction<int, MockClassA> tranny)
                        {
                            returnSegments = afm.CommitTransaction(tranny, returnSegments);

                            while (afm.FileFlushQueueActive)
                                Thread.Sleep(100);

                            tranny.MarkComplete();

                            afm.SaveCore<int>();

                            core.MinimumCoreStride = (int)formatter.FormatObjStream(core).Length;
                        });

                    using (var tLock = manager.BeginTransaction())
                    {
                        deletedSegments = returnSegments.Take(9000).ToDictionary(k => k.Key, k => k.Value);

                        foreach (var kvp in deletedSegments)
                            updateEntities.Add(afm.LoadSegmentFrom(kvp.Value) as MockClassC);

                        updateEntities.ForEach(u => tLock.Transaction.Enlist(Action.Delete, u.Id, u));

                        tLock.Transaction.Commit();

                        afm.SaveCore<int>();
                    }

                    Assert.AreEqual(512, afm.Stride);

                    //Deleting items from the database adds those idsToDelete to the segmentSeed'aqn open Ids list, increasing it'aqn size. It'aqn an easy way to check for segmentSeed rebuilding.
                    Assert.Greater(afm.Core.MinimumCoreStride, 23000);
                }
            }
        }