コード例 #1
0
        public void MustSucceedRevertingWithoutCallingPerform()
        {
            var sut    = new OperationSequence(loggerMock.Object, new Queue <IOperation>());
            var result = sut.TryRevert();

            Assert.AreEqual(OperationResult.Success, result);
        }
コード例 #2
0
        public void MustContinueToRevertOperationsInCaseOfError()
        {
            var operationA = new Mock <IOperation>();
            var operationB = new Mock <IOperation>();
            var operationC = new Mock <IOperation>();
            var operations = new Queue <IOperation>();

            operationA.Setup(o => o.Perform()).Returns(OperationResult.Success);
            operationB.Setup(o => o.Perform()).Returns(OperationResult.Success);
            operationC.Setup(o => o.Perform()).Returns(OperationResult.Success);

            operationA.Setup(o => o.Revert()).Throws <Exception>();
            operationB.Setup(o => o.Revert()).Throws <Exception>();
            operationC.Setup(o => o.Revert()).Throws <Exception>();

            operations.Enqueue(operationA.Object);
            operations.Enqueue(operationB.Object);
            operations.Enqueue(operationC.Object);

            var sut = new OperationSequence(loggerMock.Object, operations);

            sut.TryPerform();

            var result = sut.TryRevert();

            operationA.Verify(o => o.Revert(), Times.Once);
            operationB.Verify(o => o.Revert(), Times.Once);
            operationC.Verify(o => o.Revert(), Times.Once);

            Assert.AreEqual(OperationResult.Failed, result);
        }
コード例 #3
0
        public void MustOnlyRevertPerformedOperations()
        {
            var operationA = new Mock <IOperation>();
            var operationB = new Mock <IOperation>();
            var operationC = new Mock <IOperation>();
            var operations = new Queue <IOperation>();

            operationA.Setup(o => o.Perform()).Returns(OperationResult.Success);
            operationA.Setup(o => o.Revert()).Returns(OperationResult.Success);
            operationB.Setup(o => o.Perform()).Returns(OperationResult.Aborted);
            operationB.Setup(o => o.Revert()).Returns(OperationResult.Success);

            operations.Enqueue(operationA.Object);
            operations.Enqueue(operationB.Object);
            operations.Enqueue(operationC.Object);

            var sut = new OperationSequence(loggerMock.Object, operations);

            sut.TryPerform();

            var result = sut.TryRevert();

            operationA.Verify(o => o.Revert(), Times.Once);
            operationB.Verify(o => o.Revert(), Times.Once);
            operationC.Verify(o => o.Revert(), Times.Never);

            Assert.AreEqual(OperationResult.Success, result);
        }
コード例 #4
0
        public void MustRevertOperationsInSequence()
        {
            int current = 0, a = 0, b = 0, c = 0;
            var operationA = new Mock <IOperation>();
            var operationB = new Mock <IOperation>();
            var operationC = new Mock <IOperation>();
            var operations = new Queue <IOperation>();

            operationA.Setup(o => o.Perform()).Returns(OperationResult.Success);
            operationB.Setup(o => o.Perform()).Returns(OperationResult.Success);
            operationC.Setup(o => o.Perform()).Returns(OperationResult.Success);

            operationA.Setup(o => o.Revert()).Returns(OperationResult.Success).Callback(() => a = ++current);
            operationB.Setup(o => o.Revert()).Returns(OperationResult.Success).Callback(() => b = ++current);
            operationC.Setup(o => o.Revert()).Returns(OperationResult.Success).Callback(() => c = ++current);

            operations.Enqueue(operationA.Object);
            operations.Enqueue(operationB.Object);
            operations.Enqueue(operationC.Object);

            var sut = new OperationSequence(loggerMock.Object, operations);

            sut.TryPerform();

            var result = sut.TryRevert();

            Assert.AreEqual(OperationResult.Success, result);
            Assert.IsTrue(c == 1);
            Assert.IsTrue(b == 2);
            Assert.IsTrue(a == 3);
        }
