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; } }
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(); } } }