/// <summary>
        ///    Установка нового статуса для анализируемого решения
        /// </summary>
        /// <param name="startupConfigurationMode">Конфигурация запуска</param>
        /// <param name="solutionInfo">Модель решения</param>
        /// <param name="newStatusValue">Новый статус</param>
        public static void SetStatusValue(this SolutionInfoViewModel solutionInfo,
                                          StartupConfigurationMode startupConfigurationMode, AnalysisStatus newStatusValue)
        {
            switch (startupConfigurationMode)
            {
            case StartupConfigurationMode.PvsVs2010:
                solutionInfo.LaunchStatusOnPvsVs2010 = newStatusValue;
                break;

            case StartupConfigurationMode.PvsVs2012:
                solutionInfo.LaunchStatusOnPvsVs2012 = newStatusValue;
                break;

            case StartupConfigurationMode.PvsVs2013:
                solutionInfo.LaunchStatusOnPvsVs2013 = newStatusValue;
                break;

            case StartupConfigurationMode.PvsVs2015:
                solutionInfo.LaunchStatusOnPvsVs2015 = newStatusValue;
                break;

            case StartupConfigurationMode.All:
                throw new ArgumentException("startupConfigurationMode");

            default:
                throw new InvalidOperationException(string.Format("Unsupported Visual Studio version: {0}",
                                                                  startupConfigurationMode));
            }
        }
        /// <summary>
        ///    Получение текущего статуса для анализируемого решения
        /// </summary>
        /// <param name="startupMode">Конфигурация запуска</param>
        /// <param name="solution">Модель решения</param>
        /// <returns>Текущий статус</returns>
        public static AnalysisStatus GetStatusValue(this StartupConfigurationMode startupMode,
                                                    SolutionInfoViewModel solution)
        {
            AnalysisStatus currentSlnStatus;

            switch (startupMode)
            {
            case StartupConfigurationMode.PvsVs2010:
                currentSlnStatus = solution.LaunchStatusOnPvsVs2010;
                break;

            case StartupConfigurationMode.PvsVs2012:
                currentSlnStatus = solution.LaunchStatusOnPvsVs2012;
                break;

            case StartupConfigurationMode.PvsVs2013:
                currentSlnStatus = solution.LaunchStatusOnPvsVs2013;
                break;

            case StartupConfigurationMode.PvsVs2015:
                currentSlnStatus = solution.LaunchStatusOnPvsVs2015;
                break;

            case StartupConfigurationMode.All:
                throw new ArgumentException("startupConfigurationMode");

            default:
                currentSlnStatus = AnalysisStatus.None;
                break;
            }

            return(currentSlnStatus);
        }
示例#3
0
        private void SetNewStatusValue(StartupConfigurationMode configMode, SolutionInfoViewModel localSlnInfo,
                                       AnalysisStatus newStatus)
        {
            switch (configMode)
            {
            case StartupConfigurationMode.PvsVs2010:
                RunInUiSynchronizationContext(() => localSlnInfo.LaunchStatusOnPvsVs2010 = newStatus);
                break;

            case StartupConfigurationMode.PvsVs2012:
                RunInUiSynchronizationContext(() => localSlnInfo.LaunchStatusOnPvsVs2012 = newStatus);
                break;

            case StartupConfigurationMode.PvsVs2013:
                RunInUiSynchronizationContext(() => localSlnInfo.LaunchStatusOnPvsVs2013 = newStatus);
                break;

            case StartupConfigurationMode.PvsVs2015:
                RunInUiSynchronizationContext(() => localSlnInfo.LaunchStatusOnPvsVs2015 = newStatus);
                break;

            default:
                throw new InvalidOperationException(
                          string.Format("Unsupported Visual Studio version: {0}", configMode));
            }
        }
示例#4
0
            /// <summary>
            ///    Получает строку статуса для версии Visual Studio
            /// </summary>
            /// <param name="vsVersion">Версия Visual Studio</param>
            /// <param name="solutionInfo">Информация о VS-решении</param>
            /// <returns>Строка статуса для версии Visual Studio</returns>
            public static AnalysisStatus GetLaunchStatus(StartupConfigurationMode vsVersion,
                                                         SolutionInfoViewModel solutionInfo)
            {
                AnalysisStatus launchStatusOn;

                switch (vsVersion)
                {
                case StartupConfigurationMode.PvsVs2010:
                    launchStatusOn = solutionInfo.LaunchStatusOnPvsVs2010;
                    break;

                case StartupConfigurationMode.PvsVs2012:
                    launchStatusOn = solutionInfo.LaunchStatusOnPvsVs2012;
                    break;

                case StartupConfigurationMode.PvsVs2013:
                    launchStatusOn = solutionInfo.LaunchStatusOnPvsVs2013;
                    break;

                case StartupConfigurationMode.PvsVs2015:
                    launchStatusOn = solutionInfo.LaunchStatusOnPvsVs2015;
                    break;

                default:
                    throw new InvalidOperationException(string.Format("Unsupported Visual Studio version: {0}",
                                                                      vsVersion));
                }

                return(launchStatusOn);
            }
