Example #1
0
        public void TestProcessFile(object[] timeAndSizes)
        {
            // initialise
            var timeAndSize   = timeAndSizes.Cast <object[]>().Select(ConvertToKVPair);
            var fileID        = new Random().Next();
            var fileSizeStats = new FileSizeStats(fileID, new Dictionary <DateTime, long>(timeAndSize));
            var processor     = new FileGrowthMeasureProcessor();

            // validate
            var processedStats = processor.ProcessFile(fileSizeStats);

            // verify
            Assert.AreEqual(fileID, processedStats.FileID, "Verify that the file ID is carried over");
            Assert.AreEqual(fileSizeStats.Count() - 1, processedStats.Count(), "Verify that we capture all points in time");
            Assert.That(fileSizeStats.Skip(1).Select(p => p.Key), Is.EqualTo(processedStats.Select(p => p.Key)),
                        "Verify that we captured the exact time stamps in the right order (except the first one)");

            var it = fileSizeStats.First();

            foreach (var fileSizeStat in fileSizeStats.Skip(1))
            {
                var currentTimestamp = fileSizeStat.Key;
                var growthRate       = processedStats[currentTimestamp];
                var calcFileSize     = CalcNewFileSize(it.Value, fileSizeStat.Key - it.Key, growthRate);

                Assert.AreEqual(fileSizeStat.Value, calcFileSize,
                                "Verify that calculated file size based on hourly growth matches actual file size");

                // for next step
                it = fileSizeStat;
            }
        }
Example #2
0
        public void WriteDenormalisedFileGrowthStats(FileMetaData metaData, FileSizeStats fileSizeStats, FileGrowthStats fileGrowthStats)
        {
            var utf8     = new UTF8Encoding(false);
            var filePath = Path.Combine(Configuration["WorkingDirectory"], $"{metaData.FileID}.csv");

            using (var fileStream = FileStreamProvider.OpenWrite(filePath))
                using (var textWriter = new StreamWriter(fileStream, utf8, 1024 * 10, leaveOpen: true))
                    using (var csvWriter = new CsvWriter(textWriter, leaveOpen: true))
                    {
                        // write headers as fields as we need to use custom quoting and mixed types
                        csvWriter.WriteField(nameof(FileMetaData.FileID), shouldQuote: true);
                        csvWriter.WriteField(nameof(FileMetaData.Name), shouldQuote: true);
                        csvWriter.WriteField(nameof(FileSizeStatsDto.Timestamp), shouldQuote: true);
                        csvWriter.WriteField(nameof(FileSizeStatsDto.SizeInBytes), shouldQuote: true);
                        csvWriter.WriteField("GrowthRatesInBytesPerHour", shouldQuote: true);
                        csvWriter.NextRecord();

                        foreach (var dto in fileGrowthStats)
                        {
                            csvWriter.WriteField(metaData.FileID);
                            csvWriter.WriteField(metaData.Name, shouldQuote: true);
                            csvWriter.WriteField(FormatTime(dto.Key), shouldQuote: true);
                            // obtain file size from original data set
                            csvWriter.WriteField(fileSizeStats[dto.Key]);
                            csvWriter.WriteField(FormatHourlyGrowthRate(dto.Value));
                            csvWriter.NextRecord();
                        }
                    }
        }