public void CanReadLegacyDataAndRewriteInNewFormat(string originalFileName)
        {
            var tempFile = Path.GetTempFileName();

            using (var sourceStream = new FileStream(originalFileName, FileMode.Open, FileAccess.Read))
                using (var sourceReader = new PersistedDataReader(sourceStream, this.streamManager))
                    using (var destStream = new FileStream(tempFile, FileMode.Open, FileAccess.Write))
                    {
                        while (sourceReader.ReadDataHeader())
                        {
                            using (var destWriter = new PersistedDataWriter(destStream, sourceReader.DimensionSet,
                                                                            this.streamManager))
                            {
                                if (sourceReader.DataType == typeof(InternalHitCount))
                                {
                                    destWriter.WriteData(sourceReader.Header.Name, sourceReader.StartTime, sourceReader.EndTime,
                                                         sourceReader.Header.DataCount, sourceReader.Header.Sources,
                                                         sourceReader.LoadData <InternalHitCount>());
                                }
                                else
                                {
                                    destWriter.WriteData(sourceReader.Header.Name, sourceReader.StartTime, sourceReader.EndTime,
                                                         sourceReader.Header.DataCount, sourceReader.Header.Sources,
                                                         sourceReader.LoadData <InternalHistogram>());
                                }
                            }
                        }
                    }

            this.VerifyMatchingContents(originalFileName, tempFile);
            File.Delete(tempFile);
        }
        public void CanReadMultipleWrittenDataFromSameStream()
        {
            const int iterations = 10;

            for (int i = 0; i < iterations; ++i)
            {
                using (var writer = new PersistedDataWriter(stream, dimensions, this.streamManager))
                {
                    writer.WriteData(AnyCounterName, AnyStart, AnyEnd, (uint)data.Count, AnySources, data);
                }
            }

            stream.Position = 0;
            using (var reader = new PersistedDataReader(stream, this.streamManager))
            {
                for (int i = 0; i < iterations; ++i)
                {
                    Assert.IsTrue(reader.ReadDataHeader());
                    Assert.AreEqual(reader.Header.Name, "/Foo");
                    Assert.AreEqual((uint)data.Count, reader.Header.DataCount);
                    reader.ReadData <InternalHitCount>(
                        (key, value) => Assert.AreEqual(AnyDataValue, value.HitCount));
                }
            }
        }
        public void ReadingTruncatedDataThrowsPersistedDataException()
        {
            using (var writer = new PersistedDataWriter(stream, dimensions, this.streamManager))
            {
                writer.WriteData(AnyCounterName, AnyStart, AnyEnd, (uint)data.Count, AnySources, data);
            }

            for (int i = (int)stream.Length / 2; i >= 0; --i)
            {
                var buffer = new byte[i];
                Buffer.BlockCopy(stream.GetBuffer(), 0, buffer, 0, i);
                using (var truncatedStream = new MemoryStream(buffer, false))
                    using (var reader = new PersistedDataReader(truncatedStream, this.streamManager))
                    {
                        try
                        {
                            // If we can't read the header it's fine.
                            if (reader.ReadDataHeader())
                            {
                                reader.ReadData <InternalHitCount>((key, value) => { });
                                Assert.Fail();
                            }
                        }
                        catch (PersistedDataException) {}
                    }
            }
        }
        private void VerifyMatchingContents(string left, string right)
        {
            using (var leftStream = new FileStream(left, FileMode.Open, FileAccess.Read))
                using (var leftReader = new PersistedDataReader(leftStream, this.streamManager))
                    using (var rightStream = new FileStream(right, FileMode.Open, FileAccess.Read))
                        using (var rightReader = new PersistedDataReader(rightStream, this.streamManager))
                        {
                            while (leftReader.ReadDataHeader())
                            {
                                rightReader.ReadDataHeader();
                                Assert.IsFalse(leftReader.IsLatestProtocol);
                                Assert.IsTrue(rightReader.IsLatestProtocol);
                                Assert.AreEqual(leftReader.Header.DataCount, rightReader.Header.DataCount);
                                Assert.IsTrue(leftReader.DimensionSet.Equals(rightReader.DimensionSet));
                                Assert.AreEqual(leftReader.StartTime, rightReader.StartTime);
                                Assert.AreEqual(leftReader.EndTime, rightReader.EndTime);

                                if (leftReader.DataType == typeof(InternalHitCount))
                                {
                                    Assert.AreEqual(leftReader.Header.DataType, rightReader.Header.DataType);

                                    var leftData  = leftReader.LoadData <InternalHitCount>().ToDictionary(kvp => kvp.Key.ToString(), kvp => kvp.Value.HitCount);
                                    var rightData = rightReader.LoadData <InternalHitCount>().ToDictionary(kvp => kvp.Key.ToString(), kvp => kvp.Value.HitCount);

                                    Assert.AreEqual(leftData.Count, rightData.Count);
                                    Assert.IsTrue(leftData.All(kvp => rightData[kvp.Key] == kvp.Value));
                                }
                                else
                                {
                                    var leftData = leftReader.LoadData <InternalHistogram>()
                                                   .ToDictionary(kvp => kvp.Key.ToString(), kvp => kvp.Value.Data);
                                    var rightData = rightReader.LoadData <InternalHistogram>()
                                                    .ToDictionary(kvp => kvp.Key.ToString(), kvp => kvp.Value.Data);

                                    Assert.AreEqual(leftData.Count, rightData.Count);
                                    Assert.IsTrue(leftData.All(
                                                      kvp =>
                                    {
                                        var otherData = rightData[kvp.Key];
                                        return(otherData.Count == kvp.Value.Count &&
                                               kvp.Value.All(x => otherData[x.Key] == x.Value));
                                    }
                                                      ));
                                }
                            }
                        }
        }
        public void CanReadWrittenData()
        {
            using (var writer = new PersistedDataWriter(stream, dimensions, this.streamManager))
            {
                writer.WriteData(AnyCounterName, AnyStart, AnyEnd, (uint)data.Count, AnySources, data);
            }

            stream.Position = 0;
            using (var reader = new PersistedDataReader(stream, this.streamManager))
            {
                Assert.IsTrue(reader.ReadDataHeader());
                Assert.AreEqual("/Foo", reader.Header.Name);
                Assert.AreEqual((uint)data.Count, reader.Header.DataCount);
                reader.ReadData <InternalHitCount>(
                    (key, value) => Assert.AreEqual(AnyDataValue, value.HitCount));
            }
        }
        private void ValidateStreamContents(Stream input)
        {
            var reader = new PersistedDataReader(input, this.memoryStreamManager);

            Assert.IsTrue(reader.ReadDataHeader());
            Assert.AreEqual((uint)3, reader.Header.DataCount);
            Assert.AreEqual(AnyCounter, reader.Header.Name);
            Assert.AreEqual(this.GetStartTime().ToUniversalTime(), reader.StartTime);
            Assert.AreEqual(this.GetEndTime().ToUniversalTime(), reader.EndTime);

            reader.ReadData <InternalHitCount>(
                (key, data) =>
            {
                bool allDimensionsProvided;
                if (
                    key.Matches(this.dimensionSet.CreateKey(new DimensionSpecification {
                    { AnyDimension, "a" }
                },
                                                            out allDimensionsProvided)))
                {
                    Assert.AreEqual((ulong)1, data.HitCount);
                }
                else if (
                    key.Matches(this.dimensionSet.CreateKey(
                                    new DimensionSpecification {
                    { AnyDimension, "b" }
                }, out allDimensionsProvided)))
                {
                    Assert.AreEqual((ulong)2, data.HitCount);
                }
                else if (
                    key.Matches(
                        this.dimensionSet.CreateKey(new DimensionSpecification {
                    { AnyDimension, "c" }
                },
                                                    out allDimensionsProvided)))
                {
                    Assert.AreEqual((ulong)1, data.HitCount);
                }
                else
                {
                    Assert.Fail("Unexpected data found!");
                }
            });
        }
        public void CanReadWrittenData()
        {
            using (var writer = new PersistedDataWriter(stream, dimensions, this.streamManager))
            {
                writer.WriteData(AnyCounterName, AnyStart, AnyEnd, (uint)data.Count, AnySources, data);
            }

            stream.Position = 0;
            using (var reader = new PersistedDataReader(stream, this.streamManager))
            {
                Assert.IsTrue(reader.ReadDataHeader());
                Assert.AreEqual("/Foo", reader.Header.Name);
                Assert.AreEqual((uint)data.Count, reader.Header.DataCount);
                reader.ReadData<InternalHitCount>(
                    (key, value) => Assert.AreEqual(AnyDataValue, value.HitCount));
            }
        }
        private void VerifyMatchingContents(string left, string right)
        {
            using (var leftStream = new FileStream(left, FileMode.Open, FileAccess.Read))
            using (var leftReader = new PersistedDataReader(leftStream, this.streamManager))
            using (var rightStream = new FileStream(right, FileMode.Open, FileAccess.Read))
            using (var rightReader = new PersistedDataReader(rightStream, this.streamManager))
            {
                while (leftReader.ReadDataHeader())
                {
                    rightReader.ReadDataHeader();
                    Assert.IsFalse(leftReader.IsLatestProtocol);
                    Assert.IsTrue(rightReader.IsLatestProtocol);
                    Assert.AreEqual(leftReader.Header.DataCount, rightReader.Header.DataCount);
                    Assert.IsTrue(leftReader.DimensionSet.Equals(rightReader.DimensionSet));
                    Assert.AreEqual(leftReader.StartTime, rightReader.StartTime);
                    Assert.AreEqual(leftReader.EndTime, rightReader.EndTime);

                    if (leftReader.DataType == typeof(InternalHitCount))
                    {
                        Assert.AreEqual(leftReader.Header.DataType, rightReader.Header.DataType);

                        var leftData = leftReader.LoadData<InternalHitCount>().ToDictionary(kvp => kvp.Key.ToString(), kvp => kvp.Value.HitCount);
                        var rightData = rightReader.LoadData<InternalHitCount>().ToDictionary(kvp => kvp.Key.ToString(), kvp => kvp.Value.HitCount);

                        Assert.AreEqual(leftData.Count, rightData.Count);
                        Assert.IsTrue(leftData.All(kvp => rightData[kvp.Key] == kvp.Value));
                    }
                    else
                    {
                        var leftData = leftReader.LoadData<InternalHistogram>()
                                                 .ToDictionary(kvp => kvp.Key.ToString(), kvp => kvp.Value.Data);
                        var rightData = rightReader.LoadData<InternalHistogram>()
                            .ToDictionary(kvp => kvp.Key.ToString(), kvp => kvp.Value.Data);

                        Assert.AreEqual(leftData.Count, rightData.Count);
                        Assert.IsTrue(leftData.All(
                                                   kvp =>
                                                   {
                                                       var otherData = rightData[kvp.Key];
                                                       return otherData.Count == kvp.Value.Count &&
                                                              kvp.Value.All(x => otherData[x.Key] == x.Value);
                                                   }
                            ));
                    }
                }
            }
        }
        public void CanReadLegacyDataAndRewriteInNewFormat(string originalFileName)
        {
            var tempFile = Path.GetTempFileName();

            using (var sourceStream = new FileStream(originalFileName, FileMode.Open, FileAccess.Read))
            using (var sourceReader = new PersistedDataReader(sourceStream, this.streamManager))
            using (var destStream = new FileStream(tempFile, FileMode.Open, FileAccess.Write))
            {
                while (sourceReader.ReadDataHeader())
                {
                    using (var destWriter = new PersistedDataWriter(destStream, sourceReader.DimensionSet,
                                                                    this.streamManager))
                    {
                        if (sourceReader.DataType == typeof(InternalHitCount))
                        {
                            destWriter.WriteData(sourceReader.Header.Name, sourceReader.StartTime, sourceReader.EndTime,
                                                 sourceReader.Header.DataCount, sourceReader.Header.Sources,
                                                 sourceReader.LoadData<InternalHitCount>());
                        }
                        else 
                        {
                            destWriter.WriteData(sourceReader.Header.Name, sourceReader.StartTime, sourceReader.EndTime,
                                                 sourceReader.Header.DataCount, sourceReader.Header.Sources,
                                                 sourceReader.LoadData<InternalHistogram>());

                        }
                    }
                }
            }

            this.VerifyMatchingContents(originalFileName, tempFile);
            File.Delete(tempFile);
        }
        public void CanReadMultipleWrittenDataFromSameStream()
        {
            const int iterations = 10;
            for (int i = 0; i < iterations; ++i)
            {
                using (var writer = new PersistedDataWriter(stream, dimensions, this.streamManager))
                {
                    writer.WriteData(AnyCounterName, AnyStart, AnyEnd, (uint)data.Count, AnySources, data);
                }
            }

            stream.Position = 0;
            using (var reader = new PersistedDataReader(stream, this.streamManager))
            {
                for (int i = 0; i < iterations; ++i)
                {
                    Assert.IsTrue(reader.ReadDataHeader());
                    Assert.AreEqual(reader.Header.Name, "/Foo");
                    Assert.AreEqual((uint)data.Count, reader.Header.DataCount);
                    reader.ReadData<InternalHitCount>(
                         (key, value) => Assert.AreEqual(AnyDataValue, value.HitCount));
                }
            }
        }
        public void ReadingTruncatedDataThrowsPersistedDataException()
        {
            using (var writer = new PersistedDataWriter(stream, dimensions, this.streamManager))
            {
                writer.WriteData(AnyCounterName, AnyStart, AnyEnd, (uint)data.Count, AnySources, data);
            }

            for (int i = (int)stream.Length / 2; i >= 0; --i)
            {
                var buffer = new byte[i];
                Buffer.BlockCopy(stream.GetBuffer(), 0, buffer, 0, i);
                using (var truncatedStream = new MemoryStream(buffer, false))
                using (var reader = new PersistedDataReader(truncatedStream, this.streamManager))
                {
                    try
                    {
                        // If we can't read the header it's fine.
                        if (reader.ReadDataHeader())
                        {
                            reader.ReadData<InternalHitCount>((key, value) => { });
                            Assert.Fail();
                        }
                    }
                    catch (PersistedDataException) {} 
                }
            }
        }