示例#5
0
        private void Execute(StartupConfigurationMode startupConfigurationMode, AnalysisStatus properInitialStatus,
                             SolutionInfoViewModel solutionInfo, string currentTestingDir)
        {
            var testSolutionInfo = solutionInfo.TestSolutionInfo;
            var initialStatus    = Utils.GetLaunchStatus(startupConfigurationMode, solutionInfo);

            if (initialStatus == AnalysisStatus.None)
            {
                throw new InvalidOperationException("Unable to determine the analysis status");
            }

            if (initialStatus != properInitialStatus)
            {
                return;
            }

            var logFileName     = Utils.GetLogFileName(currentTestingDir, testSolutionInfo);
            var analysisManager = new AnalysisManager(
                solutionInfo, startupConfigurationMode, initialStatus, logFileName, _currentHtmlLog);

            lock (_syncAnalysisManagers)
            {
                AnalysisManagers.Add(analysisManager);
            }

            analysisManager.Run();
            OnCurrentAnalysisDone(
                new CurrentAnalysisDoneEventArgs(Interlocked.Increment(ref _totalFinishedCount)));
        }
        /// <summary>
        ///    Получение индекса столбца модели представления для имени свойства
        /// </summary>
        /// <param name="solutionInfoViewModel">Модель представления</param>
        /// <param name="propertyName">Имя свойства</param>
        /// <returns>Индекс столбца</returns>
        /// <exception cref="InvalidOperationException">Если свойство с таким именем не существует</exception>
        public static int GetColumnIndex(this SolutionInfoViewModel solutionInfoViewModel, string propertyName)
        {
            if (PropertyToColumnIndexMap.ContainsKey(propertyName))
            {
                return(PropertyToColumnIndexMap[propertyName]);
            }

            throw new InvalidOperationException(string.Format("{0} is not exists in type {1}", propertyName,
                                                              solutionInfoViewModel.GetType().Name));
        }
 /// <summary>
 ///    Конструктор аргументов события анализа
 /// </summary>
 /// <param name="newStatus">Новый статус анализа</param>
 /// <param name="solutionInfoViewModel">Информация о VS-решении</param>
 /// <param name="startupMode">Конфигурация запуска</param>
 /// <param name="crashReason">Возможная причина сбоя</param>
 /// <param name="devenvExitCode">Код завершения devenv.exe</param>
 public TestAnalysisEventArgs(AnalysisStatus newStatus, SolutionInfoViewModel solutionInfoViewModel,
                              StartupConfigurationMode startupMode, CrashReason crashReason = default(CrashReason),
                              int devenvExitCode = default(int))
 {
     NewStatus      = newStatus;
     SolutionInfo   = solutionInfoViewModel;
     StartupMode    = startupMode;
     CrashReason    = crashReason;
     DevenvExitCode = devenvExitCode;
 }
 /// <summary>
 ///    Конструктор менеджера для тестового анализа
 /// </summary>
 /// <param name="slnInfoVm">Тестируемое решение</param>
 /// <param name="startupConfigurationMode">Версия Visual Studion, для которой нужно запустить решение</param>
 /// <param name="status">Начальный статус анализа</param>
 /// <param name="logFileName">Файл лога с результатами работы анализатора</param>
 /// <param name="htmlLog">Html-лог</param>
 public AnalysisManager(SolutionInfoViewModel slnInfoVm, StartupConfigurationMode startupConfigurationMode,
                        AnalysisStatus status, string logFileName, string htmlLog)
 {
     SolutionInfo      = slnInfoVm;
     StartupMode       = startupConfigurationMode;
     _logFileName      = logFileName;
     _snapshotFilename = string.Format("{0}{1}", _logFileName, SnapshotExt);
     _currentStatus    = status;
     _htmlLog          = htmlLog;
 }
