Example #1
0
        public async Task MediaPropertiesMustChangeOnlyAfterUpdate()
        {
            IFileSystem  fs  = Substitute.For <IFileSystem>();
            MyFileStream stm = Substitute.For <MyFileStream>(new object());

            fs.OpenFile("test").Returns(stm);

            DateTime time1 = new DateTime(2000, 1, 1);
            long     size1 = 100;

            stm.Length.Returns(size1);
            stm.LastWriteTime.Returns(time1);
            stm.IsDeleted.Returns(false);

            using (SimpleFileMedia media = await SimpleFileMedia.Create(fs, SimpleFileMedia.CreateConnectionParamsFromFileName("test")))
            {
                // Media properties are the same as stm's ones
                Assert.AreEqual(time1, media.LastModified);
                Assert.AreEqual(size1, media.Size);

                // Change the properties of stm
                DateTime time2 = new DateTime(2000, 2, 2);
                long     size2 = 200;
                stm.Length.Returns(size2);
                stm.LastWriteTime.Returns(time2);
                stm.IsDeleted.Returns(false);

                // Properties have not still changed
                Assert.AreEqual(time1, media.LastModified);
                Assert.AreEqual(size1, media.Size);

                // This Update should refresh media's properties
                await media.Update();

                Assert.AreEqual(time2, media.LastModified);
                Assert.AreEqual(size2, media.Size);

                // Subsequent calls change nothing
                await media.Update();

                await media.Update();

                Assert.AreEqual(time2, media.LastModified);
                Assert.AreEqual(size2, media.Size);
            }

            stm.Received(1).Dispose();
        }
        public void UpdatingWhileFileIsGrowing()
        {
            IFileSystem  fs  = Substitute.For <IFileSystem>();
            MyFileStream stm = Substitute.For <MyFileStream>(new object());

            fs.OpenFile("test").Returns(stm);

            DateTime time1 = new DateTime(2000, 1, 1);
            long     size1 = 100;

            stm.Length.Returns(size1);
            stm.LastWriteTime.Returns(time1);
            stm.IsDeleted.Returns(false);

            using (SimpleFileMedia media = new SimpleFileMedia(fs, SimpleFileMedia.CreateConnectionParamsFromFileName("test")))
            {
                Assert.AreEqual(time1, media.LastModified);
                Assert.AreEqual(size1, media.Size);
                Assert.AreEqual(size1, media.DataStream.Length);

                DateTime time2 = new DateTime(2000, 2, 2);
                long     size2 = 200;
                stm.Length.Returns(size2);
                stm.LastWriteTime.Returns(time2);
                stm.IsDeleted.Returns(false);

                media.Update();

                Assert.AreEqual(time2, media.LastModified);
                Assert.AreEqual(size2, media.Size);
            }

            stm.Received(1).Dispose();
        }
