public SignalConfigurationControlViewModel(
            IAzureResourceManagerClient azureResourceManagerClient,
            ITracer tracer,
            SmartSignalManifest smartSignalManifest,
            SmartSignalRunner signalRunner)
        {
            this.azureResourceManagerClient = azureResourceManagerClient;
            this.smartSignalManifes         = smartSignalManifest;
            this.tracer = tracer;

            this.SignalRunner            = signalRunner;
            this.SignalName              = this.smartSignalManifes.Name;
            this.ShouldShowStatusControl = false;

            // Initialize cadences combo box
            IEnumerable <SignalCadence> cadences = this.smartSignalManifes.SupportedCadencesInMinutes
                                                   .Select(cadence => new SignalCadence(TimeSpan.FromMinutes(cadence)));

            this.Cadences = new ObservableCollection <SignalCadence>(cadences);

            // Initialize combo boxes read tasks
            this.ReadSubscriptionsTask = new ObservableTask <ObservableCollection <AzureSubscription> >(
                this.GetSubscriptionsAsync());

            this.ReadResourceGroupsTask = new ObservableTask <ObservableCollection <string> >(
                Task.FromResult(new ObservableCollection <string>()));

            this.ReadResourceTypesTask = new ObservableTask <ObservableCollection <string> >(
                Task.FromResult(new ObservableCollection <string>()));

            this.ReadResourcesTask = new ObservableTask <ObservableCollection <ResourceIdentifier> >(
                Task.FromResult(new ObservableCollection <ResourceIdentifier>()));
        }
        public async Task WhenRunningSignalThenCustomExceptionsAreHandledCorrectly()
        {
            // Notify the signal that it should throw a custom exception
            this.signal.ShouldThrowCustom = true;

            // Run the signal
            ISmartSignalRunner runner = new SmartSignalRunner(this.smartSignalsRepositoryMock.Object, this.smartSignalLoaderMock.Object, this.analysisServicesFactoryMock.Object, this.azureResourceManagerClientMock.Object, this.queryRunInfoProviderMock.Object, this.tracerMock.Object);
            await runner.RunAsync(this.request, default(CancellationToken));
        }
        public SignalsResultsControlViewModel(SmartSignalRunner signalRunner)
        {
            this.SignalRunner = signalRunner;
            this.SignalResultDetailsControlViewModel = null;

            this.ResultDetailsControlClosed += () =>
            {
                this.SelectedResult = null;
            };
        }
        public async Task WhenRunningSignalThenTheCorrectResultItemIsReturned()
        {
            // Run the signal and validate results
            ISmartSignalRunner runner = new SmartSignalRunner(this.smartSignalsRepositoryMock.Object, this.smartSignalLoaderMock.Object, this.analysisServicesFactoryMock.Object, this.azureResourceManagerClientMock.Object, this.queryRunInfoProviderMock.Object, this.tracerMock.Object);
            List <SmartSignalResultItemPresentation> resultItemPresentations = await runner.RunAsync(this.request, default(CancellationToken));

            Assert.IsNotNull(resultItemPresentations, "Presentation list is null");
            Assert.AreEqual(1, resultItemPresentations.Count);
            Assert.AreEqual("Test title", resultItemPresentations.Single().Title);
            Assert.AreEqual("Summary value", resultItemPresentations.Single().Summary.Value);
        }
