private static void Client_OnReady(Client client) { // This is called when the client has established a new session, this is NOT called when a session is restored Logger.LogInformation("OnReady"); // Hook all the callbacks for testing client.Calling.OnCallReceived += CallingAPI_OnCallReceived; Task.Run(() => { // Request that the inbound calls for the given context reach this client try { client.Calling.Receive(sCallReceiveContext); } catch (Exception exc) { Logger.LogError(exc, "CallReceive failed"); sCompleted.Set(); return; } // Create the first outbound call leg to the inbound DID associated to the context this client is receiving PhoneCall callA = null; try { callA = client.Calling.NewPhoneCall(sCallToNumber, sCallFromNumber); callA.Begin(); } catch (Exception exc) { Logger.LogError(exc, "CallBeginPhone failed"); sCompleted.Set(); return; } // Block waiting for a reasonable amount of time for the state to change to answered or ended, this will succeed // after answering the call in CallingAPI_OnCallReceived if (!callA.WaitForState(TimeSpan.FromSeconds(20), CallState.answered, CallState.ended)) { Logger.LogError("CallA was not answered or ended in a timely fashion: {0}", callA.State); sCompleted.Set(); return; } // If it's not answered, it ended for some reason if (callA.State != CallState.answered) { Logger.LogError("CallA was not answered"); sCompleted.Set(); return; } // The call was answered, try to connect another outbound call to it Call callB = null; try { // The top level list of the devices represents entries that will be called in serial, // one at a time. The inner list of devices represents a set of devices to call in // parallel with each other. Ultimately only one device wins by answering first. callB = callA.Connect(new List <List <CallDevice> > { new List <CallDevice> { new CallDevice { Type = CallDevice.DeviceType.phone, Parameters = new CallDevice.PhoneParams { ToNumber = sCallToNumber, FromNumber = sCallFromNumber, } } } }); } catch (Exception exc) { Logger.LogError(exc, "Connect failed"); sCompleted.Set(); return; } // If it was connected then we just hangup both calls try { callB.Hangup(); callA.Hangup(); } catch (Exception exc) { Logger.LogError(exc, "Hangup failed"); sCompleted.Set(); return; } // Mark the test successful and terminate sSuccessful = true; sCompleted.Set(); }); }