private void ExecuteInternal() { try { WiFiDirectTestLogger.Log( "Beginning Connect Scenario from Discovery Handle {0} to Advertiser {1}. GetProvisioning={2}, ValidateData={3}", connectParameters.DiscoveryHandle, connectParameters.AdvertiserHandle, connectParameters.Options.CallGetProvisioningInfo, connectParameters.Options.ValidateData ); string pin = ""; // Get the current session counts int advertiserCountBefore = advertiserWFDController.GetServiceSessionCount(); int seekerCountBefore = seekerWFDController.GetServiceSessionCount(); // Set any options (like prefer GO) // This also calls OpenSession() if (connectParameters.Options.DeclineConnect) { if (!connectParameters.Options.CallGetProvisioningInfo || connectParameters.Options.ExpectConnectSuccess) { throw new Exception(String.Format( CultureInfo.InvariantCulture, "Bad test case, decline connection should call get provisioning info and expect failure" )); } advertiserWFDController.DeclineNextServiceConnectionRequest(connectParameters.AdvertiserHandle); } if (!connectParameters.Options.ExpectAdvertiserConnectSuccess) { advertiserWFDController.ExpectNextServiceConnectionRequestFailure(connectParameters.AdvertiserHandle); } Stopwatch openSessionStopwatch = new Stopwatch(); openSessionStopwatch.Start(); seekerWFDController.SetServiceOptions( connectParameters.DiscoveryHandle, connectParameters.Options.PreferGO, connectParameters.Options.SessionInfo ); openSessionStopwatch.Stop(); WiFiDirectTestLogger.Log("OpenSession completed in {0} ms.", openSessionStopwatch.ElapsedMilliseconds); // Optionally GetProvisioningInfo before doing a PIN connection if (connectParameters.Options.CallGetProvisioningInfo) { ProvisioningInfoWrapper provisioningInfo = null; Stopwatch provDiscStopwatch = new Stopwatch(); // Handle expected failures in GetProvisioningInfo try { provDiscStopwatch.Start(); provisioningInfo = seekerWFDController.GetServiceProvisioningInfo( connectParameters.DiscoveryHandle, connectParameters.Options.PreferredConfigMethod ); } catch (Exception e) { if (connectParameters.Options.ExpectGetProvisioningSuccess) { throw; } else { WiFiDirectTestLogger.Log("Caught expected exception in GetProvisioningInfo: {0}", e.Message); if (connectParameters.Options.DeclineConnect) { advertiserWFDController.CheckAdvertiserLastSessionDeclined(connectParameters.AdvertiserHandle); } succeeded = true; return; } } finally { provDiscStopwatch.Stop(); WiFiDirectTestLogger.Log("GetServiceProvisioningInfo completed in {0} ms.", provDiscStopwatch.ElapsedMilliseconds); if (succeeded && connectParameters.Options.DeclineConnect) { // 30 seconds is much more time than actually needed if (provDiscStopwatch.ElapsedMilliseconds > 30000) { throw new Exception(String.Format( CultureInfo.InvariantCulture, "Expected decline to fail connect before 2 minute timeout, took too long, decline did not succeed properly" )); } } } if (!connectParameters.Options.ExpectGetProvisioningSuccess) { throw new Exception(String.Format( CultureInfo.InvariantCulture, "Expected GetProvisioningInfo to fail" )); } if (provisioningInfo.IsGroupFormationNeeded != connectParameters.Options.ExpectGroupFormationNeeded) { throw new Exception(String.Format( CultureInfo.InvariantCulture, "Expected Group Formation {0}, Actual Group Formation {1}", (connectParameters.Options.ExpectGroupFormationNeeded) ? "Needed" : "Not Needed", (provisioningInfo.IsGroupFormationNeeded) ? "Needed" : "Not Needed" )); } if (provisioningInfo.IsGroupFormationNeeded && provisioningInfo.SelectedConfigMethod != WiFiDirectServiceConfigurationMethod.Default) { if (provisioningInfo.SelectedConfigMethod == WiFiDirectServiceConfigurationMethod.PinDisplay) { // Seeker should have generated a PIN, now advertiser can enter the PIN pin = seekerWFDController.GetServiceDisplayedPin(); advertiserWFDController.EnterServicesPin(pin); } else { // Advertiser will generate/display PIN, enter on seeker side before connecting pin = advertiserWFDController.GetServiceDisplayedPin(); seekerWFDController.EnterServicesPin(pin); } } WiFiDirectTestLogger.Log("Get Provisioning Info complete, using PIN: {0}", pin); } // Some tests will validate that this works even if there is a time delay from provisioning info available on seeker to calling connect // Add a sleep here if that is the case if (connectParameters.Options.DelaySeekerConnectCall) { // 5 seconds should be long enough for advertiser to attempt the connect before seeker is ready Task.Delay(5000).Wait(); } // Now do the real connect Stopwatch connectStopwatch = new Stopwatch(); // Handle expected failures in ConnectService try { connectStopwatch.Start(); seekerSessionHandle = seekerWFDController.ConnectService( connectParameters.DiscoveryHandle ); } catch (Exception e) { if (connectParameters.Options.ExpectConnectSuccess) { throw; } else { WiFiDirectTestLogger.Log("Caught expected exception in ConnectService: {0}", e.Message); succeeded = true; return; } } finally { connectStopwatch.Stop(); WiFiDirectTestLogger.Log("Connect completed in {0} ms.", connectStopwatch.ElapsedMilliseconds); if (!connectParameters.Options.ExpectAdvertiserConnectSuccess) { advertiserWFDController.CheckAdvertiserLastSessionFailed(connectParameters.AdvertiserHandle); } if (succeeded && connectParameters.Options.DeclineConnect) { // 30 seconds is much more time than actually needed if (connectStopwatch.ElapsedMilliseconds > 30000) { throw new Exception(String.Format( CultureInfo.InvariantCulture, "Expected decline to fail connect before 2 minute timeout, took too long, decline did not succeed properly" )); } } } if (!connectParameters.Options.ExpectConnectSuccess) { throw new Exception(String.Format( CultureInfo.InvariantCulture, "Expected Connect to fail" )); } // Advertiser should have gotten the connection advertiserSessionHandle = advertiserWFDController.GetAdvertiserLastSession( connectParameters.AdvertiserHandle, pin.Length == 0 // autoAccept ); ServiceSessionInfo advertiserSession = advertiserWFDController.GetServiceSessionInfo(advertiserSessionHandle); if (advertiserSession.Status != WiFiDirectServiceSessionStatus.Open) { throw new Exception(String.Format( CultureInfo.InvariantCulture, "Advertiser session is not open (Status={0}, ErrorStatus={1})", advertiserSession.Status, advertiserSession.ErrorStatus )); } if (connectParameters.Options.SessionInfo.Length > 0 && connectParameters.Options.SessionInfo != advertiserSession.DeferredSessionInfo) { throw new Exception(String.Format( CultureInfo.InvariantCulture, "Advertiser and Seeker session info mismatch! (Seeker={0}) (Advertiser={1})", WiFiDirectTestUtilities.GetTruncatedString(connectParameters.Options.SessionInfo), WiFiDirectTestUtilities.GetTruncatedString(advertiserSession.DeferredSessionInfo) )); } ServiceSessionInfo seekerSession = seekerWFDController.GetServiceSessionInfo(seekerSessionHandle); // Compare sessions for correct data if (advertiserSession.ServiceName != seekerSession.ServiceName || advertiserSession.AdvertisementId != seekerSession.AdvertisementId || advertiserSession.ServiceAddress != seekerSession.ServiceAddress || advertiserSession.SessionAddress != seekerSession.SessionAddress || advertiserSession.SessionId != seekerSession.SessionId) { throw new Exception(String.Format( CultureInfo.InvariantCulture, "Advertiser and Seeker session mismatch! (Seeker={0}) (Advertiser={1})", seekerSession.ToString(), advertiserSession.ToString() )); } if (connectParameters.Options.ExpectDeferred) { seekerWFDController.CheckServiceSessionDeferred(seekerSessionHandle, true); var advertiserInfo = advertiserWFDController.GetAdvertiserInfo(connectParameters.AdvertiserHandle); if (advertiserInfo.DeferredSessionInfo.Length > 0 && seekerSession.DeferredSessionInfo != advertiserInfo.DeferredSessionInfo) { throw new Exception(String.Format( CultureInfo.InvariantCulture, "Advertiser and Seeker deferred session info mismatch! (Seeker={0}) (Advertiser={1})", WiFiDirectTestUtilities.GetTruncatedString(seekerSession.DeferredSessionInfo), WiFiDirectTestUtilities.GetTruncatedString(advertiserInfo.DeferredSessionInfo) )); } } else { seekerWFDController.CheckServiceSessionDeferred(seekerSessionHandle, false); if (seekerSession.DeferredSessionInfo != "") { throw new Exception(String.Format( CultureInfo.InvariantCulture, "Seeker Received Deferred Session info, was not deferred session! (Session Info={0})", WiFiDirectTestUtilities.GetTruncatedString(seekerSession.DeferredSessionInfo) )); } } // Check that we added 1 session to each side int advertiserCountAfter = advertiserWFDController.GetServiceSessionCount(); int seekerCountAfter = seekerWFDController.GetServiceSessionCount(); if (advertiserCountBefore + 1 != advertiserCountAfter || seekerCountBefore + 1 != seekerCountAfter) { throw new Exception(String.Format( CultureInfo.InvariantCulture, "Expected 1 new session on each side! (Seeker {0} -> {1}, Advertiser {2} -> {3})", seekerCountBefore, seekerCountAfter, advertiserCountBefore, advertiserCountAfter )); } if (connectParameters.Options.ValidateData) { var dataScenario = new ServicesOpenSocketSendDataScenario( seekerWFDController, advertiserWFDController, new ServicesOpenSocketSendDataParameters( seekerSessionHandle, advertiserSessionHandle, WiFiDirectServiceIPProtocol.Tcp, validationPort++, 65536 ) ); validateDataResults = dataScenario.Execute(); if (!validateDataResults.ScenarioSucceeded) { throw new Exception("Failed data validation!"); } } succeeded = true; } catch (Exception e) { WiFiDirectTestLogger.Error("Caught exception while executing service connect scenario: {0}", e); } }
private void DoFindAllDiscovery() { Stopwatch discoveryStopwatch = new Stopwatch(); discoveryStopwatch.Start(); discoveryHandles = discoveryTestController.DiscoverServices( discoveryParameters.Query, discoveryParameters.ExpectedMatchCount > 0, discoveryParameters.ServiceInfoRequest ); discoveryStopwatch.Stop(); WiFiDirectTestLogger.Log("Services Discovery (FindAllAsync) completed in {0} ms.", discoveryStopwatch.ElapsedMilliseconds); if (discoveryHandles.Count != discoveryParameters.ExpectedMatchCount) { WiFiDirectTestLogger.Error( "Expected {0} devices but discovered {1} devices", discoveryParameters.ExpectedMatchCount, discoveryHandles.Count ); return; } if (discoveryHandles.Count > 0 && discoveryParameters.AdvertisersToMatch != null && discoveryParameters.AdvertisersToMatch.Count > 0) { WiFiDirectTestLogger.Log("Checking discovery results for expected services"); bool foundAll = true; IList <DiscoveredServiceInfo> discoveredDevices = new List <DiscoveredServiceInfo>(); foreach (var handle in discoveryHandles) { DiscoveredServiceInfo discovery = discoveryTestController.GetDiscoveredServiceInfo(handle); discoveredDevices.Add(discovery); WiFiDirectTestLogger.Log( "Discovered service: {0} with address: {1}", discovery.ServiceName, discovery.ServiceAddress.ToString() ); } int adIdx = 0; foreach (var handle in discoveryParameters.AdvertisersToMatch) { ServiceAdvertiserInfo advertiser = advertiserTestController.GetAdvertiserInfo(handle); bool found = false; // Check discovered list for match, remove for (int i = 0; i < discoveredDevices.Count; i++) { if (advertiser.ServiceName == discoveredDevices[i].ServiceName && advertiser.ServiceAddress == discoveredDevices[i].ServiceAddress) { WiFiDirectTestLogger.Log( "Found Expected Service: {0} with address: {1}", discoveredDevices[i].ServiceName, discoveredDevices[i].ServiceAddress.ToString() ); if (discoveryParameters.AdvertiserServiceInfoMatch != null && discoveryParameters.AdvertiserServiceInfoMatch.Count >= adIdx) { if (discoveryParameters.AdvertiserServiceInfoMatch[adIdx]) { WiFiDirectTestLogger.Log( "Expecting Service Info:\n\t{0}\nReceived:\n\t{1}", WiFiDirectTestUtilities.GetTruncatedString(advertiser.ServiceInfo, 32), WiFiDirectTestUtilities.GetTruncatedString(discoveredDevices[i].ServiceInfo, 32) ); if (advertiser.ServiceInfo != discoveredDevices[i].ServiceInfo) { // Allow multiple services with same name/different service info // Skip if service info match fails, will fail if no service info found continue; } } else { WiFiDirectTestLogger.Log( "Expecting No Service Info, Received:\n\t{0}", WiFiDirectTestUtilities.GetTruncatedString(discoveredDevices[i].ServiceInfo, 32) ); if ("" != discoveredDevices[i].ServiceInfo) { // Allow multiple services with same name/different service info // Skip if service info match fails, will fail if no service info found continue; } } } discoveredDevices.RemoveAt(i); found = true; break; } } if (!found) { WiFiDirectTestLogger.Error( "Did NOT Find Expected Service: {0} with address: {1}", advertiser.ServiceName, advertiser.ServiceAddress.ToString() ); foundAll = false; // Continue checking complete list } adIdx++; } if (discoveredDevices.Count > 0) { WiFiDirectTestLogger.Error("Found unexpected services!"); foundAll = false; } if (!foundAll) { return; } } succeeded = true; }