예제 #5
0
        /// <summary>
        /// Raises the <see cref="E:System.Windows.Application.Startup" /> event.
        /// </summary>
        /// <param name="e">A <see cref="T:System.Windows.StartupEventArgs" /> that contains the event data.</param>
        protected override void OnStartup(StartupEventArgs e)
        {
            ITracer stringTracer  = new StringTracer(string.Empty);
            ITracer consoleTracer = new ConsoleTracer(string.Empty);
            var     signalLoader  = new SmartSignalLoader(consoleTracer);

            // *Temporary*: if package file path wasn't accepted, raise file selection window to allow package file selection.
            // This option should be removed before launching version for customers (bug for tracking: 1177247)
            string signalPackagePath = e.Args.Length != 1 ?
                                       this.GetSignalPackagePath() :
                                       Diagnostics.EnsureStringNotNullOrWhiteSpace(() => e.Args[0]);

            SmartSignalPackage signalPackage;

            using (var fileStream = new FileStream(signalPackagePath, FileMode.Open))
            {
                signalPackage = SmartSignalPackage.CreateFromStream(fileStream, consoleTracer);
            }

            SmartSignalManifest signalManifest = signalPackage.Manifest;
            ISmartSignal        signal         = signalLoader.LoadSignal(signalPackage);

            // Authenticate the user to Active Directory
            var authenticationServices = new AuthenticationServices();

            authenticationServices.AuthenticateUser();
            ICredentialsFactory credentialsFactory = new ActiveDirectoryCredentialsFactory(authenticationServices);

            IAzureResourceManagerClient azureResourceManagerClient = new AzureResourceManagerClient(credentialsFactory, consoleTracer);

            // Create analysis service factory
            var queryRunInroProvider = new QueryRunInfoProvider(azureResourceManagerClient);
            var httpClientWrapper    = new HttpClientWrapper();
            IAnalysisServicesFactory analysisServicesFactory = new AnalysisServicesFactory(consoleTracer, httpClientWrapper, credentialsFactory, azureResourceManagerClient, queryRunInroProvider);

            var signalRunner = new SmartSignalRunner(signal, analysisServicesFactory, queryRunInroProvider, signalManifest, stringTracer);

            // Create a Unity container with all the required models and view models registrations
            Container = new UnityContainer();
            Container
            .RegisterInstance(stringTracer)
            .RegisterInstance(new SignalsResultsRepository())
            .RegisterInstance(authenticationServices)
            .RegisterInstance(azureResourceManagerClient)
            .RegisterInstance(signal)
            .RegisterInstance(signalManifest)
            .RegisterInstance(analysisServicesFactory)
            .RegisterInstance(signalRunner);
        }
        public async Task WhenRunningSignalThenExceptionsAreHandledCorrectly()
        {
            // Notify the signal that it should throw an exception
            this.signal.ShouldThrow = true;

            // Run the signal
            ISmartSignalRunner runner = new SmartSignalRunner(this.smartSignalsRepositoryMock.Object, this.smartSignalLoaderMock.Object, this.analysisServicesFactoryMock.Object, this.azureResourceManagerClientMock.Object, this.queryRunInfoProviderMock.Object, this.tracerMock.Object);

            try
            {
                await runner.RunAsync(this.request, default(CancellationToken));
            }
            catch (SmartSignalCustomException e) when(e.SignalExceptionType == typeof(DivideByZeroException).ToString())
            {
                // Expected exception
            }
        }
        public void WhenRunningSignalThenCancellationIsHandledGracefully()
        {
            // Notify the signal that it should get stuck and wait for cancellation
            this.signal.ShouldStuck = true;

            // Run the signal asynchronously
            ISmartSignalRunner      runner = new SmartSignalRunner(this.smartSignalsRepositoryMock.Object, this.smartSignalLoaderMock.Object, this.analysisServicesFactoryMock.Object, this.azureResourceManagerClientMock.Object, this.queryRunInfoProviderMock.Object, this.tracerMock.Object);
            CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
            Task t = runner.RunAsync(this.request, cancellationTokenSource.Token);

            SpinWait.SpinUntil(() => this.signal.IsRunning);

            // Cancel and wait for expected result
            cancellationTokenSource.Cancel();
            try
            {
                t.Wait(TimeSpan.FromSeconds(10));
            }
            catch (AggregateException e) when((e.InnerExceptions.Single() as SmartSignalCustomException).SignalExceptionType == typeof(TaskCanceledException).ToString())
            {
                Assert.IsTrue(this.signal.WasCanceled, "The signal was not canceled!");
            }
        }
        private async Task RunSignalWithResourceTypes(ResourceType requestResourceType, ResourceType signalResourceType, bool shouldFail)
        {
            this.TestInitialize(requestResourceType, signalResourceType);
            ISmartSignalRunner runner = new SmartSignalRunner(this.smartSignalsRepositoryMock.Object, this.smartSignalLoaderMock.Object, this.analysisServicesFactoryMock.Object, this.azureResourceManagerClientMock.Object, this.queryRunInfoProviderMock.Object, this.tracerMock.Object);

            try
            {
                List <SmartSignalResultItemPresentation> resultItemPresentations = await runner.RunAsync(this.request, default(CancellationToken));

                if (shouldFail)
                {
                    Assert.Fail("An exception should have been thrown - resource types are not compatible");
                }

                Assert.AreEqual(1, resultItemPresentations.Count);
            }
            catch (IncompatibleResourceTypesException)
            {
                if (!shouldFail)
                {
                    throw;
                }
            }
        }
        public MainWindowViewModel(SignalsResultsRepository signalsResultsRepository, AuthenticationServices authenticationServices, SmartSignalRunner signalRunner)
        {
            this.NumberOfResultsFound = 0;
            signalsResultsRepository.Results.CollectionChanged +=
                (sender, args) => { this.NumberOfResultsFound = args.NewItems.Count; };

            this.UserName     = authenticationServices.AuthenticationResult.UserInfo.GivenName;
            this.SignalRunner = signalRunner;
        }
 public EmulationStatusControlViewModel(SmartSignalRunner signalRunner, ITracer tracer)
 {
     this.SignalRunner = signalRunner;
     this.Tracer       = tracer;
 }