Beispiel #1
0
        public async void TileExecutor_EmptySiteModel()
        {
            AddRoutings();

            var siteModel = DITAGFileAndSubGridRequestsWithIgniteFixture.NewEmptyModel();

            var request = new QMTileRequest
                          (
                siteModel.ID,
                new FilterResult(),
                1, 3, 3, 3, false
                          );

            request.Validate();

            var executor = RequestExecutorContainer
                           .Build <QuantizedMeshTileExecutor>(DIContext.Obtain <IConfigurationStore>(),
                                                              DIContext.Obtain <ILoggerFactory>(),
                                                              DIContext.Obtain <IServiceExceptionHandler>());

            var result = await executor.ProcessAsync(request) as QMTileResult;

            result.Should().NotBeNull();
            result.Code.Should().Be(ContractExecutionStatesEnum.ExecutedSuccessfully);
            result.TileData.Should().NotBeNull();
        }
Beispiel #2
0
        public void PD_GetTerrainTile_TRex_Success()
        {
            var expectedResult = new QMTileResult
                                 (
                new byte[] { 0x41, 0x42, 0x42, 0x41 } // may get compressed(gzip) later in part two
                                 );

            var resultStream = new MemoryStream(new byte[]
            {
                0x41, 0x42, 0x42, 0x41
            });

            var tRexProxy = new Mock <ITRexCompactionDataProxy>();

            var request = new QMTileRequest
            {
                X          = 0,
                Y          = 0,
                Z          = 0,
                Filter     = new FilterResult(),
                ProjectUid = Guid.NewGuid()
            };


            tRexProxy.Setup(x => x.SendDataPostRequestWithStreamResponse(
                                It.Is <QMTileRequest>(r => r.ProjectUid == request.ProjectUid),
                                It.Is <string>(s => s == "/terrain"),
                                It.IsAny <IHeaderDictionary>()))
            .Returns(Task.FromResult <Stream>(resultStream));


            var configStore = new Mock <IConfigurationStore>();

            var executor = RequestExecutorContainerFactory
                           .Build <QMTilesExecutor>(logger, configStore: configStore.Object,
                                                    trexCompactionDataProxy: tRexProxy.Object, customHeaders: _customHeaders);


            var result = executor.ProcessAsync(request).Result as QMTileResult;

            Assert.IsNotNull(result, "Result should not be null");


            Assert.AreEqual(expectedResult.TileData.Length, result.TileData.Length, "QM Tile does not match");

            for (int i = 0; i < expectedResult.TileData.Length; i++)
            {
                Assert.IsTrue(expectedResult.TileData[i].Equals(result.TileData[i]), "QM Tile does not match");
            }

            tRexProxy.Verify(m => m.SendDataPostRequestWithStreamResponse(
                                 It.Is <QMTileRequest>(r => r.ProjectUid == request.ProjectUid),
                                 It.Is <string>(s => s == "/terrain"),
                                 It.IsAny <IHeaderDictionary>())
                             , Times.Once);
        }
