Pccrr server.
상속: IDisposable
        public void Start(int port, CryptoAlgoId_Values cryptoAlgoId, byte[] content, EventQueue eventQueue)
        {
            this.cryptoAlgoId = cryptoAlgoId;
            this.content = content;
            this.eventQueue = eventQueue;
            this.aes = PccrrUtitlity.CreateAes(cryptoAlgoId);
            this.iv = new byte[16];
            for (int i = 0; i < iv.Length; i++)
            {
                this.iv[i] = (byte)i;
            }

            pccrrServer = new PccrrServer(port);

            pccrrServer.MessageArrived += new MessageArrivedEventArgs(pccrrServer_MessageArrived);

            pccrrServer.StartListening();
        }
        public void HostedCacheServer_PchcServer_SegmentInfo_HashAlgoInvalid()
        {
            CheckApplicability();

            var contentInformation = contentInformationUtility.CreateContentInformationV1();

            using (var pccrrServer = new PccrrServer(testConfig.ClientContentRetrievalListenPort))
            {
                pccrrServer.StartListening();

                pccrrServer.MessageArrived += new MessageArrivedEventArgs(delegate(IPEndPoint sender, PccrrPacket pccrrPacket)
                {
                    BaseTestSite.Assert.Fail("Hosted cache server should not retrieve content information with invalid hash algorithm");
                });

                PCHCClient pchcClient = new PCHCClient(
                    TransferProtocol.HTTPS,
                    testConfig.HostedCacheServerComputerName,
                    testConfig.HostedCacheServerHTTPSListenPort,
                    PchcConsts.HttpsUrl,
                    testConfig.DomainName,
                    testConfig.UserName,
                    testConfig.UserPassword);

                var segmentInfo = pchcClient.CreateSegmentInfoMessage(
                    testConfig.ClientContentRetrievalListenPort,
                    contentInformation,
                    0);

                segmentInfo.SegmentInfo.dwHashAlgo = (dwHashAlgo_Values)0xFEFE;

                var segmentInfoResponse = pchcClient.SendSegmentInfoMessage(segmentInfo);

                BaseTestSite.Assert.AreEqual(
                    RESPONSE_CODE.OK,
                    segmentInfoResponse.ResponseCode,
                    "Hosted cache server should return OK to segment info message");

                Thread.Sleep(testConfig.NegativeTestTimeout);
            }
        }
        /// <summary>
        /// Initialize adapter data and create connection.
        /// </summary>
        /// <param name="testSite">the test site</param>
        public override void Initialize(ITestSite testSite)
        {
            base.Initialize(ReqConfigurableSite.GetReqConfigurableSite(testSite));
            this.Site.DefaultProtocolDocShortName = "MS-PCCRR";
            this.isDistributedMode = bool.Parse(this.GetProperty("Environment.IsDistributedMode"));

            if (!this.isDistributedMode)
            {
                this.isWindows = string.Equals(
                    testSite.Properties["Environment.SecondContentClient.OSVersion"],
                    "win2k8r2",
                    StringComparison.OrdinalIgnoreCase);
            }
            else
            {
                this.isWindows = string.Equals(
                    testSite.Properties["Environment.DistributedSUT.OSVersion"],
                    "win2k8r2",
                    StringComparison.OrdinalIgnoreCase);
            }

            this.cryptoAlgo = (CryptoAlgoId_Values)Enum.Parse(typeof(CryptoAlgoId_Values), this.GetProperty("PCCRR.Protocol.CryptoAlgoId_Value"));
            this.port = int.Parse(this.GetProperty("PCCRR.Protocol.HttpPort"));
            PccrrBothRoleCaptureCode.Initialize(this.Site);

            this.minSupV.MinorVersion = ushort.Parse(this.GetProperty("PCCRR.Protocol.MSG_NEGO_RESP.MinSupportedProtocolVersion.MinorVer"));
            this.minSupV.MajorVersion = ushort.Parse(this.GetProperty("PCCRR.Protocol.MSG_NEGO_RESP.MinSupportedProtocolVersion.MajorVer"));
            this.maxSupV.MinorVersion = ushort.Parse(this.GetProperty("PCCRR.Protocol.MSG_NEGO_RESP.MaxSupportedProtocolVersion.MinorVer"));
            this.maxSupV.MajorVersion = ushort.Parse(this.GetProperty("PCCRR.Protocol.MSG_NEGO_RESP.MaxSupportedProtocolVersion.MajorVer"));
            this.minErrorSupV.MinorVersion = ushort.Parse(this.GetProperty("PCCRR.Protocol.MSG_NEGO_RESP.Error.MinSupportedProtocolVersion"));
            this.minErrorSupV.MajorVersion = ushort.Parse(this.GetProperty("PCCRR.Protocol.MSG_NEGO_RESP.MaxSupportedProtocolVersion.MajorVer"));
            this.maxErrorSupV.MinorVersion = ushort.Parse(this.GetProperty("PCCRR.Protocol.MSG_NEGO_RESP.Error.MaxSupportedProtocolVersion"));
            this.maxErrorSupV.MajorVersion = ushort.Parse(this.GetProperty("PCCRR.Protocol.MSG_NEGO_RESP.MaxSupportedProtocolVersion.MajorVer"));
            this.protoVer.MinorVersion = ushort.Parse(this.GetProperty("PCCRR.Protocol.MSG_NEGO_REQ.MinSupportedProtocolVersion.MinorVer"));
            this.protoVer.MajorVersion = ushort.Parse(this.GetProperty("PCCRR.Protocol.MSG_NEGO_REQ.MinSupportedProtocolVersion.MajorVer"));
            this.protoErrorVer.MinorVersion = ushort.Parse(this.GetProperty("PCCRR.Protocol.MSG_NEGO_REQ.ErrorProtocolVersion"));
            this.protoErrorVer.MajorVersion = ushort.Parse(this.GetProperty("PCCRR.Protocol.MSG_NEGO_RESP.MaxSupportedProtocolVersion.MajorVer"));

            this.pccrrStackSer = new PccrrServer(this.port, string.Empty, IPAddressType.IPv4);
            this.pccrrStackSer.MessageArrived += new MessageArrivedEventArgs(this.RetrievalTransport_Receive);

            this.pccrrStackSer.StartListening();
        }
        public void HostedCacheServer_PchcServer_BatchedOffer_SegmentDescriptorTooMany()
        {
            CheckApplicability();

            var contentInformation = contentInformationUtility.CreateContentInformationV2();

            using (var pccrrServer = new PccrrServer(testConfig.ClientContentRetrievalListenPort))
            {
                pccrrServer.StartListening();

                pccrrServer.MessageArrived += new MessageArrivedEventArgs(delegate(IPEndPoint sender, PccrrPacket pccrrPacket)
                {
                    BaseTestSite.Assert.Fail("Hosted cache server should not retrieve content information with more than 128 segment descriptions");
                });

                PCHCClient pchcClient = new PCHCClient(
                    TransferProtocol.HTTP,
                    testConfig.HostedCacheServerComputerName,
                    testConfig.HostedCacheServerHTTPListenPort,
                    PchcConsts.HttpUrl,
                    testConfig.DomainName,
                    testConfig.UserName,
                    testConfig.UserPassword);

                var batchedOffer = pchcClient.CreateBatchedOfferMessage(
                    testConfig.ClientContentRetrievalListenPort,
                    contentInformation);

                List<SegmentDescriptor> segmentDescriptors = new List<SegmentDescriptor>();
                for (int i = 0; i < 129; i++)
                {
                    segmentDescriptors.Add(batchedOffer.SegmentDescriptors[0]);
                }
                batchedOffer.SegmentDescriptors = segmentDescriptors.ToArray();

                bool passed = false;
                try
                {
                    pchcClient.SendBatchedOfferMessage(batchedOffer);
                }
                catch
                {
                    passed = true;
                }

                BaseTestSite.Assert.IsTrue(passed, "Hosted cache server should drop invalid batched offer request");
            }
        }
        public void HostedCacheServer_PchcServer_BatchedOffer_HashAlgoInvalid()
        {
            CheckApplicability();

            var contentInformation = contentInformationUtility.CreateContentInformationV2();

            using (var pccrrServer = new PccrrServer(testConfig.ClientContentRetrievalListenPort))
            {
                pccrrServer.StartListening();

                pccrrServer.MessageArrived += new MessageArrivedEventArgs(delegate(IPEndPoint sender, PccrrPacket pccrrPacket)
                {
                    BaseTestSite.Assert.Fail("Hosted cache server should not retrieve content information with more than 128 segment descriptions");
                });

                PCHCClient pchcClient = new PCHCClient(
                    TransferProtocol.HTTP,
                    testConfig.HostedCacheServerComputerName,
                    testConfig.HostedCacheServerHTTPListenPort,
                    PchcConsts.HttpUrl,
                    testConfig.DomainName,
                    testConfig.UserName,
                    testConfig.UserPassword);

                var batchedOffer = pchcClient.CreateBatchedOfferMessage(
                    testConfig.ClientContentRetrievalListenPort,
                    contentInformation);

                batchedOffer.SegmentDescriptors[0].HashAlgorithm = 0xFE;

                var batchedOfferResponse = pchcClient.SendBatchedOfferMessage(batchedOffer);

                BaseTestSite.Assert.AreEqual(
                    RESPONSE_CODE.OK,
                    batchedOfferResponse.ResponseCode,
                    "Hosted cache server should return OK to batched offer message");

                Thread.Sleep(testConfig.NegativeTestTimeout);
            }
        }
        /// <summary>
        /// Start the MS-PCCRR server listening to incoming MS-PCCRR request message.
        /// </summary>
        /// <param name="port">The listening port.</param>
        public void StartPccrrServerListening(int port)
        {
            try
            {
                this.pccrrServer =
                    new PccrrServer(
                        port,
                        string.Empty,
                        IPAddressType.IPv4);
                this.pccrrServer.MessageArrived
                    += new Microsoft.Protocols.TestTools.StackSdk.BranchCache.Pccrr.MessageArrivedEventArgs(
                        this.RetrievalTransport_Receive);

                this.pccrrServer.StartListening();
            }
            catch (ThreadStateException e)
            {
                Site.Log.Add(
                    LogEntryKind.Debug,
                    "Can't start pccrr server listening. Detailed information: {0}",
                    e.Message);
                throw;
            }
        }
        /// <summary>
        /// Reset the adapter
        /// </summary>
        public override void Reset()
        {
            base.Reset();

            this.isReceived = false;
            this.pccrtpResponse = null;
            if (this.pccrrServer != null)
            {
                this.pccrrServer.CloseConnections();
                this.pccrrServer = null;
            }
        }
        public void HostedCacheServer_PchcServer_GetBlocks_SizeOfBlockNotMatch()
        {
            CheckApplicability();

            var contentInformation = contentInformationUtility.CreateContentInformationV1();

            using (var pccrrServer = new PccrrServer(testConfig.ClientContentRetrievalListenPort))
            {
                bool blockRetrieved = false;
                pccrrServer.MessageArrived += new MessageArrivedEventArgs(delegate(IPEndPoint sender, PccrrPacket pccrrPacket)
                    {
                        var pccrrGetBlkRequest = (PccrrGETBLKSRequestPacket)pccrrPacket;

                        if (pccrrGetBlkRequest != null)
                        {
                            BaseTestSite.Log.Add(
                                LogEntryKind.Debug,
                                "PCCRR GetBlks request received from hosted cache server. Send malformed Blks response");

                            var pccrrBlocksResponse = pccrrServer.CreateMsgBlkResponse(
                                pccrrGetBlkRequest.MsgGetBLKS.SegmentID,
                                TestUtility.GenerateRandomArray(ContentInformationUtility.DefaultBlockSize),
                                CryptoAlgoId_Values.AES_128,
                                MsgType_Values.MSG_BLK,
                                TestUtility.GenerateRandomArray(16),
                                0,
                                0);
                            var blk = pccrrBlocksResponse.MsgBLK;
                            blk.SizeOfBlock = 0;
                            pccrrBlocksResponse.MsgBLK = blk;
                            pccrrServer.SendPacket(pccrrBlocksResponse);

                            blockRetrieved = true;
                        }
                    });
                pccrrServer.StartListening();

                PCHCClient pchcClient = new PCHCClient(
                    TransferProtocol.HTTPS,
                    testConfig.HostedCacheServerComputerName,
                    testConfig.HostedCacheServerHTTPSListenPort,
                    PchcConsts.HttpsUrl,
                    testConfig.DomainName,
                    testConfig.UserName,
                    testConfig.UserPassword);

                BaseTestSite.Log.Add(
                    LogEntryKind.Debug,
                    "Offer block to hosted cache server");

                SEGMENT_INFO_MESSAGE segmentInfoMessage = pchcClient.CreateSegmentInfoMessage(
                    testConfig.ClientContentRetrievalListenPort,
                    contentInformation,
                    0);
                pchcClient.SendSegmentInfoMessage(segmentInfoMessage);

                TestUtility.DoUntilSucceed(() =>
                {
                    return blockRetrieved;
                }, testConfig.Timeout, testConfig.RetryInterval);
            }

            BaseTestSite.Log.Add(
                LogEntryKind.Debug,
                "Try to retrieve the block from hosted cache server");

            PccrrClient pccrrClient = new PccrrClient(
                testConfig.HostedCacheServerComputerName,
                testConfig.HostedCacheServerHTTPListenPort);

            PccrrGETBLKSRequestPacket pccrrBlkRequest = pccrrClient.CreateMsgGetBlksRequest(
                contentInformation.GetSegmentId(0),
                CryptoAlgoId_Values.AES_128,
                MsgType_Values.MSG_GETBLKS,
                0,
                1);
            pccrrClient.SendPacket(
                pccrrBlkRequest,
                testConfig.Timeout);
            PccrrBLKResponsePacket pccrrBlkResponse
                = (PccrrBLKResponsePacket)pccrrClient.ExpectPacket();

            BaseTestSite.Assert.AreEqual<uint>(
                0,
                pccrrBlkResponse.MsgBLK.SizeOfBlock,
                "The server MUST set the SizeOfBlock field to zero if blocks data is not available.");
        }