Example #3
0
        public void UpdatingWhileFileIsGrowing()
        {
            MockRepository rep = new MockRepository();
            IFileSystem    fs  = rep.CreateMock <IFileSystem>();
            MyFileStream   stm = rep.CreateMock <MyFileStream>(rep);

            Expect.Call(fs.OpenFile("test")).Return(stm);

            DateTime time1 = new DateTime(2000, 1, 1);
            long     size1 = 100;

            Expect.Call(stm.Length).Repeat.Any().Return(size1);
            Expect.Call(stm.LastWriteTime).Repeat.Any().Return(time1);
            Expect.Call(stm.IsDeleted).Repeat.Any().Return(false);

            rep.ReplayAll();

            using (SimpleFileMedia media = new SimpleFileMedia(fs, SimpleFileMedia.CreateConnectionParamsFromFileName("test")))
            {
                Assert.AreEqual(time1, media.LastModified);
                Assert.AreEqual(size1, media.Size);
                Assert.AreEqual(size1, media.DataStream.Length);

                rep.VerifyAll();

                rep.BackToRecordAll();

                DateTime time2 = new DateTime(2000, 2, 2);
                long     size2 = 200;
                Expect.Call(stm.Length).Repeat.Any().Return(size2);
                Expect.Call(stm.LastWriteTime).Repeat.Any().Return(time2);
                Expect.Call(stm.IsDeleted).Repeat.Any().Return(false);

                rep.ReplayAll();

                media.Update();

                Assert.AreEqual(time2, media.LastModified);
                Assert.AreEqual(size2, media.Size);

                rep.VerifyAll();

                rep.BackToRecordAll();
                stm.Dispose();
                LastCall.On(stm).Repeat.AtLeastOnce();
                rep.ReplayAll();
            }

            rep.VerifyAll();
        }
        public void FileDeletedByAnotherProcessAndThenNewFileAppeared()
        {
            IFileSystem fs = Substitute.For <IFileSystem>();

            // Create and init the first stream
            long         initialSize1 = 100;
            DateTime     modifTime1   = new DateTime(2000, 3, 4);
            MyFileStream stm1         = Substitute.For <MyFileStream>(new object());

            stm1.Length.Returns(initialSize1);
            stm1.IsDeleted.Returns(false);
            stm1.LastWriteTime.Returns(modifTime1);

            // Instruct file system to return the first stream
            fs.OpenFile("test").Returns(stm1);

            MyFileStream stm2 = Substitute.For <MyFileStream>(new object());

            using (SimpleFileMedia media = new SimpleFileMedia(fs, SimpleFileMedia.CreateConnectionParamsFromFileName("test")))
            {
                // Check that media refers to the first stream stm1
                Assert.AreEqual(initialSize1, media.DataStream.Length);
                Assert.AreEqual(initialSize1, media.Size);
                Assert.AreEqual(true, media.IsAvailable);


                // Simulate file deletion: Length and LastWriteTime keep returning file properties,
                // but IsDeleted now returns "true".
                stm1.IsDeleted.Returns(true);


                // Factory cannot open the file that has been deleted while being locked
                fs.OpenFile("test").Returns(
                    _ => throw new UnauthorizedAccessException(),
                    _ => throw new UnauthorizedAccessException(),
                    _ => stm2
                    );


                // Properties must return previous values as long as Update is not called
                Assert.AreEqual(initialSize1, media.Size);
                Assert.AreEqual(initialSize1, media.DataStream.Length);
                Assert.AreEqual(true, media.IsAvailable);

                // This update should detect file deletion and release it
                media.Update();
                Assert.AreEqual(0, media.Size);
                Assert.AreEqual(0, media.DataStream.Length);
                Assert.AreEqual(false, media.IsAvailable);
                stm1.Received(1).Dispose();

                // Subsequent Updates should change nothing
                media.Update();
                media.Update();
                Assert.AreEqual(0, media.Size);
                Assert.AreEqual(0, media.DataStream.Length);
                Assert.AreEqual(false, media.IsAvailable);


                // Simulate that new file with name "test" appeared
                long     initialSize2 = 200;
                DateTime modifTime2   = new DateTime(2000, 4, 5);
                stm2.Length.Returns(initialSize2);
                stm2.IsDeleted.Returns(false);
                stm2.LastWriteTime.Returns(modifTime2);


                // Properties must return previous values as long as Update is not called
                Assert.AreEqual(0, media.Size);
                Assert.AreEqual(0, media.DataStream.Length);
                Assert.AreEqual(false, media.IsAvailable);

                // This Update will pick up new file
                media.Update();
                Assert.AreEqual(initialSize2, media.DataStream.Length);
                Assert.AreEqual(initialSize2, media.Size);
                Assert.AreEqual(true, media.IsAvailable);

                // Subsequent Updates should change nothing
                media.Update();
                media.Update();
                Assert.AreEqual(initialSize2, media.Size);
                Assert.AreEqual(initialSize2, media.DataStream.Length);
                Assert.AreEqual(true, media.IsAvailable);
            }

            stm2.Received(1).Dispose();
        }
