Example #1
0
        public async Task Simple_WhenCancelled_Reports_Cancelled_Async()
        {
            var restoreMan = Mock.Of <IPackageRestoreManager>();

            _globalProvider.AddService(typeof(IPackageRestoreManager), restoreMan);
            var slnMan = Mock.Of <IVsSolutionManager>();

            _globalProvider.AddService(typeof(IVsSolutionManager), slnMan);
            ISourceRepositoryProvider sourceRepositoryProvider = TestSourceRepositoryUtility.CreateV3OnlySourceRepositoryProvider();

            _globalProvider.AddService(typeof(ISourceRepositoryProvider), sourceRepositoryProvider);

            var restoreChecker        = Mock.Of <ISolutionRestoreChecker>();
            var eventsPublisher       = Mock.Of <IRestoreEventsPublisher>();
            var settings              = Mock.Of <ISettings>();
            var nuGetProgressReporter = Mock.Of <IVsNuGetProgressReporter>();

            Mock.Get(settings)
            .Setup(x => x.GetSection("packageRestore"))
            .Returns(() => new VirtualSettingSection("packageRestore",
                                                     new AddItem("automatic", bool.TrueString)));

            var consoleProvider = Mock.Of <IOutputConsoleProvider>();
            var logger          = new RestoreOperationLogger(new Lazy <IOutputConsoleProvider>(() => consoleProvider));

            var job = new SolutionRestoreJob(
                asyncServiceProvider: AsyncServiceProvider.GlobalProvider,
                packageRestoreManager: restoreMan,
                solutionManager: slnMan,
                sourceRepositoryProvider: sourceRepositoryProvider,
                restoreEventsPublisher: eventsPublisher,
                settings: settings,
                solutionRestoreChecker: restoreChecker,
                nuGetProgressReporter: nuGetProgressReporter);

            var restoreRequest = new SolutionRestoreRequest(
                forceRestore: true,
                RestoreOperationSource.OnBuild);
            var restoreJobContext = new SolutionRestoreJobContext();

            var cts = new CancellationTokenSource();

            cts.Cancel();

            await job.ExecuteAsync(
                request : restoreRequest,
                jobContext : restoreJobContext,
                logger : logger,
                trackingData : new Dictionary <string, object>(),
                token : cts.Token);

            Assert.Equal(NuGetOperationStatus.Cancelled, job.Status);
        }
Example #2
0
        /// <summary>
        /// Restore job entry point. Not re-entrant.
        /// </summary>
        public async Task <bool> ExecuteAsync(
            SolutionRestoreRequest request,
            SolutionRestoreJobContext jobContext,
            RestoreOperationLogger logger,
            CancellationToken token)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            if (jobContext == null)
            {
                throw new ArgumentNullException(nameof(jobContext));
            }

            if (logger == null)
            {
                throw new ArgumentNullException(nameof(logger));
            }

            _logger = logger;

            // update instance attributes with the shared context values
            _dependencyGraphProjectCacheHash = jobContext.DependencyGraphProjectCacheHash;
            _nuGetProjectContext             = jobContext.NuGetProjectContext;

            using (var ctr1 = token.Register(() => _status = NuGetOperationStatus.Cancelled))
            {
                try
                {
                    await RestoreAsync(request.ForceRestore, request.RestoreSource, token);
                }
                catch (OperationCanceledException) when(token.IsCancellationRequested)
                {
                }
                catch (Exception e)
                {
                    // Log the exception to the console and activity log
                    await _logger.LogExceptionAsync(e);
                }
                finally
                {
                    // update shared context values with instance attributes
                    jobContext.DependencyGraphProjectCacheHash = _dependencyGraphProjectCacheHash;
                }
            }

            return(_status == NuGetOperationStatus.NoOp || _status == NuGetOperationStatus.Succeeded);
        }
        private void Reset(bool isDisposing = false)
        {
            // Make sure worker restore operation is cancelled
            _workerCts?.Cancel();

            if (_backgroundJobRunner?.IsValueCreated == true)
            {
                // Await completion of the background work
                _joinableFactory.Run(
                    async() =>
                {
                    // Do not block VS forever
                    // After the specified delay the task will disjoin.
                    await _backgroundJobRunner.GetValueAsync().WithTimeout(TimeSpan.FromSeconds(60));
                },
                    JoinableTaskCreationOptions.LongRunning);
            }

            _pendingRestore?.Dispose();
            _workerCts?.Dispose();

            if (_pendingRequests?.IsValueCreated == true)
            {
                _pendingRequests.Value.Dispose();
            }

            if (!isDisposing)
            {
                _solutionLoadedEvent.Reset();

                _workerCts = new CancellationTokenSource();

                _backgroundJobRunner = new AsyncLazy <bool>(
                    () => StartBackgroundJobRunnerAsync(_workerCts.Token),
                    _joinableFactory);

                _pendingRequests = new Lazy <BlockingCollection <SolutionRestoreRequest> >(
                    () => new BlockingCollection <SolutionRestoreRequest>(RequestQueueLimit));

                _pendingRestore    = new BackgroundRestoreOperation();
                _activeRestoreTask = Task.FromResult(true);
                _restoreJobContext = new SolutionRestoreJobContext();
            }
        }
        /// <summary>
        /// Restore job entry point. Not re-entrant.
        /// </summary>
        public async Task <bool> ExecuteAsync(
            SolutionRestoreRequest request,
            SolutionRestoreJobContext jobContext,
            RestoreOperationLogger logger,
            bool isSolutionLoadRestore,
            CancellationToken token)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            if (jobContext == null)
            {
                throw new ArgumentNullException(nameof(jobContext));
            }

            if (logger == null)
            {
                throw new ArgumentNullException(nameof(logger));
            }

            _logger = logger;

            // update instance attributes with the shared context values
            _nuGetProjectContext             = jobContext.NuGetProjectContext;
            _nuGetProjectContext.OperationId = request.OperationId;
            _isSolutionLoadRestore           = isSolutionLoadRestore;

            try
            {
                await RestoreAsync(request.ForceRestore, request.RestoreSource, token);
            }
            catch (OperationCanceledException)
            {
            }
            catch (Exception e)
            {
                // Log the exception to the console and activity log
                await _logger.LogExceptionAsync(e);
            }

            return(_status == NuGetOperationStatus.NoOp || _status == NuGetOperationStatus.Succeeded);
        }