コード例 #5
0
        public void MustCreateCopyOfOperationQueue()
        {
            var operationA = new Mock <IOperation>();
            var operationB = new Mock <IOperation>();
            var operationC = new Mock <IOperation>();
            var operations = new Queue <IOperation>();

            operationA.Setup(o => o.Perform()).Returns(OperationResult.Success);
            operationB.Setup(o => o.Perform()).Returns(OperationResult.Success);
            operationC.Setup(o => o.Perform()).Returns(OperationResult.Success);

            operations.Enqueue(operationA.Object);
            operations.Enqueue(operationB.Object);
            operations.Enqueue(operationC.Object);

            var sut = new OperationSequence(loggerMock.Object, operations);

            operations.Clear();

            sut.TryPerform();

            operationA.Verify(o => o.Perform(), Times.Once);
            operationB.Verify(o => o.Perform(), Times.Once);
            operationC.Verify(o => o.Perform(), Times.Once);
        }
コード例 #6
0
        public void MustSucceedWithEmptyQueue()
        {
            var sut    = new OperationSequence(loggerMock.Object, new Queue <IOperation>());
            var result = sut.TryPerform();

            Assert.AreEqual(OperationResult.Success, result);
        }
コード例 #7
0
        internal void BuildObjectGraph()
        {
            const int ONE_SECOND   = 1000;
            const int FIVE_SECONDS = 5000;

            var backupFilePath = BuildBackupFilePath();

            InitializeLogging();

            var featureBackup             = new FeatureConfigurationBackup(backupFilePath, new ModuleLogger(logger, nameof(FeatureConfigurationBackup)));
            var featureFactory            = new FeatureConfigurationFactory(new ModuleLogger(logger, nameof(FeatureConfigurationFactory)));
            var featureMonitor            = new FeatureConfigurationMonitor(new ModuleLogger(logger, nameof(FeatureConfigurationMonitor)), ONE_SECOND);
            var proxyFactory              = new ProxyFactory(new ProxyObjectFactory(), new ModuleLogger(logger, nameof(ProxyFactory)));
            var serviceHost               = new ServiceHost(AppConfig.SERVICE_ADDRESS, new HostObjectFactory(), new ModuleLogger(logger, nameof(ServiceHost)), FIVE_SECONDS);
            var sessionContext            = new SessionContext();
            var systemConfigurationUpdate = new SystemConfigurationUpdate(new ModuleLogger(logger, nameof(SystemConfigurationUpdate)));

            var bootstrapOperations = new Queue <IOperation>();
            var sessionOperations   = new Queue <IOperation>();

            sessionContext.AutoRestoreMechanism = new AutoRestoreMechanism(featureBackup, new ModuleLogger(logger, nameof(AutoRestoreMechanism)), systemConfigurationUpdate, FIVE_SECONDS);

            bootstrapOperations.Enqueue(new RestoreOperation(featureBackup, logger, sessionContext));
            bootstrapOperations.Enqueue(new CommunicationHostOperation(serviceHost, logger));
            bootstrapOperations.Enqueue(new ServiceEventCleanupOperation(logger, sessionContext));

            sessionOperations.Enqueue(new SessionInitializationOperation(logger, ServiceEventFactory, sessionContext));
            sessionOperations.Enqueue(new LockdownOperation(featureBackup, featureFactory, featureMonitor, logger, sessionContext));
            sessionOperations.Enqueue(new SessionActivationOperation(logger, sessionContext));

            var bootstrapSequence = new OperationSequence(logger, bootstrapOperations);
            var sessionSequence   = new OperationSequence(logger, sessionOperations);

            ServiceController = new ServiceController(logger, LogWriterFactory, bootstrapSequence, sessionSequence, serviceHost, sessionContext, systemConfigurationUpdate);
        }
