public void ThrowsAnExceptionWhenTheCompletionSourceIsNotCreated() { var api = new Mock <IRasApi32>(); var rasHangUp = new Mock <IRasHangUp>(); var extensionsBuilder = new Mock <IRasDialExtensionsBuilder>(); var paramsBuilder = new Mock <IRasDialParamsBuilder>(); var exceptionPolicy = new Mock <IExceptionPolicy>(); var completionSourceFactory = new Mock <ITaskCompletionSourceFactory>(); completionSourceFactory.Setup(o => o.Create <RasConnection>()).Returns((ITaskCompletionSource <RasConnection>)null); var cancellationSourceFactory = new Mock <ITaskCancellationSourceFactory>(); var callbackHandler = new Mock <IRasDialCallbackHandler>(); var context = new RasDialContext { PhoneBookPath = @"C:\Test.pbk", EntryName = "Entry", Credentials = new NetworkCredential("User", "Password"), Options = new RasDialerOptions { InterfaceIndex = 0 } }; var target = new RasDialService(api.Object, rasHangUp.Object, extensionsBuilder.Object, paramsBuilder.Object, exceptionPolicy.Object, callbackHandler.Object, completionSourceFactory.Object, cancellationSourceFactory.Object); Assert.ThrowsAsync <InvalidOperationException>(() => target.DialAsync(context)); }
public RASDIALEXTENSIONS Build(RasDialContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } var rasDialExtensions = structFactory.Create <RASDIALEXTENSIONS>(); RasDialerOptions options; if ((options = context.Options) != null) { if (options.Owner != null) { rasDialExtensions.hwndParent = options.Owner.Handle; } rasDialExtensions.dwfOptions = BuildOptions(); } if (getEapUserData.TryUnsafeGetEapUserData(IntPtr.Zero, context.EntryName, context.PhoneBookPath, out var eapInfo)) { rasDialExtensions.RasEapInfo = eapInfo; } return(rasDialExtensions); }
public async Task DialTheConnection() { var handle = new IntPtr(1); var phoneBookPath = @"C:\Test.pbk"; var entryName = "Entry"; var userName = "******"; var password = "******"; var interfaceIndex = 1; var api = new Mock <IRasApi32>(); api.Setup(o => o.RasDial(ref It.Ref <RASDIALEXTENSIONS> .IsAny, phoneBookPath, ref It.Ref <RASDIALPARAMS> .IsAny, Ras.NotifierType.RasDialFunc2, It.IsAny <RasDialFunc2>(), out It.Ref <IntPtr> .IsAny)).Returns(new RasDialCallback( (ref RASDIALEXTENSIONS rasDialExtensions, string lpszPhoneBook, ref RASDIALPARAMS rasDialParams, Ras.NotifierType notifierType, RasDialFunc2 o5, out IntPtr o6) => { Assert.AreEqual(phoneBookPath, lpszPhoneBook); o6 = handle; return(SUCCESS); })); var rasHangUp = new Mock <IRasHangUp>(); var extensionsBuilder = new Mock <IRasDialExtensionsBuilder>(); var paramsBuilder = new Mock <IRasDialParamsBuilder>(); var exceptionPolicy = new Mock <IExceptionPolicy>(); var callbackHandler = new Mock <IRasDialCallbackHandler>(); var connection = new Mock <RasConnection>(); var completionSource = new Mock <ITaskCompletionSource <RasConnection> >(); completionSource.Setup(o => o.Task).Returns(Task.FromResult(connection.Object)); var completionSourceFactory = new Mock <ITaskCompletionSourceFactory>(); completionSourceFactory.Setup(o => o.Create <RasConnection>()).Returns(completionSource.Object); var cancellationSource = new Mock <ITaskCancellationSource>(); var cancellationSourceFactory = new Mock <ITaskCancellationSourceFactory>(); cancellationSourceFactory.Setup(o => o.Create(It.IsAny <CancellationToken>())).Returns(cancellationSource.Object); var context = new RasDialContext { PhoneBookPath = phoneBookPath, EntryName = entryName, Credentials = new NetworkCredential(userName, password), Options = new RasDialerOptions { InterfaceIndex = interfaceIndex } }; var target = new RasDialService(api.Object, rasHangUp.Object, extensionsBuilder.Object, paramsBuilder.Object, exceptionPolicy.Object, callbackHandler.Object, completionSourceFactory.Object, cancellationSourceFactory.Object); var result = await target.DialAsync(context); Assert.AreSame(connection.Object, result); Assert.IsTrue(target.IsBusy); callbackHandler.Verify(o => o.Initialize(completionSource.Object, It.IsAny <Action <StateChangedEventArgs> >(), It.IsAny <Action>(), It.IsAny <CancellationToken>()), Times.Once); callbackHandler.Verify(o => o.SetHandle(handle), Times.Once); }
private void BeginDial(RasDialContext context) { try { SetBusy(); var rasDialExtensions = ConvertToRasDialExtensions(context); var rasDialParams = ConvertToRasDialParams(context); var handle = IntPtr.Zero; try { var ret = api.RasDial(ref rasDialExtensions, context.PhoneBookPath, ref rasDialParams, NotifierType.RasDialFunc2, callback, out handle); if (ret != SUCCESS) { throw exceptionPolicy.Create(ret); } } finally { context.Handle = handle; } callbackHandler.SetHandle(context.Handle); } catch (Exception) { HangUpIfNecessary(context); SetNotBusy(); throw; } }
public void ThrowsAnExceptionWhenNonSuccessIsReturnedFromWin32() { api.Setup(o => o.RasDial(ref It.Ref <RASDIALEXTENSIONS> .IsAny, @"C:\Test.pbk", ref It.Ref <RASDIALPARAMS> .IsAny, Ras.NotifierType.RasDialFunc2, It.IsAny <RasDialFunc2>(), out It.Ref <IntPtr> .IsAny)).Returns(new RasDialCallback( (ref RASDIALEXTENSIONS o1, string o2, ref RASDIALPARAMS o3, Ras.NotifierType o4, RasDialFunc2 o5, out IntPtr o6) => { o6 = IntPtr.Zero; return(ERROR_INVALID_PARAMETER); })); exceptionPolicy.Setup(o => o.Create(ERROR_INVALID_PARAMETER)).Returns(new TestException()); var connection = new Mock <RasConnection>(); var completionSource = new TaskCompletionSource <RasConnection>(); completionSource.SetResult(connection.Object); var context = new RasDialContext { PhoneBookPath = @"C:\Test.pbk", EntryName = "Entry", Credentials = new NetworkCredential("User", "Password"), Options = new RasDialerOptions { InterfaceIndex = 0 } }; Assert.ThrowsAsync <TestException>(() => target.DialAsync(context)); }
public void BuildsTheStructureWithTheStoredCredentialsWithNullCredentials() { var entryName = "Test"; var phoneBookPath = @"C:\Test.pbk"; var api = new Mock <IRasApi32>(); api.Setup(o => o.RasGetEntryDialParams(phoneBookPath, ref It.Ref <RASDIALPARAMS> .IsAny, out It.Ref <bool> .IsAny)).Returns(new RasGetEntryDialParamsCallback( (string o1, ref RASDIALPARAMS o2, out bool o3) => { o2.szUserName = "******"; o2.szPassword = "******"; o2.szDomain = "Domain"; o3 = true; return(SUCCESS); })); var structFactory = new Mock <IStructFactory>(); var exceptionPolicy = new Mock <IExceptionPolicy>(); var context = new RasDialContext { EntryName = entryName, PhoneBookPath = phoneBookPath, Credentials = null }; var target = new RasDialParamsBuilder(api.Object, structFactory.Object, exceptionPolicy.Object); var result = target.Build(context); Assert.AreEqual("User", result.szUserName); Assert.AreEqual("Password", result.szPassword); Assert.AreEqual("Domain", result.szDomain); }
public void OverwritesTheStoredCredentialsWhenCredentialsAreSupplied() { var entryName = "Test"; var phoneBookPath = @"C:\Test.pbk"; api.Setup(o => o.RasGetEntryDialParams(phoneBookPath, ref It.Ref <RASDIALPARAMS> .IsAny, out It.Ref <bool> .IsAny)).Returns(new RasGetEntryDialParamsCallback( (string o1, ref RASDIALPARAMS o2, out bool o3) => { o2.szUserName = "******"; o2.szPassword = "******"; o2.szDomain = "Domain1"; o3 = true; return(SUCCESS); })); var context = new RasDialContext { EntryName = entryName, PhoneBookPath = phoneBookPath, Credentials = new NetworkCredential("User2", "Password2", "Domain2") }; var target = new RasDialParamsBuilder(api.Object, structFactory.Object, exceptionPolicy.Object); var result = target.Build(context); Assert.AreEqual("User2", result.szUserName); Assert.AreEqual("Password2", result.szPassword); Assert.AreEqual("Domain2", result.szDomain); }
public void HangsUpTheConnectionWhenCancelled() { var handle = new IntPtr(1); api.Setup(o => o.RasDial(ref It.Ref <RASDIALEXTENSIONS> .IsAny, It.IsAny <string>(), ref It.Ref <RASDIALPARAMS> .IsAny, Ras.NotifierType.RasDialFunc2, It.IsAny <RasDialFunc2>(), out It.Ref <IntPtr> .IsAny)).Returns(new RasDialCallback( (ref RASDIALEXTENSIONS rasDialExtensions, string lpszPhoneBook, ref RASDIALPARAMS rasDialParams, Ras.NotifierType notifierType, RasDialFunc2 o5, out IntPtr o6) => { o6 = handle; return(SUCCESS); })); using var cts = new CancellationTokenSource(); var context = new RasDialContext { PhoneBookPath = @"C:\Test.pbk", EntryName = "Entry", Credentials = new NetworkCredential("User", "Password"), CancellationToken = cts.Token }; target.DialAsync(context); cts.Cancel(); rasHangUp.Verify(o => o.UnsafeHangUp(context.Handle, It.IsAny <bool>(), CancellationToken.None)); }
private RASDIALEXTENSIONS ConvertToRasDialExtensions(RasDialContext context) { var result = extensionsBuilder.Build(context); context.RasDialExtensions = result; return(result); }
private RASDIALPARAMS ConvertToRasDialParams(RasDialContext context) { var result = paramsBuilder.Build(context); context.RasDialParams = result; return(result); }
private void SetUpCancellationSource(RasDialContext context) { CancellationSource?.Dispose(); CancellationSource = CancellationTokenSource.CreateLinkedTokenSource(context.CancellationToken); // Ensures that the connection can be cancelled even if the callback is stuck. CancellationSource.Token.Register(() => OnCancellationRequestedCallback(context)); }
private void HangUpIfNecessary(RasDialContext context) { if (context.Handle == IntPtr.Zero) { return; } hangUpService.UnsafeHangUp(context.Handle, false, CancellationToken.None); }
public void CancelsTheDialConnectionAttemptIfDisposed() { var handle = new IntPtr(1); var api = new Mock <IRasApi32>(); api.Setup(o => o.RasDial(ref It.Ref <RASDIALEXTENSIONS> .IsAny, @"C:\Test.pbk", ref It.Ref <RASDIALPARAMS> .IsAny, Ras.NotifierType.RasDialFunc2, It.IsAny <RasDialFunc2>(), out It.Ref <IntPtr> .IsAny)).Returns(new RasDialCallback( (ref RASDIALEXTENSIONS o1, string o2, ref RASDIALPARAMS o3, Ras.NotifierType o4, RasDialFunc2 o5, out IntPtr o6) => { o6 = handle; return(SUCCESS); })); var rasHangUp = new Mock <IRasHangUp>(); var extensionsBuilder = new Mock <IRasDialExtensionsBuilder>(); var paramsBuilder = new Mock <IRasDialParamsBuilder>(); var exceptionPolicy = new Mock <IExceptionPolicy>(); var callbackHandler = new Mock <IRasDialCallbackHandler>(); var connection = new Mock <RasConnection>(); var completionSource = new Mock <ITaskCompletionSource <RasConnection> >(); completionSource.Setup(o => o.Task).Returns(Task.FromResult(connection.Object)); var completionSourceFactory = new Mock <ITaskCompletionSourceFactory>(); completionSourceFactory.Setup(o => o.Create <RasConnection>()).Returns(completionSource.Object); var cancellationSource = new Mock <ITaskCancellationSource>(); var cancellationSourceFactory = new Mock <ITaskCancellationSourceFactory>(); cancellationSourceFactory.Setup(o => o.Create(It.IsAny <CancellationToken>())).Returns(cancellationSource.Object); var context = new RasDialContext { PhoneBookPath = @"C:\Test.pbk", EntryName = "Entry", Credentials = new NetworkCredential("User", "Password"), Options = new RasDialerOptions { InterfaceIndex = 0 } }; var target = new RasDialService(api.Object, rasHangUp.Object, extensionsBuilder.Object, paramsBuilder.Object, exceptionPolicy.Object, callbackHandler.Object, completionSourceFactory.Object, cancellationSourceFactory.Object); target.DialAsync(context); Assert.IsTrue(target.IsBusy); target.Dispose(); cancellationSource.Verify(o => o.Cancel(), Times.Once); }
public void ThrowsAnExceptionWhenNonSuccessIsReturnedFromWin32() { var api = new Mock <IRasApi32>(); api.Setup(o => o.RasDial(ref It.Ref <RASDIALEXTENSIONS> .IsAny, @"C:\Test.pbk", ref It.Ref <RASDIALPARAMS> .IsAny, Ras.NotifierType.RasDialFunc2, It.IsAny <RasDialFunc2>(), out It.Ref <IntPtr> .IsAny)).Returns(new RasDialCallback( (ref RASDIALEXTENSIONS o1, string o2, ref RASDIALPARAMS o3, Ras.NotifierType o4, RasDialFunc2 o5, out IntPtr o6) => { o6 = IntPtr.Zero; return(ERROR_INVALID_PARAMETER); })); var rasHangUp = new Mock <IRasHangUp>(); var extensionsBuilder = new Mock <IRasDialExtensionsBuilder>(); var paramsBuilder = new Mock <IRasDialParamsBuilder>(); var exceptionPolicy = new Mock <IExceptionPolicy>(); exceptionPolicy.Setup(o => o.Create(ERROR_INVALID_PARAMETER)).Returns(new TestException()); var callbackHandler = new Mock <IRasDialCallbackHandler>(); var connection = new Mock <RasConnection>(); var completionSource = new Mock <ITaskCompletionSource <RasConnection> >(); completionSource.Setup(o => o.Task).Returns(Task.FromResult(connection.Object)); var completionSourceFactory = new Mock <ITaskCompletionSourceFactory>(); completionSourceFactory.Setup(o => o.Create <RasConnection>()).Returns(completionSource.Object); var cancellationSource = new Mock <ITaskCancellationSource>(); var cancellationSourceFactory = new Mock <ITaskCancellationSourceFactory>(); cancellationSourceFactory.Setup(o => o.Create(It.IsAny <CancellationToken>())).Returns(cancellationSource.Object); var context = new RasDialContext { PhoneBookPath = @"C:\Test.pbk", EntryName = "Entry", Credentials = new NetworkCredential("User", "Password"), Options = new RasDialerOptions { InterfaceIndex = 0 } }; var target = new RasDialService(api.Object, rasHangUp.Object, extensionsBuilder.Object, paramsBuilder.Object, exceptionPolicy.Object, callbackHandler.Object, completionSourceFactory.Object, cancellationSourceFactory.Object); Assert.ThrowsAsync <TestException>(() => target.DialAsync(context)); Assert.IsFalse(target.IsBusy); callbackHandler.Verify(o => o.Initialize(completionSource.Object, It.IsAny <Action <StateChangedEventArgs> >(), It.IsAny <Action>(), It.IsAny <CancellationToken>()), Times.Once); callbackHandler.Verify(o => o.SetHandle(It.IsAny <IntPtr>()), Times.Never); }
public void FlagsTheServiceAsNoLongerBusyWhenCompleted() { var context = new RasDialContext(); target.FlagAsBusy(); Assert.True(target.IsBusy); target.SimulateDialCompleted(context); Assert.False(target.IsBusy); }
public void BuildsTheStructureWithTheEntryName() { var context = new RasDialContext { EntryName = "Test" }; var target = new RasDialParamsBuilder(api.Object, structFactory.Object, exceptionPolicy.Object); var result = target.Build(context); Assert.AreEqual("Test", result.szEntryName); }
protected void OnCancellationRequestedCallback(RasDialContext context) { if (!IsBusy) { return; } HangUpIfNecessary(context); OnDialCompletedCallback(context); CancelCompletionSourceIfNecessary(); }
public void BuildsTheStructureWithTheUserNameAndPassword() { var context = new RasDialContext { Credentials = new NetworkCredential("User", "Pass") }; var target = new RasDialParamsBuilder(api.Object, structFactory.Object, exceptionPolicy.Object); var result = target.Build(context); Assert.AreEqual("User", result.szUserName); Assert.AreEqual("Pass", result.szPassword); }
public void BuildsTheStructureWithTheInterfaceIndex() { var context = new RasDialContext { Options = new RasDialerOptions { InterfaceIndex = 1 } }; var target = new RasDialParamsBuilder(api.Object, structFactory.Object, exceptionPolicy.Object); var result = target.Build(context); Assert.AreEqual(1, result.dwIfIndex); }
public void DoesNotErrorIfCancelledBeforeDialAttemptCanStart() { target.FlagAsBusy(); var context = new RasDialContext { PhoneBookPath = @"C:\Test.pbk", EntryName = "Entry", Credentials = new NetworkCredential("User", "Password"), Options = new RasDialerOptions { InterfaceIndex = 0 } }; Assert.DoesNotThrow(() => target.SimulateCancellationRequested(context)); Assert.False(target.IsBusy); }
public void BuildsTheStructureWithTheUserNamePasswordAndDomain() { var api = new Mock <IRasApi32>(); var structFactory = new Mock <IStructFactory>(); var exceptionPolicy = new Mock <IExceptionPolicy>(); var context = new RasDialContext { Credentials = new NetworkCredential("User", "Pass", "Domain") }; var target = new RasDialParamsBuilder(api.Object, structFactory.Object, exceptionPolicy.Object); var result = target.Build(context); Assert.AreEqual("User", result.szUserName); Assert.AreEqual("Pass", result.szPassword); Assert.AreEqual("Domain", result.szDomain); }
public RASDIALPARAMS Build(RasDialContext context) { var rasDialParams = structFactory.Create <RASDIALPARAMS>(); rasDialParams.szEntryName = context.EntryName; var ret = api.RasGetEntryDialParams(context.PhoneBookPath, ref rasDialParams, out _); if (ret != SUCCESS) { throw exceptionPolicy.Create(ret); } ConfigureOptions(context.Options, ref rasDialParams); ConfigureCredentials(context.Credentials, ref rasDialParams); return(rasDialParams); }
public Task <RasConnection> DialAsync(RasDialContext context) { GuardMustNotBeDisposed(); GuardMustNotAlreadyBeBusy(); lock (SyncRoot) { GuardMustNotAlreadyBeBusy(); CompletionSource = CreateCompletionSource(); SetUpCancellationSource(context); InitializeCallbackHandler(context); BeginDial(context); return(CompletionSource.Task); } }
public async Task DisposeWillDisposeTheObjectAsExpected() { var completionSource = new Mock <ITaskCompletionSource <RasConnection> >(); completionSource.Setup(o => o.Task).Returns(Task.FromResult((RasConnection)null)); var api = new Mock <IRasApi32>(); var rasHangUp = new Mock <IRasHangUp>(); var extensionsBuilder = new Mock <IRasDialExtensionsBuilder>(); var paramsBuilder = new Mock <IRasDialParamsBuilder>(); var exceptionPolicy = new Mock <IExceptionPolicy>(); var completionSourceFactory = new Mock <ITaskCompletionSourceFactory>(); completionSourceFactory.Setup(o => o.Create <RasConnection>()).Returns(completionSource.Object); var cancellationSource = new Mock <ITaskCancellationSource>(); var cancellationSourceFactory = new Mock <ITaskCancellationSourceFactory>(); cancellationSourceFactory.Setup(o => o.Create(It.IsAny <CancellationToken>())).Returns(cancellationSource.Object); var callbackHandler = new Mock <IRasDialCallbackHandler>(); var context = new RasDialContext { PhoneBookPath = @"C:\Test.pbk", EntryName = "Entry", Credentials = new NetworkCredential("User", "Password"), Options = new RasDialerOptions { InterfaceIndex = 0 } }; using (var target = new RasDialService(api.Object, rasHangUp.Object, extensionsBuilder.Object, paramsBuilder.Object, exceptionPolicy.Object, callbackHandler.Object, completionSourceFactory.Object, cancellationSourceFactory.Object)) { await target.DialAsync(context); } callbackHandler.Verify(o => o.Dispose(), Times.Once); cancellationSource.Verify(o => o.Dispose(), Times.Once); }
public void ReleasesTheEapUserDataWhenCompleted() { var ptr = new IntPtr(1); var context = new RasDialContext { RasDialExtensions = new RASDIALEXTENSIONS { RasEapInfo = new RASEAPINFO { pbEapInfo = ptr, dwSizeofEapInfo = 1 } } }; target.SimulateDialCompleted(context); marshaller.Verify(o => o.FreeHGlobalIfNeeded(ptr)); }
public void ThrowsAnExceptionWhenAttemptingToDialWhileAlreadyBusy() { var context = new RasDialContext { PhoneBookPath = @"C:\Test.pbk", EntryName = "Entry", Credentials = new NetworkCredential("User", "Password"), Options = new RasDialerOptions { InterfaceIndex = 0 } }; target.FlagAsBusy(); Assert.IsTrue(target.IsBusy); Assert.ThrowsAsync <InvalidOperationException>(() => target.DialAsync(context)); Assert.IsTrue(target.IsBusy); }
public RASDIALEXTENSIONS Build(RasDialContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } var rasDialExtensions = structFactory.Create <RASDIALEXTENSIONS>(); RasDialerOptions options; if ((options = context.Options) != null) { if (options.Owner != IntPtr.Zero) { rasDialExtensions.hwndParent = options.Owner; } rasDialExtensions.dwfOptions = BuildOptions(options); } return(rasDialExtensions); }
public Task <RasConnection> DialAsync(RasDialContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } GuardMustNotBeDisposed(); GuardMustNotAlreadyBeBusy(); lock (SyncRoot) { GuardMustNotAlreadyBeBusy(); CompletionSource = CreateCompletionSource(); SetUpCancellationSource(context); InitializeCallbackHandler(context); BeginDial(context); return(CompletionSource.Task); } }
public void CancelsTheDialConnectionAttemptIfDisposed() { var handle = new IntPtr(1); api.Setup(o => o.RasDial(ref It.Ref <RASDIALEXTENSIONS> .IsAny, @"C:\Test.pbk", ref It.Ref <RASDIALPARAMS> .IsAny, Ras.NotifierType.RasDialFunc2, It.IsAny <RasDialFunc2>(), out It.Ref <IntPtr> .IsAny)).Returns(new RasDialCallback( (ref RASDIALEXTENSIONS o1, string o2, ref RASDIALPARAMS o3, Ras.NotifierType o4, RasDialFunc2 o5, out IntPtr o6) => { o6 = handle; return(SUCCESS); })); using var cts = new CancellationTokenSource(); var context = new RasDialContext { CancellationToken = cts.Token, PhoneBookPath = @"C:\Test.pbk", EntryName = "Entry", Credentials = new NetworkCredential("User", "Password"), Options = new RasDialerOptions { InterfaceIndex = 0 } }; target.DialAsync(context); Assert.IsTrue(target.IsBusy); target.Dispose(); Assert.IsTrue(target.CancelledAttempt); }
private void InitializeCallbackHandler(RasDialContext context) { callbackHandler.Initialize(CompletionSource, context.OnStateChangedCallback, () => OnDialCompletedCallback(context), CancellationSource.Token); }