コード例 #1
0
        public void FrameProtocol_RoundTripOfMultiFrames_Success()
        {
            // Arrange
            GetChunkedFileRequestMessage request = CreateGetChunkedFileRequestMessage();

            // Act
            // Build a request stream from a message frame and a chunk frame
            var   builder = new FrameProtocolBuilder();
            IBlob blob1   = new MemoryBlob(Encoding.UTF8.GetBytes("Blob1"));
            IBlob blob2   = new MemoryBlob(Encoding.UTF8.GetBytes("Blob2"));

            builder.AddFrame(request);
            builder.AddFrame(blob1);
            builder.AddFrame(blob2);
            var inputStream = builder.CreateStream();

            // Parse the request stream into multiple WopiFrame
            List <Frame> frameList = FrameProtocolParser.ParseStream(inputStream);

            // Assert
            Assert.AreEqual(3, frameList.Count);
            Assert.IsNotNull(frameList[0].Payload);
            Assert.IsNull(frameList[0].ExtendedHeader);
            Assert.IsNotNull(frameList[1].Payload);
            Assert.IsNotNull(frameList[1].ExtendedHeader);
            Assert.AreEqual(blob1.BlobId, System.Convert.ToBase64String(frameList[1].ExtendedHeader));
            var spookyHash = new SpookyHash();

            Assert.AreEqual(blob1.BlobId, spookyHash.CalculateHash(frameList[1].Payload));
            Assert.IsNotNull(frameList[2].Payload);
            Assert.IsNotNull(frameList[2].ExtendedHeader);
            Assert.AreEqual(blob2.BlobId, System.Convert.ToBase64String(frameList[2].ExtendedHeader));
            Assert.AreEqual(blob2.BlobId, spookyHash.CalculateHash(new MemoryStream(frameList[2].Payload)));
        }
コード例 #2
0
        private ValidationResult ValidateGetChunkedFileResponse(IResponseData data)
        {
            data.ResponseStream.Seek(0, SeekOrigin.Begin);

            if (data.ResponseStream == null || data.ResponseStream.Length == 0)
            {
                return(new ValidationResult(String.Format(CultureInfo.CurrentCulture, "ResponseData.ResponseStream is null or empty")));
            }

            List <Frame> outputFrames = FrameProtocolParser.ParseStream(data.ResponseStream);

            data.ResponseStream.Seek(0, SeekOrigin.Begin);

            if (outputFrames == null || outputFrames.Count < 1)
            {
                return(new ValidationResult(String.Format(CultureInfo.CurrentCulture, "Parsed outputFrameList is null or empty")));
            }

            if (outputFrames[0].Type != FrameType.MessageJSON)
            {
                return(new ValidationResult(String.Format(CultureInfo.CurrentCulture, "The first frame is not MessageJson type")));
            }

            for (int i = 0; i < outputFrames.Count; i++)
            {
                Frame            outputFrame     = outputFrames[i];
                ValidationResult frameValidation = ValidateFrame(outputFrame);

                if (frameValidation.HasFailures)
                {
                    return(frameValidation);
                }

                switch (outputFrame.Type)
                {
                case FrameType.MessageJSON:
                    // Enrich HostBlobIdsPerStreamId with chunk ids of the file from download, keyed by stream id
                    PopulateMessageFrame(outputFrame);
                    break;

                case FrameType.Chunk:
                    // Enrich HostBlobs with delta blobs of the file from download
                    PopulateHostFileChunkIdToBlobMapping(outputFrame);
                    break;

                default:
                    break;
                }
            }

            if (this.ExpectedHostBlobsCount != null && this.ExpectedHostBlobsCount.Value != HostBlobs.Count)
            {
                return(new ValidationResult($"{nameof(ExpectedHostBlobsCount)}: '{ExpectedHostBlobsCount.Value}' not equal to {nameof(HostBlobs)}.Count: '{HostBlobs.Count}'"));
            }

            return(new ValidationResult());
        }
コード例 #3
0
        public void FrameProtocol_RoundTripOfOneMessageFrame_Success()
        {
            // Arrange
            GetChunkedFileRequestMessage request = CreateGetChunkedFileRequestMessage();

            // Act
            // Build a request stream from GetChunkedFile message frame
            FrameProtocolBuilder builder = new FrameProtocolBuilder();

            builder.AddFrame(request);
            var inputStream = builder.CreateStream();

            // Parse the request stream into WopiFrame
            List <Frame> frameList = FrameProtocolParser.ParseStream(inputStream);

            // Assert
            Assert.AreEqual(1, frameList.Count);
            Assert.IsNotNull(frameList[0].Payload);
            Assert.IsNull(frameList[0].ExtendedHeader);
            GetChunkedFileRequestMessage requestDecoded = JsonMessageSerializer.Instance.DeSerialize <GetChunkedFileRequestMessage>(new MemoryStream(frameList[0].Payload));

            Assert.AreEqual(request.ToString(), requestDecoded.ToString());
        }