private static bool WaitForState(TestExecutionStates state, uint timeoutSeconds) { bool isStateReached = false; DateTime initialDateTime = DateTime.Now; while ((DateTime.Now - initialDateTime).TotalSeconds < timeoutSeconds) { if (File.Exists(LOG_FILE_NAME)) { File.Copy(LOG_FILE_NAME, LOG_FILE_NAME_COPY); StreamReader sr = new StreamReader(LOG_FILE_NAME_COPY); string line; int i = 0; while ((line = sr.ReadLine()) != null) { // Анализируем только новые записанные строки i++; if (i > _lineCounter) { _lineCounter++; if (line != "" && line[0] == 'E') { System.Console.Error.WriteLine(" " + line); } else { System.Console.WriteLine(" " + line); } if (TestStateAnalizer(line) >= state) { // Если ожидаемое состояние достигнуто isStateReached = true; break; } } } sr.Close(); Thread.Sleep(500); File.Delete(LOG_FILE_NAME_COPY); if (isStateReached) { return(true); } // Если количество строк в логе больше максимального, // делаем вывод о зависании встроенного ПО if (i > SystemParameters.MAX_LINES_IN_LOG) { return(false); } } } return(false); }
private static TestExecutionStates TestStateAnalizer(string str) { TestExecutionParameters parameters = new TestExecutionParameters(); if (str.Contains(parameters.START_TEST_VALUE)) { _currentState = TestExecutionStates.Started; } else if (str.Contains(parameters.END_TEST_FAILED_VALUE)) { _currentState = TestExecutionStates.StopFailed; } else if (str.Contains(parameters.END_TEST_SUCCEEDED_VALUE)) { _currentState = TestExecutionStates.StopSucceeded; } return(_currentState); }
public static int ReadTrace() { TestExecutionParameters parameters = TestParametersReader.GetTestExecutionParameters(); var initialDateTime = DateTime.Now; int returnCode = SystemParameters.RETURN_CODE_SUCCESS; // Запуск процесса rttLogger _rttLoggerProcess = new Process(); returnCode = StartRttLoggerProcess(); if (SystemParameters.FAILED(returnCode)) { return(returnCode); } // Подготовка параметров _lineCounter = 0; _currentState = TestExecutionStates.NotStarted; File.Delete(LOG_FILE_NAME_COPY); // Ожидаем начало выполнения теста if (!WaitForState(TestExecutionStates.Started, parameters.StartTimeout)) { // Тест не запустился за отведенное время Console.WriteLine("ERROR: timeout start, timeout={0}, duration={1}", parameters.StartTimeout, DateTime.Now - initialDateTime); returnCode = SystemParameters.RETURN_CODE_FAILED_START_TEST; } if (SystemParameters.SUCCESSED(returnCode)) { // Тест начал выполняться, ожидаем его завершения if (!WaitForState(TestExecutionStates.StopFailed, parameters.EndTimeout)) { // Тест не завершился за отведенное время Console.WriteLine("ERROR: timeout end, timeout={0}, duration={1}", parameters.EndTimeout, DateTime.Now - initialDateTime); returnCode = SystemParameters.RETURN_CODE_FAILED_STOP_TEST; } } if (SystemParameters.SUCCESSED(returnCode)) { // Тест завершился. Проверяем код результата if (_currentState == TestExecutionStates.StopSucceeded) { // Тест выполнен успешно Console.WriteLine("test PASSED, dt={0}", DateTime.Now); returnCode = SystemParameters.RETURN_CODE_SUCCESS; } else { // Тест завершился ошибкой Console.WriteLine("ERROR: test FAILED, dt={0}", DateTime.Now); returnCode = SystemParameters.RETURN_CODE_TEST_FAILED; } } try { // Остановка процесса StopRttLoggerProcess(); } catch { // Если не удалось завершить процесс JLinkRTTLogger, значит он уже завершен. } SaveLogFile(); File.Delete(LOG_FILE_NAME); return(returnCode); }