コード例 #8
0
        internal void BuildObjectGraph(Action shutdown)
        {
            const int FIVE_SECONDS   = 5000;
            const int THIRTY_SECONDS = 30000;

            var args          = Environment.GetCommandLineArgs();
            var nativeMethods = new NativeMethods();

            logger     = new Logger();
            systemInfo = new SystemInfo();

            InitializeConfiguration();
            InitializeLogging();
            InitializeText();

            var messageBox     = new MessageBox(text);
            var desktopFactory = new DesktopFactory(ModuleLogger(nameof(DesktopFactory)));
            var explorerShell  = new ExplorerShell(ModuleLogger(nameof(ExplorerShell)), nativeMethods);
            var processFactory = new ProcessFactory(ModuleLogger(nameof(ProcessFactory)));
            var proxyFactory   = new ProxyFactory(new ProxyObjectFactory(), logger);
            var runtimeHost    = new RuntimeHost(appConfig.RuntimeAddress, new HostObjectFactory(), ModuleLogger(nameof(RuntimeHost)), FIVE_SECONDS);
            var serviceProxy   = new ServiceProxy(appConfig.ServiceAddress, new ProxyObjectFactory(), ModuleLogger(nameof(ServiceProxy)));
            var sessionContext = new SessionContext();
            var uiFactory      = new UserInterfaceFactory(text);

            var bootstrapOperations = new Queue <IOperation>();
            var sessionOperations   = new Queue <IRepeatableOperation>();

            bootstrapOperations.Enqueue(new I18nOperation(logger, text, textResource));
            bootstrapOperations.Enqueue(new CommunicationHostOperation(runtimeHost, logger));

            sessionOperations.Enqueue(new SessionInitializationOperation(configuration, logger, runtimeHost, sessionContext));
            sessionOperations.Enqueue(new ConfigurationOperation(args, configuration, new HashAlgorithm(), logger, sessionContext));
            sessionOperations.Enqueue(new ClientTerminationOperation(logger, processFactory, proxyFactory, runtimeHost, sessionContext, THIRTY_SECONDS));
            sessionOperations.Enqueue(new KioskModeTerminationOperation(desktopFactory, explorerShell, logger, processFactory, sessionContext));
            sessionOperations.Enqueue(new ServiceOperation(logger, runtimeHost, serviceProxy, sessionContext, THIRTY_SECONDS));
            sessionOperations.Enqueue(new KioskModeOperation(desktopFactory, explorerShell, logger, processFactory, sessionContext));
            sessionOperations.Enqueue(new ClientOperation(logger, processFactory, proxyFactory, runtimeHost, sessionContext, THIRTY_SECONDS));
            sessionOperations.Enqueue(new SessionActivationOperation(logger, sessionContext));

            var bootstrapSequence = new OperationSequence(logger, bootstrapOperations);
            var sessionSequence   = new RepeatableOperationSequence(logger, sessionOperations);

            RuntimeController = new RuntimeController(
                appConfig,
                logger,
                messageBox,
                bootstrapSequence,
                sessionSequence,
                runtimeHost,
                serviceProxy,
                sessionContext,
                shutdown,
                text,
                uiFactory);
        }
コード例 #9
0
        public void MustNotFailInCaseOfUnexpectedErrorWhenReverting()
        {
            var sut = new OperationSequence(loggerMock.Object, new Queue <IOperation>());

            sut.ProgressChanged += (args) => throw new Exception();

            var result = sut.TryRevert();

            Assert.AreEqual(OperationResult.Failed, result);
        }
コード例 #10
0
 public override int GetHashCode()
 {
     unchecked
     {
         int hash = 17;
         hash = hash * 23 + (ActualCost == null ? 0 : ActualCost.GetHashCode());
         hash = hash * 23 + (ActualEndDate == null ? 0 : ActualEndDate.GetHashCode());
         hash = hash * 23 + (ActualResourceHrs == null ? 0 : ActualResourceHrs.GetHashCode());
         hash = hash * 23 + (ActualStartDate == null ? 0 : ActualStartDate.GetHashCode());
         hash = hash * 23 + (LocationId == default(short) ? 0 : LocationId.GetHashCode());
         hash = hash * 23 + (ModifiedDate == default(DateTime) ? 0 : ModifiedDate.GetHashCode());
         hash = hash * 23 + (OperationSequence == default(short) ? 0 : OperationSequence.GetHashCode());
         hash = hash * 23 + (PlannedCost == default(decimal) ? 0 : PlannedCost.GetHashCode());
         hash = hash * 23 + (ProductId == default(int) ? 0 : ProductId.GetHashCode());
         hash = hash * 23 + (ScheduledEndDate == default(DateTime) ? 0 : ScheduledEndDate.GetHashCode());
         hash = hash * 23 + (ScheduledStartDate == default(DateTime) ? 0 : ScheduledStartDate.GetHashCode());
         hash = hash * 23 + (WorkOrderId == default(int) ? 0 : WorkOrderId.GetHashCode());
         return(hash);
     }
 }