Exemple #12
0
        private void ValidateStreamContents(Stream input)
        {
            var reader = new PersistedDataReader(input, this.memoryStreamManager);
            Assert.IsTrue(reader.ReadDataHeader());
            Assert.AreEqual((uint)3, reader.Header.DataCount);
            Assert.AreEqual(AnyCounter, reader.Header.Name);
            Assert.AreEqual(this.GetStartTime().ToUniversalTime(), reader.StartTime);
            Assert.AreEqual(this.GetEndTime().ToUniversalTime(), reader.EndTime);

            reader.ReadData<InternalHitCount>(
                (key, data) =>
                {
                    bool allDimensionsProvided;
                    if (
                        key.Matches(this.dimensionSet.CreateKey(new DimensionSpecification {{AnyDimension, "a"}},
                            out allDimensionsProvided)))
                    {
                        Assert.AreEqual((ulong)1, data.HitCount);
                    }
                    else if (
                        key.Matches(this.dimensionSet.CreateKey(
                            new DimensionSpecification {{AnyDimension, "b"}}, out allDimensionsProvided)))
                    {
                        Assert.AreEqual((ulong)2, data.HitCount);
                    }
                    else if (
                        key.Matches(
                            this.dimensionSet.CreateKey(new DimensionSpecification {{AnyDimension, "c"}},
                                out allDimensionsProvided)))
                    {
                        Assert.AreEqual((ulong)1, data.HitCount);
                    }
                    else
                    {
                        Assert.Fail("Unexpected data found!");
                    }
                });
        }