void WaitUntilLocalTargetState(ETWController.ViewModel model, ETWController.UI.TraceStates targetState, int waitMs = 2000)
        {
            while (model.LocalTraceSettings.TraceStates != targetState && waitMs-- > 0)
            {
                Thread.Sleep(1);
            }

            Assert.AreEqual(targetState, model.LocalTraceSettings.TraceStates);
        }
        ViewModel Create(string tempDir, bool bUseTraceDirStopVariable = false)
        {
            TraceMessages = new ConcurrentQueue <string>();
            if (CurrentApp == null)
            {
                CurrentApp = new App();
            }

            MessageDisplayMock display = new MessageDisplayMock();

            display.OnMessage += (str1, str2) =>
            {
                TraceMessages.Enqueue($"{MessageBoxStringPrefix}: {str1} Caption: {str2}");
            };
            ETWController.ViewModel model = new ETWController.ViewModel(display);

            model.LocalTraceSettings.PropertyChanged += (object sender, System.ComponentModel.PropertyChangedEventArgs e) =>
            {
                if (e.PropertyName == nameof(model.LocalTraceSettings.TraceStates))
                {
                    lock (LocalTraceStateChanges)
                    {
                        LocalTraceStateChanges.Add(model.LocalTraceSettings.TraceStates);
                    }
                }
            };

            model.InitUIDependantVariables(CurrentApp, TaskScheduler.Default);
            model.CaptureKeyboard               = false;
            model.CaptureMouseButtonDown        = false;
            model.CaptureScreenShots            = false;
            model.UnexpandedTraceFileName       = Path.Combine(tempDir, "test.etl");
            model.LocalTraceSettings.TraceStart = ":: echo hi trace start";
            model.LocalTraceSettings.TraceStop  = ":: echo trace stop performed " + (bUseTraceDirStopVariable ? ETWController.UI.TraceControlViewModel.TraceFileDirVariable : ETWController.UI.TraceControlViewModel.TraceFileNameVariable);
            model.LocalTraceSettings.CommandOutputs.CollectionChanged += (sender, e) =>
            {
                if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
                {
                    TraceMessages.Enqueue(e.NewItems[0].ToString());
                }
            };

            return(model);
        }