コード例 #11
0
        public void MustCorrectlyPropagateEventSubscription()
        {
            var actionRequiredCalled  = false;
            var actionRequiredHandler = new ActionRequiredEventHandler(args => actionRequiredCalled = true);
            var statusChangedCalled   = false;
            var statusChangedHandler  = new StatusChangedEventHandler(t => statusChangedCalled = true);
            var operationA            = new Mock <IOperation>();
            var operationB            = new Mock <IOperation>();
            var operationC            = new Mock <IOperation>();
            var operations            = new Queue <IOperation>();

            operationA.Setup(o => o.Perform()).Returns(OperationResult.Success);
            operationB.Setup(o => o.Perform()).Returns(OperationResult.Success).Raises(o => o.ActionRequired += null, new Mock <ActionRequiredEventArgs>().Object);
            operationC.Setup(o => o.Perform()).Returns(OperationResult.Success).Raises(o => o.StatusChanged  += null, default(TextKey));

            operations.Enqueue(operationA.Object);
            operations.Enqueue(operationB.Object);
            operations.Enqueue(operationC.Object);

            var sut = new OperationSequence(loggerMock.Object, operations);

            sut.ActionRequired += actionRequiredHandler;
            sut.StatusChanged  += statusChangedHandler;

            sut.TryPerform();

            Assert.IsTrue(actionRequiredCalled);
            Assert.IsTrue(statusChangedCalled);

            actionRequiredCalled = false;
            statusChangedCalled  = false;
            sut.ActionRequired  -= actionRequiredHandler;
            sut.StatusChanged   -= statusChangedHandler;

            sut.TryPerform();

            Assert.IsFalse(actionRequiredCalled);
            Assert.IsFalse(statusChangedCalled);
        }
コード例 #12
0
        internal void BuildObjectGraph(Action shutdown)
        {
            ValidateCommandLineArguments();

            InitializeLogging();
            InitializeText();

            context       = new ClientContext();
            uiFactory     = BuildUserInterfaceFactory();
            actionCenter  = uiFactory.CreateActionCenter();
            messageBox    = BuildMessageBox();
            nativeMethods = new NativeMethods();
            runtimeProxy  = new RuntimeProxy(runtimeHostUri, new ProxyObjectFactory(), ModuleLogger(nameof(RuntimeProxy)), Interlocutor.Client);
            systemInfo    = new SystemInfo();
            taskbar       = uiFactory.CreateTaskbar(ModuleLogger("Taskbar"));
            taskview      = uiFactory.CreateTaskview();

            var processFactory     = new ProcessFactory(ModuleLogger(nameof(ProcessFactory)));
            var applicationMonitor = new ApplicationMonitor(TWO_SECONDS, ModuleLogger(nameof(ApplicationMonitor)), nativeMethods, processFactory);
            var applicationFactory = new ApplicationFactory(applicationMonitor, ModuleLogger(nameof(ApplicationFactory)), nativeMethods, processFactory);
            var displayMonitor     = new DisplayMonitor(ModuleLogger(nameof(DisplayMonitor)), nativeMethods, systemInfo);
            var explorerShell      = new ExplorerShell(ModuleLogger(nameof(ExplorerShell)), nativeMethods);
            var fileSystemDialog   = BuildFileSystemDialog();
            var hashAlgorithm      = new HashAlgorithm();
            var splashScreen       = uiFactory.CreateSplashScreen();

            var operations = new Queue <IOperation>();

            operations.Enqueue(new I18nOperation(logger, text));
            operations.Enqueue(new RuntimeConnectionOperation(context, logger, runtimeProxy, authenticationToken));
            operations.Enqueue(new ConfigurationOperation(context, logger, runtimeProxy));
            operations.Enqueue(new DelegateOperation(UpdateAppConfig));
            operations.Enqueue(new LazyInitializationOperation(BuildClientHostOperation));
            operations.Enqueue(new ClientHostDisconnectionOperation(context, logger, FIVE_SECONDS));
            operations.Enqueue(new LazyInitializationOperation(BuildKeyboardInterceptorOperation));
            operations.Enqueue(new LazyInitializationOperation(BuildMouseInterceptorOperation));
            operations.Enqueue(new ApplicationOperation(context, applicationFactory, applicationMonitor, logger, text));
            operations.Enqueue(new DisplayMonitorOperation(context, displayMonitor, logger, taskbar));
            operations.Enqueue(new LazyInitializationOperation(BuildShellOperation));
            operations.Enqueue(new LazyInitializationOperation(BuildBrowserOperation));
            operations.Enqueue(new ClipboardOperation(context, logger, nativeMethods));

            var sequence = new OperationSequence(logger, operations);

            ClientController = new ClientController(
                actionCenter,
                applicationMonitor,
                context,
                displayMonitor,
                explorerShell,
                fileSystemDialog,
                hashAlgorithm,
                logger,
                messageBox,
                sequence,
                runtimeProxy,
                shutdown,
                splashScreen,
                taskbar,
                text,
                uiFactory);
        }