Beispiel #3
0
        /// <summary>
        /// Async call to make quantized mesh tile
        /// </summary>
        /// <param name="projectUid"> project id</param>
        /// <param name="filterUid">filter id</param>
        /// <param name="displayMode">DisplayMode</param>
        /// <param name="x">tile x coordinate</param>
        /// <param name="y">tile y coordinate</param>
        /// <param name="z">tile z coordinate</param>
        /// <param name="hasLighting">Does tile have lighting</param>
        /// <returns></returns>
        private async Task <byte[]> FetchTile(Guid projectUid, Guid filterUid, int displayMode, int x, int y, int z, bool hasLighting)
        {
            FilterResult filter;

            try
            {
                filter = await GetCompactionFilter(projectUid, filterUid);

                // Note! When debugging locally with your own data you may want to skip the above line and make a empty filter to avoid lookup validation failures
                // filter = new FilterResult();
            }
            catch (Exception e)
            { var msg = $"TerrainController.FetchTile. Call to GetCompactionFilter has failed. ProjectUid:{projectUid}, FilterUid{filterUid}. Error:{e.Message}";
              Log.LogError(e, msg);
              throw; }

            var request = new QMTileRequest()
            {
                ProjectUid  = projectUid,
                Filter      = filter,
                DisplayMode = displayMode,
                X           = x,
                Y           = y,
                Z           = z,
                HasLighting = hasLighting
            };

            request.Validate();

            try
            {
                var qmTileResult = await RequestExecutorContainerFactory.Build <QMTilesExecutor>(LoggerFactory,
                                                                                                 configStore : ConfigStore, trexCompactionDataProxy : TRexCompactionDataProxy, customHeaders : CustomHeaders,
                                                                                                 userId : GetUserId(), fileImportProxy : FileImportProxy).ProcessAsync(request) as QMTileResult;

                return((qmTileResult == null) ? null : qmTileResult.TileData);
            }
            catch (Exception e)
            {
                var msg = $"TerrainController.FetchTile. Call to TRex gateway for QMTile has failed. ProjectUid:{projectUid}, FilterUid{filterUid}. Error:{e.Message}";
                Log.LogError(e, msg);
                throw;
            }
        }
Beispiel #4
0
        public async Task <IActionResult> GetTile([FromBody] QMTileRequest request)
        {
            Log.LogInformation($"{nameof(GetTile)}: #Tile# In. Params. XYZ:{request.X},{request.Y},{request.Z}, Project:{request.ProjectUid}, Lighting:{request.HasLighting}, DisplayMode:{request.DisplayMode}");
            request.Validate();

            var tileResult = await WithServiceExceptionTryExecuteAsync(() =>
                                                                       RequestExecutorContainer
                                                                       .Build <QuantizedMeshTileExecutor>(ConfigStore, LoggerFactory, ServiceExceptionHandler)
                                                                       .ProcessAsync(request)) as QMTileResult;

            if (tileResult == null || tileResult.TileData == null)
            {
                Log.LogError($"Failed to get Quantized Mesh tile for projectUid: {request.ProjectUid}. For more info check .Server.QuantizedMesh.log");
                return(NoContent());
            }

            Log.LogDebug($"#Tile# Out. XYZ:{request.X},{request.Y},{request.Z}");
            return(new FileStreamResult(new MemoryStream(tileResult.TileData), ContentTypeConstants.ApplicationOctetStream));
        }
Beispiel #5
0
        public void PD_GetTerrainTile_TRex_Fail()
        {
            var resultStream = new MemoryStream(new byte[]
            {
                0x41, 0x42, 0x42, 0x41
            });

            var tRexProxy = new Mock <ITRexCompactionDataProxy>();

            var request = new QMTileRequest
            {
                X          = 0,
                Y          = 0,
                Z          = 0,
                Filter     = new FilterResult(),
                ProjectUid = Guid.Empty
            };

            // make bad call
            tRexProxy.Setup(x => x.SendDataPostRequestWithStreamResponse(
                                It.Is <QMTileRequest>(r => r.ProjectUid == request.ProjectUid),
                                It.Is <string>(s => s == "/terrainNoValid"),
                                It.IsAny <IHeaderDictionary>()))
            .Returns(Task.FromResult <Stream>(resultStream));

            var configStore = new Mock <IConfigurationStore>();

            var executor = RequestExecutorContainerFactory
                           .Build <QMTilesExecutor>(logger, configStore: configStore.Object,
                                                    trexCompactionDataProxy: tRexProxy.Object, customHeaders: _customHeaders);

            var result = executor.ProcessAsync(request).Result as QMTileResult;

            Assert.IsNull(result, "Result should be null");

            tRexProxy.Verify(m => m.SendDataPostRequestWithStreamResponse(
                                 It.Is <QMTileRequest>(r => r.ProjectUid == request.ProjectUid),
                                 It.Is <string>(s => s == "/terrain"),
                                 It.IsAny <IHeaderDictionary>())
                             , Times.Once);
        }
Beispiel #6
0
        public void Test_QMTileRequest_Creation()
        {
            var request = new QMTileRequest();

            request.Should().NotBeNull();
        }