public async Task HandleUpdateInfoAsync_Succeeds()
        {
            // setup valid http context
            using var memoryStream = new MemoryStream();
            var(httpContext, _, _) = SetupHttpContextWithRequest(CupsRequestJson, memoryStream);

            // setting up the twin in such a way that there are no updates
            var cupsTwinInfo = new CupsTwinInfo(new Uri(CupsUri),
                                                new Uri(TcUri),
                                                CredentialsChecksum,
                                                CredentialsChecksum,
                                                string.Empty,
                                                string.Empty,
                                                Package,
                                                KeyChecksum,
                                                string.Empty,
                                                new Uri(FwUrl));

            _ = this.basicsStationConfigurationService.Setup(m => m.GetCupsConfigAsync(It.IsAny <StationEui>(), It.IsAny <CancellationToken>()))
                .Returns(Task.FromResult(cupsTwinInfo));

            // Act
            await this.processor.HandleUpdateInfoAsync(httpContext.Object, default);

            // Assert
            var responseLength = httpContext.Object.Response.ContentLength;

            Assert.NotNull(responseLength);
            Assert.Equal((int)HttpStatusCode.OK, httpContext.Object.Response.StatusCode);
        }
        public async Task HandleUpdateInfoAsync_Invokes_FetchFirmware_WhenUpdateAvailable()
        {
            // setup
            using var memoryStream = new MemoryStream();
            var strictifiedInput = JsonUtil.Strictify(CupsRequestJson);

            var(httpContext, httpRequest, _) = SetupHttpContextWithRequest(strictifiedInput, memoryStream);
            _ = httpRequest.Setup(r => r.ContentLength).Returns(Encoding.UTF8.GetByteCount(strictifiedInput));

            var signatureBase64 = "ABCD";
            // setting up the twin in such a way that there is a fw update but no matching checksum
            var cupsTwinInfo = new CupsTwinInfo(new Uri(CupsUri),
                                                new Uri(TcUri),
                                                CredentialsChecksum,
                                                CredentialsChecksum,
                                                string.Empty,
                                                string.Empty,
                                                "anotherVersion",
                                                KeyChecksum,
                                                signatureBase64,
                                                new Uri(FwUrl));

            _ = this.basicsStationConfigurationService.Setup(m => m.GetCupsConfigAsync(It.IsAny <StationEui>(), It.IsAny <CancellationToken>()))
                .Returns(Task.FromResult(cupsTwinInfo));

            var firmwareBytes = new byte[] { 1, 2, 3 };

            using var httpContent = new ByteArrayContent(firmwareBytes);
            _ = this.deviceAPIServiceBase.Setup(m => m.FetchStationFirmwareAsync(It.IsAny <StationEui>(), It.IsAny <CancellationToken>()))
                .ReturnsAsync(httpContent);
            // act
            await this.processor.HandleUpdateInfoAsync(httpContext.Object, default);

            // assert

            this.deviceAPIServiceBase.Verify(m => m.FetchStationFirmwareAsync(StationEui.Parse(StationEuiString), It.IsAny <CancellationToken>()), Times.Once);

            var expectedHeader = new CupsUpdateInfoResponseHeader
            {
                UpdateSignature  = Convert.FromBase64String(signatureBase64),
                SignatureKeyCrc  = KeyChecksum,
                UpdateDataLength = (uint)firmwareBytes.Length,
            };
            var expectedHeaderBytes = expectedHeader.Serialize(new byte[256].AsMemory()).ToArray();

            var response = memoryStream.ToArray();

            Assert.Equal(expectedHeaderBytes, response[..expectedHeaderBytes.Length]);