/// <summary> /// Restart the CM service /// </summary> /// <param name="currentApi"></param> /// <param name="testName"></param> /// <returns></returns> protected bool RestartCmService(string currentApi, [CallerMemberName] string testName = null) { try { if (!StartStopCmService("stop")) { return(false); } if (!StartStopCmService("start")) { return(false); } CmTestLog.Success(string.Format("{0}: Successfully restarted Chassis Manager service", currentApi)); return(true); } catch (Exception e) { CmTestLog.Failure(string.Format("{0}: Restart Chassis Manager service has failed with an exception.", currentApi)); CmTestLog.Exception(e, testName); return(false); } }
/// <summary> /// This method returns list of populated Psu slots for CM /// </summary> /// <param name="testName"></param> /// <returns>Returns list of Psus if CM has any; returns null otherwise.</returns> protected int[] GetPsuLocations([CallerMemberName] string testName = null) { ChassisInfoResponse chassisInfoResponse = this.Channel.GetChassisInfo(false, true, false, true); if (chassisInfoResponse.completionCode != CompletionCode.Success) { CmTestLog.Failure("Failed to get Psu info using GetChassisInfo", testName); return(null); } else { CmTestLog.Success("Successfully received Psu info using GetChassisInfo", testName); } string testingLes = ConfigurationManager.AppSettings["LesOrNonLesPsus"].ToString(); int[] psuLocations = chassisInfoResponse .psuCollections .Where(psu => psu.state.Equals(PowerState.ON)) .Select(psu => (int)psu.id) .ToArray(); if (testingLes == "1") { psuLocations = chassisInfoResponse .batteryCollections .Where(battery => battery.presence.Equals((byte)1) && psuLocations.Contains((int)battery.id)) .Select(battery => (int)battery.id) .ToArray(); } return(psuLocations); }
/// <summary> /// Checks if a given condition is true. The method logs a success if the condition is true, /// or it logs a failure. /// </summary> /// <param name="condition">The condition to be checked.</param> /// <param name="message">The message to be logged.</param> /// <returns>True if the condition holds; false, otherwise.</returns> internal static bool IsTrue(bool condition, string message, [CallerMemberName] string testName = null) { if (condition) { CmTestLog.Success(message, testName); return(true); } CmTestLog.Failure(string.Format(string.Format("The following Condition is false: {0} ", message)), testName); return(false); }
/// <summary> /// Checks if two values are NOT equal. The method logs a success if the two values are NOT equal, /// or it logs a failure. /// </summary> /// <typeparam name="T">The type of the two values to be compared.</typeparam> /// <param name="expected">The expected value.</param> /// <param name="actual">The actual value.</param> /// <param name="message">The message to be logged.</param> /// <returns>True if the two values are equal; false, otherwise.</returns> internal static bool AreNotEqual <T>(T expected, T actual, string SuccessMessage, [CallerMemberName] string testName = null) { if (!expected.Equals(actual)) { CmTestLog.Success(SuccessMessage, testName); return(true); } CmTestLog.Failure(string.Format("Verifying NOT Equalt Expected and Actual are both: {1}) ", actual), testName); return(false); }
/// <summary> /// Checks if two values are equal. The method logs a success if the two values are equal, /// or it logs a failure. /// </summary> /// <typeparam name="T">The type of the two values to be compared.</typeparam> /// <param name="expected">The expected value.</param> /// <param name="actual">The actual value.</param> /// <param name="message">The message to be logged.</param> /// <returns>True if the two values are equal; false, otherwise.</returns> internal static bool AreEqual <T>(T expected, T actual, string SuccessMessage, [CallerMemberName] string testName = null) { if (expected.Equals(actual)) { CmTestLog.Success(SuccessMessage, testName); return(true); } CmTestLog.Failure(string.Format("(Expected: {0}, Actual: {1}) ", expected, actual), testName); return(false); }
protected bool GetAllBladesInfo(out GetAllBladesInfoResponse allBladesInfoResponse, [CallerMemberName] string testName = null) { // if the blade info has already been cached // just return it. if (this.allBladesInfo != null) { allBladesInfoResponse = this.allBladesInfo; return(true); } try { CmTestLog.Info("Trying to get the information for all blades", testName); if (!this.SetPowerState(PowerState.ON) || !this.SetBladeState(PowerState.ON)) { allBladesInfoResponse = null; return(false); } allBladesInfoResponse = this.Channel.GetAllBladesInfo(); if (CompletionCode.Success != allBladesInfoResponse.completionCode) { CmTestLog.Failure("Failed to get all blades info", testName); return(false); } CmTestLog.Success("Get all blades info successfully", testName); this.allBladesInfo = allBladesInfoResponse; // save it return(true); } catch (Exception e) { CmTestLog.Exception(e, testName); allBladesInfoResponse = null; return(false); } }
/// <summary> /// Starts or stops the CM service /// </summary> /// <example> /// Example 1: start the CM service /// StartStopCmService("start"); /// Example 2: stop the CM service /// StartStopCmService("stop"); /// </example> /// <param name="startStopService"></param> /// <param name="testName"></param> /// <param name="retryStartStop"></param> /// <returns></returns> protected bool StartStopCmService(string startStopService, [CallerMemberName] string testName = null, bool retryStartStop = true) { bool startStopSuccess = true; try { string cmServiceName = "chassismanager"; startStopService = startStopService.ToLower(); if (startStopService == "start") { CmTestLog.Info(string.Format("Trying to start Chassis Manager service on {0}", this.defaultCMName)); } else if (startStopService == "stop") { CmTestLog.Info(string.Format("Trying to stop Chassis Manager service on {0}", this.defaultCMName)); } else { CmTestLog.Failure("startStopService action not defined to 'start' or 'stop' service"); return(false); } // Initialize object to specify all settings for WMI connection ConnectionOptions serviceConnectOptions = new ConnectionOptions(); serviceConnectOptions.Username = string.Format("{0}\\{1}", this.defaultCMName, this.defaultAdminUserName); serviceConnectOptions.Password = this.defaultAdminPassword; // Initialize object to represent scope of management operations ManagementScope serviceScope = new ManagementScope(string.Format("{0}{1}{2}", @"\\", this.defaultCMName, @"\root\cimv2")); serviceScope.Options = serviceConnectOptions; // Define WMI query to execute on CM SelectQuery query = new SelectQuery(string.Format("select * from Win32_service where name = '{0}'", cmServiceName)); using (ManagementObjectSearcher serviceSearcher = new ManagementObjectSearcher(serviceScope, query)) { ManagementObjectCollection serviceCollection = serviceSearcher.Get(); foreach (ManagementObject service in serviceCollection) { if (startStopService == "start") { if (service["Started"].Equals(true)) { CmTestLog.Success("Chassis Manager service already started"); startStopSuccess &= true; continue; } else if (service.GetPropertyValue("State").ToString() == "Stopped") { // Start the service CmTestLog.Info(string.Format("Trying to start Chassis Manager service ...")); service.InvokeMethod("StartService", null); CmTestLog.Info(string.Format("Chassis Manager service is starting. Sleeping for {0} seconds", CmConstants.CmServiceStartStopSeconds)); Thread.Sleep(TimeSpan.FromSeconds(CmConstants.CmServiceStartStopSeconds)); startStopSuccess &= true; continue; } else { CmTestLog.Info("Chassis Manager service not in start or stop state"); startStopSuccess &= false; } } else if (startStopService == "stop") { if (service["Started"].Equals(true)) { // Stop the service CmTestLog.Info(string.Format("Trying to stop Chassis Manager service ...")); service.InvokeMethod("StopService", null); CmTestLog.Info(string.Format("Stopping Chassis Manager service. Sleeping for {0} seconds", CmConstants.CmServiceStartStopSeconds)); Thread.Sleep(TimeSpan.FromSeconds(CmConstants.CmServiceStartStopSeconds)); startStopSuccess &= true; continue; } else if (service.GetPropertyValue("State").ToString() == "Stopped") { CmTestLog.Success("Chassis Manager service already stopped"); startStopSuccess &= true; continue; } else { CmTestLog.Info("Chassis Manager service not in start or stop state"); startStopSuccess &= false; } } else { CmTestLog.Failure("startStopService action not defined to 'start' or 'stop' service"); return(false); } } } } catch (COMException ce) { //if we fail for RPC server not being available we need to try one more time if (ce.Message.Contains("0x800706BA") && retryStartStop == true) { CmTestLog.Info("startStopCmService failed with COMException 0x800706BA. Retrying..."); startStopSuccess = StartStopCmService(startStopService, null, false); } else { throw new Exception("Unexpected COMException occurred or retry failed", ce); } } catch (Exception e) { CmTestLog.Failure("Start or Stop chassis manager service has failed with an exception."); CmTestLog.Exception(e, testName); return(false); } return(startStopSuccess); }
/// <summary> /// Configures App.Config of Chassis Manager service by taking as input key value pairs from dictionary. /// keys in dictionary are the keys in App.Config and values are the value in App.Config that /// are to be changed for each key. ConfigureAppConfig backs up the original App.Config and should be /// restored using cleanUp parameter after testing with ConfigureAppConfig is complete. /// </summary> /// <example> /// Example 1: Change Value of Key "NumFans" in CM service App.Config to "5" /// ConfigureAppConfig(new Dictionary<string, string>() {{"NumFans", "5"}}, false); /// Example 2: Restore original CM service App. Config /// ConfigureAppConfig(null, true); /// </example> /// <remarks> /// ConfigureAppConfig does not restart the CM service after configuring App.Config. Use method RestartCmService. /// </remarks> /// <param name="appConfigKeyValuePairs"></param> /// <param name="cleanUp"></param> /// <param name="testName"></param> /// <returns></returns> protected bool ConfigureAppConfig(Dictionary <string, string> appConfigKeyValuePairs, bool cleanUp, [CallerMemberName] string testName = null) { bool configurationSuccess = true; try { string configFilePath = string.Format("{0}{1}{2}", @"\\", this.defaultCMName, @"\c$\ChassisManager\Microsoft.GFS.WCS.ChassisManager.exe.config"); string backupConfigFilePath = string.Format("{0}{1}{2}", @"\\", this.defaultCMName, @"\c$\ChassisManager\Microsoft.GFS.WCS.ChassisManager.exe.config.backup"); string modifiedConfigFilePath = string.Format("{0}modifiedConfig.config", Path.Combine(Directory.GetCurrentDirectory(), "TestData")); IntPtr token = IntPtr.Zero; // Impersonate remote user in order to copy/modify files bool successLogon = LogonUser(this.defaultAdminUserName, this.defaultCMName, this.defaultAdminPassword, (int)DwLogonType.NewCredentials, (int)DwLogonProvider.WinNT50, ref token); if (successLogon) { CmTestLog.Info("LogonUser: User successfully created"); // Impersonate user using (WindowsImpersonationContext context = WindowsIdentity.Impersonate(token)) { if (!cleanUp) { // Verify input KeyValue pairs is not empty if (appConfigKeyValuePairs.Count < 1) { CmTestLog.Failure("Requested App Config Key Value Pairs is empty"); return(false); } // Delete modified file path if it already exists if (File.Exists(modifiedConfigFilePath)) { File.Delete(modifiedConfigFilePath); CmTestLog.Info("Temporary App.Config already exists. Deleting..."); } // Delete backup file path if it already exists if (File.Exists(backupConfigFilePath)) { File.Delete(backupConfigFilePath); CmTestLog.Info("Backup App.Config already exists. Deleting..."); } // Copy original App.Config to temporary path and backup original File.Copy(configFilePath, modifiedConfigFilePath); File.Move(configFilePath, backupConfigFilePath); // Initialize App.Config in config object to prep for modification ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(); fileMap.ExeConfigFilename = modifiedConfigFilePath; Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); // Modify KeyValue pairs in App.Config to requested input KeyValue pairs foreach (KeyValuePair <string, string> xmlKeyValue in appConfigKeyValuePairs) { if (config.AppSettings.Settings.AllKeys.Contains(xmlKeyValue.Key)) { config.AppSettings.Settings[xmlKeyValue.Key].Value = xmlKeyValue.Value; CmTestLog.Success(string.Format(string.Format("Changed key:{0} to new value:{1} in App.Config", xmlKeyValue.Key, xmlKeyValue.Value))); configurationSuccess &= true; } else { CmTestLog.Failure(string.Format("Could not find key:{0} in App.Config", xmlKeyValue.Key)); configurationSuccess = false; } } // Save modified App.Config config.Save(); System.Configuration.ConfigurationManager.RefreshSection("appSettings"); // Copy over modified App.Config to original file path if (!File.Exists(configFilePath)) { File.Copy(modifiedConfigFilePath, configFilePath); } else { CmTestLog.Failure("App.Config cannot be renamed, and so, cannot be replaced by modified App.Config"); return(false); } File.Delete(modifiedConfigFilePath); } else { // Revert back to original App.Config using backup file during CleanUp CmTestLog.Info("configureAppConfig CleanUp: Replacing modified App.Config with original App.Config"); if (!File.Exists(backupConfigFilePath)) { CmTestLog.Failure("Backup App.Config does not exist"); return(false); } else { if (File.Exists(configFilePath)) { CmTestLog.Info("Modified App.Config file exists - deleting"); File.Delete(configFilePath); } File.Move(backupConfigFilePath, configFilePath); } CmTestLog.Success("configureAppConfig: Clean up successful"); } // Revert back to original user context.Undo(); } } else { CmTestLog.Failure("UserLogon: User failed to be created"); return(false); } } catch (Exception e) { CmTestLog.Exception(e, testName); return(false); } return(configurationSuccess); }
/// <summary> /// Verifies that all BladeStateResponses in the given collection are the same as the expectedState. /// If a blade is a server, this method verifies the server has the same state as the expectedState; if a blade /// is a jbod, this method ignores the expectedState parameter and verifies the blade returns CommandNotValidForBlade. /// If there is only one response in the collection and it is from an empty slot, the method returns false; /// in other cases, empty slots in the collection will just be ignored. /// </summary> protected bool VerifyBladeState(PowerState expectedState, IEnumerable <BladeStateResponse> bladeStates, [CallerMemberName] string testName = null) { GetAllBladesInfoResponse allBlades; if (!this.GetAllBladesInfo(out allBlades, testName)) { return(false); } try { var bladeStateCollection = new List <BladeStateResponse>(bladeStates); bool serverResult = true, jbodResult = true; int bladeCount = 0, JbodCount = 0; foreach (var state in bladeStateCollection) { // current blade info var bladeInfo = allBlades.bladeInfoResponseCollection.Single(info => info.bladeNumber == state.bladeNumber); if (bladeInfo.bladeType.ToLower().Equals("server")) { bladeCount++; } if (bladeInfo.bladeType.ToLower().Equals("jbod")) { JbodCount++; } // verify server blade if (bladeInfo.bladeType.Equals(CmConstants.ServerBladeType) && state.bladeState != expectedState) { serverResult = false; CmTestLog.Failure(string.Format("Server Blade# {0} state is not as expected (Expected: {1}, Actual: {2})", state.bladeNumber, expectedState, state.bladeState), testName); } // verify jbod blade else if (bladeInfo.bladeType.Equals(CmConstants.JbodBladeType) && state.completionCode != CompletionCode.CommandNotValidForBlade) { jbodResult = false; CmTestLog.Failure(string.Format("JBOD Blade# {0} completion code is not correct (Expected: {1}, Actual: {2})", state.bladeNumber, CompletionCode.CommandNotValidForBlade, state.completionCode), testName); } } if (bladeCount > 0 && serverResult) { CmTestLog.Success(string.Format("Verified server blades are {0}", expectedState), testName); } else { CmTestLog.Warning("There were no blades to run test against", testName); } if (JbodCount > 0 && jbodResult) { CmTestLog.Success("Verified JBODs return CommandNotValidForBlade", testName); } else { CmTestLog.Warning("There were no JBODs to run test against", testName); } return(serverResult && jbodResult); } catch (Exception e) { CmTestLog.Exception(e, testName); return(false); } }
/// <summary> /// Test Command: ReadBladeLog, ClearBladeLog. The test case verifies: /// The command returns completion code success on server blades; /// ReadBladeLog succeeds even after all logs are cleared. /// </summary> /// <returns>True if all check-points pass; false, otherwise.</returns> public bool ReadClearBladeLogTest() { CmTestLog.Start(); ChassisLogResponse readLogResponse; BladeResponse clearLogResponse; bool testPassed = true; int[] serverLocations, jbodLocations; if (!this.GetBladeLocations(blade => blade.bladeType.Equals(CmConstants.ServerBladeType), out serverLocations) || !this.GetBladeLocations(blade => blade.bladeType.Equals(CmConstants.JbodBladeType), out jbodLocations)) { CmTestLog.Failure("Cannot find a server/ Jbod blade to execute automation against"); CmTestLog.End(false); return(false); } if (serverLocations == null || serverLocations.Length == 0) { CmTestLog.Warning("There are no server blades to execute the test against."); } else { int bladeId = serverLocations.RandomOrDefault(); CmTestLog.Success("Found server blade at location: " + bladeId); CmTestLog.Info("Power on Blade# " + bladeId); var powerOnResponse = this.Channel.SetPowerOn(bladeId); testPassed &= ChassisManagerTestHelper.AreEqual(CompletionCode.Success, powerOnResponse.completionCode, string.Format("Blade# {0} is powered on", bladeId)); CmTestLog.Info("Read logs from Blade# " + bladeId); readLogResponse = this.Channel.ReadBladeLog(bladeId); testPassed &= ChassisManagerTestHelper.AreEqual(CompletionCode.Success, readLogResponse.completionCode, "Received Read logs from Blade# " + bladeId); CmTestLog.Info("Clear logs on Blade# " + bladeId + " and read again"); clearLogResponse = this.Channel.ClearBladeLog(bladeId); testPassed &= ChassisManagerTestHelper.AreEqual(CompletionCode.Success, clearLogResponse.completionCode, "Logs on Blade# " + bladeId + " is cleared"); readLogResponse = this.Channel.ReadBladeLog(bladeId); testPassed &= ChassisManagerTestHelper.AreEqual(CompletionCode.Success, readLogResponse.completionCode, "Read logs from Blade# " + bladeId); } // [TFS WorkItem: 2730] ReadBladeLog: Verify command is not valid to run on JBOD blade if (jbodLocations == null || jbodLocations.Length == 0) { CmTestLog.Warning("There are no JBODs to execute the test against."); } else { int JbodId = jbodLocations.RandomOrDefault(); CmTestLog.Success("Found JBOD blade at location " + JbodId); CmTestLog.Info("Power on Blade# " + JbodId); var powerOnResponse = this.Channel.SetPowerOn(JbodId); testPassed &= ChassisManagerTestHelper.AreEqual(CompletionCode.Success, powerOnResponse.completionCode, string.Format("JBOD at location# {0} is powered on", JbodId)); CmTestLog.Info("Trying to read logs for JBOD"); readLogResponse = this.Channel.ReadBladeLog(JbodId); testPassed &= ChassisManagerTestHelper.AreEqual(CompletionCode.CommandNotValidForBlade, readLogResponse.completionCode, "Received CommandNotValidForBlade to Read logs for JBOD# " + JbodId); // [TFS WorkItem: 2731] ClearBladeLog: Verify command is not valid to run on JBOD blade CmTestLog.Info("Trying to clear logs for JBOD"); clearLogResponse = this.Channel.ClearBladeLog(JbodId); testPassed &= ChassisManagerTestHelper.AreEqual(CompletionCode.CommandNotValidForBlade, clearLogResponse.completionCode, "Received CommandNotValidForBlade to clear logs for JBOD# " + JbodId); } this.EmptyLocations = this.GetEmptyLocations(); if (EmptyLocations == null || EmptyLocations.Length == 0) { CmTestLog.Warning("There are no Empty slots to execute the test against."); } else { int slotId = EmptyLocations.RandomOrDefault(); CmTestLog.Success("Found empty slot at location " + slotId); CmTestLog.Info("Trying to read logs for Empty location"); readLogResponse = this.Channel.ReadBladeLog(slotId); testPassed &= ChassisManagerTestHelper.AreEqual(CompletionCode.Timeout, readLogResponse.completionCode, "Received Timeout to Read logs for emoty slot# " + slotId); // [TFS WorkItem: 2731] ClearBladeLog: Verify command is not valid to run on JBOD blade CmTestLog.Info("Trying to clear logs for empty slot"); clearLogResponse = this.Channel.ClearBladeLog(slotId); testPassed &= ChassisManagerTestHelper.AreEqual(CompletionCode.Timeout, clearLogResponse.completionCode, "Received Timeout to clear logs for empty slot# " + slotId); } CmTestLog.End(testPassed); return(true); }
private void VerifyReadChassisLog(ref bool chassisPassed, WCSSecurityRole user) { string currentApi = "ReadChassisLog"; string logParentDirectory = @"\\" + defaultCMName + @"\c$\"; string[] userLogPaths = new string[] { null, null }; ChassisLogResponse chassisLog = new ChassisLogResponse(); CmTestLog.Info("TestChannelContext user " + (int)user); this.TestChannelContext = this.ListTestChannelContexts[(int)user]; chassisLog = this.TestChannelContext.ReadChassisLog(); chassisPassed &= ChassisManagerTestHelper.AreEqual(CompletionCode.Success, chassisLog.completionCode, currentApi + ": Completion Code success for user " + user.ToString()); if (StartStopCmService("stop")) { CmTestLog.Success(currentApi + ": Stopped Chassis Manager Service"); } else { CmTestLog.Failure(currentApi + ": Unable to stop Chassis Manager Service. Will not check log entry contents"); chassisPassed = false; return; } // Check Log entries are populated in ChassisLogResponse and not greater than 50 entries if (chassisLog.logEntries.Count < 1) { CmTestLog.Failure(currentApi + ": Command does not return Log Entries"); chassisPassed = false; ChassisManagerTestHelper.IsTrue(StartStopCmService("start"), currentApi + ": Stopped Chassis Manager Service"); return; } else if (chassisLog.logEntries.Count > 50) { CmTestLog.Failure(currentApi + ": Command returns more than 50 Log Entries"); chassisPassed = false; ChassisManagerTestHelper.IsTrue(StartStopCmService("start"), currentApi + ": Stopped Chassis Manager Service"); return; } else { CmTestLog.Success(currentApi + ": Command returns between 1 and 50 Log Entries"); } IntPtr token = IntPtr.Zero; // Impersonate remote user bool successLogon = LogonUser(defaultAdminUserName, defaultCMName, defaultAdminPassword, (int)DwLogonType.NewCredentials, (int)DwLogonProvider.WinNT50, ref token); if (successLogon) { using (WindowsImpersonationContext context = WindowsIdentity.Impersonate(token)) { // Verify that User Logs exist to compare log entries with ChassisLogResponse if (!Directory.Exists(logParentDirectory)) { CmTestLog.Failure(currentApi + ": Directory to User Log files does not exist"); chassisPassed = false; ChassisManagerTestHelper.IsTrue(StartStopCmService("start"), currentApi + ": Stopped Chassis Manager Service"); return; } foreach (string filePath in Directory.GetFiles(logParentDirectory)) { Match fileMatch00 = Regex.Match(filePath, @"ChassisManagerUserLog00\.svclog"); Match fileMatch01 = Regex.Match(filePath, @"ChassisManagerUserLog01\.svclog"); if (fileMatch00.Success) { userLogPaths[0] = filePath; } else if (fileMatch01.Success) { userLogPaths[1] = filePath; } } if (userLogPaths[0] == null && userLogPaths[1] == null) { CmTestLog.Failure(currentApi + ": Could not find user logs"); chassisPassed = false; ChassisManagerTestHelper.IsTrue(StartStopCmService("start"), currentApi + ": Started Chassis Manager Service"); return; } // Compare and match log entries in ChassisLogResponse to User Logs in Chassis Manager int entryCount = 0; bool allEntriesPassed = true; foreach (LogEntry entry in chassisLog.logEntries) { if (entry.eventDescription == null && entry.eventTime == null) { CmTestLog.Failure(currentApi + string.Format(": Log Entry {0} returns no data for either eventDescription or eventTime or both", entryCount)); allEntriesPassed = false; entryCount++; continue; } // Find log entry in either UserLog00 or UserLog01 int userLogCount = 0; bool userLogEntryFound = false; string propertyValue; foreach (string userLogPath in userLogPaths) { if (userLogPath == null) { CmTestLog.Info(currentApi + string.Format(": User Log {0} does not exist", userLogCount)); userLogCount++; continue; } XmlReaderSettings xmlSettings = new XmlReaderSettings(); xmlSettings.ConformanceLevel = ConformanceLevel.Fragment; XmlReader userLogReader = XmlReader.Create(userLogPath, xmlSettings); try { while (!userLogEntryFound) { while (userLogReader.Read()) { if (userLogReader.Name == "ApplicationData") { break; } } if (userLogReader.Name != "ApplicationData") { userLogReader.Close(); break; } // Read User Log Entry and condition both strings for comparison propertyValue = userLogReader.ReadElementContentAsString(); propertyValue = propertyValue.Replace(@"\", ""); propertyValue = propertyValue.Replace(@"(", ""); propertyValue = propertyValue.Replace(@")", ""); entry.eventDescription = entry.eventDescription.Replace(@"\", ""); entry.eventDescription = entry.eventDescription.Replace(@"(", ""); entry.eventDescription = entry.eventDescription.Replace(@")", ""); Match eventTimeMatch = Regex.Match(propertyValue, entry.eventTime.ToString("yyyy-MM-dd HH:mm:ss.fff")); Match eventDescriptionMatch = Regex.Match(propertyValue, entry.eventDescription); if (eventTimeMatch.Success && eventDescriptionMatch.Success) { CmTestLog.Success(currentApi + string.Format(": Found eventTime match and eventDescription match for entry {0} in user log {1}", entryCount, userLogCount)); userLogEntryFound = true; } } } catch (Exception exc) { if (exc.Message.Contains(@"Not enough )'s")) { CmTestLog.Info(currentApi + string.Format(": Entry {0} throwing exception 'Not enough )'s' in User Log {1}", entryCount, userLogCount)); userLogCount++; continue; } else { throw new Exception(exc.Message); } } if (!userLogEntryFound) { CmTestLog.Info(currentApi + string.Format(": User Log {0} does not contain entry {1}", userLogCount, entryCount)); userLogReader.Close(); userLogCount++; continue; } userLogReader.Close(); userLogCount++; } if (!userLogEntryFound) { CmTestLog.Failure(currentApi + string.Format(": Entry {0} was not found in either user logs", entryCount)); allEntriesPassed = false; entryCount++; continue; } chassisPassed &= allEntriesPassed; entryCount++; } ChassisManagerTestHelper.IsTrue(allEntriesPassed, currentApi + string.Format(": All Log Entries passed", entryCount)); // Revert back to original user context.Undo(); } } else { CmTestLog.Failure("UserLogon: User failed to be created"); chassisPassed = false; } ChassisManagerTestHelper.IsTrue(StartStopCmService("start"), currentApi + ": Started Chassis Manager Service"); }
/// <summary> /// Test: User Logs /// The test case verifies: /// User Log exists /// </summary> /// <returns>True if all check-points pass; false, otherwise.</returns> public bool UserLogsTest() { CmTestLog.Start(); bool allPassed = true; string currentTest = "UserLogs"; try { string logParentDirectory = @"\\" + defaultCMName + @"\c$\"; bool foundUserLog = false; IntPtr token = IntPtr.Zero; // Impersonate remote user bool successLogon = LogonUser(defaultAdminUserName, defaultCMName, defaultAdminPassword, (int)DwLogonType.NewCredentials, (int)DwLogonProvider.WinNT50, ref token); if (successLogon) { using (WindowsImpersonationContext context = WindowsIdentity.Impersonate(token)) { // Verify presence of User Log : WorkItem(2271) if (!Directory.Exists(logParentDirectory)) { CmTestLog.Failure(currentTest + ": Directory to User Log files does not exist"); return(false); } foreach (string filePath in Directory.GetFiles(logParentDirectory)) { Match fileMatch = Regex.Match(filePath, @"ChassisManagerUserLog0[01]\.svclog"); if (fileMatch.Success) { CmTestLog.Success(currentTest + ": Verified presence of User Log " + filePath); foundUserLog = true; break; } } allPassed &= foundUserLog; // Revert back to original user context.Undo(); } } else { CmTestLog.Failure("UserLogon: User failed to be created"); return(false); } } catch (Exception ex) { ChassisManagerTestHelper.IsTrue(false, "Exception: " + ex.Message); allPassed = false; } CmTestLog.End(allPassed); return(allPassed); }