public void Rdpei_TouchInputTest_Positive_SingleTouchEvent() { Site.Log.Add(LogEntryKind.Debug, "Establishing RDP connection ..."); StartRDPConnection(); Site.Log.Add(LogEntryKind.Debug, "Creating dynamic virtual channels for MS-RDPEI ..."); bool bProtocolSupported = this.rdpeiServer.CreateRdpeiDvc(waitTime); TestSite.Assert.IsTrue(bProtocolSupported, "Client should support this protocol."); // RDPEI initializing phase Site.Log.Add(LogEntryKind.Debug, "Sending a RDPINPUT_SC_READY_PDU."); RDPINPUT_SC_READY_PDU scReadyPdu = this.rdpeiServer.CreateRdpInputScReadyPdu(); this.rdpeiServer.SendRdpInputScReadyPdu(scReadyPdu); Site.Log.Add(LogEntryKind.Debug, "Expecting RDPINPUT_CS_READY_PDU ..."); RDPINPUT_CS_READY_PDU csReadyPdu = this.rdpeiServer.ExpectRdpInputCsReadyPdu(waitTime); TestSite.Assert.IsTrue(csReadyPdu != null, "Client is expected to send RDPINPUT_CS_READY_PDU to the server."); this.rdpeiSUTControlAdapter.TriggerOneTouchEventOnClient(this.TestContext.TestName); // RDPEI running phase Site.Log.Add(LogEntryKind.Debug, "Expecting RDPINPUT_TOUCH_EVENT_PDU ..."); RDPINPUT_TOUCH_EVENT_PDU touchEventPdu = this.rdpeiServer.ExpectRdpInputTouchEventPdu(waitTime); VerifyRdpInputTouchEventPdu(touchEventPdu, true); if (isManagedAdapter) { RdpeiUtility.SendConfirmImage(); } }
public void Rdpei_TouchInputTest_Positive_MultiTouchEvent() { Site.Log.Add(LogEntryKind.Debug, "Establishing RDP connection ..."); StartRDPConnection(); Site.Log.Add(LogEntryKind.Debug, "Creating dynamic virtual channels for MS-RDPEI ..."); bool bProtocolSupported = this.rdpeiServer.CreateRdpeiDvc(waitTime); TestSite.Assert.IsTrue(bProtocolSupported, "Client should support this protocol."); // RDPEI initializing phase Site.Log.Add(LogEntryKind.Debug, "Sending a RDPINPUT_SC_READY_PDU."); RDPINPUT_SC_READY_PDU scReadyPdu = this.rdpeiServer.CreateRdpInputScReadyPdu(); this.rdpeiServer.SendRdpInputScReadyPdu(scReadyPdu); Site.Log.Add(LogEntryKind.Debug, "Expecting RDPINPUT_CS_READY_PDU ..."); RDPINPUT_CS_READY_PDU csReadyPdu = this.rdpeiServer.ExpectRdpInputCsReadyPdu(waitTime); TestSite.Assert.IsTrue(csReadyPdu != null, "Client is expected to send RDPINPUT_CS_READY_PDU to the server."); ushort contactCount = (csReadyPdu.maxTouchContacts > 5) ? (ushort)5 : csReadyPdu.maxTouchContacts; this.rdpeiSUTControlAdapter.TriggerMultiTouchEventOnClient(this.TestContext.TestName, contactCount); // RDPEI running phase Site.Log.Add(LogEntryKind.Debug, "Expecting multitouch RDPINPUT_TOUCH_EVENT_PDU ..."); bool isFirstFrame = true; DateTime endTime = DateTime.Now + waitTime; bool isExpectedFrameReceived = false; while (DateTime.Now < endTime && !isExpectedFrameReceived) { RDPINPUT_TOUCH_EVENT_PDU touchEventPdu = this.rdpeiServer.ExpectRdpInputTouchEventPdu(waitTime); Site.Assert.IsNotNull(touchEventPdu, "Client is expected to send to the server a RDPINPUT_TOUCH_EVENT_PDU whose contactCount is {0}.", contactCount); VerifyRdpInputTouchEventPdu(touchEventPdu, isFirstFrame); if (isFirstFrame) { isFirstFrame = false; } foreach (RDPINPUT_TOUCH_FRAME f in touchEventPdu.frames) { if (f.contactCount.ToUShort() == contactCount) { isExpectedFrameReceived = true; break; } } } Site.Assert.IsTrue(isExpectedFrameReceived, "Client is expected to send to the server a RDPINPUT_TOUCH_EVENT_PDU whose contactCount is {0}.", contactCount); if (isManagedAdapter) { RdpeiUtility.SendConfirmImage(); } }
public void Rdpei_TouchControlTest_Negative_DuplicatedResume() { Site.Log.Add(LogEntryKind.Debug, "Establishing RDP connection ..."); StartRDPConnection(); Site.Log.Add(LogEntryKind.Debug, "Creating dynamic virtual channels for MS-RDPEI ..."); bool bProtocolSupported = this.rdpeiServer.CreateRdpeiDvc(waitTime); TestSite.Assert.IsTrue(bProtocolSupported, "Client should support this protocol."); // RDPEI initializing phase Site.Log.Add(LogEntryKind.Debug, "Sending a RDPINPUT_SC_READY_PDU."); RDPINPUT_SC_READY_PDU scReadyPdu = this.rdpeiServer.CreateRdpInputScReadyPdu(); this.rdpeiServer.SendRdpInputScReadyPdu(scReadyPdu); Site.Log.Add(LogEntryKind.Debug, "Expecting RDPINPUT_CS_READY_PDU ..."); RDPINPUT_CS_READY_PDU csReadyPdu = this.rdpeiServer.ExpectRdpInputCsReadyPdu(waitTime); TestSite.Assert.IsTrue(csReadyPdu != null, "Client is expected to send RDPINPUT_CS_READY_PDU to the server."); // RDPEI running phase Site.Log.Add(LogEntryKind.Debug, "Sending a RDPINPUT_SUSPEND_TOUCH_PDU."); RDPINPUT_SUSPEND_TOUCH_PDU suspendPdu = this.rdpeiServer.CreateRdpInputSuspendTouchPdu(); this.rdpeiServer.SendRdpInputSuspendTouchPdu(suspendPdu); Site.Log.Add(LogEntryKind.Debug, "Sending a RDPINPUT_RESUME_TOUCH_PDU."); RDPINPUT_RESUME_TOUCH_PDU resumePdu = this.rdpeiServer.CreateRdpInputResumeTouchPdu(); this.rdpeiServer.SendRdpInputResumeTouchPdu(resumePdu); // Send a duplicated resume message to test the client will ignore it, since the Touch Remoting Suspended ADM element is already set to FALSE. Site.Log.Add(LogEntryKind.Debug, "Sending a RDPINPUT_RESUME_TOUCH_PDU."); this.rdpeiServer.SendRdpInputResumeTouchPdu(resumePdu); this.rdpeiSUTControlAdapter.TriggerOneTouchEventOnClient(this.TestContext.TestName); Site.Log.Add(LogEntryKind.Debug, "Expecting RDPINPUT_TOUCH_EVENT_PDU ..."); RDPINPUT_TOUCH_EVENT_PDU touchEventPdu = this.rdpeiServer.ExpectRdpInputTouchEventPdu(waitTime); VerifyRdpInputTouchEventPdu(touchEventPdu, true); if (isManagedAdapter) { RdpeiUtility.SendConfirmImage(); } }
public void Rdpei_TouchInputTest_Negative_TouchEventWithoutNegotiation() { Site.Log.Add(LogEntryKind.Debug, "Establishing RDP connection ..."); StartRDPConnection(); Site.Log.Add(LogEntryKind.Debug, "Creating dynamic virtual channels for MS-RDPEI ..."); bool bProtocolSupported = this.rdpeiServer.CreateRdpeiDvc(waitTime); TestSite.Assert.IsTrue(bProtocolSupported, "Client should support this protocol."); this.rdpeiSUTControlAdapter.TriggerContinuousTouchEventOnClient("Rdpei_TouchInputTest_Negative_TouchEventWithoutNegotiation"); RDPINPUT_TOUCH_EVENT_PDU touchEventPdu = this.rdpeiServer.ExpectRdpInputTouchEventPdu(waitTime); Site.Assert.IsNull(touchEventPdu, "The client is not expected to send a RDPINPUT_TOUCH_EVENT_PDU."); }
public void Rdpei_TouchControlTest_Negative_InvalidSuspendPduLength() { Site.Log.Add(LogEntryKind.Debug, "Establishing RDP connection ..."); StartRDPConnection(); Site.Log.Add(LogEntryKind.Debug, "Creating dynamic virtual channels for MS-RDPEI ..."); bool bProtocolSupported = this.rdpeiServer.CreateRdpeiDvc(waitTime); TestSite.Assert.IsTrue(bProtocolSupported, "Client should support this protocol."); // RDPEI initializing phase Site.Log.Add(LogEntryKind.Debug, "Sending a RDPINPUT_SC_READY_PDU."); RDPINPUT_SC_READY_PDU scReadyPdu = this.rdpeiServer.CreateRdpInputScReadyPdu(); this.rdpeiServer.SendRdpInputScReadyPdu(scReadyPdu); Site.Log.Add(LogEntryKind.Debug, "Expecting RDPINPUT_CS_READY_PDU ..."); RDPINPUT_CS_READY_PDU csReadyPdu = this.rdpeiServer.ExpectRdpInputCsReadyPdu(waitTime); TestSite.Assert.IsTrue(csReadyPdu != null, "Client is expected to send RDPINPUT_CS_READY_PDU to the server."); // RDPEI running phase Site.Log.Add(LogEntryKind.Debug, "Sending a RDPINPUT_SUSPEND_TOUCH_PDU with invalid PduLength."); RDPINPUT_INVALID_PDU invalidPdu = CreateRdpInputInvalidPdu((ushort)EventId_Values.EVENTID_SUSPEND_TOUCH, 16, null); SendRdpInvalidPdu(invalidPdu); // Expect the client to ignore the RDPINPUT_SUSPEND_TOUCH_PDU with invalid pduLength. this.rdpeiSUTControlAdapter.TriggerOneTouchEventOnClient(this.TestContext.TestName); Site.Log.Add(LogEntryKind.Debug, "Expecting RDPINPUT_TOUCH_EVENT_PDU ..."); RDPINPUT_TOUCH_EVENT_PDU touchEventPdu = this.rdpeiServer.ExpectRdpInputTouchEventPdu(waitTime); Site.Assert.IsNotNull(touchEventPdu, "Client should ignore the RDPINPUT_SUSPEND_TOUCH_PDU message when the pduLength field is inconsistent with the amount of data read from DVC."); VerifyRdpInputTouchEventPdu(touchEventPdu, true); if (isManagedAdapter) { RdpeiUtility.SendConfirmImage(); } }
/// <summary> /// The callback method to receive data from transport layer. /// </summary> private void OnDataReceived(byte[] data, uint channelId) { lock (receivedList) { RDPINPUT_PDU pdu = new RDPINPUT_PDU(); bool fResult = PduMarshaler.Unmarshal(data, pdu); if (fResult) { byte[] pduData = new byte[pdu.header.pduLength]; Array.Copy(data, pduData, pduData.Length); RDPINPUT_PDU msg = pdu; if (pdu.header.eventId == EventId_Values.EVENTID_CS_READY) { RDPINPUT_CS_READY_PDU request = new RDPINPUT_CS_READY_PDU(); if (PduMarshaler.Unmarshal(pduData, request)) { msg = request; } } else if (pdu.header.eventId == EventId_Values.EVENTID_DISMISS_HOVERING_CONTACT) { RDPINPUT_DISMISS_HOVERING_CONTACT_PDU request = new RDPINPUT_DISMISS_HOVERING_CONTACT_PDU(); if (PduMarshaler.Unmarshal(pduData, request)) { msg = request; } } else if (pdu.header.eventId == EventId_Values.EVENTID_TOUCH) { RDPINPUT_TOUCH_EVENT_PDU request = new RDPINPUT_TOUCH_EVENT_PDU(); if (PduMarshaler.Unmarshal(pduData, request)) { msg = request; } } receivedList.Add(msg); } } }
/// <summary> /// This method is used to verify the structure of RDPINPUT_TOUCH_EVENT_PDU. /// </summary> /// <param name="pdu">The RDPINPUT_TOUCH_EVENT_PDU.</param> /// <param name="isFirstFrame">Whether the input pdu is the first pdu that client has transmitted.</param> public void VerifyRdpInputTouchEventPdu(RDPINPUT_TOUCH_EVENT_PDU pdu, bool isFirstFrame) { Site.Assert.IsNotNull(pdu, "Client is expected to send RDPINPUT_TOUCH_EVENT_PDU to the server."); Site.Assert.IsNotNull(pdu.header, "The header of RDPINPUT_TOUCH_EVENT_PDU should not be null."); Site.Assert.IsNotNull(pdu.frames, "The array of RDPINPUT_TOUCH_FRAME in RDPINPUT_TOUCH_EVENT_PDU should not be null."); Site.Assert.AreEqual(pdu.header.pduLength, pdu.Length(), "The length of the RDPINPUT_TOUCH_EVENT_PDU message is expected to be the same with the pduLength in header."); Site.Assert.AreEqual((int)pdu.frameCount.ToUShort(), pdu.frames.Length, "The size of the array frames in RDPINPUT_TOUCH_EVENT_PDU is expected to be the same with the frameCount ."); if (isFirstFrame) { Site.Assert.IsTrue(pdu.frames[0].frameOffset.ToULong() == 0, "The field frameOffset of the first frame being transmitted must be set to zero."); } foreach (RDPINPUT_TOUCH_FRAME f in pdu.frames) { Site.Assert.AreEqual((int)f.contactCount.ToUShort(), f.contacts.Length, "The size of the array contacts in RDPINPUT_TOUCH_FRAME is expected to be the same with the contactCount ."); foreach (RDPINPUT_CONTACT_DATA d in f.contacts) { if (((RDPINPUT_CONTACT_DATA_FieldsPresent)(d.fieldsPresent.ToUShort())).HasFlag(RDPINPUT_CONTACT_DATA_FieldsPresent.CONTACT_DATA_CONTACTRECT_PRESENT)) { Site.Assert.IsNotNull(d.contactRectBottom, "The contactRectBottom is not expected to be null when flag CONTACT_DATA_CONTACTRECT_PRESENT in filedsPresent is set."); Site.Assert.IsNotNull(d.contactRectTop, "The contactRectTop is not expected to be null when flag CONTACT_DATA_CONTACTRECT_PRESENT in filedsPresent is set."); Site.Assert.IsNotNull(d.contactRectLeft, "The contactRectLeft is not expected to be null when flag CONTACT_DATA_CONTACTRECT_PRESENT in filedsPresent is set."); Site.Assert.IsNotNull(d.contactRectRight, "The contactRectRight is not expected to be null when flag CONTACT_DATA_CONTACTRECT_PRESENT in filedsPresent is set."); } if (((RDPINPUT_CONTACT_DATA_FieldsPresent)(d.fieldsPresent.ToUShort())).HasFlag(RDPINPUT_CONTACT_DATA_FieldsPresent.CONTACT_DATA_ORIENTATION_PRESENT)) { Site.Assert.IsNotNull(d.orientation, "The orientation is not expected to be null when flag CONTACT_DATA_ORIENTATION_PRESENT in filedsPresent is set."); } if (((RDPINPUT_CONTACT_DATA_FieldsPresent)(d.fieldsPresent.ToUShort())).HasFlag(RDPINPUT_CONTACT_DATA_FieldsPresent.CONTACT_DATA_PRESSURE_PRESENT)) { Site.Assert.IsNotNull(d.pressure, "The orientation is not expected to be null when flag CONTACT_DATA_PRESSURE_PRESENT in filedsPresent is set."); } Site.Assert.IsTrue(Enum.IsDefined(typeof(ValidStateFlagCombinations), d.contactFlags.ToUInt()), "The value of contactFlags does not contain a valid combination of the contact state flags."); } } }
/// <summary> /// This method is used to verify the structure of RDPINPUT_TOUCH_EVENT_PDU or RDPINPUT_DISMISS_HOVERING_CONTACT_PDU, and update the contact transition state according to the contacts contained in the message. /// </summary> /// <param name="inputPdu">The input pdu.</param> /// <param name="isFirstFrame">Whether the input pdu is the first pdu that client has transmitted.</param> public void VerifyAndUpdateContactState(RDPINPUT_PDU inputPdu, bool isFirstFrame) { if (inputPdu == null) { return; } if (inputPdu is RDPINPUT_TOUCH_EVENT_PDU) { RDPINPUT_TOUCH_EVENT_PDU pdu = inputPdu as RDPINPUT_TOUCH_EVENT_PDU; Site.Assert.IsNotNull(pdu.header, "The header of RDPINPUT_TOUCH_EVENT_PDU should not be null."); Site.Assert.IsNotNull(pdu.frames, "The array of RDPINPUT_TOUCH_FRAME in RDPINPUT_TOUCH_EVENT_PDU should not be null."); Site.Assert.AreEqual(pdu.header.pduLength, pdu.Length(), "The length of the RDPINPUT_TOUCH_EVENT_PDU message is expected to be the same with the pduLength in header."); Site.Assert.AreEqual((int)pdu.frameCount.ToUShort(), pdu.frames.Length, "The size of the array frames in RDPINPUT_TOUCH_EVENT_PDU is expected to be the same with the frameCount ."); if (isFirstFrame) { Site.Assert.IsTrue(pdu.frames[0].frameOffset.ToULong() == 0, "The field frameOffset of the first frame being transmitted must be set to zero."); } foreach (RDPINPUT_TOUCH_FRAME f in pdu.frames) { Site.Assert.AreEqual((int)f.contactCount.ToUShort(), f.contacts.Length, "The size of the array contacts in RDPINPUT_TOUCH_FRAME is expected to be the same with the contactCount ."); foreach (RDPINPUT_CONTACT_DATA d in f.contacts) { if (((RDPINPUT_CONTACT_DATA_FieldsPresent)(d.fieldsPresent.ToUShort())).HasFlag(RDPINPUT_CONTACT_DATA_FieldsPresent.CONTACT_DATA_CONTACTRECT_PRESENT)) { Site.Assert.IsNotNull(d.contactRectBottom, "The contactRectBottom is not expected to be null when flag CONTACT_DATA_CONTACTRECT_PRESENT in filedsPresent is set."); Site.Assert.IsNotNull(d.contactRectTop, "The contactRectTop is not expected to be null when flag CONTACT_DATA_CONTACTRECT_PRESENT in filedsPresent is set."); Site.Assert.IsNotNull(d.contactRectLeft, "The contactRectLeft is not expected to be null when flag CONTACT_DATA_CONTACTRECT_PRESENT in filedsPresent is set."); Site.Assert.IsNotNull(d.contactRectRight, "The contactRectRight is not expected to be null when flag CONTACT_DATA_CONTACTRECT_PRESENT in filedsPresent is set."); } if (((RDPINPUT_CONTACT_DATA_FieldsPresent)(d.fieldsPresent.ToUShort())).HasFlag(RDPINPUT_CONTACT_DATA_FieldsPresent.CONTACT_DATA_ORIENTATION_PRESENT)) { Site.Assert.IsNotNull(d.orientation, "The orientation is not expected to be null when flag CONTACT_DATA_ORIENTATION_PRESENT in filedsPresent is set."); } if (((RDPINPUT_CONTACT_DATA_FieldsPresent)(d.fieldsPresent.ToUShort())).HasFlag(RDPINPUT_CONTACT_DATA_FieldsPresent.CONTACT_DATA_PRESSURE_PRESENT)) { Site.Assert.IsNotNull(d.pressure, "The orientation is not expected to be null when flag CONTACT_DATA_PRESSURE_PRESENT in filedsPresent is set."); } Site.Assert.IsTrue(Enum.IsDefined(typeof(ValidStateFlagCombinations), d.contactFlags.ToUInt()), "The value of contactFlags does not contain a valid combination of the contact state flags."); ValidStateFlagCombinations temp = (ValidStateFlagCombinations)(d.contactFlags.ToUInt()); byte result = stateMachine.UpdateContactsMap(d.contactId, temp, d.x.ToInt(), d.y.ToInt()); Site.Assert.AreNotEqual(result, 1, "The contact state transition is invalid."); Site.Assert.AreNotEqual(result, 2, "The contact position cannot change when transitioning from 'engaged' state to 'hovering' or 'out of range' state."); } } } else if (inputPdu is RDPINPUT_DISMISS_HOVERING_CONTACT_PDU) { RDPINPUT_DISMISS_HOVERING_CONTACT_PDU pdu = inputPdu as RDPINPUT_DISMISS_HOVERING_CONTACT_PDU; Site.Assert.IsNotNull(pdu.header, "The header of RDPINPUT_DISMISS_HOVERING_CONTACT_PDU should not be null."); Site.Assert.AreEqual(pdu.header.eventId, EventId_Values.EVENTID_DISMISS_HOVERING_CONTACT, "The eventId in the header of RDPINPUT_DISMISS_HOVERING_CONTACT_PDU is expected to be EVENTID_DISMISS_HOVERING_CONTACT."); Site.Assert.AreEqual(pdu.header.pduLength, pdu.Length(), "The length of the RDPINPUT_DISMISS_HOVERING_CONTACT_PDU message is expected to be the same with the pduLength in header."); TouchContactAttribute attr; if (stateMachine.contactStateMap.TryGetValue(pdu.contactId, out attr)) { Site.Assert.AreEqual(attr.state, TouchContactState.Hovering, "The contact {0} is expected to be in hovering state.", pdu.contactId); stateMachine.UpdateContactsMap(pdu.contactId, ValidStateFlagCombinations.UPDATE, 0, 0); } else { Site.Assert.IsTrue(false, "The contact {0} is expected to be in hovering state, but it's out of range.", pdu.contactId); } } else { Site.Assert.IsTrue(false, "Unexpected message."); } }
/// <summary> /// Expect a RDPINPUT_TOUCH_EVENT_PDU. /// </summary> /// <param name="timeout">TimeOut</param> /// <returns>A RDPINPUT_TOUCH_EVENT_PDU instance.</returns> public RDPINPUT_TOUCH_EVENT_PDU ExpectRdpInputTouchEventPdu(TimeSpan timeout) { RDPINPUT_TOUCH_EVENT_PDU pdu = ExpectRdpeiPdu <RDPINPUT_TOUCH_EVENT_PDU>(timeout); return(pdu); }
public void Rdpei_TouchInputTest_Positive_DismissHoveringContact() { Site.Log.Add(LogEntryKind.Debug, "Establishing RDP connection ..."); StartRDPConnection(); Site.Log.Add(LogEntryKind.Debug, "Creating dynamic virtual channels for MS-RDPEI ..."); bool bProtocolSupported = this.rdpeiServer.CreateRdpeiDvc(waitTime); TestSite.Assert.IsTrue(bProtocolSupported, "Client should support this protocol."); // RDPEI initializing phase Site.Log.Add(LogEntryKind.Debug, "Sending a RDPINPUT_SC_READY_PDU."); RDPINPUT_SC_READY_PDU scReadyPdu = this.rdpeiServer.CreateRdpInputScReadyPdu(); this.rdpeiServer.SendRdpInputScReadyPdu(scReadyPdu); Site.Log.Add(LogEntryKind.Debug, "Expecting RDPINPUT_CS_READY_PDU ..."); RDPINPUT_CS_READY_PDU csReadyPdu = this.rdpeiServer.ExpectRdpInputCsReadyPdu(waitTime); TestSite.Assert.IsTrue(csReadyPdu != null, "Client is expected to send RDPINPUT_CS_READY_PDU to the server."); // Trigger the user to determin whether the client device supports proximity. If not, negative value will be returned when using interactive adapter. if (this.rdpeiSUTControlAdapter.TriggerDismissHoveringContactPduOnClient(this.TestContext.TestName) < 0) { TestSite.Assume.Inconclusive("The client device does not support proximity."); } // RDPEI running phase RDPINPUT_TOUCH_EVENT_PDU touchEventPdu = this.rdpeiServer.ExpectRdpInputTouchEventPdu(waitTime); this.stateMachine = new TouchContactStateMachine(); this.stateMachine.Initialize(); VerifyAndUpdateContactState(touchEventPdu, true); // Verify the user input. ushort left = (ushort)(rdpbcgrAdapter.CapabilitySetting.DesktopWidth - 160); ushort top = (ushort)(rdpbcgrAdapter.CapabilitySetting.DesktopHeight - 120); ushort width = 100; ushort height = 60; if (touchEventPdu != null && touchEventPdu.frames != null) { foreach (RDPINPUT_TOUCH_FRAME f in touchEventPdu.frames) { foreach (RDPINPUT_CONTACT_DATA d in f.contacts) { int x = d.x.ToInt(); int y = d.y.ToInt(); if (x >= left && x <= (left + width) && y >= top && y <= (top + height)) { TestSite.Assume.Inconclusive("The client device does not support proximity."); } } } } // The client supports proximity, waiting for RDPINPUT_DISMISS_HOVERING_CONTACT_PDU. Site.Log.Add(LogEntryKind.Debug, "Expecting RDPINPUT_DISMISS_HOVERING_CONTACT_PDU ..."); DateTime endTime = DateTime.Now + waitTime; bool isExpectedFrameReceived = false; while (DateTime.Now < endTime && !isExpectedFrameReceived) { RDPINPUT_PDU pdu = this.rdpeiServer.ExpectRdpInputPdu(waitTime); // Intent to check whether the state transition of received RDPINPUT_DISMISS_HOVERING_CONTACT_PDU is valid. VerifyAndUpdateContactState(pdu, false); if (pdu != null && pdu is RDPINPUT_DISMISS_HOVERING_CONTACT_PDU) { isExpectedFrameReceived = true; } } TestSite.Assert.IsTrue(isExpectedFrameReceived, "Client is expected to send RDPINPUT_DISMISS_HOVERING_CONTACT_PDU to the server."); if (isManagedAdapter) { RdpeiUtility.SendConfirmImage(); } }
public void Rdpei_TouchInputTest_Positive_SingleTouchContactPosition() { if (isInteractiveAdapter) { Site.Assume.Inconclusive("This case will not be bun when using interactive client control adapter."); } Site.Log.Add(LogEntryKind.Debug, "Establishing RDP connection ..."); StartRDPConnection(); Site.Log.Add(LogEntryKind.Debug, "Creating dynamic virtual channels for MS-RDPEI ..."); bool bProtocolSupported = this.rdpeiServer.CreateRdpeiDvc(waitTime); TestSite.Assert.IsTrue(bProtocolSupported, "Client should support this protocol."); // RDPEI initializing phase Site.Log.Add(LogEntryKind.Debug, "Sending a RDPINPUT_SC_READY_PDU."); RDPINPUT_SC_READY_PDU scReadyPdu = this.rdpeiServer.CreateRdpInputScReadyPdu(); this.rdpeiServer.SendRdpInputScReadyPdu(scReadyPdu); Site.Log.Add(LogEntryKind.Debug, "Expecting RDPINPUT_CS_READY_PDU ..."); RDPINPUT_CS_READY_PDU csReadyPdu = this.rdpeiServer.ExpectRdpInputCsReadyPdu(waitTime); TestSite.Assert.IsTrue(csReadyPdu != null, "Client is expected to send RDPINPUT_CS_READY_PDU to the server."); this.rdpeiSUTControlAdapter.TriggerPositionSpecifiedTouchEventOnClient("Rdpei_TouchInputTest_Positive_SingleTouchEvent"); // RDPEI running phase ushort width = this.rdpbcgrAdapter.CapabilitySetting.DesktopWidth; ushort height = this.rdpbcgrAdapter.CapabilitySetting.DesktopHeight; // The diameter of the circle to be sent to the client. ushort diam = 64; Random random = new Random(); // The left and top position of the circles to be sent to the client. //ushort[] arr = { 0, 0, 0, (ushort)(height - diam), (ushort)(width - diam), 0, (ushort)(width - diam), (ushort)(height - diam), (ushort)(random.Next(width - diam * 2) + diam), (ushort)(random.Next(height - diam * 2) + diam) }; ushort[] arr = { 0, 0, 0, (ushort)(height - diam), (ushort)(width - diam), 0, (ushort)(width - diam), (ushort)(height - diam), (ushort)(width / 2 - diam / 2), (ushort)(height / 2 - diam / 2) }; bool isFirstFrame = true; for (int i = 0; i < 5; i++) { ushort left = arr[i * 2]; ushort top = arr[i * 2 + 1]; if (isManagedAdapter) { RdpeiUtility.SendCircle(diam, Color.Red, left, top); } Site.Log.Add(LogEntryKind.Debug, "Expecting RDPINPUT_TOUCH_EVENT_PDU ..."); ushort preLeft = (i == 0) ? (ushort)(width + 1) : arr[(i - 1) * 2]; ushort preTop = (i == 0) ? (ushort)(height + 1) : arr[2 * i - 1]; bool isExpectedFrameReceived = false; while (!isExpectedFrameReceived) { RDPINPUT_TOUCH_EVENT_PDU touchEventPdu = this.rdpeiServer.ExpectRdpInputTouchEventPdu(waitTime); VerifyRdpInputTouchEventPdu(touchEventPdu, isFirstFrame); if (isFirstFrame) { isFirstFrame = false; } foreach (RDPINPUT_TOUCH_FRAME f in touchEventPdu.frames) { foreach (RDPINPUT_CONTACT_DATA d in f.contacts) { int contactX = d.x.ToInt(); int contactY = d.y.ToInt(); // Consume the RDPINPUT_TOUCH_EVENT_PDU received from last touch action. if (contactX >= preLeft && contactX <= preLeft + diam && contactY >= preTop && contactY <= preTop + diam) { continue; } // Touch out of the valid range, send the unexpected position instruction to the client, and fail the case. if (contactX < left || contactX > left + diam || contactY < top || contactY > top + diam) { if (isManagedAdapter) { ushort l = (contactX < diam / 2) ? (ushort)0 : (contactX > (ushort)(rdpbcgrAdapter.CapabilitySetting.DesktopWidth - diam / 2) ? (ushort)(rdpbcgrAdapter.CapabilitySetting.DesktopWidth - diam) : (ushort)(contactX - diam / 2)); ushort t = (contactY < diam / 2) ? (ushort)0 : (contactY > (ushort)(rdpbcgrAdapter.CapabilitySetting.DesktopHeight - diam / 2) ? (ushort)(rdpbcgrAdapter.CapabilitySetting.DesktopHeight - diam) : (ushort)(contactY - diam / 2)); RdpeiUtility.SendCircle(diam, Color.Green, l, t); RdpeiUtility.SendInstruction(RdpeiSUTControlData.UnexpectedPositionNotice); } Site.Assert.IsTrue(false, "Client is expected to send a RDPINPUT_TOUCH_EVENT_PDU whose contact position near ({0}, {1}), not ({2}, {3}).", left + diam / 2, top + diam / 2, contactX, contactY); } else { isExpectedFrameReceived = true; } } } } // Update on the client screen. if (isManagedAdapter) { RdpeiUtility.SendCircle(diam, Color.Black, left, top); } } if (isManagedAdapter) { RdpeiUtility.SendConfirmImage(); } }