Example #5
0
        protected override void LiveLogListen(CancellationToken stopEvt, LiveLogXMLWriter output)
        {
            using (ILogMedia media = new SimpleFileMedia(
                       LogMedia.FileSystemImpl.Instance,
                       SimpleFileMedia.CreateConnectionParamsFromFileName(fileName)))
                using (FileSystemWatcher watcher = new FileSystemWatcher(Path.GetDirectoryName(fileName),
                                                                         Path.GetFileName(fileName)))
                    using (AutoResetEvent fileChangedEvt = new AutoResetEvent(true))
                    {
                        IMessagesSplitter splitter = new MessagesSplitter(
                            new StreamTextAccess(media.DataStream, Encoding.ASCII, TextStreamPositioningParams.Default),
                            RegexFactory.Instance.Create(@"^(?<body>.+)$", ReOptions.Multiline)
                            );

                        watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.Size;
                        watcher.Changed     += delegate(object sender, FileSystemEventArgs e)
                        {
                            fileChangedEvt.Set();
                        };
                        //watcher.EnableRaisingEvents = true;

                        long         lastLinePosition = 0;
                        long         lastStreamLength = 0;
                        WaitHandle[] events           = new WaitHandle[] { stopEvt.WaitHandle, fileChangedEvt };

                        var capture = new TextMessageCapture();

                        for (; ;)
                        {
                            if (WaitHandle.WaitAny(events, 250, false) == 0)
                            {
                                break;
                            }

                            media.Update();

                            if (media.Size == lastStreamLength)
                            {
                                continue;
                            }

                            lastStreamLength = media.Size;
                            sizeInBytesStat  = lastStreamLength;

                            DateTime lastModified = media.LastModified;

                            splitter.BeginSplittingSession(new FileRange.Range(0, lastStreamLength), lastLinePosition, MessagesParserDirection.Forward);
                            try
                            {
                                for (; ;)
                                {
                                    if (!splitter.GetCurrentMessageAndMoveToNextOne(capture))
                                    {
                                        break;
                                    }
                                    lastLinePosition = capture.BeginPosition;

                                    XmlWriter writer = output.BeginWriteMessage(false);
                                    writer.WriteStartElement("m");
                                    writer.WriteAttributeString("d", Listener.FormatDate(lastModified));
                                    writer.WriteString(XmlUtils.RemoveInvalidXMLChars(capture.MessageHeader));
                                    writer.WriteEndElement();
                                    output.EndWriteMessage();
                                }
                            }
                            finally
                            {
                                splitter.EndSplittingSession();
                            }
                        }
                    }
        }
Example #6
0
        public void MediaPropertiesMustChangeOnlyAfterUpdate()
        {
            MockRepository rep = new MockRepository();
            IFileSystem    fs  = rep.CreateMock <IFileSystem>();
            MyFileStream   stm = rep.CreateMock <MyFileStream>(rep);

            Expect.Call(fs.OpenFile("test")).Return(stm);

            DateTime time1 = new DateTime(2000, 1, 1);
            long     size1 = 100;

            Expect.Call(stm.Length).Repeat.Any().Return(size1);
            Expect.Call(stm.LastWriteTime).Repeat.Any().Return(time1);
            Expect.Call(stm.IsDeleted).Repeat.Any().Return(false);

            rep.ReplayAll();

            using (SimpleFileMedia media = new SimpleFileMedia(fs, SimpleFileMedia.CreateConnectionParamsFromFileName("test")))
            {
                // Media properties are the same as stm's ones
                Assert.AreEqual(time1, media.LastModified);
                Assert.AreEqual(size1, media.Size);

                rep.VerifyAll();

                rep.BackToRecordAll();
                // Chnage the properties of stm
                DateTime time2 = new DateTime(2000, 2, 2);
                long     size2 = 200;
                Expect.Call(stm.Length).Repeat.Any().Return(size2);
                Expect.Call(stm.LastWriteTime).Repeat.Any().Return(time2);
                Expect.Call(stm.IsDeleted).Repeat.Any().Return(false);
                rep.ReplayAll();

                // Properties have not still changed
                Assert.AreEqual(time1, media.LastModified);
                Assert.AreEqual(size1, media.Size);

                // This Update should refresh media's properties
                media.Update();

                Assert.AreEqual(time2, media.LastModified);
                Assert.AreEqual(size2, media.Size);

                // Subsequent calls change nothing
                media.Update();
                media.Update();
                Assert.AreEqual(time2, media.LastModified);
                Assert.AreEqual(size2, media.Size);

                rep.VerifyAll();


                rep.BackToRecordAll();
                stm.Dispose();
                LastCall.On(stm).Repeat.AtLeastOnce();
                rep.ReplayAll();
            }

            rep.VerifyAll();
        }