コード例 #13
0
        internal void BuildObjectGraph(Action shutdown)
        {
            const int FIVE_SECONDS   = 5000;
            const int THIRTY_SECONDS = 30000;

            logger     = new Logger();
            systemInfo = new SystemInfo();

            InitializeConfiguration();
            InitializeLogging();
            InitializeText();

            var args                  = Environment.GetCommandLineArgs();
            var messageBox            = new MessageBoxFactory(text);
            var nativeMethods         = new NativeMethods();
            var uiFactory             = new UserInterfaceFactory(text);
            var desktopFactory        = new DesktopFactory(ModuleLogger(nameof(DesktopFactory)));
            var explorerShell         = new ExplorerShell(ModuleLogger(nameof(ExplorerShell)), nativeMethods);
            var fileSystem            = new FileSystem();
            var processFactory        = new ProcessFactory(ModuleLogger(nameof(ProcessFactory)));
            var proxyFactory          = new ProxyFactory(new ProxyObjectFactory(), ModuleLogger(nameof(ProxyFactory)));
            var remoteSessionDetector = new RemoteSessionDetector(ModuleLogger(nameof(RemoteSessionDetector)));
            var runtimeHost           = new RuntimeHost(appConfig.RuntimeAddress, new HostObjectFactory(), ModuleLogger(nameof(RuntimeHost)), FIVE_SECONDS);
            var runtimeWindow         = uiFactory.CreateRuntimeWindow(appConfig);
            var server                = new ServerProxy(appConfig, ModuleLogger(nameof(ServerProxy)));
            var serviceProxy          = new ServiceProxy(appConfig.ServiceAddress, new ProxyObjectFactory(), ModuleLogger(nameof(ServiceProxy)), Interlocutor.Runtime);
            var sessionContext        = new SessionContext();
            var splashScreen          = uiFactory.CreateSplashScreen(appConfig);
            var userInfo              = new UserInfo(ModuleLogger(nameof(UserInfo)));
            var vmDetector            = new VirtualMachineDetector(ModuleLogger(nameof(VirtualMachineDetector)), systemInfo);

            var bootstrapOperations = new Queue <IOperation>();
            var sessionOperations   = new Queue <IRepeatableOperation>();

            bootstrapOperations.Enqueue(new I18nOperation(logger, text));
            bootstrapOperations.Enqueue(new CommunicationHostOperation(runtimeHost, logger));

            sessionOperations.Enqueue(new SessionInitializationOperation(configuration, fileSystem, logger, runtimeHost, sessionContext));
            sessionOperations.Enqueue(new ConfigurationOperation(args, configuration, new FileSystem(), new HashAlgorithm(), logger, sessionContext));
            sessionOperations.Enqueue(new DisclaimerOperation(logger, sessionContext));
            sessionOperations.Enqueue(new ServerOperation(args, configuration, fileSystem, logger, sessionContext, server));
            sessionOperations.Enqueue(new RemoteSessionOperation(remoteSessionDetector, logger, sessionContext));
            sessionOperations.Enqueue(new VirtualMachineOperation(vmDetector, logger, sessionContext));
            sessionOperations.Enqueue(new ServiceOperation(logger, runtimeHost, serviceProxy, sessionContext, THIRTY_SECONDS, userInfo));
            sessionOperations.Enqueue(new ClientTerminationOperation(logger, processFactory, proxyFactory, runtimeHost, sessionContext, THIRTY_SECONDS));
            sessionOperations.Enqueue(new ProctoringWorkaroundOperation(logger, sessionContext));
            sessionOperations.Enqueue(new KioskModeOperation(desktopFactory, explorerShell, logger, processFactory, sessionContext));
            sessionOperations.Enqueue(new ClientOperation(logger, processFactory, proxyFactory, runtimeHost, sessionContext, THIRTY_SECONDS));
            sessionOperations.Enqueue(new SessionActivationOperation(logger, sessionContext));

            var bootstrapSequence = new OperationSequence(logger, bootstrapOperations);
            var sessionSequence   = new RepeatableOperationSequence(logger, sessionOperations);

            RuntimeController = new RuntimeController(
                appConfig,
                logger,
                messageBox,
                bootstrapSequence,
                sessionSequence,
                runtimeHost,
                runtimeWindow,
                serviceProxy,
                sessionContext,
                shutdown,
                splashScreen,
                text,
                uiFactory);
        }
