示例#1
0
        /// <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);
            }
        }
示例#2
0
        /// <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);
 }
示例#6
0
        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);
            }
        }
示例#7
0
        /// <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);
        }
示例#8
0
        /// <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);
        }
示例#9
0
        /// <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);
        }