Example #7
0
        public void FileDeletedByAnotherProcessAndThenNewFileAppeared()
        {
            MockRepository rep = new MockRepository();

            IFileSystem fs = rep.CreateMock <IFileSystem>();

            // Create and init the first stream
            long         initialSize1 = 100;
            DateTime     modifTime1   = new DateTime(2000, 3, 4);
            MyFileStream stm1         = rep.CreateMock <MyFileStream>(rep);

            Expect.Call(stm1.Length).Repeat.Any().Return(initialSize1);
            Expect.Call(stm1.IsDeleted).Repeat.Any().Return(false);
            Expect.Call(stm1.LastWriteTime).Repeat.Any().Return(modifTime1);

            // Instruct file system to return the first stream
            Expect.Call(fs.OpenFile("test")).Return(stm1);

            rep.ReplayAll();

            using (SimpleFileMedia media = new SimpleFileMedia(fs, SimpleFileMedia.CreateConnectionParamsFromFileName("test")))
            {
                // Check that media refers to the first stream stm1
                Assert.AreEqual(initialSize1, media.DataStream.Length);
                Assert.AreEqual(initialSize1, media.Size);
                Assert.AreEqual(true, media.IsAvailable);

                rep.VerifyAll();



                rep.BackToRecordAll();
                // Simulate file deletion: Length and LastWriteTime keep returning file properties,
                // but IsDeleted now returns "true".
                Expect.Call(stm1.Length).Repeat.Any().Return(initialSize1);
                Expect.Call(stm1.LastWriteTime).Repeat.Any().Return(modifTime1);
                Expect.Call(stm1.IsDeleted).Repeat.Any().Return(true);

                // We expect stream stm1 to be released/disposed
                stm1.Dispose();
                LastCall.On(stm1).Repeat.AtLeastOnce();

                // Factory cannot open the file that has been deleted while being locked
                Expect.Call(fs.OpenFile("test")).Repeat.Any().Throw(new UnauthorizedAccessException());
                rep.ReplayAll();


                // Properties must return previous values as long as Update is not called
                Assert.AreEqual(initialSize1, media.Size);
                Assert.AreEqual(initialSize1, media.DataStream.Length);
                Assert.AreEqual(true, media.IsAvailable);

                // This update should detect file deletion and release it
                media.Update();
                Assert.AreEqual(0, media.Size);
                Assert.AreEqual(0, media.DataStream.Length);
                Assert.AreEqual(false, media.IsAvailable);

                // Subsequent Updates should change nothing
                media.Update();
                media.Update();
                Assert.AreEqual(0, media.Size);
                Assert.AreEqual(0, media.DataStream.Length);
                Assert.AreEqual(false, media.IsAvailable);

                rep.VerifyAll();


                rep.BackToRecordAll();
                // Simulate that new file with name "test" appeared
                long         initialSize2 = 200;
                DateTime     modifTime2   = new DateTime(2000, 4, 5);
                MyFileStream stm2         = rep.CreateMock <MyFileStream>(rep);
                Expect.Call(stm2.Length).Repeat.Any().Return(initialSize2);
                Expect.Call(stm2.IsDeleted).Repeat.Any().Return(false);
                Expect.Call(stm2.LastWriteTime).Repeat.Any().Return(modifTime2);
                stm2.Dispose();
                LastCall.On(stm2).Repeat.AtLeastOnce();
                Expect.Call(fs.OpenFile("test")).Return(stm2);
                rep.ReplayAll();


                // Properties must return previous values as long as Update is not called
                Assert.AreEqual(0, media.Size);
                Assert.AreEqual(0, media.DataStream.Length);
                Assert.AreEqual(false, media.IsAvailable);

                // This Update will pick up new file
                media.Update();
                Assert.AreEqual(initialSize2, media.DataStream.Length);
                Assert.AreEqual(initialSize2, media.Size);
                Assert.AreEqual(true, media.IsAvailable);

                // Subsequent Updates should change nothing
                media.Update();
                media.Update();
                Assert.AreEqual(initialSize2, media.Size);
                Assert.AreEqual(initialSize2, media.DataStream.Length);
                Assert.AreEqual(true, media.IsAvailable);
            }

            rep.VerifyAll();
        }