diff --git a/MergerCli/Process.cs b/MergerCli/Process.cs index cffc6bd5..9e51a207 100644 --- a/MergerCli/Process.cs +++ b/MergerCli/Process.cs @@ -54,10 +54,10 @@ public void Start(IData baseData, IData newData, BatchStatusManager batchStatusM } this._logger.LogInformation($"[{MethodBase.GetCurrentMethod()?.Name}] Total amount of tiles to merge: {totalTileCount - tileProgressCount}"); - + ParallelRun(baseData, newData, batchStatusManager, tileProgressCount, totalTileCount, resumeBatchIdentifier, resumeMode, pollForBatch); - + batchStatusManager.CompleteLayer(newData.Path); newData.Reset(); // base data wrap up is in program as the same base data object is used in multiple calls @@ -79,7 +79,7 @@ public void Start(IData baseData, IData newData, BatchStatusManager batchStatusM newData.setBatchIdentifier(resumeBatchIdentifier); } } - + var incompleteBatch = batchStatusManager.GetFirstIncompleteBatch(newData.Path); if (incompleteBatch is not null) { @@ -88,21 +88,21 @@ public void Start(IData baseData, IData newData, BatchStatusManager batchStatusM } List newTiles = newData.GetNextBatch(out string? currentBatchIdentifier, out string? nextBatchIdentifier, totalTileCount); - + if (!resumeMode && newTiles.Count != 0) { batchStatusManager.AssignBatch(newData.Path, currentBatchIdentifier); batchStatusManager.SetCurrentBatch(newData.Path, nextBatchIdentifier); } - + return (newTiles, currentBatchIdentifier); } } - - private void ProcessBatch(IData baseData, List newTiles, ref long tileProgressCount, long totalTileCount,ref bool pollForBatch) + + private void ProcessBatch(IData baseData, List newTiles, ref long tileProgressCount, long totalTileCount, ref bool pollForBatch) { ConcurrentBag tiles = new ConcurrentBag(); - + if (newTiles.Count == 0) { pollForBatch = false; @@ -137,7 +137,7 @@ private void ProcessBatch(IData baseData, List newTiles, ref long tileProg } private void ParallelRun(IData baseData, IData newData, - BatchStatusManager batchStatusManager, long tileProgressCount, long totalTileCount, string? resumeBatchIdentifier, bool resumeMode,bool pollForBatch) + BatchStatusManager batchStatusManager, long tileProgressCount, long totalTileCount, string? resumeBatchIdentifier, bool resumeMode, bool pollForBatch) { var numOfThreads = this._configManager.GetConfiguration("GENERAL", "parallel", "numOfThreads"); Parallel.For(0, numOfThreads, new ParallelOptions { MaxDegreeOfParallelism = -1 }, _ => @@ -151,7 +151,7 @@ private void ParallelRun(IData baseData, IData newData, } }); } - + public void Validate(IData baseData, IData newData, string? incompleteBatchIdentifier) { List newTiles; diff --git a/MergerLogic/Batching/Tile.cs b/MergerLogic/Batching/Tile.cs index de28907b..dcd549f9 100644 --- a/MergerLogic/Batching/Tile.cs +++ b/MergerLogic/Batching/Tile.cs @@ -1,6 +1,7 @@ using ImageMagick; using MergerLogic.DataTypes; using MergerLogic.ImageProcessing; +using MergerLogic.Utils; using System.ComponentModel.DataAnnotations; namespace MergerLogic.Batching @@ -33,33 +34,53 @@ public int Y public TileFormat Format { get; internal set; } + public int Width { get; internal set; } + + public int Height { get; internal set; } + private byte[] _data; - public Tile(int z, int x, int y, byte[] data) + private readonly IConfigurationManager _configManager; + + public Tile(IConfigurationManager configuration, int z, int x, int y, byte[] data) { this.Z = z; this.X = x; this.Y = y; this.Format = ImageFormatter.GetTileFormat(data) ?? throw new ValidationException($"Cannot create tile {this}, data is in invalid format"); - this._data = data; - } + this._configManager = configuration; + + var info = new MagickImageInfo(data); + this.Width = info.Width; + this.Height = info.Height; - public Tile(Coord cords, byte[] data) - { - this.Z = cords.Z; - this.X = cords.X; - this.Y = cords.Y; - this.Format = ImageFormatter.GetTileFormat(data) ?? throw new ValidationException($"Cannot create tile {this}, data is in invalid format"); this._data = data; + + int allowedPixelSize = _configManager.GetConfiguration("GENERAL", "allowedPixelSize"); + if (this.Width != allowedPixelSize || this.Height != allowedPixelSize) + { + throw new ArgumentException($"The image dimensions ({this.Width}x{this.Height}) does not match the allowed size ({allowedPixelSize})"); + } } - public Tile(Coord cords, IMagickImage image) + public Tile(IConfigurationManager configuration, Coord cords, byte[] data) : this(configuration, cords.Z, cords.X, cords.Y, data) { } + + public Tile(IConfigurationManager configuration, Coord cords, IMagickImage image) { + this._configManager = configuration; this.Z = cords.Z; this.X = cords.X; this.Y = cords.Y; this.Format = ImageFormatter.GetTileFormat(image) ?? throw new ValidationException($"Cannot create tile {this}, data is in invalid format"); + this.Width = image.Width; + this.Height = image.Height; this._data = image.ToByteArray(); + + int allowedPixelSize = configuration.GetConfiguration("GENERAL", "allowedPixelSize"); + if (this.Width != allowedPixelSize || this.Height != allowedPixelSize) + { + throw new ArgumentException($"The image dimensions ({this.Width}x{this.Height}) does not match the allowed size ({allowedPixelSize})"); + } } public bool HasCoords(int z, int x, int y) @@ -78,6 +99,8 @@ public virtual void Print() Console.WriteLine($"x: {this.X}"); Console.WriteLine($"y: {this.Y}"); // Console.WriteLine($"blob: {this.Blob}"); + Console.WriteLine($"width: {this.Width}"); + Console.WriteLine($"height: {this.Height}"); Console.WriteLine($"data Size: {this._data.Length}"); } @@ -86,7 +109,8 @@ public virtual byte[] GetImageBytes() return this._data; } - public int Size() { + public int Size() + { return this._data.Length; } diff --git a/MergerLogic/Clients/FileClient.cs b/MergerLogic/Clients/FileClient.cs index 25544910..1496fcdb 100644 --- a/MergerLogic/Clients/FileClient.cs +++ b/MergerLogic/Clients/FileClient.cs @@ -8,8 +8,8 @@ public class FileClient : DataUtils, IFileClient { private readonly IFileSystem _fileSystem; - public FileClient(string path, IGeoUtils geoUtils, IFileSystem fileSystem) - : base(path, geoUtils) + public FileClient(string path, IGeoUtils geoUtils, IFileSystem fileSystem, IConfigurationManager configuration) + : base(path, geoUtils, configuration) { this._fileSystem = fileSystem; } @@ -31,7 +31,7 @@ public FileClient(string path, IGeoUtils geoUtils, IFileSystem fileSystem) public override bool TileExists(int z, int x, int y) { - return this.GetTilePath(z,x,y) != null; + return this.GetTilePath(z, x, y) != null; } private string? GetTilePath(int z, int x, int y) diff --git a/MergerLogic/Clients/GpkgClient.cs b/MergerLogic/Clients/GpkgClient.cs index 6eb801bc..86c642ae 100644 --- a/MergerLogic/Clients/GpkgClient.cs +++ b/MergerLogic/Clients/GpkgClient.cs @@ -19,7 +19,7 @@ public class GpkgClient : DataUtils, IGpkgClient private readonly IFileSystem _fileSystem; public GpkgClient(string path, ITimeUtils timeUtils, ILogger logger, IFileSystem fileSystem, - IGeoUtils geoUtils) : base(path, geoUtils) + IGeoUtils geoUtils, IConfigurationManager configuration) : base(path, geoUtils, configuration) { this._timeUtils = timeUtils; this._logger = logger; diff --git a/MergerLogic/Clients/HttpSourceClient.cs b/MergerLogic/Clients/HttpSourceClient.cs index 240b46d9..2a76cb7c 100644 --- a/MergerLogic/Clients/HttpSourceClient.cs +++ b/MergerLogic/Clients/HttpSourceClient.cs @@ -9,7 +9,7 @@ public class HttpSourceClient : DataUtils, IHttpSourceClient private IPathPatternUtils _pathPatternUtils; public HttpSourceClient(string path, IHttpRequestUtils httpClient, IPathPatternUtils pathPatternUtils, - IGeoUtils geoUtils) : base(path, geoUtils) + IGeoUtils geoUtils, IConfigurationManager configuration) : base(path, geoUtils, configuration) { this._httpClient = httpClient; this._pathPatternUtils = pathPatternUtils; diff --git a/MergerLogic/Clients/S3Client.cs b/MergerLogic/Clients/S3Client.cs index 8dd39d96..933b4102 100644 --- a/MergerLogic/Clients/S3Client.cs +++ b/MergerLogic/Clients/S3Client.cs @@ -16,8 +16,8 @@ public class S3Client : DataUtils, IS3Client private readonly IPathUtils _pathUtils; private readonly S3StorageClass _storageClass; - public S3Client(IAmazonS3 client, IPathUtils pathUtils, IGeoUtils geoUtils, ILogger logger, - string storageClass, string bucket, string path) : base(path, geoUtils) + public S3Client(IAmazonS3 client, IPathUtils pathUtils, IGeoUtils geoUtils, ILogger logger, IConfigurationManager configuration, + string storageClass, string bucket, string path) : base(path, geoUtils, configuration) { this._client = client; this._bucket = bucket; @@ -105,10 +105,10 @@ public void UpdateTile(Tile tile) var request = new PutObjectRequest() { - BucketName = this._bucket, - CannedACL = S3CannedACL.PublicRead, - Key = String.Format(key), - StorageClass=this._storageClass + BucketName = this._bucket, + CannedACL = S3CannedACL.PublicRead, + Key = String.Format(key), + StorageClass = this._storageClass }; byte[] buffer = tile.GetImageBytes(); diff --git a/MergerLogic/ImageProcessing/TileMerger.cs b/MergerLogic/ImageProcessing/TileMerger.cs index 9317f9dc..0ecae3e2 100644 --- a/MergerLogic/ImageProcessing/TileMerger.cs +++ b/MergerLogic/ImageProcessing/TileMerger.cs @@ -11,22 +11,26 @@ public class TileMerger : ITileMerger { private readonly ITileScaler _tileScaler; private readonly ILogger _logger; + private readonly IConfigurationManager _configurationManager; - public TileMerger(ITileScaler tileScaler, ILogger logger) + public TileMerger(ITileScaler tileScaler, ILogger logger, IConfigurationManager configuration) { this._logger = logger; this._tileScaler = tileScaler; + this._configurationManager = configuration; } public Tile? MergeTiles(List tiles, Coord targetCoords, TileFormatStrategy strategy, bool uploadOnly = false) { - if(uploadOnly) { + if (uploadOnly) + { this._logger.LogDebug($"[{MethodBase.GetCurrentMethod()?.Name}] Configured to upload only mode"); // Ignore target if in upload only mode tiles = tiles.Skip(1).ToList(); // In case there is only one source then we can just return the data as is - if(tiles.Count == 1) { + if (tiles.Count == 1) + { this._logger.LogDebug($"[{MethodBase.GetCurrentMethod()?.Name}] Only one source was found, using raw image"); Tile? rawTile = tiles[0](); rawTile?.ConvertToFormat(strategy.ApplyStrategy(rawTile.Format)); @@ -70,7 +74,7 @@ public TileMerger(ITileScaler tileScaler, ILogger logger) break; } - Tile tile = new Tile(targetCoords, image); + Tile tile = new Tile(this._configurationManager, targetCoords, image); image.Dispose(); tile.ConvertToFormat(strategy.ApplyStrategy(tile.Format)); return tile; diff --git a/MergerLogic/ImageProcessing/TileScaler.cs b/MergerLogic/ImageProcessing/TileScaler.cs index 592c18ce..06599a95 100644 --- a/MergerLogic/ImageProcessing/TileScaler.cs +++ b/MergerLogic/ImageProcessing/TileScaler.cs @@ -14,15 +14,18 @@ public class TileScaler : ITileScaler private const int TILE_SIZE = 256; private readonly IMetricsProvider _metricsProvider; private readonly ILogger _logger; + private readonly IConfigurationManager _configurationManager; - public TileScaler(IMetricsProvider metricsProvider, ILogger logger) + public TileScaler(IMetricsProvider metricsProvider, ILogger logger, IConfigurationManager configuration) { this._metricsProvider = metricsProvider; this._logger = logger; + this._configurationManager = configuration; } public MagickImage? Upscale(MagickImage baseImage, Tile baseTile, Coord targetCoords) { + string fromTileToCoordMessage = $"from tile z:{baseTile.Z}, x:{baseTile.X}, y:{baseTile.Y} to coords z:{targetCoords.Z}, x:{targetCoords.X}, y:{targetCoords.Y}"; this._logger.LogDebug($"[{MethodBase.GetCurrentMethod().Name}] MagickImage Upscale Begin {fromTileToCoordMessage}"); var upscaleStopwatch = Stopwatch.StartNew(); @@ -135,7 +138,7 @@ public TileScaler(IMetricsProvider metricsProvider, ILogger logger) ImageFormatter.RemoveImageDateAttributes(upscale); } - return upscale is null ? null : new Tile(targetCoords, upscale.ToByteArray()); + return upscale is null ? null : new Tile(this._configurationManager, targetCoords, upscale.ToByteArray()); } } } diff --git a/MergerLogic/Utils/DataUtils.cs b/MergerLogic/Utils/DataUtils.cs index 7b979478..962b6cdb 100644 --- a/MergerLogic/Utils/DataUtils.cs +++ b/MergerLogic/Utils/DataUtils.cs @@ -8,14 +8,18 @@ public abstract class DataUtils : IDataUtils { protected readonly string path; protected readonly IGeoUtils GeoUtils; + protected readonly IImageFormatter Formatter; + private readonly IConfigurationManager _configurationManager; - public DataUtils(string path, IGeoUtils geoUtils) + public DataUtils(string path, IGeoUtils geoUtils, IConfigurationManager configuration) { this.path = path; this.GeoUtils = geoUtils; + this._configurationManager = configuration; } - public virtual bool IsValidGrid(bool isOneXOne = false) { + public virtual bool IsValidGrid(bool isOneXOne = false) + { return true; } @@ -35,7 +39,7 @@ public virtual bool IsValidGrid(bool isOneXOne = false) { return null; } - return new Tile(z, x, y, data); + return new Tile(this._configurationManager, z, x, y, data); } protected Tile? CreateTile(Coord coord, byte[]? data) diff --git a/MergerLogic/Utils/ImageUtils.cs b/MergerLogic/Utils/ImageUtils.cs index 8d11a8d5..371f7bb5 100644 --- a/MergerLogic/Utils/ImageUtils.cs +++ b/MergerLogic/Utils/ImageUtils.cs @@ -1,4 +1,5 @@ using ImageMagick; +using MergerLogic.Batching; namespace MergerLogic.Utils { @@ -12,14 +13,15 @@ public static bool IsTransparent(MagickImage image) } using var pixels = image.GetPixels(); - + foreach (var pixel in pixels) { - if (pixel.ToColor()?.A != 255) { + if (pixel.ToColor()?.A != 255) + { return true; } } - + return false; } @@ -35,6 +37,11 @@ public static bool IsFullyTransparent(MagickImage image) return pixels.Select(pixel => pixel.ToColor()).All(color => color?.A == 0); } + public static bool IsValidImageDimensions(Tile tile, int allowedImageSize) + { + return tile.Width == allowedImageSize && tile.Height == allowedImageSize; + } + // public static bool IsEmpty(MagickImage image) // { // using var pixels = image.GetPixels(); diff --git a/MergerLogic/Utils/UtilsFactory.cs b/MergerLogic/Utils/UtilsFactory.cs index c61ca3fb..00732cbd 100644 --- a/MergerLogic/Utils/UtilsFactory.cs +++ b/MergerLogic/Utils/UtilsFactory.cs @@ -3,6 +3,7 @@ using Microsoft.Extensions.Logging; using System.IO.Abstractions; using MergerLogic.Clients; +using System.ComponentModel; namespace MergerLogic.Utils { @@ -30,19 +31,21 @@ public UtilsFactory(IPathUtils pathUtils, ITimeUtils timeUtils, IGeoUtils geoUti public IFileClient GetFileUtils(string path) { - return new FileClient(path, this._geoUtils, this._fileSystem); + return new FileClient(path, this._geoUtils, this._fileSystem, this._container.GetRequiredService()); } public IGpkgClient GetGpkgUtils(string path) { var logger = this._container.GetRequiredService>(); - return new GpkgClient(path, this._timeUtils, logger, this._fileSystem, this._geoUtils); + return new GpkgClient(path, this._timeUtils, logger, this._fileSystem, this._geoUtils, + this._container.GetRequiredService()); } public IHttpSourceClient GetHttpUtils(string path) { IPathPatternUtils pathPatternUtils = this.GetPathPatternUtils(path); - return new HttpSourceClient(path, this._httpRequestUtils, pathPatternUtils, this._geoUtils); + return new HttpSourceClient(path, this._httpRequestUtils, pathPatternUtils, this._geoUtils, + this._container.GetRequiredService()); } public IS3Client GetS3Utils(string path) @@ -55,7 +58,8 @@ public IS3Client GetS3Utils(string path) throw new Exception("S3 Data utils requires s3 client to be configured"); } var logger = this._container.GetRequiredService>(); - return new S3Client(client, this._pathUtils, this._geoUtils, logger, storageClass, bucket, path); + return new S3Client(client, this._pathUtils, this._geoUtils, logger, this._container.GetRequiredService(), + storageClass, bucket, path); } public T GetDataUtils(string path) where T : IDataUtils diff --git a/MergerLogicUnitTests/Batching/TestImages/image.gif b/MergerLogicUnitTests/Batching/TestImages/image.gif new file mode 100644 index 00000000..1af68430 Binary files /dev/null and b/MergerLogicUnitTests/Batching/TestImages/image.gif differ diff --git a/MergerLogicUnitTests/Batching/TestImages/image.jpeg b/MergerLogicUnitTests/Batching/TestImages/image.jpeg new file mode 100644 index 00000000..af163531 Binary files /dev/null and b/MergerLogicUnitTests/Batching/TestImages/image.jpeg differ diff --git a/MergerLogicUnitTests/Batching/TestImages/image.png b/MergerLogicUnitTests/Batching/TestImages/image.png new file mode 100644 index 00000000..4c0485af Binary files /dev/null and b/MergerLogicUnitTests/Batching/TestImages/image.png differ diff --git a/MergerLogicUnitTests/Batching/TileTest.cs b/MergerLogicUnitTests/Batching/TileTest.cs index 1731aac3..6fba33cb 100644 --- a/MergerLogicUnitTests/Batching/TileTest.cs +++ b/MergerLogicUnitTests/Batching/TileTest.cs @@ -1,49 +1,129 @@ using MergerLogic.Batching; +using MergerLogic.Utils; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; +using System; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using System.IO; namespace MergerLogicUnitTests.Clients { [TestClass] [TestCategory("unit")] [TestCategory("Tile")] - public class TilesTest + [DeploymentItem(@"../../../Batching/TestImages")] + public class TilesTest { #region mocks private MockRepository _repository; + private Mock _configurationManagerMock; #endregion + private readonly Times anyNumberOfTimes = Times.AtMost(int.MaxValue); [TestInitialize] public void beforeEach() { this._repository = new MockRepository(MockBehavior.Strict); + this._configurationManagerMock = this._repository.Create(); + + this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "allowedPixelSize")) + .Returns(256).Verifiable(anyNumberOfTimes); } #region CreateTile + public static IEnumerable GenCreateTileUnknownFormatParams() + { +#nullable disable + yield return new object[] { null }; +#nullable enable + yield return new object[] { File.ReadAllBytes("image.gif") }; + } + [TestMethod] [TestCategory("CreateTile")] - [DataRow(null)] - [DataRow(new byte[] { 0x43, 0x44, 0x30, 0x30, 0x31 })] + [DynamicData(nameof(GenCreateTileUnknownFormatParams), DynamicDataSourceType.Method)] public void CreateTileWithUnknownDataFormatFails(byte[] data) { - Assert.ThrowsException(() => new Tile(0, 0, 0, data)); + Assert.ThrowsException(() => new Tile(this._configurationManagerMock.Object, 0, 0, 0, data)); this._repository.VerifyAll(); } + public static IEnumerable GenCreateTileParams() + { + yield return new object[] { File.ReadAllBytes("image.jpeg") }; + yield return new object[] { File.ReadAllBytes("image.png") }; + } + [TestMethod] [TestCategory("CreateTile")] - [DataRow(new byte[] { 0xFF, 0xD8, 0xFF, 0xDB })] - [DataRow(new byte[] { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A })] + [DynamicData(nameof(GenCreateTileParams), DynamicDataSourceType.Method)] public void CreateTile(byte[] data) { - Tile tile = new Tile(0, 0, 0, data); + Tile tile = new Tile(this._configurationManagerMock.Object, 0, 0, 0, data); Assert.AreEqual(tile.GetImageBytes(), data); this._repository.VerifyAll(); } #endregion + + #region imageDimensions + public static IEnumerable ValidTilesSizeTestParameters() + { + yield return new object[] { + File.ReadAllBytes("no_transparency.jpeg"), + (256, 256) + }; + yield return new object[] { + File.ReadAllBytes("no_transparency.png"), + (256, 256) + }; + } + public static IEnumerable InvalidTilesSizeTestParameters() + { + yield return new object[] { + File.ReadAllBytes("100x100.jpeg"), + (100, 100) + }; + yield return new object[] { + File.ReadAllBytes("100x100.png"), + (100, 100) + }; + yield return new object[] { + File.ReadAllBytes("100x256.jpeg"), + (100, 256) + }; + yield return new object[] { + File.ReadAllBytes("100x256.png"), + (100, 256) + }; + yield return new object[] { + File.ReadAllBytes("256x100.jpeg"), + (256, 100) + }; + yield return new object[] { + File.ReadAllBytes("256x100.png"), + (256, 100) + }; + } + + [TestMethod] + [DynamicData(nameof(ValidTilesSizeTestParameters), DynamicDataSourceType.Method)] + public void IsAcceptsValidTileSize(byte[] imageBytes, (int, int) dimensions) + { + Tile tile = new Tile(this._configurationManagerMock.Object, 0, 0, 0, imageBytes); + Assert.AreEqual((tile.Width, tile.Height), dimensions); + } + + [TestMethod] + [DynamicData(nameof(InvalidTilesSizeTestParameters), DynamicDataSourceType.Method)] + [ExpectedException(typeof(ArgumentException))] + public void IsRejectsInvalidTileSize(byte[] imageBytes, (int, int) dimensions) + { + new Tile(this._configurationManagerMock.Object, 0, 0, 0, imageBytes); + } + #endregion } } diff --git a/MergerLogicUnitTests/Clients/FileClientTest.cs b/MergerLogicUnitTests/Clients/FileClientTest.cs index b7bf9dc2..cfec3f65 100644 --- a/MergerLogicUnitTests/Clients/FileClientTest.cs +++ b/MergerLogicUnitTests/Clients/FileClientTest.cs @@ -16,7 +16,8 @@ namespace MergerLogicUnitTests.Clients [TestCategory("unit")] [TestCategory("fs")] [TestCategory("FileClient")] - public class FileClientTest + [DeploymentItem(@"../../../Clients/TestImages")] + public class FileClientTest { #region mocks private MockRepository _repository; @@ -24,11 +25,13 @@ public class FileClientTest private Mock _fsMock; private Mock _fileMock; private Mock _pathMock; - private Mock _directoryMock; + private Mock _directoryMock; private Mock _imageFormatterMock; + private Mock _configurationManagerMock; private byte[] _jpegImageData; private byte[] _pngImageData; #endregion + private readonly Times anyNumberOfTimes = Times.AtMost(int.MaxValue); [TestInitialize] public void beforeEach() @@ -39,13 +42,16 @@ public void beforeEach() this._fileMock = this._repository.Create(); this._pathMock = this._repository.Create(); this._directoryMock = this._repository.Create(); + this._configurationManagerMock = this._repository.Create(); this._fsMock.SetupGet(fs => fs.File).Returns(this._fileMock.Object); this._fsMock.SetupGet(fs => fs.Path).Returns(this._pathMock.Object); this._fsMock.SetupGet(fs => fs.Directory).Returns(this._directoryMock.Object); + this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "allowedPixelSize")) + .Returns(256).Verifiable(anyNumberOfTimes); this._imageFormatterMock = this._repository.Create(); - this._jpegImageData = new byte[] { 0xFF, 0xD8, 0xFF, 0xDB}; - this._pngImageData = new byte[] { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }; + this._jpegImageData = File.ReadAllBytes("image.jpeg"); + this._pngImageData = File.ReadAllBytes("image.png"); } #region GetTile @@ -61,7 +67,7 @@ public static IEnumerable GetGetTileParams() } [TestMethod] - [DynamicData(nameof(GetGetTileParams),DynamicDataSourceType.Method)] + [DynamicData(nameof(GetGetTileParams), DynamicDataSourceType.Method)] public void GetTile(bool useCoords, bool returnsNull, TileFormat targetFormat) { Coord cords = new Coord(1, 2, 3); @@ -88,7 +94,7 @@ public void GetTile(bool useCoords, bool returnsNull, TileFormat targetFormat) .Returns(targetFormat); } - var fileClient = new FileClient("testFilePath", this._geoUtilsMock.Object,this._fsMock.Object); + var fileClient = new FileClient("testFilePath", this._geoUtilsMock.Object, this._fsMock.Object, this._configurationManagerMock.Object); var res = useCoords ? fileClient.GetTile(cords) : fileClient.GetTile(cords.Z, cords.X, cords.Y); if (returnsNull) @@ -121,18 +127,18 @@ public void TileExists(bool exist) var seq = new MockSequence(); this._pathMock .InSequence(seq) - .Setup(util => util.Join(cords.Z.ToString(),cords.X.ToString(),cords.Y.ToString())) + .Setup(util => util.Join(cords.Z.ToString(), cords.X.ToString(), cords.Y.ToString())) .Returns("testTilePath"); this._directoryMock .InSequence(seq) .Setup(dir => dir.EnumerateFiles("testFilePath", "testTilePath.*", SearchOption.TopDirectoryOnly)) - .Returns(exist ? new string[]{"testFile"} : Array.Empty()); + .Returns(exist ? new string[] { "testFile" } : Array.Empty()); - var fileClient = new FileClient("testFilePath", this._geoUtilsMock.Object,this._fsMock.Object); + var fileClient = new FileClient("testFilePath", this._geoUtilsMock.Object, this._fsMock.Object, this._configurationManagerMock.Object); var res = fileClient.TileExists(cords.Z, cords.X, cords.Y); - Assert.AreEqual(exist,res); + Assert.AreEqual(exist, res); this._repository.VerifyAll(); } @@ -151,7 +157,7 @@ public void TileExistsReturnFalseWhenDirectoryDontExist() .Setup(dir => dir.EnumerateFiles("testFilePath", "testTilePath.*", SearchOption.TopDirectoryOnly)) .Throws(); - var fileClient = new FileClient("testFilePath", this._geoUtilsMock.Object, this._fsMock.Object); + var fileClient = new FileClient("testFilePath", this._geoUtilsMock.Object, this._fsMock.Object, this._configurationManagerMock.Object); var res = fileClient.TileExists(cords.Z, cords.X, cords.Y); diff --git a/MergerLogicUnitTests/Clients/TestImages/image.jpeg b/MergerLogicUnitTests/Clients/TestImages/image.jpeg new file mode 100644 index 00000000..af163531 Binary files /dev/null and b/MergerLogicUnitTests/Clients/TestImages/image.jpeg differ diff --git a/MergerLogicUnitTests/Clients/TestImages/image.png b/MergerLogicUnitTests/Clients/TestImages/image.png new file mode 100644 index 00000000..4c0485af Binary files /dev/null and b/MergerLogicUnitTests/Clients/TestImages/image.png differ diff --git a/MergerLogicUnitTests/DataTypes/FSTest.cs b/MergerLogicUnitTests/DataTypes/FSTest.cs index cc3e6d7b..e8b712c4 100644 --- a/MergerLogicUnitTests/DataTypes/FSTest.cs +++ b/MergerLogicUnitTests/DataTypes/FSTest.cs @@ -18,6 +18,7 @@ namespace MergerLogicUnitTests.DataTypes [TestCategory("unit")] [TestCategory("FS")] [TestCategory("FSDataSource")] + [DeploymentItem(@"../../../DataTypes/TestImages")] public class FSTest { #region mocks @@ -36,6 +37,7 @@ public class FSTest private Mock _fileInfoFactoryMock; private Mock _pathMock; private Mock _metricsProviderMock; + private Mock _configurationManagerMock; private byte[] _jpegImageData; #endregion @@ -52,6 +54,9 @@ public void BeforeEach() this._fileInfoFactoryMock = this._repository.Create(); this._pathMock = this._repository.Create(); this._fileSystemMock = this._repository.Create(); + this._configurationManagerMock = this._repository.Create(); + this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "allowedPixelSize")) + .Returns(256); this._fileSystemMock.SetupGet(fs => fs.Directory).Returns(this._directoryMock.Object); this._fileSystemMock.SetupGet(fs => fs.FileInfo).Returns(this._fileInfoFactoryMock.Object); this._fileSystemMock.SetupGet(fs => fs.Path).Returns(this._pathMock.Object); @@ -76,7 +81,7 @@ public void BeforeEach() this._serviceProviderMock.Setup(container => container.GetService(typeof(IMetricsProvider))) .Returns(this._metricsProviderMock.Object); - this._jpegImageData = new byte[] { 0xFF, 0xD8, 0xFF, 0xDB}; + this._jpegImageData = File.ReadAllBytes("no_transparency.jpeg"); } #region TileExists @@ -136,7 +141,7 @@ public void TileExists(bool isBase, Coord cords, bool isOneXOne, GridOrigin orig } else { - var tile = new Tile(cords, this._jpegImageData); + var tile = new Tile(this._configurationManagerMock.Object, cords, this._jpegImageData); Assert.AreEqual(expected, fsSource.TileExists(tile)); } this._fsUtilsMock.Verify(util => util.TileExists(cords.Z, cords.X, cords.Y), @@ -171,7 +176,7 @@ public void GetCorrespondingTileWithoutUpscaleWithoutConversion(int batchSize, b { this.SetupConstructorRequiredMocks(isBase); Tile nullTile = null; - var existingTile = new Tile(2, 2, 3, this._jpegImageData); + var existingTile = new Tile(this._configurationManagerMock.Object, 2, 2, 3, this._jpegImageData); this._fsUtilsMock.Setup(utils => utils.GetTile(It.IsAny(), It.IsAny(), It.IsAny())) .Returns((z, x, y) => z == 2 ? existingTile : nullTile); @@ -222,7 +227,7 @@ public void GetCorrespondingTileWithoutUpscale(bool isBase, Coord cords, bool en bool expectedNull = cords.Z != 2; this.SetupConstructorRequiredMocks(isBase); Tile nullTile = null; - var existingTile = new Tile(2, 2, 3, this._jpegImageData); + var existingTile = new Tile(this._configurationManagerMock.Object, 2, 2, 3, this._jpegImageData); var sequence = new MockSequence(); if (origin != GridOrigin.LOWER_LEFT) { @@ -326,7 +331,7 @@ public void GetCorrespondingTileWithUpscale(bool isBase, bool isOneXOne, GridOri { this.SetupConstructorRequiredMocks(isBase); Tile nullTile = null; - var tile = new Tile(2, 2, 3, this._jpegImageData); + var tile = new Tile(this._configurationManagerMock.Object, 2, 2, 3, this._jpegImageData); var sequence = new MockSequence(); if (origin != GridOrigin.LOWER_LEFT) @@ -467,8 +472,9 @@ public void UpdateTiles(bool isBase, bool isOneXOne, GridOrigin origin) var testTiles = new Tile[] { - new Tile(1, 2, 3, this._jpegImageData), new Tile(7, 7, 7, this._jpegImageData), - new Tile(2, 2, 3, this._jpegImageData) + new Tile(this._configurationManagerMock.Object, 1, 2, 3, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 7, 7, 7, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 2, 2, 3, this._jpegImageData) }; var tileComparer = EqualityComparerFactory.Create((tile1, tile2) => @@ -767,8 +773,11 @@ public void GetNextBatch(bool isOneXOne, bool isBase, GridOrigin origin, int bat { var tiles = new Tile?[] { - new Tile(0, 0, 0, this._jpegImageData), new Tile(1, 1, 1, this._jpegImageData), null, - new Tile(3, 3, 3, this._jpegImageData), new Tile(4, 4, 4, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 0, 0, 0, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 1, 1, 1, this._jpegImageData), + null, + new Tile(this._configurationManagerMock.Object, 3, 3, 3, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 4, 4, 4, this._jpegImageData), }; var tileBatches = tiles.Where(t => t is not null && (!isOneXOne || t.Z != 0)).Chunk(batchSize).ToList(); var seq = new MockSequence(); @@ -945,7 +954,7 @@ private void SetupGetTiles(bool isBase, bool isOneXOne, GridOrigin origin) .Returns(new Coord(0, 0, 0)); this._fsUtilsMock .Setup(utils => utils.GetTile(It.IsAny())) - .Returns(new Tile(0, 0, 0, this._jpegImageData)); + .Returns(new Tile(this._configurationManagerMock.Object, 0, 0, 0, this._jpegImageData)); if (origin != GridOrigin.LOWER_LEFT) { this._geoUtilsMock diff --git a/MergerLogicUnitTests/DataTypes/GpkgTest.cs b/MergerLogicUnitTests/DataTypes/GpkgTest.cs index 82c01d8f..3a571bf5 100644 --- a/MergerLogicUnitTests/DataTypes/GpkgTest.cs +++ b/MergerLogicUnitTests/DataTypes/GpkgTest.cs @@ -9,7 +9,7 @@ using Moq; using System; using System.Collections.Generic; -using System.IO.Abstractions; +using System.IO; using System.Linq; namespace MergerLogicUnitTests.DataTypes @@ -18,6 +18,7 @@ namespace MergerLogicUnitTests.DataTypes [TestCategory("unit")] [TestCategory("gpkg")] [TestCategory("gpkgDataSource")] + [DeploymentItem(@"../../../DataTypes/TestImages")] public class GpkgTest { #region mocks @@ -35,6 +36,7 @@ public class GpkgTest private byte[] _jpegImageData; #endregion + private readonly Times anyNumberOfTimes = Times.AtMost(int.MaxValue); [TestInitialize] public void BeforeEach() @@ -52,6 +54,8 @@ public void BeforeEach() this._loggerFactoryMock = this._repository.Create(); this._loggerFactoryMock.Setup(f => f.CreateLogger(It.IsAny())).Returns(this._loggerMock.Object); this._serviceProviderMock = this._repository.Create(); + this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "allowedPixelSize")) + .Returns(256).Verifiable(anyNumberOfTimes); this._serviceProviderMock.Setup(container => container.GetService(typeof(IOneXOneConvertor))) .Returns(this._oneXOneConvertorMock.Object); this._serviceProviderMock.Setup(container => container.GetService(typeof(IUtilsFactory))) @@ -62,8 +66,7 @@ public void BeforeEach() .Returns(this._geoUtilsMock.Object); this._serviceProviderMock.Setup(container => container.GetService(typeof(IMetricsProvider))) .Returns(this._metricsProviderMock.Object); - - this._jpegImageData = new byte[] { 0xFF, 0xD8, 0xFF, 0xDB}; + this._jpegImageData = File.ReadAllBytes("no_transparency.jpeg"); } #region TileExists @@ -127,7 +130,7 @@ public void TileExists(bool isBase, Coord cords, bool isOneXOne, GridOrigin orig } else { - var tile = new Tile(cords, this._jpegImageData); + var tile = new Tile(this._configurationManagerMock.Object, cords, this._jpegImageData); Assert.AreEqual(expected, gpkg.TileExists(tile)); } this._gpkgUtilsMock.Verify(util => util.TileExists(cords.Z, cords.X, cords.Y), @@ -163,7 +166,7 @@ public void GetCorrespondingTileWithoutUpscaleWithoutConversion(int batchSize, b var extent = new Extent() { MinX = -180, MinY = -90, MaxX = 180, MaxY = 90 }; this.SetupRequiredBaseMocks(isBase, false, extent); Tile nullTile = null; - var existingTile = new Tile(2, 2, 3, this._jpegImageData); + var existingTile = new Tile(this._configurationManagerMock.Object, 2, 2, 3, this._jpegImageData); this._gpkgUtilsMock.Setup(utils => utils.GetTile(It.IsAny(), It.IsAny(), It.IsAny())) .Returns((z, x, y) => z == 2 ? existingTile : nullTile); @@ -219,7 +222,7 @@ public void GetCorrespondingTileWithoutUpscale(bool isBase, Coord cords, bool en this.SetupRequiredBaseMocks(isBase, isOneXOne, extent); Tile nullTile = null; - var existingTile = new Tile(2, 2, 3, this._jpegImageData); + var existingTile = new Tile(this._configurationManagerMock.Object, 2, 2, 3, this._jpegImageData); var sequence = new MockSequence(); if (origin != GridOrigin.LOWER_LEFT) { @@ -325,7 +328,7 @@ public void GetCorrespondingTileWithUpscale(bool isBase, bool isOneXOne, GridOri var extent = new Extent() { MinX = -180, MinY = -90, MaxX = 180, MaxY = 90 }; Grid grid = isOneXOne ? Grid.OneXOne : Grid.TwoXOne; Tile nullTile = null; - var tile = new Tile(2, 2, 3, this._jpegImageData); + var tile = new Tile(this._configurationManagerMock.Object, 2, 2, 3, this._jpegImageData); var sequence = new MockSequence(); this.SetupRequiredBaseMocks(isBase, isOneXOne, extent); @@ -461,8 +464,9 @@ public void UpdateTiles(bool isBase, bool isOneXOne, GridOrigin origin) var testTiles = new Tile[] { - new Tile(1, 2, 3, this._jpegImageData), new Tile(7, 7, 7, this._jpegImageData), - new Tile(2, 2, 3, this._jpegImageData) + new Tile(this._configurationManagerMock.Object, 1, 2, 3, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 7, 7, 7, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 2, 2, 3, this._jpegImageData) }; gpkg.UpdateTiles(testTiles); @@ -708,7 +712,7 @@ public void Reset(bool isOneXOne, bool isBase, GridOrigin origin, int batchSize) this.SetupRequiredBaseMocks(isBase, isOneXOne, extent); this._gpkgUtilsMock.Setup(utils => utils.GetBatch(batchSize, It.IsAny())) - .Returns(new List { new Tile(0, 0, 0, this._jpegImageData) }); + .Returns(new List { new Tile(this._configurationManagerMock.Object, 0, 0, 0, this._jpegImageData) }); if (origin == GridOrigin.UPPER_LEFT) { this._geoUtilsMock.Setup(converter => converter.FlipY(It.IsAny())) @@ -759,8 +763,10 @@ public void GetNextBatch(bool isOneXOne, bool isBase, GridOrigin origin, int bat Grid grid = isOneXOne ? Grid.OneXOne : Grid.TwoXOne; var tiles = new Tile[] { - new Tile(0, 0, 0, this._jpegImageData), new Tile(1, 1, 1, this._jpegImageData), - new Tile(2, 2, 2, this._jpegImageData), new Tile(3, 3, 3, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 0, 0, 0, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 1, 1, 1, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 2, 2, 2, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 3, 3, 3, this._jpegImageData), }; var tileBatches = tiles.Chunk(batchSize).ToList(); diff --git a/MergerLogicUnitTests/DataTypes/S3Test.cs b/MergerLogicUnitTests/DataTypes/S3Test.cs index a89ad970..9b7a60e5 100644 --- a/MergerLogicUnitTests/DataTypes/S3Test.cs +++ b/MergerLogicUnitTests/DataTypes/S3Test.cs @@ -7,10 +7,12 @@ using MergerLogic.Utils; using MergerLogicUnitTests.testUtils; using Microsoft.Extensions.Logging; +using Microsoft.VisualStudio.TestPlatform.ObjectModel; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using System; using System.Collections.Generic; +using System.IO; using System.Threading; namespace MergerLogicUnitTests.DataTypes @@ -19,6 +21,7 @@ namespace MergerLogicUnitTests.DataTypes [TestCategory("unit")] [TestCategory("S3")] [TestCategory("S3DataSource")] + [DeploymentItem(@"../../../DataTypes/TestImages")] public class S3Test { #region mocks @@ -80,8 +83,10 @@ public void BeforeEach() .Returns(this._configurationManagerMock.Object); this._configurationManagerMock.Setup(cm => cm.GetConfiguration("S3", "bucket")) .Returns("bucket"); + this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "allowedPixelSize")) + .Returns(256); - this._jpegImageData = new byte[] { 0xFF, 0xD8, 0xFF, 0xDB}; + this._jpegImageData = File.ReadAllBytes("no_transparency.jpeg"); } #region TileExists @@ -142,7 +147,7 @@ public void TileExists(Coord cords, bool isOneXOne, GridOrigin origin, bool useC } else { - var tile = new Tile(cords, this._jpegImageData); + var tile = new Tile(this._configurationManagerMock.Object, cords, this._jpegImageData); Assert.AreEqual(expected, s3Source.TileExists(tile)); } @@ -177,7 +182,7 @@ public void GetCorrespondingTileWithoutUpscaleWithoutConversion(int batchSize, i bool expectedNull) { Tile nullTile = null; - var existingTile = new Tile(2, 2, 3, this._jpegImageData); + var existingTile = new Tile(this._configurationManagerMock.Object, 2, 2, 3, this._jpegImageData); this.SetupConstructorRequiredMocks(); this._s3UtilsMock.Setup(utils => utils.GetTile(It.IsAny(), It.IsAny(), It.IsAny())) @@ -226,7 +231,7 @@ public void GetCorrespondingTileWithoutUpscale(Coord cords, bool enableUpscale, { bool expectedNull = cords.Z != 2; Tile nullTile = null; - var existingTile = new Tile(2, 2, 3, this._jpegImageData); + var existingTile = new Tile(this._configurationManagerMock.Object, 2, 2, 3, this._jpegImageData); var sequence = new MockSequence(); this.SetupConstructorRequiredMocks(true, sequence); @@ -330,7 +335,7 @@ public static IEnumerable GenGetCorrespondingTileWithUpscaleTwoXOnePar public void GetCorrespondingTileWithUpscale(bool isOneXOne, GridOrigin origin, bool isValidConversion) { Tile nullTile = null; - var tile = new Tile(2, 2, 3, this._jpegImageData); + var tile = new Tile(this._configurationManagerMock.Object, 2, 2, 3, this._jpegImageData); var sequence = new MockSequence(); this.SetupConstructorRequiredMocks(true, sequence); @@ -445,8 +450,9 @@ public void UpdateTiles(bool isOneXOne, GridOrigin origin) { var testTiles = new Tile[] { - new Tile(1, 2, 3, this._jpegImageData), new Tile(7, 7, 7, this._jpegImageData), - new Tile(2, 2, 3, this._jpegImageData) + new Tile(this._configurationManagerMock.Object, 1, 2, 3, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 7, 7, 7, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 2, 2, 3, this._jpegImageData) }; var seq = new MockSequence(); this.SetupConstructorRequiredMocks(true, seq); @@ -699,7 +705,7 @@ public void Reset(bool isOneXOne, GridOrigin origin, int batchSize) }); this._s3UtilsMock .Setup(utils => utils.GetTile(It.IsAny())) - .Returns(new Tile(0, 0, 0, this._jpegImageData)); + .Returns(new Tile(this._configurationManagerMock.Object, 0, 0, 0, this._jpegImageData)); if (origin != GridOrigin.LOWER_LEFT) { this._geoUtilsMock diff --git a/MergerLogicUnitTests/DataTypes/TMSTest.cs b/MergerLogicUnitTests/DataTypes/TMSTest.cs index f969b056..fe9b7373 100644 --- a/MergerLogicUnitTests/DataTypes/TMSTest.cs +++ b/MergerLogicUnitTests/DataTypes/TMSTest.cs @@ -9,6 +9,7 @@ using Moq; using System; using System.Collections.Generic; +using System.IO; using System.IO.Abstractions; using System.Linq; @@ -19,6 +20,7 @@ namespace MergerLogicUnitTests.DataTypes [TestCategory("TMS")] [TestCategory("TMSDataSource")] [TestCategory("HttpDataSource")] + [DeploymentItem(@"../../../DataTypes/TestImages")] public class TMSTest { #region mocks @@ -32,6 +34,7 @@ public class TMSTest private Mock _loggerFactoryMock; private Mock> _loggerMock; private Mock _metricsProviderMock; + private Mock _configurationManagerMock; private byte[] _jpegImageData; #endregion @@ -45,6 +48,8 @@ public void BeforeEach() this._geoUtilsMock = this._repository.Create(); this._utilsFactoryMock = this._repository.Create(); this._metricsProviderMock = this._repository.Create(MockBehavior.Loose); + this._configurationManagerMock = this._repository.Create(); + this._utilsFactoryMock.Setup(factory => factory.GetDataUtils(It.IsAny())) .Returns(this._httpUtilsMock.Object); @@ -62,8 +67,10 @@ public void BeforeEach() .Returns(this._loggerFactoryMock.Object); this._serviceProviderMock.Setup(container => container.GetService(typeof(IMetricsProvider))) .Returns(this._metricsProviderMock.Object); - - this._jpegImageData = new byte[] { 0xFF, 0xD8, 0xFF, 0xDB}; + this._jpegImageData = File.ReadAllBytes("no_transparency.jpeg"); + this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "allowedPixelSize")) + .Returns(256); + } #region TileExists @@ -123,7 +130,7 @@ public void TileExists(Coord cords, bool isOneXOne, GridOrigin origin, bool useC } else { - var tile = new Tile(cords, this._jpegImageData); + var tile = new Tile(this._configurationManagerMock.Object, cords, this._jpegImageData); Assert.AreEqual(expected, tmsSource.TileExists(tile)); } this._httpUtilsMock.Verify(util => util.TileExists(cords.Z, cords.X, cords.Y), @@ -157,7 +164,7 @@ public void GetCorrespondingTileWithoutUpscaleWithoutConversion(int batchSize, i { this.SetupConstructorRequiredMocks(); Tile nullTile = null; - var existingTile = new Tile(2, 2, 3, this._jpegImageData); + var existingTile = new Tile(this._configurationManagerMock.Object, 2, 2, 3, this._jpegImageData); this._httpUtilsMock.Setup(utils => utils.GetTile(It.IsAny(), It.IsAny(), It.IsAny())) .Returns((z, x, y) => z == 2 ? existingTile : nullTile); @@ -206,7 +213,7 @@ public void GetCorrespondingTileWithoutUpscale(Coord cords, bool enableUpscale, bool expectedNull = cords.Z != 2; this.SetupConstructorRequiredMocks(); Tile nullTile = null; - var existingTile = new Tile(2, 2, 3, this._jpegImageData); + var existingTile = new Tile(this._configurationManagerMock.Object, 2, 2, 3, this._jpegImageData); var sequence = new MockSequence(); if (origin != GridOrigin.LOWER_LEFT) { @@ -310,7 +317,7 @@ public void GetCorrespondingTileWithUpscale(bool isOneXOne, GridOrigin origin, b { this.SetupConstructorRequiredMocks(); Tile nullTile = null; - var tile = new Tile(2, 2, 3, this._jpegImageData); + var tile = new Tile(this._configurationManagerMock.Object, 2, 2, 3, this._jpegImageData); var sequence = new MockSequence(); if (origin != GridOrigin.LOWER_LEFT) @@ -430,8 +437,9 @@ public void UpdateTiles(bool isOneXOne, GridOrigin origin) var testTiles = new Tile[] { - new Tile(1, 2, 3, this._jpegImageData), new Tile(7, 7, 7, this._jpegImageData), - new Tile(2, 2, 3, this._jpegImageData) + new Tile(this._configurationManagerMock.Object, 1, 2, 3, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 7, 7, 7, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 2, 2, 3, this._jpegImageData) }; Assert.ThrowsException(() => tmsSource.UpdateTiles(testTiles)); @@ -580,7 +588,7 @@ public void Reset(bool isOneXOne, GridOrigin origin, int batchSize) .Returns(t => t); this._httpUtilsMock .Setup(utils => utils.GetTile(It.IsAny())) - .Returns(new Tile(0, 0, 0, this._jpegImageData)); + .Returns(new Tile(this._configurationManagerMock.Object, 0, 0, 0, this._jpegImageData)); this._oneXOneConvertorMock .Setup(converter => converter.TryFromTwoXOne(It.IsAny(), It.IsAny(), It.IsAny())) .Returns((z, x, y) => new Coord(z, x, y)); @@ -589,7 +597,7 @@ public void Reset(bool isOneXOne, GridOrigin origin, int batchSize) { this._httpUtilsMock .Setup(utils => utils.GetTile(It.IsAny(), It.IsAny(), It.IsAny())) - .Returns(new Tile(0, 0, 0, this._jpegImageData)); + .Returns(new Tile(this._configurationManagerMock.Object, 0, 0, 0, this._jpegImageData)); } var extent = new Extent() { MinX = -180, MinY = -90, MaxX = 180, MaxY = 90 }; @@ -629,8 +637,11 @@ public void GetNextBatch(bool isOneXOne, GridOrigin origin, int batchSize) // z = 0 is invalid conversion tile z = 2 is missing tile var tiles = new Tile?[] { - new Tile(0, 0, 0, this._jpegImageData), new Tile(1, 0, 0, this._jpegImageData), null, - new Tile(3, 0, 0, this._jpegImageData), new Tile(4, 0, 0, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 0, 0, 0, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 1, 0, 0, this._jpegImageData), + null, + new Tile(this._configurationManagerMock.Object, 3, 0, 0, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 4, 0, 0, this._jpegImageData), }; var tileBatches = tiles.Where(t => t is not null && (!isOneXOne || t.Z != 0)).Chunk(batchSize).ToList(); diff --git a/MergerLogicUnitTests/DataTypes/TestImages/image.jpeg b/MergerLogicUnitTests/DataTypes/TestImages/image.jpeg new file mode 100644 index 00000000..af163531 Binary files /dev/null and b/MergerLogicUnitTests/DataTypes/TestImages/image.jpeg differ diff --git a/MergerLogicUnitTests/DataTypes/WMTSTest.cs b/MergerLogicUnitTests/DataTypes/WMTSTest.cs index 57684f87..5f089371 100644 --- a/MergerLogicUnitTests/DataTypes/WMTSTest.cs +++ b/MergerLogicUnitTests/DataTypes/WMTSTest.cs @@ -1,4 +1,5 @@ -using MergerLogic.Batching; +using Amazon.Runtime; +using MergerLogic.Batching; using MergerLogic.Clients; using MergerLogic.DataTypes; using MergerLogic.Monitoring.Metrics; @@ -9,7 +10,7 @@ using Moq; using System; using System.Collections.Generic; -using System.IO.Abstractions; +using System.IO; using System.Linq; namespace MergerLogicUnitTests.DataTypes @@ -19,6 +20,8 @@ namespace MergerLogicUnitTests.DataTypes [TestCategory("WMTS")] [TestCategory("WMTSDataSource")] [TestCategory("HttpDataSource")] + [DeploymentItem(@"../../../DataTypes/TestImages")] + public class WMTSTest { @@ -33,9 +36,9 @@ public class WMTSTest private Mock _loggerFactoryMock; private Mock> _loggerMock; private Mock _metricsProviderMock; + private Mock _configurationManagerMock; private byte[] _jpegImageData; - #endregion [TestInitialize] @@ -47,6 +50,7 @@ public void BeforeEach() this._geoUtilsMock = this._repository.Create(); this._utilsFactoryMock = this._repository.Create(); this._metricsProviderMock = this._repository.Create(MockBehavior.Loose); + this._configurationManagerMock = this._repository.Create(); this._utilsFactoryMock.Setup(factory => factory.GetDataUtils(It.IsAny())) .Returns(this._httpUtilsMock.Object); @@ -64,8 +68,10 @@ public void BeforeEach() .Returns(this._loggerFactoryMock.Object); this._serviceProviderMock.Setup(container => container.GetService(typeof(IMetricsProvider))) .Returns(this._metricsProviderMock.Object); - - this._jpegImageData = new byte[] { 0xFF, 0xD8, 0xFF, 0xDB}; + this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "allowedPixelSize")) + .Returns(256); + + this._jpegImageData = File.ReadAllBytes("image.jpeg"); } #region TileExists @@ -125,7 +131,7 @@ public void TileExists(Coord cords, bool isOneXOne, GridOrigin origin, bool useC } else { - var tile = new Tile(cords, this._jpegImageData); + var tile = new Tile(this._configurationManagerMock.Object, cords, this._jpegImageData); Assert.AreEqual(expected, wmtsSource.TileExists(tile)); } this._httpUtilsMock.Verify(util => util.TileExists(cords.Z, cords.X, cords.Y), @@ -159,7 +165,7 @@ public void GetCorrespondingTileWithoutUpscaleWithoutConversion(int batchSize, i { this.SetupConstructorRequiredMocks(); Tile nullTile = null; - var existingTile = new Tile(2, 2, 3, this._jpegImageData); + var existingTile = new Tile(this._configurationManagerMock.Object, 2, 2, 3, this._jpegImageData); this._httpUtilsMock.Setup(utils => utils.GetTile(It.IsAny(), It.IsAny(), It.IsAny())) .Returns((z, x, y) => z == 2 ? existingTile : nullTile); @@ -209,7 +215,7 @@ public void GetCorrespondingTileWithoutUpscale(Coord cords, bool enableUpscale, bool expectedNull = cords.Z != 2; this.SetupConstructorRequiredMocks(); Tile nullTile = null; - var existingTile = new Tile(2, 2, 3, this._jpegImageData); + var existingTile = new Tile(this._configurationManagerMock.Object, 2, 2, 3, this._jpegImageData); var sequence = new MockSequence(); if (origin != GridOrigin.LOWER_LEFT) { @@ -313,7 +319,7 @@ public void GetCorrespondingTileWithUpscale(bool isOneXOne, GridOrigin origin, b { this.SetupConstructorRequiredMocks(); Tile nullTile = null; - var tile = new Tile(2, 2, 3, this._jpegImageData); + var tile = new Tile(this._configurationManagerMock.Object, 2, 2, 3, this._jpegImageData); var sequence = new MockSequence(); if (origin != GridOrigin.LOWER_LEFT) @@ -433,8 +439,9 @@ public void UpdateTiles(bool isOneXOne, GridOrigin origin) var testTiles = new Tile[] { - new Tile(1, 2, 3, this._jpegImageData), new Tile(7, 7, 7, this._jpegImageData), - new Tile(2, 2, 3, this._jpegImageData) + new Tile(this._configurationManagerMock.Object, 1, 2, 3, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 7, 7, 7, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 2, 2, 3, this._jpegImageData) }; Assert.ThrowsException(() => wmtsSource.UpdateTiles(testTiles)); @@ -583,7 +590,7 @@ public void Reset(bool isOneXOne, GridOrigin origin, int batchSize) .Returns(t => t); this._httpUtilsMock .Setup(utils => utils.GetTile(It.IsAny())) - .Returns(new Tile(0, 0, 0, this._jpegImageData)); + .Returns(new Tile(this._configurationManagerMock.Object, 0, 0, 0, this._jpegImageData)); this._oneXOneConvertorMock .Setup(converter => converter.TryFromTwoXOne(It.IsAny(), It.IsAny(), It.IsAny())) .Returns((z, x, y) => new Coord(z, x, y)); @@ -592,7 +599,7 @@ public void Reset(bool isOneXOne, GridOrigin origin, int batchSize) { this._httpUtilsMock .Setup(utils => utils.GetTile(It.IsAny(), It.IsAny(), It.IsAny())) - .Returns(new Tile(0, 0, 0, this._jpegImageData)); + .Returns(new Tile(this._configurationManagerMock.Object, 0, 0, 0, this._jpegImageData)); } var extent = new Extent() { MinX = -180, MinY = -90, MaxX = 180, MaxY = 90 }; @@ -632,12 +639,15 @@ public void GetNextBatch(bool isOneXOne, GridOrigin origin, int batchSize) // z = 0 is invalid conversion tile z = 2 is missing tile var tiles = new Tile?[] { - new Tile(0, 0, 0, this._jpegImageData), new Tile(1, 0, 0, this._jpegImageData), null, - new Tile(3, 0, 0, this._jpegImageData), new Tile(4, 0, 0, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 0, 0, 0, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 1, 0, 0, this._jpegImageData), + null, + new Tile(this._configurationManagerMock.Object, 3, 0, 0, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 4, 0, 0, this._jpegImageData), }; var tileBatches = tiles.Where(t => t is not null && (!isOneXOne || t.Z != 0)).Chunk(batchSize).ToList(); var seq = new MockSequence(); - + for (var i = minZoom; i <= maxZoom; i++) { this._geoUtilsMock diff --git a/MergerLogicUnitTests/DataTypes/XYZTest.cs b/MergerLogicUnitTests/DataTypes/XYZTest.cs index 8bec11fe..f87badea 100644 --- a/MergerLogicUnitTests/DataTypes/XYZTest.cs +++ b/MergerLogicUnitTests/DataTypes/XYZTest.cs @@ -9,6 +9,7 @@ using Moq; using System; using System.Collections.Generic; +using System.IO; using System.Linq; namespace MergerLogicUnitTests.DataTypes @@ -18,6 +19,7 @@ namespace MergerLogicUnitTests.DataTypes [TestCategory("XYZ")] [TestCategory("XYZDataSource")] [TestCategory("HttpDataSource")] + [DeploymentItem(@"../../../DataTypes/TestImages")] public class XYZTest { @@ -32,6 +34,7 @@ public class XYZTest private Mock _loggerFactoryMock; private Mock> _loggerMock; private Mock _metricsProviderMock; + private Mock _configurationManagerMock; private byte[] _jpegImageData; #endregion @@ -45,6 +48,7 @@ public void BeforeEach() this._geoUtilsMock = this._repository.Create(); this._utilsFactoryMock = this._repository.Create(); this._metricsProviderMock = this._repository.Create(MockBehavior.Loose); + this._configurationManagerMock = this._repository.Create(); this._utilsFactoryMock.Setup(factory => factory.GetDataUtils(It.IsAny())) .Returns(this._httpUtilsMock.Object); @@ -62,8 +66,10 @@ public void BeforeEach() .Returns(this._loggerFactoryMock.Object); this._serviceProviderMock.Setup(container => container.GetService(typeof(IMetricsProvider))) .Returns(this._metricsProviderMock.Object); - - this._jpegImageData = new byte[] { 0xFF, 0xD8, 0xFF, 0xDB}; + this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "allowedPixelSize")) + .Returns(256); + + this._jpegImageData = File.ReadAllBytes("no_transparency.jpeg"); } #region TileExists @@ -75,7 +81,6 @@ public static IEnumerable GenTileExistsParams() new Coord(2,2,3), //existing tile new Coord(1,2,3), //missing tile new Coord(0,2,3) //invalid conversion tile - }, //cords new object[] { true, false }, //is one on one new object[] { GridOrigin.LOWER_LEFT, GridOrigin.UPPER_LEFT }, //origin @@ -123,7 +128,7 @@ public void TileExists(Coord cords, bool isOneXOne, GridOrigin origin, bool useC } else { - var tile = new Tile(cords, this._jpegImageData); + var tile = new Tile(this._configurationManagerMock.Object, cords, this._jpegImageData); Assert.AreEqual(expected, xyzSource.TileExists(tile)); } this._httpUtilsMock.Verify(util => util.TileExists(cords.Z, cords.X, cords.Y), @@ -157,7 +162,7 @@ public void GetCorrespondingTileWithoutUpscaleWithoutConversion(int batchSize, i { this.SetupConstructorRequiredMocks(); Tile nullTile = null; - var existingTile = new Tile(2, 2, 3, this._jpegImageData); + var existingTile = new Tile(this._configurationManagerMock.Object, 2, 2, 3, this._jpegImageData); this._httpUtilsMock.Setup(utils => utils.GetTile(It.IsAny(), It.IsAny(), It.IsAny())) .Returns((z, x, y) => z == 2 ? existingTile : nullTile); @@ -207,7 +212,7 @@ public void GetCorrespondingTileWithoutUpscale(Coord cords, bool enableUpscale, bool expectedNull = cords.Z != 2; this.SetupConstructorRequiredMocks(); Tile nullTile = null; - var existingTile = new Tile(2, 2, 3, this._jpegImageData); + var existingTile = new Tile(this._configurationManagerMock.Object, 2, 2, 3, this._jpegImageData); var sequence = new MockSequence(); if (origin != GridOrigin.LOWER_LEFT) { @@ -311,7 +316,7 @@ public void GetCorrespondingTileWithUpscale(bool isOneXOne, GridOrigin origin, b { this.SetupConstructorRequiredMocks(); Tile nullTile = null; - var tile = new Tile(2, 2, 3, this._jpegImageData); + var tile = new Tile(this._configurationManagerMock.Object, 2, 2, 3, this._jpegImageData); var sequence = new MockSequence(); if (origin != GridOrigin.LOWER_LEFT) @@ -431,8 +436,9 @@ public void UpdateTiles(bool isOneXOne, GridOrigin origin) var testTiles = new Tile[] { - new Tile(1, 2, 3, this._jpegImageData), new Tile(7, 7, 7, this._jpegImageData), - new Tile(2, 2, 3, this._jpegImageData) + new Tile(this._configurationManagerMock.Object, 1, 2, 3, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 7, 7, 7, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 2, 2, 3, this._jpegImageData) }; Assert.ThrowsException(() => xyzSource.UpdateTiles(testTiles)); @@ -581,7 +587,7 @@ public void Reset(bool isOneXOne, GridOrigin origin, int batchSize) .Returns(t => t); this._httpUtilsMock .Setup(utils => utils.GetTile(It.IsAny())) - .Returns(new Tile(0, 0, 0, this._jpegImageData)); + .Returns(new Tile(this._configurationManagerMock.Object, 0, 0, 0, this._jpegImageData)); this._oneXOneConvertorMock .Setup(converter => converter.TryFromTwoXOne(It.IsAny(), It.IsAny(), It.IsAny())) .Returns((z, x, y) => new Coord(z, x, y)); @@ -590,7 +596,7 @@ public void Reset(bool isOneXOne, GridOrigin origin, int batchSize) { this._httpUtilsMock .Setup(utils => utils.GetTile(It.IsAny(), It.IsAny(), It.IsAny())) - .Returns(new Tile(0, 0, 0, this._jpegImageData)); + .Returns(new Tile(this._configurationManagerMock.Object, 0, 0, 0, this._jpegImageData)); } var extent = new Extent() { MinX = -180, MinY = -90, MaxX = 180, MaxY = 90 }; @@ -630,12 +636,15 @@ public void GetNextBatch(bool isOneXOne, GridOrigin origin, int batchSize) // z = 0 is invalid conversion tile z = 2 is missing tile var tiles = new Tile?[] { - new Tile(0, 0, 0, this._jpegImageData), new Tile(1, 0, 0, this._jpegImageData), null, - new Tile(3, 0, 0, this._jpegImageData), new Tile(4, 0, 0, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 0, 0, 0, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 1, 0, 0, this._jpegImageData), + null, + new Tile(this._configurationManagerMock.Object, 3, 0, 0, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 4, 0, 0, this._jpegImageData), }; var tileBatches = tiles.Where(t => t is not null && (!isOneXOne || t.Z != 0)).Chunk(batchSize).ToList(); var seq = new MockSequence(); - + for (var i = minZoom; i <= maxZoom; i++) { this._geoUtilsMock diff --git a/MergerLogicUnitTests/ImageProcessing/TileMergerTest.cs b/MergerLogicUnitTests/ImageProcessing/TileMergerTest.cs index 536ac9b9..8719b3f0 100644 --- a/MergerLogicUnitTests/ImageProcessing/TileMergerTest.cs +++ b/MergerLogicUnitTests/ImageProcessing/TileMergerTest.cs @@ -2,6 +2,7 @@ using MergerLogic.DataTypes; using MergerLogic.ImageProcessing; using MergerLogic.Monitoring.Metrics; +using MergerLogic.Utils; using Microsoft.Extensions.Logging; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; @@ -24,6 +25,8 @@ public class TileMergerTest private TileMerger _testTileMerger; + private Mock _configurationManagerMock; + #endregion [TestInitialize] @@ -34,9 +37,13 @@ public void BeforeEach() var metricsProviderMock = this._mockRepository.Create(); var tileScalerLoggerMock = this._mockRepository.Create>(); var tileMergerLoggerMock = this._mockRepository.Create>(); + this._configurationManagerMock = this._mockRepository.Create(); + + this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "allowedPixelSize")) + .Returns(256); - var testTileScaler = new TileScaler(metricsProviderMock.Object, tileScalerLoggerMock.Object); - this._testTileMerger = new TileMerger(testTileScaler, tileMergerLoggerMock.Object); + var testTileScaler = new TileScaler(metricsProviderMock.Object, tileScalerLoggerMock.Object, this._configurationManagerMock.Object); + this._testTileMerger = new TileMerger(testTileScaler, tileMergerLoggerMock.Object, this._configurationManagerMock.Object); } #region MergeTiles @@ -50,114 +57,114 @@ public static IEnumerable GetMergeTilesTestParameters() #region Regular merge test cases yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("2.png")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("1.png")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("2.png")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("1.png")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Jpeg), TileFormat.Jpeg, false, File.ReadAllBytes("2_1_merged.jpeg"), }; yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("1.png")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("1.png")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Jpeg), TileFormat.Jpeg, false, File.ReadAllBytes("3_1_merged.jpeg"), }; yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("1.png")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("3.jpeg")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("1.png")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("3.jpeg")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Jpeg), TileFormat.Jpeg, false, File.ReadAllBytes("3.jpeg"), }; yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("4.jpeg")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("4.jpeg")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Jpeg), TileFormat.Jpeg, false, File.ReadAllBytes("3_4_merged.jpeg"), }; yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("2.png")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("1.png")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("2.png")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("1.png")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Png), TileFormat.Png, false, File.ReadAllBytes("2_1_merged.png"), }; yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("2.png")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("1.png")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("2.png")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("1.png")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Png, TileFormatStrategy.FormatStrategy.Mixed), TileFormat.Png, false, File.ReadAllBytes("2_1_merged.png"), }; yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("2.png")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("1.png")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("2.png")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("1.png")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Jpeg, TileFormatStrategy.FormatStrategy.Mixed), TileFormat.Png, false, File.ReadAllBytes("2_1_merged.png"), }; yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("1.png")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("1.png")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Png, TileFormatStrategy.FormatStrategy.Mixed), TileFormat.Jpeg, false, File.ReadAllBytes("3_1_merged.jpeg"), }; yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("4.jpeg")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("4.jpeg")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Png, TileFormatStrategy.FormatStrategy.Mixed), TileFormat.Jpeg, false, File.ReadAllBytes("3_4_merged.jpeg"), }; yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("5.png")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("5.png")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("5.png")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("5.png")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Png, TileFormatStrategy.FormatStrategy.Mixed), TileFormat.Jpeg, false, File.ReadAllBytes("5.jpeg"), }; yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), - new Tile(targetCoordLowZoom, File.ReadAllBytes("1.png")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), + new Tile(this._configurationManagerMock.Object, targetCoordLowZoom, File.ReadAllBytes("1.png")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Jpeg), TileFormat.Jpeg, false, File.ReadAllBytes("3_1_merged_upscaled_5_15.jpeg"), }; yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), - new Tile(targetCoordMediumZoom, File.ReadAllBytes("1.png")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), + new Tile(this._configurationManagerMock.Object, targetCoordMediumZoom, File.ReadAllBytes("1.png")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Jpeg), TileFormat.Jpeg, false, File.ReadAllBytes("3_1_merged_upscaled_14_15.jpeg"), }; yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("1.png")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("4.jpeg")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("1.png")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("4.jpeg")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Jpeg), TileFormat.Jpeg, false, File.ReadAllBytes("4.jpeg"), }; yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("2.png")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("1.png")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("2.png")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("1.png")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Png, TileFormatStrategy.FormatStrategy.Mixed), TileFormat.Jpeg, false, File.ReadAllBytes("3_2_1_merged.jpeg"), }; @@ -166,118 +173,118 @@ public static IEnumerable GetMergeTilesTestParameters() #region Test cases for ignoring target yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("2.png")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("1.png")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("2.png")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("1.png")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Jpeg), TileFormat.Jpeg, true, File.ReadAllBytes("1.jpeg"), }; yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("1.png")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("1.png")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Jpeg), TileFormat.Jpeg, true, File.ReadAllBytes("1.jpeg"), }; yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("1.png")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("3.jpeg")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("1.png")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("3.jpeg")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Jpeg), TileFormat.Jpeg, true, File.ReadAllBytes("3.jpeg"), }; yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("4.jpeg")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("4.jpeg")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Jpeg), TileFormat.Jpeg, true, File.ReadAllBytes("4.jpeg"), }; yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("2.png")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("1.png")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("2.png")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("1.png")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Png), TileFormat.Png, true, File.ReadAllBytes("1.png"), }; yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("2.png")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("1.png")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("2.png")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("1.png")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Png, TileFormatStrategy.FormatStrategy.Mixed), TileFormat.Png, true, File.ReadAllBytes("1.png"), }; yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("2.png")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("1.png")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("2.png")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("1.png")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Jpeg, TileFormatStrategy.FormatStrategy.Mixed), TileFormat.Png, true, File.ReadAllBytes("1.png"), }; yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("1.png")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("1.png")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Png, TileFormatStrategy.FormatStrategy.Mixed), TileFormat.Png, true, File.ReadAllBytes("1.png"), }; yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("2.png")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("1.png")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("2.png")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("1.png")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Jpeg), TileFormat.Jpeg, true, File.ReadAllBytes("2_1_merged.jpeg"), }; yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("2.png")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("1.png")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("2.png")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("1.png")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Jpeg), TileFormat.Jpeg, true, File.ReadAllBytes("3_1_merged.jpeg"), }; yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("1.png")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("2.png")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("3.jpeg")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("1.png")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("2.png")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("3.jpeg")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Jpeg), TileFormat.Jpeg, true, File.ReadAllBytes("3.jpeg"), }; yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("1.png")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("4.jpeg")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("1.png")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("4.jpeg")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Jpeg), TileFormat.Jpeg, true, File.ReadAllBytes("4.jpeg"), }; yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("2.png")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("1.png")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("2.png")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("1.png")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Png), TileFormat.Png, true, File.ReadAllBytes("2_1_merged.png"), }; yield return new object[] { new Tile[] { - new Tile(targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("2.png")), - new Tile(targetCoordHighZoom, File.ReadAllBytes("1.png")) + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("3.jpeg")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("2.png")), + new Tile(this._configurationManagerMock.Object, targetCoordHighZoom, File.ReadAllBytes("1.png")) }, targetCoordHighZoom, new TileFormatStrategy(TileFormat.Png, TileFormatStrategy.FormatStrategy.Mixed), TileFormat.Png, true, File.ReadAllBytes("2_1_merged.png"), }; diff --git a/MergerLogicUnitTests/ImageProcessing/TileScalerTest.cs b/MergerLogicUnitTests/ImageProcessing/TileScalerTest.cs index ffeb3fc3..6838acdb 100644 --- a/MergerLogicUnitTests/ImageProcessing/TileScalerTest.cs +++ b/MergerLogicUnitTests/ImageProcessing/TileScalerTest.cs @@ -1,7 +1,9 @@ -using MergerLogic.Batching; +using Castle.Components.DictionaryAdapter.Xml; +using MergerLogic.Batching; using MergerLogic.DataTypes; using MergerLogic.ImageProcessing; using MergerLogic.Monitoring.Metrics; +using MergerLogic.Utils; using Microsoft.Extensions.Logging; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; @@ -20,6 +22,7 @@ public class TileScalerTest #region mocks private MockRepository _mockRepository; + private Mock _configurationManagerMock; private TileScaler _testTileScaler; @@ -32,8 +35,12 @@ public void BeforeEach() var metricsProviderMock = this._mockRepository.Create(); var tileScalerLoggerMock = this._mockRepository.Create>(); + this._configurationManagerMock = this._mockRepository.Create(); - this._testTileScaler = new TileScaler(metricsProviderMock.Object, tileScalerLoggerMock.Object); + this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "allowedPixelSize")) + .Returns(256); + + this._testTileScaler = new TileScaler(metricsProviderMock.Object, tileScalerLoggerMock.Object, this._configurationManagerMock.Object); } #region Upscale @@ -110,7 +117,7 @@ public void BeforeEach() [DynamicData(nameof(GetUpscaleTilesTestParameters), DynamicDataSourceType.Method)] public void Upscale(byte[] tileBytes, Coord baseTileCoord, Coord targetCoord, byte[]? expectedTileBytes) { - var testTile = new Tile(baseTileCoord, tileBytes); + var testTile = new Tile(this._configurationManagerMock.Object, baseTileCoord, tileBytes); var resultTile = this._testTileScaler.Upscale(testTile, targetCoord); if (expectedTileBytes is null) diff --git a/MergerLogicUnitTests/MergerLogicUnitTests.csproj b/MergerLogicUnitTests/MergerLogicUnitTests.csproj index bafdd798..99993d5d 100644 --- a/MergerLogicUnitTests/MergerLogicUnitTests.csproj +++ b/MergerLogicUnitTests/MergerLogicUnitTests.csproj @@ -9,7 +9,7 @@ - + diff --git a/MergerLogicUnitTests/Utils/GeoUtilsTest.cs b/MergerLogicUnitTests/Utils/GeoUtilsTest.cs index df06cf55..806af1fa 100644 --- a/MergerLogicUnitTests/Utils/GeoUtilsTest.cs +++ b/MergerLogicUnitTests/Utils/GeoUtilsTest.cs @@ -3,8 +3,10 @@ using MergerLogic.Utils; using MergerLogicUnitTests.testUtils; using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; using System; using System.Collections.Generic; +using System.IO; namespace MergerLogicUnitTests.Utils { @@ -12,10 +14,14 @@ namespace MergerLogicUnitTests.Utils [TestCategory("unit")] [TestCategory("geo")] [TestCategory("geoUtils")] + [DeploymentItem(@"../../../Utils/TestData")] + public class GeoUtilsTest { #region mocks + private MockRepository _repository; + private Mock _configurationManagerMock; private byte[] _jpegImageData; #endregion @@ -23,7 +29,11 @@ public class GeoUtilsTest [TestInitialize] public void BeforeEach() { - this._jpegImageData = new byte[] { 0xFF, 0xD8, 0xFF, 0xDB}; + this._repository = new MockRepository(MockBehavior.Strict); + this._configurationManagerMock = this._repository.Create(); + this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "allowedPixelSize")) + .Returns(256); + this._jpegImageData = File.ReadAllBytes("no_transparency.jpeg"); } #region FlipY @@ -55,7 +65,7 @@ public void FlipY(GetFlipYParamType paramType, Coord coords) res = geoUtils.FlipY(coords.Z, coords.Y); break; case GetFlipYParamType.Tile: - res = geoUtils.FlipY(new Tile(coords, this._jpegImageData)); + res = geoUtils.FlipY(new Tile(this._configurationManagerMock.Object, coords, this._jpegImageData)); break; } Assert.AreEqual(coords.X, res); diff --git a/MergerLogicUnitTests/Utils/GpkgUtilsTest.cs b/MergerLogicUnitTests/Utils/GpkgUtilsTest.cs index d9d4b7ec..1d4858fd 100644 --- a/MergerLogicUnitTests/Utils/GpkgUtilsTest.cs +++ b/MergerLogicUnitTests/Utils/GpkgUtilsTest.cs @@ -10,6 +10,7 @@ using System.Collections.Generic; using System.Data; using System.Data.SQLite; +using System.IO; using System.IO.Abstractions; using System.Linq; @@ -19,6 +20,7 @@ namespace MergerLogicUnitTests.Utils [TestCategory("unit")] [TestCategory("gpkg")] [TestCategory("gpkgUtils")] + [DeploymentItem(@"../../../Utils/TestData")] public class GpkgUtilsTest { #region mocks @@ -30,6 +32,7 @@ public class GpkgUtilsTest private Mock _fileSystemMock; private Mock _pathMock; private Mock _fileMock; + private Mock _configurationManagerMock; private byte[] _jpegImageData; #endregion @@ -43,11 +46,15 @@ public void BeforeEach() this._pathMock = this._repository.Create(); this._fileMock = this._repository.Create(); this._fileSystemMock = this._repository.Create(); + this._configurationManagerMock = this._repository.Create(); + this._loggerMock = this._repository.Create>(MockBehavior.Loose); + this._fileSystemMock.SetupGet(fs => fs.File).Returns(this._fileMock.Object); this._fileSystemMock.SetupGet(fs => fs.Path).Returns(this._pathMock.Object); - this._loggerMock = this._repository.Create>(MockBehavior.Loose); + this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "allowedPixelSize")) + .Returns(256); - this._jpegImageData = new byte[] { 0xFF, 0xD8, 0xFF, 0xDB}; + this._jpegImageData = File.ReadAllBytes("no_transparency.jpeg"); } #region GetTile @@ -68,7 +75,7 @@ public void GetTile(bool exist, bool useCoords) { var data = this._jpegImageData; var cords = new Coord(0, 0, 0); - var testTiles = exist ? new Tile[] { new Tile(cords, data) } : Array.Empty(); + var testTiles = exist ? new Tile[] { new Tile(this._configurationManagerMock.Object, cords, data) } : Array.Empty(); string path = this.GetGpkgPath(); using (var connection = new SQLiteConnection($"Data Source={path}")) @@ -78,7 +85,7 @@ public void GetTile(bool exist, bool useCoords) this.CreateTestTiles(connection, testTiles); //create tile table var gpkgUtils = new GpkgClient(path, this._timeUtilsMock.Object, this._loggerMock.Object, - this._fileSystemMock.Object, this._geoUtilsMock.Object); + this._fileSystemMock.Object, this._geoUtilsMock.Object, this._configurationManagerMock.Object); var res = useCoords ? gpkgUtils.GetTile(cords) : gpkgUtils.GetTile(cords.Z, cords.X, cords.Y); @@ -109,7 +116,7 @@ public void TileExists(bool exist) { var data = this._jpegImageData; var cords = new Coord(0, 0, 0); - var testTiles = exist ? new Tile[] { new Tile(cords, data) } : Array.Empty(); + var testTiles = exist ? new Tile[] { new Tile(this._configurationManagerMock.Object, cords, data) } : Array.Empty(); string path = this.GetGpkgPath(); using (var connection = new SQLiteConnection($"Data Source={path}")) @@ -119,7 +126,7 @@ public void TileExists(bool exist) this.CreateTestTiles(connection, testTiles); //create tile table var gpkgUtils = new GpkgClient(path, this._timeUtilsMock.Object, this._loggerMock.Object, - this._fileSystemMock.Object, this._geoUtilsMock.Object); + this._fileSystemMock.Object, this._geoUtilsMock.Object, this._configurationManagerMock.Object); var res = gpkgUtils.TileExists(cords.Z, cords.X, cords.Y); @@ -129,7 +136,7 @@ public void TileExists(bool exist) } #endregion - + #region GetBatch public static IEnumerable GenGetBatchParams() { @@ -147,9 +154,12 @@ public void GetBatch(int batchSize, int offset) string path = this.GetGpkgPath(); var testTiles = new Tile[] { - new Tile(0, 0, 0, this._jpegImageData), new Tile(1, 1, 1, this._jpegImageData), - new Tile(2, 2, 2, this._jpegImageData),new Tile(3, 3, 3, this._jpegImageData), - new Tile(4, 4, 4, this._jpegImageData),new Tile(5, 5, 5, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 0, 0, 0, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 1, 1, 1, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 2, 2, 2, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 3, 3, 3, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 4, 4, 4, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 5, 5, 5, this._jpegImageData), }; using (var connection = new SQLiteConnection($"Data Source={path}")) @@ -159,7 +169,7 @@ public void GetBatch(int batchSize, int offset) this.CreateTestTiles(connection, testTiles); var gpkgUtils = new GpkgClient(path, this._timeUtilsMock.Object, this._loggerMock.Object, - this._fileSystemMock.Object, this._geoUtilsMock.Object); + this._fileSystemMock.Object, this._geoUtilsMock.Object, this._configurationManagerMock.Object); var comparer = ComparerFactory.Create((t1, t2) => t1?.Z == t2?.Z && t1?.X == t2?.X && t1?.Y == t2?.Y ? 0 : -1); var res = gpkgUtils.GetBatch(batchSize, offset); @@ -177,7 +187,7 @@ public void GetBatchWithLongOffset() string path = this.GetGpkgPath(); var testTiles = new Tile[] { - new Tile(0, 0, 0, this._jpegImageData) + new Tile(this._configurationManagerMock.Object, 0, 0, 0, this._jpegImageData) }; using (var connection = new SQLiteConnection($"Data Source={path}")) @@ -187,7 +197,7 @@ public void GetBatchWithLongOffset() this.CreateTestTiles(connection, testTiles); var gpkgUtils = new GpkgClient(path, this._timeUtilsMock.Object, this._loggerMock.Object, - this._fileSystemMock.Object, this._geoUtilsMock.Object); + this._fileSystemMock.Object, this._geoUtilsMock.Object, this._configurationManagerMock.Object); var res = gpkgUtils.GetBatch(21, offset); CollectionAssert.AreEqual(Array.Empty(), res); @@ -225,7 +235,7 @@ public void GetExtent(Extent extent) this.SetupConstructorRequiredMocks(connection, extent: extent); var gpkgUtils = new GpkgClient(path, this._timeUtilsMock.Object, this._loggerMock.Object, - this._fileSystemMock.Object, this._geoUtilsMock.Object); + this._fileSystemMock.Object, this._geoUtilsMock.Object, this._configurationManagerMock.Object); var res = gpkgUtils.GetExtent(); Assert.AreEqual(extent, res); @@ -255,8 +265,9 @@ public void GetLastTile(Coord baseCoords) string path = this.GetGpkgPath(); var testTiles = new Tile[] { - new Tile(3, 3, 3, this._jpegImageData), - new Tile(4, 4, 4, this._jpegImageData),new Tile(5, 5, 5, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 3, 3, 3, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 4, 4, 4, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 5, 5, 5, this._jpegImageData), }; using (var connection = new SQLiteConnection($"Data Source={path}")) @@ -266,7 +277,7 @@ public void GetLastTile(Coord baseCoords) this.CreateTestTiles(connection, testTiles); var gpkgUtils = new GpkgClient(path, this._timeUtilsMock.Object, this._loggerMock.Object, - this._fileSystemMock.Object, this._geoUtilsMock.Object); + this._fileSystemMock.Object, this._geoUtilsMock.Object, this._configurationManagerMock.Object); var coords = new List(); for (int i = 0; i < baseCoords.Z; i++) { @@ -311,7 +322,7 @@ public void GetTileCount(int tileCount) var testTiles = new List(tileCount); for (int i = 0; i < tileCount; i++) { - testTiles.Add(new Tile(0, i, 0, this._jpegImageData)); + testTiles.Add(new Tile(this._configurationManagerMock.Object, 0, i, 0, this._jpegImageData)); }; using (var connection = new SQLiteConnection($"Data Source={path}")) @@ -321,7 +332,7 @@ public void GetTileCount(int tileCount) this.CreateTestTiles(connection, testTiles); var gpkgUtils = new GpkgClient(path, this._timeUtilsMock.Object, this._loggerMock.Object, - this._fileSystemMock.Object, this._geoUtilsMock.Object); + this._fileSystemMock.Object, this._geoUtilsMock.Object, this._configurationManagerMock.Object); var res = gpkgUtils.GetTileCount(); Assert.AreEqual(tileCount, res); @@ -338,11 +349,13 @@ public void GetTileCount(int tileCount) public void InsertTiles() { string path = this.GetGpkgPath(); - var existingTiles = new Tile[] { new Tile(0, 0, 0, this._jpegImageData), new Tile(3, 3, 3, this._jpegImageData) }; + var existingTiles = new Tile[] { new Tile(this._configurationManagerMock.Object, 0, 0, 0, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 3, 3, 3, this._jpegImageData) }; var testTiles = new Tile[] { - new Tile(3, 3, 3, this._jpegImageData), - new Tile(4, 4, 4, this._jpegImageData),new Tile(5, 5, 5, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 3, 3, 3, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 4, 4, 4, this._jpegImageData), + new Tile(this._configurationManagerMock.Object, 5, 5, 5, this._jpegImageData), }; using (var connection = new SQLiteConnection($"Data Source={path}")) @@ -352,7 +365,7 @@ public void InsertTiles() this.CreateTestTiles(connection, existingTiles); var gpkgUtils = new GpkgClient(path, this._timeUtilsMock.Object, this._loggerMock.Object, - this._fileSystemMock.Object, this._geoUtilsMock.Object); + this._fileSystemMock.Object, this._geoUtilsMock.Object, this._configurationManagerMock.Object); gpkgUtils.InsertTiles(testTiles); @@ -365,7 +378,7 @@ public void InsertTiles() { while (reader.Read()) { - res.Add(new Tile(reader.GetInt32(0), reader.GetInt32(1), reader.GetInt32(2), (byte[])reader["tile_data"])); + res.Add(new Tile(this._configurationManagerMock.Object, reader.GetInt32(0), reader.GetInt32(1), reader.GetInt32(2), (byte[])reader["tile_data"])); } } } @@ -399,7 +412,7 @@ public void UpdateExtent(Extent extent) this.SetupConstructorRequiredMocks(connection); var gpkgUtils = new GpkgClient(path, this._timeUtilsMock.Object, this._loggerMock.Object, - this._fileSystemMock.Object, this._geoUtilsMock.Object); + this._fileSystemMock.Object, this._geoUtilsMock.Object, this._configurationManagerMock.Object); gpkgUtils.UpdateExtent(extent); using (var command = connection.CreateCommand()) @@ -449,7 +462,7 @@ public void Exist(bool exist) .Returns(exist); var gpkgUtils = new GpkgClient(path, this._timeUtilsMock.Object, this._loggerMock.Object, - this._fileSystemMock.Object, this._geoUtilsMock.Object); + this._fileSystemMock.Object, this._geoUtilsMock.Object, this._configurationManagerMock.Object); Assert.AreEqual(exist, gpkgUtils.Exist()); @@ -484,7 +497,7 @@ public void DeleteTileTableTriggers() } var gpkgUtils = new GpkgClient(path, this._timeUtilsMock.Object, this._loggerMock.Object, - this._fileSystemMock.Object, this._geoUtilsMock.Object); + this._fileSystemMock.Object, this._geoUtilsMock.Object, this._configurationManagerMock.Object); gpkgUtils.DeleteTileTableTriggers(); @@ -516,7 +529,7 @@ public void CreateTileCacheValidationTriggers() this.CreateTestTiles(connection, Array.Empty()); var gpkgUtils = new GpkgClient(path, this._timeUtilsMock.Object, this._loggerMock.Object, - this._fileSystemMock.Object, this._geoUtilsMock.Object); + this._fileSystemMock.Object, this._geoUtilsMock.Object, this._configurationManagerMock.Object); gpkgUtils.CreateTileCacheValidationTriggers(); @@ -561,7 +574,7 @@ public void UpdateTileMatrixTable(bool isOneXOne, int maxZoom) { connection.Open(); this.SetupConstructorRequiredMocks(connection); - this.CreateTestTiles(connection, new Tile[] { new Tile(maxZoom, 0, 0, this._jpegImageData) }); + this.CreateTestTiles(connection, new Tile[] { new Tile(this._configurationManagerMock.Object, maxZoom, 0, 0, this._jpegImageData) }); using (var command = connection.CreateCommand()) { command.CommandText = "CREATE TABLE gpkg_tile_matrix (" + @@ -577,7 +590,7 @@ public void UpdateTileMatrixTable(bool isOneXOne, int maxZoom) } var gpkgUtils = new GpkgClient(path, this._timeUtilsMock.Object, this._loggerMock.Object, - this._fileSystemMock.Object, this._geoUtilsMock.Object); + this._fileSystemMock.Object, this._geoUtilsMock.Object, this._configurationManagerMock.Object); gpkgUtils.UpdateTileMatrixTable(isOneXOne); @@ -690,7 +703,7 @@ public void IsValidGridWithValidMatrixSet(bool isOneXOne, string gridValues, boo } var gpkgUtils = new GpkgClient(path, this._timeUtilsMock.Object, this._loggerMock.Object, - this._fileSystemMock.Object, this._geoUtilsMock.Object); + this._fileSystemMock.Object, this._geoUtilsMock.Object, this._configurationManagerMock.Object); Assert.AreEqual(expected, gpkgUtils.IsValidGrid(isOneXOne)); } @@ -756,7 +769,7 @@ public void IsValidGridWithInvalidMatrixSet(bool isOneXOne, string matrixSetValu } var gpkgUtils = new GpkgClient(path, this._timeUtilsMock.Object, this._loggerMock.Object, - this._fileSystemMock.Object, this._geoUtilsMock.Object); + this._fileSystemMock.Object, this._geoUtilsMock.Object, this._configurationManagerMock.Object); Assert.AreEqual(expected, gpkgUtils.IsValidGrid(isOneXOne)); } @@ -839,8 +852,10 @@ private void CreateTestTiles(SQLiteConnection connection, IEnumerable test foreach (Tile tile in testTiles) { byte[] tileBytes = tile.GetImageBytes(); - SQLiteParameter blobParameter = new SQLiteParameter("$blob", System.Data.DbType.Binary, tileBytes.Length); - blobParameter.Value = tileBytes; + SQLiteParameter blobParameter = new SQLiteParameter("$blob", DbType.Binary, tileBytes.Length) + { + Value = tileBytes + }; command.Parameters.AddWithValue("$z", tile.Z); command.Parameters.AddWithValue("$x", tile.X); diff --git a/MergerLogicUnitTests/Utils/HttpSourceUtilsTest.cs b/MergerLogicUnitTests/Utils/HttpSourceUtilsTest.cs index 5a86da28..3c8c5fbe 100644 --- a/MergerLogicUnitTests/Utils/HttpSourceUtilsTest.cs +++ b/MergerLogicUnitTests/Utils/HttpSourceUtilsTest.cs @@ -3,6 +3,7 @@ using MergerLogic.Utils; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; +using System.IO; namespace MergerLogicUnitTests.Utils { @@ -10,6 +11,7 @@ namespace MergerLogicUnitTests.Utils [TestCategory("unit")] [TestCategory("http")] [TestCategory("HttpUtils")] + [DeploymentItem(@"../../../Utils/TestData")] public class HttpSourceUtilsTest { #region mocks @@ -17,8 +19,10 @@ public class HttpSourceUtilsTest private Mock _httpRequestUtilsMock; private Mock _pathPatternUtilsMock; private Mock _geoUtilsMock; + private Mock _configurationManagerMock; private byte[] _jpegImageData; #endregion + private readonly Times anyNumberOfTimes = Times.AtMost(int.MaxValue); [TestInitialize] public void beforeEach() @@ -27,8 +31,12 @@ public void beforeEach() this._httpRequestUtilsMock = this._repository.Create(); this._pathPatternUtilsMock = this._repository.Create(); this._geoUtilsMock = this._repository.Create(); + this._configurationManagerMock = this._repository.Create(); - this._jpegImageData = new byte[] { 0xFF, 0xD8, 0xFF, 0xDB}; + this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "allowedPixelSize")) + .Returns(256).Verifiable(anyNumberOfTimes); + + this._jpegImageData = File.ReadAllBytes("no_transparency.jpeg"); } #region GetTile @@ -49,7 +57,7 @@ public void GetTile(bool useCoords, bool returnsNull) .Returns(returnsNull ? null : data); var httpSourceUtils = new HttpSourceClient("http://testPath", this._httpRequestUtilsMock.Object, - this._pathPatternUtilsMock.Object, this._geoUtilsMock.Object); + this._pathPatternUtilsMock.Object, this._geoUtilsMock.Object, this._configurationManagerMock.Object); var res = useCoords ? httpSourceUtils.GetTile(cords) : httpSourceUtils.GetTile(cords.Z, cords.X, cords.Y); if (returnsNull) @@ -84,11 +92,11 @@ public void TileExists(bool exist) .Returns(exist ? data : null); var httpSourceUtils = new HttpSourceClient("http://testPath", this._httpRequestUtilsMock.Object, - this._pathPatternUtilsMock.Object, this._geoUtilsMock.Object); + this._pathPatternUtilsMock.Object, this._geoUtilsMock.Object, this._configurationManagerMock.Object); var res = httpSourceUtils.TileExists(cords.Z, cords.X, cords.Y); - Assert.AreEqual(exist,res); + Assert.AreEqual(exist, res); this._repository.VerifyAll(); } diff --git a/MergerLogicUnitTests/Utils/ImageUtilsTest.cs b/MergerLogicUnitTests/Utils/ImageUtilsTest.cs index cfce16fe..cdadf69e 100644 --- a/MergerLogicUnitTests/Utils/ImageUtilsTest.cs +++ b/MergerLogicUnitTests/Utils/ImageUtilsTest.cs @@ -1,6 +1,8 @@ using ImageMagick; +using MergerLogic.Batching; using MergerLogic.Utils; using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; using System.Collections.Generic; using System.IO; @@ -86,7 +88,6 @@ public void IsFullyTransparent(byte[] imageBytes, bool expectedResult) Assert.AreEqual(expectedResult, result); } } - #endregion } } diff --git a/MergerLogicUnitTests/Utils/OneXOneConvertorTest.cs b/MergerLogicUnitTests/Utils/OneXOneConvertorTest.cs index 3a713203..dc7f7428 100644 --- a/MergerLogicUnitTests/Utils/OneXOneConvertorTest.cs +++ b/MergerLogicUnitTests/Utils/OneXOneConvertorTest.cs @@ -3,7 +3,9 @@ using MergerLogic.Utils; using MergerLogicUnitTests.testUtils; using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; using System.Collections.Generic; +using System.IO; namespace MergerLogicUnitTests.Utils { @@ -11,6 +13,7 @@ namespace MergerLogicUnitTests.Utils [TestCategory("unit")] [TestCategory("1X1")] [TestCategory("OneXOneConvertor")] + [DeploymentItem(@"../../../Utils/TestData")] public class OneXOneConvertorTest { @@ -23,6 +26,8 @@ public enum OneXOneConvertorParameterType #region mocks + private MockRepository _repository; + private Mock _configurationManagerMock; private byte[] _jpegImageData; #endregion @@ -30,7 +35,11 @@ public enum OneXOneConvertorParameterType [TestInitialize] public void BeforeEach() { - this._jpegImageData = new byte[] { 0xFF, 0xD8, 0xFF, 0xDB}; + this._repository = new MockRepository(MockBehavior.Strict); + this._configurationManagerMock = this._repository.Create(); + this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "allowedPixelSize")) + .Returns(256); + this._jpegImageData = File.ReadAllBytes("no_transparency.jpeg"); } #region FromTwoXOne @@ -64,7 +73,7 @@ public void FromTwoXOneCoords(OneXOneConvertorParameterType convertorParameterTy { OneXOneConvertorParameterType.Cords => convertor.FromTwoXOne(testData), OneXOneConvertorParameterType.Ints => convertor.FromTwoXOne(testData.Z, testData.X, testData.Y), - OneXOneConvertorParameterType.Tile => convertor.FromTwoXOne(new Tile(testData, this._jpegImageData)), + OneXOneConvertorParameterType.Tile => convertor.FromTwoXOne(new Tile(this._configurationManagerMock.Object, testData, this._jpegImageData)), _ => null }; @@ -121,7 +130,7 @@ public void TryFromTwoXOneCoords(OneXOneConvertorParameterType convertorParamete { OneXOneConvertorParameterType.Cords => convertor.TryFromTwoXOne(testData), OneXOneConvertorParameterType.Ints => convertor.TryFromTwoXOne(testData.Z, testData.X, testData.Y), - OneXOneConvertorParameterType.Tile => convertor.TryFromTwoXOne(new Tile(testData, this._jpegImageData)), + OneXOneConvertorParameterType.Tile => convertor.TryFromTwoXOne(new Tile(this._configurationManagerMock.Object, testData, this._jpegImageData)), _ => null }; @@ -184,7 +193,7 @@ public void ToTwoXOneCoords(OneXOneConvertorParameterType convertorParameterType { OneXOneConvertorParameterType.Cords => convertor.ToTwoXOne(testData), OneXOneConvertorParameterType.Ints => convertor.ToTwoXOne(testData.Z, testData.X, testData.Y), - OneXOneConvertorParameterType.Tile => convertor.ToTwoXOne(new Tile(testData, this._jpegImageData)), + OneXOneConvertorParameterType.Tile => convertor.ToTwoXOne(new Tile(this._configurationManagerMock.Object, testData, this._jpegImageData)), _ => null }; @@ -241,7 +250,7 @@ public void TryToTwoXOneCoords(OneXOneConvertorParameterType convertorParameterT object? res = convertorParameterType switch { OneXOneConvertorParameterType.Ints => convertor.TryToTwoXOne(testData.Z, testData.X, testData.Y), - OneXOneConvertorParameterType.Tile => convertor.TryToTwoXOne(new Tile(testData, this._jpegImageData)), + OneXOneConvertorParameterType.Tile => convertor.TryToTwoXOne(new Tile(this._configurationManagerMock.Object, testData, this._jpegImageData)), _ => null }; diff --git a/MergerLogicUnitTests/Utils/PathUtilsTest.cs b/MergerLogicUnitTests/Utils/PathUtilsTest.cs index 2a93bc82..e539902f 100644 --- a/MergerLogicUnitTests/Utils/PathUtilsTest.cs +++ b/MergerLogicUnitTests/Utils/PathUtilsTest.cs @@ -5,6 +5,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using System.Collections.Generic; +using System.IO; using System.IO.Abstractions; namespace MergerLogicUnitTests.Utils @@ -12,6 +13,7 @@ namespace MergerLogicUnitTests.Utils [TestClass] [TestCategory("unit")] [TestCategory("PathUtils")] + [DeploymentItem(@"../../../Utils/TestData")] public class PathUtilsTest { #region mocks @@ -20,6 +22,7 @@ public class PathUtilsTest private Mock _fileSystemMock; private Mock _pathMock; private Mock _imageFormaterMock; + private Mock _configurationManagerMock; private byte[] _jpegImageData; private byte[] _pngImageData; @@ -34,9 +37,12 @@ public void BeforeEach() this._fileSystemMock = this._repository.Create(); this._fileSystemMock.SetupGet(fs => fs.Path).Returns(this._pathMock.Object); this._imageFormaterMock = this._repository.Create(); + this._configurationManagerMock = this._repository.Create(); + this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "allowedPixelSize")) + .Returns(256); - this._jpegImageData = new byte[] { 0xFF, 0xD8, 0xFF, 0xDB}; - this._pngImageData = new byte[] { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }; + this._jpegImageData = File.ReadAllBytes("no_transparency.jpeg"); + this._pngImageData = File.ReadAllBytes("no_transparency.png"); } #region RemoveTrailingSlash @@ -74,7 +80,7 @@ public void GetTilePathTile(TileFormat format) { var data = format == TileFormat.Jpeg ? this._jpegImageData : this._pngImageData; var utils = new PathUtils(this._fileSystemMock.Object); - var res = utils.GetTilePath("test#subTest", new Tile(0, 1, 2, data)); + var res = utils.GetTilePath("test#subTest", new Tile(this._configurationManagerMock.Object, 0, 1, 2, data)); Assert.AreEqual($"test#subTest#0#1#2.{format.ToString().ToLower()}", res); } @@ -88,7 +94,7 @@ public static IEnumerable GenGetTilePathCoordsParams() } [TestMethod] - [DynamicData(nameof(GenGetTilePathCoordsParams),DynamicDataSourceType.Method)] + [DynamicData(nameof(GenGetTilePathCoordsParams), DynamicDataSourceType.Method)] public void GetTilePathCoords(bool isS3, TileFormat format) { var utils = new PathUtils(this._fileSystemMock.Object); @@ -120,7 +126,7 @@ public static IEnumerable GenFromPathParams() } [TestMethod] - [DynamicData(nameof(GenFromPathParams),DynamicDataSourceType.Method)] + [DynamicData(nameof(GenFromPathParams), DynamicDataSourceType.Method)] public void FromPath(bool isS3, TileFormat expectedFormat) { var utils = new PathUtils(this._fileSystemMock.Object); diff --git a/MergerLogicUnitTests/Utils/S3UtilsTest.cs b/MergerLogicUnitTests/Utils/S3UtilsTest.cs index b6c79901..f428203c 100644 --- a/MergerLogicUnitTests/Utils/S3UtilsTest.cs +++ b/MergerLogicUnitTests/Utils/S3UtilsTest.cs @@ -21,6 +21,7 @@ namespace MergerLogicUnitTests.Utils [TestCategory("unit")] [TestCategory("S3")] [TestCategory("s3Utils")] + [DeploymentItem(@"../../../Utils/TestData")] public class S3UtilsTest { #region mocks @@ -32,6 +33,7 @@ public class S3UtilsTest private Mock _imageFormatterMock; private Mock> _loggerMock; private Mock _loggerFactoryMock; + private Mock _configurationManagerMock; private byte[] _jpegImageData; @@ -45,12 +47,15 @@ public void BeforeEach() this._pathUtilsMock = this._repository.Create(); this._geoUtilsMock = this._repository.Create(); this._imageFormatterMock = this._repository.Create(); + this._configurationManagerMock = this._repository.Create(); this._loggerMock = this._repository.Create>(MockBehavior.Loose); this._loggerFactoryMock = this._repository.Create(); this._loggerFactoryMock.Setup(f => f.CreateLogger(It.IsAny())).Returns(this._loggerMock.Object); + this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "allowedPixelSize")) + .Returns(256); - this._jpegImageData = new byte[] { 0xFF, 0xD8, 0xFF, 0xDB}; + this._jpegImageData = File.ReadAllBytes("no_transparency.jpeg"); } #region GetTile @@ -69,7 +74,7 @@ public static IEnumerable GenGetTileParams() [TestMethod] [TestCategory("GetTile")] [DynamicData(nameof(GenGetTileParams), DynamicDataSourceType.Method)] - public void GetTile(bool exist, GetTileParamType paramType,TileFormat tileFormat) + public void GetTile(bool exist, GetTileParamType paramType, TileFormat tileFormat) { var seq = new MockSequence(); var data = this._jpegImageData; @@ -97,7 +102,7 @@ public void GetTile(bool exist, GetTileParamType paramType,TileFormat tileFormat It.IsAny())) .ReturnsAsync(new ListObjectsV2Response() { - S3Objects = exist ? new List() {new S3Object(){Key = "key"}} : new List() + S3Objects = exist ? new List() { new S3Object() { Key = "key" } } : new List() }); } @@ -123,7 +128,7 @@ public void GetTile(bool exist, GetTileParamType paramType,TileFormat tileFormat } var s3Utils = new S3Client(this._s3ClientMock.Object, this._pathUtilsMock.Object, - this._geoUtilsMock.Object, this._loggerMock.Object, "STANDARD", "bucket", "test"); + this._geoUtilsMock.Object, this._loggerMock.Object, this._configurationManagerMock.Object, "STANDARD", "bucket", "test"); Tile tile = null; switch (paramType) @@ -135,10 +140,10 @@ public void GetTile(bool exist, GetTileParamType paramType,TileFormat tileFormat tile = s3Utils.GetTile(cords.Z, cords.X, cords.Y); break; case GetTileParamType.String: - if(exist) + if (exist) { tile = s3Utils.GetTile("key"); - } + } else { Assert.ThrowsException(() => s3Utils.GetTile("key")); @@ -167,7 +172,7 @@ public void GetTile(bool exist, GetTileParamType paramType,TileFormat tileFormat { this._pathUtilsMock.Verify(utils => utils.GetTilePathWithoutExtension(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Once); - this._s3ClientMock.Verify(s3=> s3.ListObjectsV2Async(It.IsAny(),It.IsAny()),Times.Once); + this._s3ClientMock.Verify(s3 => s3.ListObjectsV2Async(It.IsAny(), It.IsAny()), Times.Once); } if (exist || paramType == GetTileParamType.String) @@ -205,7 +210,7 @@ public void TileExists(bool exist) }); var s3Utils = new S3Client(this._s3ClientMock.Object, this._pathUtilsMock.Object, - this._geoUtilsMock.Object, this._loggerMock.Object, "STANDARD", "bucket", "test"); + this._geoUtilsMock.Object, this._loggerMock.Object, this._configurationManagerMock.Object, "STANDARD", "bucket", "test"); Assert.AreEqual(exist, s3Utils.TileExists(0, 0, 0)); @@ -226,7 +231,7 @@ public void UpdateTile() var buff = this._jpegImageData; int readLen = -1; var seq = new MockSequence(); - var testTile = new Tile(0, 0, 0, buff); + var testTile = new Tile(this._configurationManagerMock.Object, 0, 0, 0, buff); this._pathUtilsMock .InSequence(seq) .Setup(utils => utils.GetTilePath("test", testTile, true)) @@ -242,10 +247,10 @@ public void UpdateTile() }); var s3Utils = new S3Client(this._s3ClientMock.Object, this._pathUtilsMock.Object, - this._geoUtilsMock.Object, this._loggerMock.Object, "STANDARD", "bucket", "test"); + this._geoUtilsMock.Object, this._loggerMock.Object, this._configurationManagerMock.Object, "STANDARD", "bucket", "test"); s3Utils.UpdateTile(testTile); - this._pathUtilsMock.Verify(utils => utils.GetTilePath(It.IsAny(),It.IsAny(), It.IsAny()), Times.Once); + this._pathUtilsMock.Verify(utils => utils.GetTilePath(It.IsAny(), It.IsAny(), It.IsAny()), Times.Once); this._s3ClientMock.Verify(s3 => s3.PutObjectAsync(It.Is(req => req.BucketName == "bucket" && req.Key == "key"), It.IsAny()), Times.Once); diff --git a/MergerLogicUnitTests/Utils/TestData/100x100.jpeg b/MergerLogicUnitTests/Utils/TestData/100x100.jpeg new file mode 100644 index 00000000..7d59cac9 Binary files /dev/null and b/MergerLogicUnitTests/Utils/TestData/100x100.jpeg differ diff --git a/MergerLogicUnitTests/Utils/TestData/100x100.png b/MergerLogicUnitTests/Utils/TestData/100x100.png new file mode 100644 index 00000000..b6d71326 Binary files /dev/null and b/MergerLogicUnitTests/Utils/TestData/100x100.png differ diff --git a/MergerLogicUnitTests/Utils/TestData/100x256.jpeg b/MergerLogicUnitTests/Utils/TestData/100x256.jpeg new file mode 100644 index 00000000..81c34e88 Binary files /dev/null and b/MergerLogicUnitTests/Utils/TestData/100x256.jpeg differ diff --git a/MergerLogicUnitTests/Utils/TestData/100x256.png b/MergerLogicUnitTests/Utils/TestData/100x256.png new file mode 100644 index 00000000..fd6364bc Binary files /dev/null and b/MergerLogicUnitTests/Utils/TestData/100x256.png differ diff --git a/MergerLogicUnitTests/Utils/TestData/256x100.jpeg b/MergerLogicUnitTests/Utils/TestData/256x100.jpeg new file mode 100644 index 00000000..b44f768a Binary files /dev/null and b/MergerLogicUnitTests/Utils/TestData/256x100.jpeg differ diff --git a/MergerLogicUnitTests/Utils/TestData/256x100.png b/MergerLogicUnitTests/Utils/TestData/256x100.png new file mode 100644 index 00000000..9448c5bd Binary files /dev/null and b/MergerLogicUnitTests/Utils/TestData/256x100.png differ diff --git a/MergerService/Runners/TaskExecutor.cs b/MergerService/Runners/TaskExecutor.cs index 135b7e64..6956f03e 100644 --- a/MergerService/Runners/TaskExecutor.cs +++ b/MergerService/Runners/TaskExecutor.cs @@ -100,7 +100,7 @@ public void ExecuteTask(MergeTask task, ITaskUtils taskUtils, string? managerCal this._logger.LogDebug($"[{methodName}] BuildDataList"); List sources = this.BuildDataList(metadata.Sources, this._batchMaxSize); - + IData target = sources[0]; target.IsNew = metadata.IsNewTarget; @@ -154,7 +154,7 @@ public void ExecuteTask(MergeTask task, ITaskUtils taskUtils, string? managerCal List correspondingTileBuilders = new List(); // Add target tile correspondingTileBuilders.Add(() => sources[0].GetCorrespondingTile(coord, shouldUpscale)); - + // Add all sources tiles this._logger.LogDebug($"[{methodName}] Get tile sources"); foreach (IData source in sources.Skip(1)) diff --git a/MergerService/appsettings.Development.json b/MergerService/appsettings.Development.json index d3d126aa..3364d311 100644 --- a/MergerService/appsettings.Development.json +++ b/MergerService/appsettings.Development.json @@ -8,7 +8,8 @@ "batchSize": { "limitBatchSize": true, "batchMaxSize": 1000 - } + }, + "allowedPixelSize": 256 }, "TASK": { "jobManagerUrl": "http://localhost:8081", diff --git a/MergerService/appsettings.json b/MergerService/appsettings.json index 1d96c4c1..f73817a4 100644 --- a/MergerService/appsettings.json +++ b/MergerService/appsettings.json @@ -8,7 +8,8 @@ "batchSize": { "limitBatchSize": true, "batchMaxSize": 1000 - } + }, + "allowedPixelSize": 256 }, "TASK": { "jobManagerUrl": "http://localhost:8081", diff --git a/MergerServiceUnitTests/Runners/TaskExecutorTest.cs b/MergerServiceUnitTests/Runners/TaskExecutorTest.cs index 5522ac56..77e38c7b 100644 --- a/MergerServiceUnitTests/Runners/TaskExecutorTest.cs +++ b/MergerServiceUnitTests/Runners/TaskExecutorTest.cs @@ -19,221 +19,224 @@ namespace MergerLogicUnitTests.Utils { - [TestClass] - [TestCategory("unit")] - [TestCategory("runners")] - [DeploymentItem(@"../../../Runners/TestData")] - public class TaskExecutorTest + [TestClass] + [TestCategory("unit")] + [TestCategory("runners")] + [DeploymentItem(@"../../../Runners/TestData")] + public class TaskExecutorTest + { + #region mocks + + private MockRepository _mockRepository; + + private Mock _dataFactoryMock; + private Mock _timeUtilsMock; + private Mock _configurationManagerMock; + private Mock> _taskExecutorLoggerMock; + private Mock _metricsProviderMock; + private Mock _taskUtilsMock; + private Mock _tileScalerMock; + private Mock> _tileMergerLoggerMock; + + private ActivitySource _testActivitySource; + private ITileMerger _testTileMerger; + private IFileSystem _testFileSystem; + + #endregion + + public static IEnumerable GetSingleTileTestParameters() { - #region mocks - - private MockRepository _mockRepository; - - private Mock _dataFactoryMock; - private Mock _timeUtilsMock; - private Mock _configurationManagerMock; - private Mock> _taskExecutorLoggerMock; - private Mock _metricsProviderMock; - private Mock _taskUtilsMock; - private Mock _tileScalerMock; - private Mock> _tileMergerLoggerMock; - - private ActivitySource _testActivitySource; - private ITileMerger _testTileMerger; - private IFileSystem _testFileSystem; - - #endregion - - public static IEnumerable GetSingleTileTestParameters() - { - yield return new object[] { 1, true }; - yield return new object[] { 3, true }; - yield return new object[] { 54, true }; - yield return new object[] { 1, false }; - yield return new object[] { 5, false }; - yield return new object[] { 14, false }; - } - - [TestInitialize] - public void BeforeEach() - { - this._mockRepository = new MockRepository(MockBehavior.Loose); - - this._dataFactoryMock = this._mockRepository.Create(); - this._timeUtilsMock = this._mockRepository.Create(); - this._configurationManagerMock = this._mockRepository.Create(); - this._taskExecutorLoggerMock = this._mockRepository.Create>(); - this._metricsProviderMock = this._mockRepository.Create(); - this._taskUtilsMock = this._mockRepository.Create(); - this._tileScalerMock = this._mockRepository.Create(); - this._tileMergerLoggerMock = this._mockRepository.Create>(); - - this._testActivitySource = new ActivitySource("test"); - this._testTileMerger = new TileMerger(_tileScalerMock.Object, _tileMergerLoggerMock.Object); - this._testFileSystem = new FileSystem(); - } - - [TestMethod] - [DynamicData(nameof(GetSingleTileTestParameters), DynamicDataSourceType.Method)] - public void WhenGivenSourcesWithOneTile_ShouldWriteAllTilesToTarget(int numberOfSources, bool isTargetNew) - { - this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "batchSize", "batchMaxSize")).Returns(1); - this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "batchSize", "limitBatchSize")).Returns(true); - this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "batchMaxBytes")).Returns(1); - - var taskTargetTuple = this.SetupTestTask(numberOfSources, isTargetNew); - var testTask = taskTargetTuple.Item1; - var targetDataMock = taskTargetTuple.Item2; - var testSourceTiles = taskTargetTuple.Item3; - var resultWrittenTiles = new List(); - - var testTaskExecutor = new TaskExecutor(_dataFactoryMock.Object, _testTileMerger, _timeUtilsMock.Object, - _configurationManagerMock.Object, _taskExecutorLoggerMock.Object, _testActivitySource, _testFileSystem, - _metricsProviderMock.Object); - - targetDataMock.Setup(targetData => targetData.UpdateTiles(It.IsAny>())).Callback>( - resultWrittenTiles.AddRange - ); - - testTaskExecutor.ExecuteTask(testTask, _taskUtilsMock.Object, null); - - targetDataMock.Verify(targetData => targetData.UpdateTiles(It.Is>( - tiles => tiles.All( - tile => testSourceTiles.Any(sourceTile => sourceTile.Z == tile.Z && sourceTile.X == tile.X && sourceTile.Y == tile.Y) - ) - )), Times.Exactly(numberOfSources)); - targetDataMock.Verify(targetData => targetData.Wrapup(), Times.Once); - - Assert.AreEqual(testSourceTiles.Length, resultWrittenTiles.Count); - Assert.IsTrue(testSourceTiles.All( - tile => resultWrittenTiles.Any(sourceTile => sourceTile.Z == tile.Z && sourceTile.X == tile.X && sourceTile.Y == tile.Y) - )); - } - - public static IEnumerable GetBatchLimitTestParameters() - { - // Tests that given a batch limit size, it flushes every time it reaches the limit - // When the limit is 2, and there are total 5 tiles, we expect 3 flushes - // We set the bytes limit to a high value to avoid it being reached by the test - yield return new object[] { + yield return new object[] { 1, true }; + yield return new object[] { 3, true }; + yield return new object[] { 54, true }; + yield return new object[] { 1, false }; + yield return new object[] { 5, false }; + yield return new object[] { 14, false }; + } + + [TestInitialize] + public void BeforeEach() + { + this._mockRepository = new MockRepository(MockBehavior.Loose); + + this._dataFactoryMock = this._mockRepository.Create(); + this._timeUtilsMock = this._mockRepository.Create(); + this._configurationManagerMock = this._mockRepository.Create(); + this._taskExecutorLoggerMock = this._mockRepository.Create>(); + this._metricsProviderMock = this._mockRepository.Create(); + this._taskUtilsMock = this._mockRepository.Create(); + this._tileScalerMock = this._mockRepository.Create(); + this._tileMergerLoggerMock = this._mockRepository.Create>(); + + this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "allowedPixelSize")) + .Returns(256); + + this._testActivitySource = new ActivitySource("test"); + this._testTileMerger = new TileMerger(_tileScalerMock.Object, _tileMergerLoggerMock.Object, _configurationManagerMock.Object); + this._testFileSystem = new FileSystem(); + } + + [TestMethod] + [DynamicData(nameof(GetSingleTileTestParameters), DynamicDataSourceType.Method)] + public void WhenGivenSourcesWithOneTile_ShouldWriteAllTilesToTarget(int numberOfSources, bool isTargetNew) + { + this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "batchSize", "batchMaxSize")).Returns(1); + this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "batchSize", "limitBatchSize")).Returns(true); + this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "batchMaxBytes")).Returns(1); + + var taskTargetTuple = this.SetupTestTask(numberOfSources, isTargetNew); + var testTask = taskTargetTuple.Item1; + var targetDataMock = taskTargetTuple.Item2; + var testSourceTiles = taskTargetTuple.Item3; + var resultWrittenTiles = new List(); + + var testTaskExecutor = new TaskExecutor(_dataFactoryMock.Object, _testTileMerger, _timeUtilsMock.Object, + _configurationManagerMock.Object, _taskExecutorLoggerMock.Object, _testActivitySource, _testFileSystem, + _metricsProviderMock.Object); + + targetDataMock.Setup(targetData => targetData.UpdateTiles(It.IsAny>())).Callback>( + resultWrittenTiles.AddRange + ); + + testTaskExecutor.ExecuteTask(testTask, _taskUtilsMock.Object, null); + + targetDataMock.Verify(targetData => targetData.UpdateTiles(It.Is>( + tiles => tiles.All( + tile => testSourceTiles.Any(sourceTile => sourceTile.Z == tile.Z && sourceTile.X == tile.X && sourceTile.Y == tile.Y) + ) + )), Times.Exactly(numberOfSources)); + targetDataMock.Verify(targetData => targetData.Wrapup(), Times.Once); + + Assert.AreEqual(testSourceTiles.Length, resultWrittenTiles.Count); + Assert.IsTrue(testSourceTiles.All( + tile => resultWrittenTiles.Any(sourceTile => sourceTile.Z == tile.Z && sourceTile.X == tile.X && sourceTile.Y == tile.Y) + )); + } + + public static IEnumerable GetBatchLimitTestParameters() + { + // Tests that given a batch limit size, it flushes every time it reaches the limit + // When the limit is 2, and there are total 5 tiles, we expect 3 flushes + // We set the bytes limit to a high value to avoid it being reached by the test + yield return new object[] { true, 2, 1024 * 1024 * 80, 3, 5 }; - // Tests that given a batch bytes limit, it flushes every time it reaches the limit - // When the limit is one byte more then twice the size of the tile, and there are total 7 tiles, we expect 3 flushes - // (Flush every 3rd tile, and additional flush at the end) - // We disable the size limit to avoid it being used in the test - yield return new object[] { + // Tests that given a batch bytes limit, it flushes every time it reaches the limit + // When the limit is one byte more then twice the size of the tile, and there are total 7 tiles, we expect 3 flushes + // (Flush every 3rd tile, and additional flush at the end) + // We disable the size limit to avoid it being used in the test + yield return new object[] { false, 1, (File.ReadAllBytes("tile.jpeg").Length * 2) + 1, 3, 7 }; - } - - [TestMethod] - [DynamicData(nameof(GetBatchLimitTestParameters), DynamicDataSourceType.Method)] - public void WhenConfiguringBatchLimits_ShouldWriteTilesEachTimeAfterReachingBatchLimit(bool limitBatchSize, int batchMaxSize, long batchMaxBytes, int amountOfFlushes, int totalAmountOfTiles) - { - this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "batchSize", "batchMaxSize")).Returns(batchMaxSize); - this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "batchSize", "limitBatchSize")).Returns(limitBatchSize); - this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "batchMaxBytes")).Returns(batchMaxBytes); - - byte[] tileBytes = File.ReadAllBytes("tile.jpeg"); - Source testTarget = new Source("target", "target_type", new Extent(), GridOrigin.UPPER_LEFT, Grid.TwoXOne); - Mock targetDataMock = this._mockRepository.Create(); - - Source testSource = new Source($"source", $"source_type"); - Coord[] testSourceCoords = new int[totalAmountOfTiles].Select((_, index) => new Coord(1, index, 0)).ToArray(); - Tile[] testSourceTiles = testSourceCoords.Select(coord => new Tile(coord, tileBytes)).ToArray(); - TileBounds tileBounds = new TileBounds(1, 0, testSourceCoords.Length, 0, 1); - Mock sourceDataMock = this._mockRepository.Create(); - - for (var testSourceCoordIdx = 0; testSourceCoordIdx < testSourceCoords.Length; testSourceCoordIdx++) - { - sourceDataMock.Setup(sourceData => sourceData.GetCorrespondingTile(testSourceCoords[testSourceCoordIdx], It.IsAny())).Returns(testSourceTiles[testSourceCoordIdx]); - } - - this._dataFactoryMock.Setup( + } + + [TestMethod] + [DynamicData(nameof(GetBatchLimitTestParameters), DynamicDataSourceType.Method)] + public void WhenConfiguringBatchLimits_ShouldWriteTilesEachTimeAfterReachingBatchLimit(bool limitBatchSize, int batchMaxSize, long batchMaxBytes, int amountOfFlushes, int totalAmountOfTiles) + { + this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "batchSize", "batchMaxSize")).Returns(batchMaxSize); + this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "batchSize", "limitBatchSize")).Returns(limitBatchSize); + this._configurationManagerMock.Setup(configManager => configManager.GetConfiguration("GENERAL", "batchMaxBytes")).Returns(batchMaxBytes); + + byte[] tileBytes = File.ReadAllBytes("tile.jpeg"); + Source testTarget = new Source("target", "target_type", new Extent(), GridOrigin.UPPER_LEFT, Grid.TwoXOne); + Mock targetDataMock = this._mockRepository.Create(); + + Source testSource = new Source($"source", $"source_type"); + Coord[] testSourceCoords = new int[totalAmountOfTiles].Select((_, index) => new Coord(1, index, 0)).ToArray(); + Tile[] testSourceTiles = testSourceCoords.Select(coord => new Tile(_configurationManagerMock.Object, coord, tileBytes)).ToArray(); + TileBounds tileBounds = new TileBounds(1, 0, testSourceCoords.Length, 0, 1); + Mock sourceDataMock = this._mockRepository.Create(); + + for (var testSourceCoordIdx = 0; testSourceCoordIdx < testSourceCoords.Length; testSourceCoordIdx++) + { + sourceDataMock.Setup(sourceData => sourceData.GetCorrespondingTile(testSourceCoords[testSourceCoordIdx], It.IsAny())).Returns(testSourceTiles[testSourceCoordIdx]); + } + + this._dataFactoryMock.Setup( + dataFactory => dataFactory.CreateDataSource( + testSource.Type, testSource.Path, It.IsAny(), + testSource.Grid, testSource.Origin, testSource.Extent, It.IsAny()) + ).Returns(sourceDataMock.Object); + + this._dataFactoryMock.Setup( + dataFactory => dataFactory.CreateDataSource( + testTarget.Type, testTarget.Path, It.IsAny(), + testTarget.Grid, testTarget.Origin, testTarget.Extent, It.IsAny()) + ).Returns(targetDataMock.Object); + + var testTask = new MergeTask("id", "type", "description", + new MergeMetadata( + TileFormat.Jpeg, true, new TileBounds[] { tileBounds }, + new Source[] { testTarget, testSource } + ), + Status.PENDING, null, "reason", 0, "jobId", true, new DateTime(), new DateTime() + ); + + var resultWrittenTiles = new List(); + var testTaskExecutor = new TaskExecutor(_dataFactoryMock.Object, _testTileMerger, _timeUtilsMock.Object, + _configurationManagerMock.Object, _taskExecutorLoggerMock.Object, _testActivitySource, _testFileSystem, + _metricsProviderMock.Object); + + targetDataMock.Setup(targetData => targetData.UpdateTiles(It.IsAny>())).Callback>( + resultWrittenTiles.AddRange + ); + + testTaskExecutor.ExecuteTask(testTask, _taskUtilsMock.Object, null); + + targetDataMock.Verify(targetData => targetData.UpdateTiles(It.IsAny>()), Times.Exactly(amountOfFlushes)); + targetDataMock.Verify(targetData => targetData.Wrapup(), Times.Once); + Assert.AreEqual(testSourceTiles.Length, resultWrittenTiles.Count); + Assert.IsTrue(testSourceTiles.All( + tile => resultWrittenTiles.Any(sourceTile => sourceTile.Z == tile.Z && sourceTile.X == tile.X && sourceTile.Y == tile.Y) + )); + } + + private Tuple, Tile[]> SetupTestTask(int amountOfSources, bool isTargetNew) + { + byte[] tileBytes = File.ReadAllBytes("tile.jpeg"); + Coord testTargetCoord = new Coord(1, 1, 1); + Coord[] testSourceCoords = new int[amountOfSources].Select((_, index) => new Coord(index + 2, index + 2, index + 2)).ToArray(); + Source testTarget = new Source("target", "target_type", new Extent(), GridOrigin.UPPER_LEFT, Grid.TwoXOne); + Source[] testSources = testSourceCoords.Select((_, index) => new Source($"source_{index}", $"source_type_{index}")).ToArray(); + Tile testTargetTile = new Tile(_configurationManagerMock.Object, testTargetCoord, tileBytes); + Tile[] testSourcesTiles = testSourceCoords.Select(coord => new Tile(_configurationManagerMock.Object, coord, tileBytes)).ToArray(); + TileBounds[] tileBounds = testSourceCoords.Select(coord => new TileBounds(coord.Z, coord.X, coord.X + 1, coord.Y, coord.Y + 1)).ToArray(); + Mock targetDataMock = this._mockRepository.Create(); + Mock[] sourcesDataMocks = testSourcesTiles.Select((tile, index) => + { + var sourceDataMock = this._mockRepository.Create(); + sourceDataMock.Setup(sourceData => sourceData.GetCorrespondingTile(testSourceCoords[index], It.IsAny())).Returns(tile); + this._dataFactoryMock.Setup( dataFactory => dataFactory.CreateDataSource( - testSource.Type, testSource.Path, It.IsAny(), - testSource.Grid, testSource.Origin, testSource.Extent, It.IsAny()) - ).Returns(sourceDataMock.Object); - - this._dataFactoryMock.Setup( - dataFactory => dataFactory.CreateDataSource( - testTarget.Type, testTarget.Path, It.IsAny(), - testTarget.Grid, testTarget.Origin, testTarget.Extent, It.IsAny()) - ).Returns(targetDataMock.Object); - - var testTask = new MergeTask("id", "type", "description", - new MergeMetadata( - TileFormat.Jpeg, true, new TileBounds[] { tileBounds }, - new Source[] { testTarget, testSource } - ), - Status.PENDING, null, "reason", 0, "jobId", true, new DateTime(), new DateTime() - ); - - var resultWrittenTiles = new List(); - var testTaskExecutor = new TaskExecutor(_dataFactoryMock.Object, _testTileMerger, _timeUtilsMock.Object, - _configurationManagerMock.Object, _taskExecutorLoggerMock.Object, _testActivitySource, _testFileSystem, - _metricsProviderMock.Object); - - targetDataMock.Setup(targetData => targetData.UpdateTiles(It.IsAny>())).Callback>( - resultWrittenTiles.AddRange - ); - - testTaskExecutor.ExecuteTask(testTask, _taskUtilsMock.Object, null); - - targetDataMock.Verify(targetData => targetData.UpdateTiles(It.IsAny>()), Times.Exactly(amountOfFlushes)); - targetDataMock.Verify(targetData => targetData.Wrapup(), Times.Once); - Assert.AreEqual(testSourceTiles.Length, resultWrittenTiles.Count); - Assert.IsTrue(testSourceTiles.All( - tile => resultWrittenTiles.Any(sourceTile => sourceTile.Z == tile.Z && sourceTile.X == tile.X && sourceTile.Y == tile.Y) - )); - } - - private Tuple, Tile[]> SetupTestTask(int amountOfSources, bool isTargetNew) - { - byte[] tileBytes = File.ReadAllBytes("tile.jpeg"); - Coord testTargetCoord = new Coord(1, 1, 1); - Coord[] testSourceCoords = new int[amountOfSources].Select((_, index) => new Coord(index + 2, index + 2, index + 2)).ToArray(); - Source testTarget = new Source("target", "target_type", new Extent(), GridOrigin.UPPER_LEFT, Grid.TwoXOne); - Source[] testSources = testSourceCoords.Select((_, index) => new Source($"source_{index}", $"source_type_{index}")).ToArray(); - Tile testTargetTile = new Tile(testTargetCoord, tileBytes); - Tile[] testSourcesTiles = testSourceCoords.Select(coord => new Tile(coord, tileBytes)).ToArray(); - TileBounds[] tileBounds = testSourceCoords.Select(coord => new TileBounds(coord.Z, coord.X, coord.X + 1, coord.Y, coord.Y + 1)).ToArray(); - Mock targetDataMock = this._mockRepository.Create(); - Mock[] sourcesDataMocks = testSourcesTiles.Select((tile, index) => - { - var sourceDataMock = this._mockRepository.Create(); - sourceDataMock.Setup(sourceData => sourceData.GetCorrespondingTile(testSourceCoords[index], It.IsAny())).Returns(tile); - this._dataFactoryMock.Setup( - dataFactory => dataFactory.CreateDataSource( - testSources[index].Type, testSources[index].Path, It.IsAny(), - testSources[index].Grid, testSources[index].Origin, testSources[index].Extent, It.IsAny()) - ).Returns(sourceDataMock.Object); - return sourceDataMock; - }).ToArray(); - - this._dataFactoryMock.Setup( - dataFactory => dataFactory.CreateDataSource( - testTarget.Type, testTarget.Path, It.IsAny(), - testTarget.Grid, testTarget.Origin, testTarget.Extent, It.IsAny()) - ).Returns(targetDataMock.Object); - - if (!isTargetNew) - { - targetDataMock.Setup(targetData => targetData.GetCorrespondingTile(testTargetCoord, It.IsAny())).Returns(testTargetTile); - tileBounds = tileBounds.Prepend(new TileBounds(testTargetCoord.Z, testTargetCoord.X, testTargetCoord.X + 1, testTargetCoord.Y, testTargetCoord.Y + 1)).ToArray(); - } - - var testTask = new MergeTask("id", "type", "description", - new MergeMetadata( - TileFormat.Jpeg, isTargetNew, tileBounds, - testSources.Prepend(testTarget).ToArray() - ), - Status.PENDING, null, "reason", 0, "jobId", true, new DateTime(), new DateTime() - ); - - return new Tuple, Tile[]>(testTask, targetDataMock, testSourcesTiles); - } + testSources[index].Type, testSources[index].Path, It.IsAny(), + testSources[index].Grid, testSources[index].Origin, testSources[index].Extent, It.IsAny()) + ).Returns(sourceDataMock.Object); + return sourceDataMock; + }).ToArray(); + + this._dataFactoryMock.Setup( + dataFactory => dataFactory.CreateDataSource( + testTarget.Type, testTarget.Path, It.IsAny(), + testTarget.Grid, testTarget.Origin, testTarget.Extent, It.IsAny()) + ).Returns(targetDataMock.Object); + + if (!isTargetNew) + { + targetDataMock.Setup(targetData => targetData.GetCorrespondingTile(testTargetCoord, It.IsAny())).Returns(testTargetTile); + tileBounds = tileBounds.Prepend(new TileBounds(testTargetCoord.Z, testTargetCoord.X, testTargetCoord.X + 1, testTargetCoord.Y, testTargetCoord.Y + 1)).ToArray(); + } + + var testTask = new MergeTask("id", "type", "description", + new MergeMetadata( + TileFormat.Jpeg, isTargetNew, tileBounds, + testSources.Prepend(testTarget).ToArray() + ), + Status.PENDING, null, "reason", 0, "jobId", true, new DateTime(), new DateTime() + ); + + return new Tuple, Tile[]>(testTask, targetDataMock, testSourcesTiles); } + } } diff --git a/helm/templates/configmap.yaml b/helm/templates/configmap.yaml index c0027b7d..874e8dc8 100644 --- a/helm/templates/configmap.yaml +++ b/helm/templates/configmap.yaml @@ -13,6 +13,7 @@ metadata: name: {{ $configmapName }} data: GENERAL__validate: {{ .Values.env.general.validate | quote }} + GENERAL__allowedPixelSize: {{ .Values.env.general.allowedPixelSize | quote }} TASK__jobManagerUrl: {{ $serviceUrls.jobManager | quote }} {{- range $i, $e := .Values.env.TASK.types }} TASK__types__{{ $i }}__jobType: {{ $e.jobType }} diff --git a/helm/values.yaml b/helm/values.yaml index 1f6e593b..d1a32d10 100644 --- a/helm/values.yaml +++ b/helm/values.yaml @@ -87,6 +87,7 @@ env: batchSize: limitBatchSize: true batchMaxSize: 1000 + allowedPixelSize: 256 TASK: types: - jobType: 'Ingestion_Update'