示例#9
0
        /// <summary>
        ///    Установка свойств решения для запуска
        /// </summary>
        /// <param name="startupConfigurationMode">Конфигурация запуска</param>
        /// <param name="slnInfo">Модель решения</param>
        /// <param name="pendingStatus">Статус планирования к запуску</param>
        /// <param name="currentTotalCount">Счетчик решений, запланированных к запуску</param>
        public static void EstablishLaunchStatus(StartupConfigurationMode startupConfigurationMode,
                                                 SolutionInfoViewModel slnInfo, AnalysisStatus pendingStatus, ref int currentTotalCount)
        {
            switch (startupConfigurationMode)
            {
            case StartupConfigurationMode.PvsVs2010:
                var pvsVs2010Stat = slnInfo.LaunchStatusOnPvsVs2010;
                if (!pvsVs2010Stat.IsInDisablingStatus())
                {
                    slnInfo.LaunchStatusOnPvsVs2010 = pendingStatus;
                    currentTotalCount++;
                }
                break;

            case StartupConfigurationMode.PvsVs2012:
                var pvsVs2012Stat = slnInfo.LaunchStatusOnPvsVs2012;
                if (!pvsVs2012Stat.IsInDisablingStatus())
                {
                    slnInfo.LaunchStatusOnPvsVs2012 = pendingStatus;
                    currentTotalCount++;
                }
                break;

            case StartupConfigurationMode.PvsVs2013:
                var pvsVs2013Stat = slnInfo.LaunchStatusOnPvsVs2013;
                if (!pvsVs2013Stat.IsInDisablingStatus())
                {
                    slnInfo.LaunchStatusOnPvsVs2013 = pendingStatus;
                    currentTotalCount++;
                }
                break;

            case StartupConfigurationMode.PvsVs2015:
                var pvsVs2015Stat = slnInfo.LaunchStatusOnPvsVs2015;
                if (!pvsVs2015Stat.IsInDisablingStatus())
                {
                    slnInfo.LaunchStatusOnPvsVs2015 = pendingStatus;
                    currentTotalCount++;
                }
                break;
            }
        }
        private static Process OpenAnalysisReportUntilWndValid(SolutionInfoViewModel currentSolution,
                                                               StartupConfigurationMode startupConfigurationMode, string selectedRunFolder, bool minimizeWindow)
        {
            Process devenvProc;

            if (!Prepare(currentSolution, startupConfigurationMode, selectedRunFolder, out devenvProc))
            {
                return(null);
            }

            IntPtr wndHandle;

            do
            {
                wndHandle = devenvProc.MainWindowHandle;
            } while (wndHandle == IntPtr.Zero);

            Unmanaged.ShowWindow(wndHandle,
                                 minimizeWindow ? Unmanaged.ShowOptions.Minimize : Unmanaged.ShowOptions.Show);

            return(devenvProc);
        }
        private static bool Prepare(SolutionInfoViewModel currentSolution,
                                    StartupConfigurationMode startupConfigurationMode,
                                    string selectedRunFolder, out Process devenvProc)
        {
            var absSlnFile         = currentSolution.TestSolutionInfo.AbsSolutionFileName;
            var vsPath             = InstallationInfo.RetrieveVisualStudioPath(startupConfigurationMode);
            var selfTesterRootPath = ApplicationConfigReader.SelfTesterRootPath;
            var srcEtalonFolder    = ApplicationConfigReader.Instance.SrcEtalonFolder;

            PrepareSolution(absSlnFile, vsPath, selfTesterRootPath, srcEtalonFolder);
            var selectedDiffLog = string.Format("{0}{1}{2}{1}{3}{4}_Diffs.plog", selectedRunFolder,
                                                Path.DirectorySeparatorChar, startupConfigurationMode, Path.GetFileNameWithoutExtension(absSlnFile),
                                                CoreExtensions.EtalonLogExt);

            if (!File.Exists(selectedDiffLog))
            {
                devenvProc = null;
                return(false);
            }

            var vsStartInfo = new ProcessStartInfo
            {
                FileName  = string.Format("{0}{1}devenv.exe", vsPath, Path.DirectorySeparatorChar),
                Arguments =
                    string.Format("\"{0}\" /command \"PVSStudio.OpenAnalysisReport {1}\"", absSlnFile, selectedDiffLog)
            };

            devenvProc = Process.Start(vsStartInfo);
            if (devenvProc == null)
            {
                return(false);
            }

            devenvProc.WaitForInputIdle();
            return(true);
        }
        /// <summary>
        ///    Открывает diff-файл лога в формате PVS-Studio
        /// </summary>
        /// <param name="currentSolution">Решение</param>
        /// <param name="startupConfigurationMode">Конфигурация запуска</param>
        /// <param name="selectedRunFolder">Директория тестового запуска</param>
        private static void OpenAnalysisReportUntilWndValid(SolutionInfoViewModel currentSolution,
                                                            StartupConfigurationMode startupConfigurationMode, string selectedRunFolder)
        {
            Process devenvProc;

            if (!Prepare(currentSolution, startupConfigurationMode, selectedRunFolder, out devenvProc))
            {
                return;
            }

            // Блокируем поток, пока не появится окно
            var vsIsInVisibleState = false;

            do
            {
                var vsWndHandle = devenvProc.MainWindowHandle;
                if (vsWndHandle == IntPtr.Zero)
                {
                    continue;
                }

                vsIsInVisibleState = Unmanaged.IsWindowVisible(vsWndHandle);
            } while (!vsIsInVisibleState);
        }
 /// <summary>
 ///    Открывает diff-файл лога в формате PVS-Studio в неблокирующем режиме
 /// </summary>
 /// <param name="currentSolution">Решение</param>
 /// <param name="startupConfigurationMode">Конфигурация запуска</param>
 /// <param name="selectedRunFolder">Директория тестового запуска</param>
 /// <returns>(Void)-Задача продолжения</returns>
 public static Task OpenAnalysisReportUntilWndValidAsync(SolutionInfoViewModel currentSolution,
                                                         StartupConfigurationMode startupConfigurationMode, string selectedRunFolder)
 {
     return(Task.Run(() => OpenAnalysisReportUntilWndValid(currentSolution, startupConfigurationMode, selectedRunFolder)));
 }