コード例 #14
0
        internal void BuildObjectGraph(Action shutdown)
        {
            ValidateCommandLineArguments();

            configuration = new ClientConfiguration();
            logger        = new Logger();
            nativeMethods = new NativeMethods();
            systemInfo    = new SystemInfo();

            InitializeLogging();
            InitializeText();

            actionCenter         = BuildActionCenter();
            messageBox           = BuildMessageBox();
            processMonitor       = new ProcessMonitor(new ModuleLogger(logger, nameof(ProcessMonitor)), nativeMethods);
            uiFactory            = BuildUserInterfaceFactory();
            runtimeProxy         = new RuntimeProxy(runtimeHostUri, new ProxyObjectFactory(), new ModuleLogger(logger, nameof(RuntimeProxy)), Interlocutor.Client);
            taskbar              = BuildTaskbar();
            terminationActivator = new TerminationActivator(new ModuleLogger(logger, nameof(TerminationActivator)));
            windowMonitor        = new WindowMonitor(new ModuleLogger(logger, nameof(WindowMonitor)), nativeMethods);

            var displayMonitor = new DisplayMonitor(new ModuleLogger(logger, nameof(DisplayMonitor)), nativeMethods, systemInfo);
            var explorerShell  = new ExplorerShell(new ModuleLogger(logger, nameof(ExplorerShell)), nativeMethods);
            var hashAlgorithm  = new HashAlgorithm();

            var operations = new Queue <IOperation>();

            operations.Enqueue(new I18nOperation(logger, text, textResource));
            operations.Enqueue(new RuntimeConnectionOperation(logger, runtimeProxy, authenticationToken));
            operations.Enqueue(new ConfigurationOperation(configuration, logger, runtimeProxy));
            operations.Enqueue(new DelegateOperation(UpdateAppConfig));
            operations.Enqueue(new LazyInitializationOperation(BuildClientHostOperation));
            operations.Enqueue(new LazyInitializationOperation(BuildClientHostDisconnectionOperation));
            operations.Enqueue(new LazyInitializationOperation(BuildKeyboardInterceptorOperation));
            operations.Enqueue(new LazyInitializationOperation(BuildMouseInterceptorOperation));
            operations.Enqueue(new LazyInitializationOperation(BuildWindowMonitorOperation));
            operations.Enqueue(new LazyInitializationOperation(BuildProcessMonitorOperation));
            operations.Enqueue(new DisplayMonitorOperation(displayMonitor, logger, taskbar));
            operations.Enqueue(new LazyInitializationOperation(BuildShellOperation));
            operations.Enqueue(new LazyInitializationOperation(BuildBrowserOperation));
            operations.Enqueue(new ClipboardOperation(logger, nativeMethods));
            operations.Enqueue(new DelegateOperation(UpdateClientControllerDependencies));

            var sequence = new OperationSequence(logger, operations);

            ClientController = new ClientController(
                actionCenter,
                displayMonitor,
                explorerShell,
                hashAlgorithm,
                logger,
                messageBox,
                sequence,
                processMonitor,
                runtimeProxy,
                shutdown,
                taskbar,
                terminationActivator,
                text,
                uiFactory,
                windowMonitor);
        }