/// <summary>
        ///A functional test For StartBladeSerialSession against all blades. This requires a full chassis.
        ///</summary>
        public TestResponse AllBladesSerialSessionFunctional()
        {
            CmTestLog.Start();
            CmTestLog.Info("Functional test for StartBladeSerialSession against 24 blades. This requires a full chassis.");
            TestResponse response = new TestResponse();

            StartSerialResponse startSerialResponse = null;

            CmTestLog.Info("Trying to power on all blades");
            if (!SetPowerState(PowerState.ON))
            {
                response.Result = false;
                response.ResultDescription.Append("Failed to power on all blades");
                CmTestLog.End(response.Result);
                return response;
            }

            for (int bladeId = 1; bladeId <= CmConstants.Population; bladeId++)
            {
                // kill any existing serial session & Start blade serial session
                startSerialResponse = StartBladeSerialSessionAndKillExistingSession(ref response, startSerialResponse, bladeId);

                byte[] payload = Encoding.ASCII.GetBytes(CmConstants.SerialCommand);

                // Send blade serial data & Verify Completion Code
                ChassisResponse sendDataResponse = this.Channel.SendBladeSerialData(bladeId, startSerialResponse.serialSessionToken, payload);

                if (!ChassisManagerTestHelper.AreEqual(CompletionCode.Success, sendDataResponse.completionCode, "Send blade serial data"))
                {
                    response.Result = false;
                    response.ResultDescription.Append("\nFailed to send blade serial data. Failure is: " + sendDataResponse.completionCode);
                }

                // ReceiveBladeSerialData & Verify Completion Code and data content
                SerialDataResponse receiveDataResponse = this.Channel.ReceiveBladeSerialData(bladeId, startSerialResponse.serialSessionToken);

                if (!ChassisManagerTestHelper.AreEqual(CompletionCode.Success, receiveDataResponse.completionCode, "Received blade serial data"))
                {
                    response.Result &= false;
                    response.ResultDescription.Append("\nFailed to receive blade serial data, completion code returned: " + receiveDataResponse.completionCode);
                    CmTestLog.Failure(response.ResultDescription.ToString());
                    return response;
                }

                // Converting response byte[] array data to string
                string str = System.Text.Encoding.Default.GetString(receiveDataResponse.data);

                if (!str.Contains(CmConstants.ResponseContent))
                {
                    response.Result &= false;
                    response.ResultDescription.Append("\nFailed verifying the content of the response. \nActual Content is : " + str + " \nExpected Content: " + CmConstants.ResponseContent);
                }
            }

            CmTestLog.Info("\n!!!!!!!!! Finished execution of StartBladeSerialSession.");

            // end of the test
            CmTestLog.End(response.Result);
            return response;
        }
        private TestResponse ForceEmersonPsuFwUpdateAfterCmServiceRestartForUpdatePsuFirmware()
        {
            // Change test case Id and fwFilePath if testing Les or Non-Les Psus
            int testCaseId = -1;
            string fwFilePath;
            if (lesPsusInChassis == "1") // currently testing LES PSU
            {
                testCaseId = 22934;
                fwFilePath = this.priLesFwFilePath;
            }
            else
            {
                testCaseId = 22935;
                fwFilePath = this.priNonLesFwFilePath;
            }

            TestCase testCase = new TestCase("ForceEmersonPsuFwUpdateAfterCmServiceRestartForUpdatePsuFirmware", testCaseId);

            CmTestLog.Info(string.Format(
                "\n !!!!!!Verifying {0} Requires ForceEmersonPsu App Config Key for Psu Fw Update After CM Service Restart. WorkItemId: {1}!!!!!!",
                this.currentApi, testCase.WorkItemId));
            TestResponse response = new TestResponse();

            // Get random valid Psu Id
            int[] psuIds = null;
            if (!ReturnSingleOrMultipleRandomPsus(1, ref psuIds, ref response))
                return response;
            UpdatePsu psu = new UpdatePsu(psuIds[0], fwFilePath, primaryImage);

            // Initialize FRU Writes Remaining Dictionary KeyValue Pair
            Dictionary<string, string> forceEmersonPsuKeyValue = new Dictionary<string, string>
            {
                {"ForceEmersonPsu", "0"}
            };

            // configure app.config and restart CM
            ConfigureAppConfig(forceEmersonPsuKeyValue, false);
            RestartCmService(this.currentApi);

            // Run test case using WcsCmAdmin
            this.TestChannelContext = this.ListTestChannelContexts[(int)WCSSecurityRole.WcsCmAdmin];

            psu.psuFwStatus = this.TestChannelContext.GetPSUFirmwareStatus(psu.index);
            LogMessage.Message = string.Format(
                    "{0}: GetPsuFirmwareStatus for PSU {1} before update - fwRevision: {2} completionCode: {3} fwUpdateStatus: {4} fwUpdateStage: {5}",
                    this.currentApi, psu.index, psu.psuFwStatus.fwRevision, psu.psuFwStatus.completionCode,
                    psu.psuFwStatus.fwUpdateStatus, psu.psuFwStatus.fwUpdateStage);

            // Verify PSU is available for update
            if (psu.psuFwStatus.completionCode != CompletionCode.Success ||
                psu.psuFwStatus.fwUpdateStatus == "InProgress")
            {
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                return response;
            }
            else
                LogMessage.Log(LogMessage.MessageType.Success, ref response);

            // Update PSU
            psu.psuFwUpdateResponse = this.TestChannelContext.UpdatePSUFirmware(psu.index,
                    psu.psuFwFilePath, psu.primaryImage);
            LogMessage.Message = string.Format(
                    "{0}: Psu {1} returned completion code {2} and status description {3}",
                    this.currentApi, psu.index, psu.psuFwUpdateResponse.completionCode,
                    psu.psuFwUpdateResponse.statusDescription);

            if (psu.psuFwUpdateResponse.completionCode != CompletionCode.Success)
            {
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                return response;
            }
            else
                LogMessage.Log(LogMessage.MessageType.Success, ref response);

            // Sleep for 5 minutes
            LogMessage.Message = "Thread sleeping for 5 minutes...";
            LogMessage.Log(LogMessage.MessageType.Info, ref response);
            Thread.Sleep(TimeSpan.FromMinutes(5));

            // Restart CM Service
            LogMessage.Message = "Restarting CM Service";
            LogMessage.Log(LogMessage.MessageType.Info, ref response);
            RestartCmService(this.currentApi);

            // Verify Psu Fw Update has failed
            psu.psuFwUpdateResponse = this.TestChannelContext.UpdatePSUFirmware(psu.index, psu.psuFwFilePath, psu.primaryImage);
            LogMessage.Message = string.Format(
                    "{0}: Psu {1} returned completion code {2} and status description {3}",
                    this.currentApi, psu.index, psu.psuFwUpdateResponse.completionCode,
                    psu.psuFwUpdateResponse.statusDescription);

            if (psu.psuFwUpdateResponse.completionCode == CompletionCode.Failure &&
                psu.psuFwUpdateResponse.statusDescription == "UpdatePSUFirmware() only supported on Emerson PSU.")
                LogMessage.Log(LogMessage.MessageType.Success, ref response);
            else
            {
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                return response;
            }

            // Configure ForceEmersonPsu App Config Key
            forceEmersonPsuKeyValue["ForceEmersonPsu"] = "1";
            ConfigureAppConfig(forceEmersonPsuKeyValue, false);
            RestartCmService(this.currentApi);

            // Verify ForceEmersonPsu allows for successful Psu Fw Update
            List<UpdatePsu> psuList = new List<UpdatePsu>();
            psuList.Add(psu);
            VerifyPsuFwUpdate(ref psuList, ref response);

            // Code Clean-Up: restore App.Config in CM
            ConfigureAppConfig(null, true);

            testCase.LogPassOrFail(ref response, this.currentApi);
            return response;
        }
        /// <summary>
        /// Test Command: UpdatePsuFirmware
        /// The test case verifies: 
        /// Command Updates Primary Fw when primaryImage true, secondary Fw when false
        /// Only Admin users can execute the command
        /// Psu does not output power during update
        /// ParameterOutOfRange completion code for invalid Psu Id values
        /// 
        /// Les Test Cases:
        /// Psu Fw file updates for primary image
        /// Psu Fw file updates for secondary image
        /// Psu Fw file updates primary image for multiple Psus
        /// Psu Fw file updates primary and secondary image for multiple Psus
        /// Psu Fw file updates secondary image for multiple Psus
        /// Psu Fw file updates for primary or secondary image but not both
        /// Invalid Psu Fw file fails update
        /// ForceEmersonPsu App Config Key updates image for previously failed Psu due to CM service restart
        /// 
        /// Non-Les Test Cases:
        /// Psu Fw file updates for primary image
        /// Psu Fw file updates for secondary image
        /// Psu Fw file updates primary image for multiple Psus
        /// Psu Fw file updates primary and secondary image for multiple Psus
        /// Psu Fw file updates secondary image for multple Psus
        /// Psu Fw file updates for primary or secondary image but not both
        /// Invalid Psu Fw file fails update
        /// ForceEmersonPsu App Config Key updates image for prebiously failed Psy due to CM service restart
        /// </summary>
        /// <returns>True if all check-points pass; false, otherwise.</returns>
        public TestResponse UpdatePsuFirmwareTest()
        {
            CmTestLog.Start();
            TestResponse response = new TestResponse();
            this.currentApi = "UpdatePsuFirmware";

            try
            {

                // Run test cases
                VerifyResponseAndAddFailureDescription(
                    SuccessfulPriSecUpdateForPrimaryImageTrueFalseForUpdatePsuFirmware(), response);
                VerifyResponseAndAddFailureDescription(
                    PsuDoesNotOutputPowerForUpdatePsuFirmware(), response);
                VerifyResponseAndAddFailureDescription(
                    OnlyAdminCanExecuteUpdatePsuFirmware(), response);
                VerifyResponseAndAddFailureDescription(
                    ParameterOutOfRangePsuIdUpdatePsuFirmware(), response);
                VerifyResponseAndAddFailureDescription(
                    SuccessfulPriFwUpdateForUpdatePsuFirmware(), response);
                VerifyResponseAndAddFailureDescription(
                    SuccessfulSecFwUpdateForUpdatePsuFirmware(), response);
                VerifyResponseAndAddFailureDescription(
                    SuccessfulMultiplePriFwUpdatesForUpdatePsuFirmware(), response);
                VerifyResponseAndAddFailureDescription(
                    SuccessfulMultipleSecFwUpdatesForUpdatePsuFirmware(), response);
                VerifyResponseAndAddFailureDescription(
                    SuccessfulMultiplePriSecFwUpdatesForUpdatePsuFirmware(), response);
                VerifyResponseAndAddFailureDescription(
                    SuccessfulPriOrSecNotBothFwUpdateForUpdatePsuFirmware(), response);
                VerifyResponseAndAddFailureDescription(
                    InvalidPsuFwFileUpdateFailForUpdatePsuFirmware(), response);
                VerifyResponseAndAddFailureDescription(
                    ForceEmersonPsuFwUpdateAfterCmServiceRestartForUpdatePsuFirmware(), response);
            }
            catch (Exception ex)
            {
                ChassisManagerTestHelper.IsTrue(false, "Exception: " + ex.Message);
                response.Result = false;
                response.ResultDescription.Append(ex.Message);
            }

            CmTestLog.End(response.Result);
            return response;
        }
 public void LogPassOrFail(ref TestResponse response, string currentApi)
 {
     if (response.Result)
     {
         LogMessage.Message = string.Format(
             "{0}: {1} PASSED - WorkItem: {2}\n\n", currentApi, this.TestCaseName, this.WorkItemId);
         LogMessage.Log(LogMessage.MessageType.Success, ref response);
     }
     else
     {
         LogMessage.Message = string.Format(
             "{0}: {1} FAILED - WorkItem: {2}\n\n", currentApi, this.TestCaseName, this.WorkItemId);
         LogMessage.Log(LogMessage.MessageType.Failure, ref response);
     }
 }
        public bool UpdatePsuFirmwareStressTest()
        {
            CmTestLog.Start();
            bool allPassed = true;
            string currentApi = "UpdatePsuFirmware";
            int numberOfCycles = Int32.Parse(ConfigurationManager.AppSettings["PsuStressCycleCount"].ToString());

            try
            {
                this.TestChannelContext = this.ListTestChannelContexts[(int)WCSSecurityRole.WcsCmAdmin];

                // Get 4 random psu locations
                int[] psuIds = null;
                TestResponse response = new TestResponse();
                if (!ReturnSingleOrMultipleRandomPsus(4, ref psuIds, ref response))
                    return false;

                UpdatePsu psu1 = new UpdatePsu(psuIds[0]);
                UpdatePsu psu2 = new UpdatePsu(psuIds[1]);
                UpdatePsu psu3 = new UpdatePsu(psuIds[2]);
                UpdatePsu psu4 = new UpdatePsu(psuIds[3]);

                bool primaryOrSecondaryImage;
                string fwFilePath = string.Empty;
                string[] fwFilePaths = new string[2];

                if (lesPsusInChassis == "1")
                {
                    fwFilePaths[0] = priLesFwFilePath;
                    fwFilePaths[1] = secLesFwFilePath;
                }
                else
                {
                    fwFilePaths[0] = priNonLesFwFilePath;
                    fwFilePaths[1] = secNonLesFwFilePath;
                }

                for (int cycleCount = 0; cycleCount < numberOfCycles; cycleCount++)
                {
                    fwFilePath = fwFilePaths[cycleCount % 2];
                    primaryOrSecondaryImage = fwFilePath == fwFilePaths[0] ? primaryImage : secondaryImage;

                    psu1.passed = true;
                    psu2.passed = true;
                    psu3.passed = true;
                    psu4.passed = true;

                    // Sleep for 30 seconds before starting each test cycle
                    CmTestLog.Info(string.Format("\n{0}: Sleeping for 30 seconds before starting test cycle {1} ...",
                        currentApi, cycleCount));
                    Thread.Sleep(TimeSpan.FromSeconds(30));

                    CmTestLog.Info(string.Format("{0}: Update Psu FW Test {1} for Psu {2}, Psu {3}, Psu {4}, Psu {5} for fwFilePath {6}",
                        currentApi, cycleCount, psu1.index, psu2.index, psu3.index, psu4.index, fwFilePath));

                    // Update Psu
                    psu1.psuFwUpdateResponse = this.TestChannelContext.UpdatePSUFirmware(psu1.index, fwFilePath, primaryOrSecondaryImage);
                    Thread.Sleep(TimeSpan.FromSeconds(30));

                    // Update second Psu
                    psu2.psuFwUpdateResponse = this.TestChannelContext.UpdatePSUFirmware(psu2.index, fwFilePath, primaryOrSecondaryImage);
                    Thread.Sleep(TimeSpan.FromSeconds(30));

                    // Update thrid Psu
                    psu3.psuFwUpdateResponse = this.TestChannelContext.UpdatePSUFirmware(psu3.index, fwFilePath, primaryOrSecondaryImage);
                    Thread.Sleep(TimeSpan.FromSeconds(30));

                    // Update fourth Psu
                    psu4.psuFwUpdateResponse = this.TestChannelContext.UpdatePSUFirmware(psu4.index, fwFilePath, primaryOrSecondaryImage);

                    // Verify response
                    if (psu1.psuFwUpdateResponse.completionCode != CompletionCode.Success &&
                        psu2.psuFwUpdateResponse.completionCode != CompletionCode.Success &&
                        psu3.psuFwUpdateResponse.completionCode != CompletionCode.Success &&
                        psu4.psuFwUpdateResponse.completionCode != CompletionCode.Success)
                    {
                        CmTestLog.Failure(string.Format(
                            "{0}: Command returned Completion Code {1} for Psu {2}, Completion Code {3} for Psu {4}, Completion Code {5} for Psu {6}, Completion Code {7} for Psu {8}",
                            currentApi, psu1.psuFwUpdateResponse.completionCode, psu1.index, psu2.psuFwUpdateResponse.completionCode, psu2.index,
                            psu3.psuFwUpdateResponse.completionCode, psu3.index, psu4.psuFwUpdateResponse.completionCode, psu4.index));
                        allPassed = false;
                        continue;
                    }

                    // Sleep 5 minutes
                    CmTestLog.Info("Thread sleeping for 5 minutes..");
                    Thread.Sleep(TimeSpan.FromMinutes(5));

                    // GetPsuFwStatus and verify test is progressing correctly
                    PrintGetPsuFwStatus(ref psu1, true, primaryOrSecondaryImage, currentApi, fwFilePath, ref allPassed);
                    PrintGetPsuFwStatus(ref psu2, true, primaryOrSecondaryImage, currentApi, fwFilePath, ref allPassed);
                    PrintGetPsuFwStatus(ref psu3, true, primaryOrSecondaryImage, currentApi, fwFilePath, ref allPassed);
                    PrintGetPsuFwStatus(ref psu4, true, primaryOrSecondaryImage, currentApi, fwFilePath, ref allPassed);

                    if (!(psu1.passed || psu1.passed || psu3.passed || psu4.passed))
                    {
                        CmTestLog.Info("\n");
                        continue;
                    }

                    // Sleep 7 minutes
                    CmTestLog.Info("Thread sleeping for 7 minutes..");
                    Thread.Sleep(TimeSpan.FromMinutes(7));

                    // GetPsuFwStatus and verify test completed successfully
                    PrintGetPsuFwStatus(ref psu1, false, primaryOrSecondaryImage, currentApi, fwFilePath, ref allPassed);
                    PrintGetPsuFwStatus(ref psu2, false, primaryOrSecondaryImage, currentApi, fwFilePath, ref allPassed);
                    PrintGetPsuFwStatus(ref psu3, false, primaryOrSecondaryImage, currentApi, fwFilePath, ref allPassed);
                    PrintGetPsuFwStatus(ref psu4, false, primaryOrSecondaryImage, currentApi, fwFilePath, ref allPassed);

                    CmTestLog.Info("\n");

                }

                if (psu1.primaryUpdateSuccessCount != 0 || psu2.primaryUpdateSuccessCount != 0 ||
                    psu3.primaryUpdateSuccessCount != 0 || psu4.primaryUpdateSuccessCount != 0)
                {
                    CmTestLog.Info(string.Format("{0}: {1} Updates successful for Primary Les Fw Update for Psu {2}\nfw: {3}",
                        currentApi, psu1.primaryUpdateSuccessCount, psu1.index, fwFilePaths[0]));
                    CmTestLog.Info(string.Format("{0}: {1} Updates successful for Primary Les Fw Update for Psu {2}\nfw: {3}",
                        currentApi, psu2.primaryUpdateSuccessCount, psu2.index, fwFilePaths[0]));
                    CmTestLog.Info(string.Format("{0}: {1} Updates successful for Primary Les Fw Update for Psu {2}\nfw: {3}",
                        currentApi, psu3.primaryUpdateSuccessCount, psu3.index, fwFilePaths[0]));
                    CmTestLog.Info(string.Format("{0}: {1} Updates successful for Primary Les Fw Update for Psu {2}\nfw: {3}",
                        currentApi, psu4.primaryUpdateSuccessCount, psu4.index, fwFilePaths[0]));
                }

                if (psu1.secondaryUpdateSuccessCount != 0 || psu2.secondaryUpdateSuccessCount != 0 ||
                    psu3.secondaryUpdateSuccessCount != 0 || psu4.secondaryUpdateSuccessCount != 0)
                {
                    CmTestLog.Info(string.Format("{0}: {1} Updates successful for Secondary Les Fw Update for Psu {2}\nfw: {3}",
                        currentApi, psu1.secondaryUpdateSuccessCount, psu1.index, fwFilePaths[1]));
                    CmTestLog.Info(string.Format("{0}: {1} Updates successful for Secondary Les Fw Update for Psu {2}\nfw: {3}",
                        currentApi, psu2.secondaryUpdateSuccessCount, psu2.index, fwFilePaths[1]));
                    CmTestLog.Info(string.Format("{0}: {1} Updates successful for Secondary Les Fw Update for Psu {2}\nfw: {3}",
                        currentApi, psu3.secondaryUpdateSuccessCount, psu3.index, fwFilePaths[1]));
                    CmTestLog.Info(string.Format("{0}: {1} Updates successful for Secondary Les Fw Update for Psu {2}\nfw: {3}",
                        currentApi, psu4.secondaryUpdateSuccessCount, psu4.index, fwFilePaths[1]));
                }

                StartStopCmService("stop");
            }
            catch (Exception ex)
            {
                ChassisManagerTestHelper.IsTrue(false, string.Format("Exception: {0}", ex.Message));
                allPassed = false;
            }

            CmTestLog.End(allPassed);
            return allPassed;
        }
        private TestResponse SuccessfulSecFwUpdateForUpdatePsuFirmware()
        {
            // Change test case Id and fwFilePath if testing Les or Non-Les Psus
            int testCaseId = -1;
            string fwFilePath;
            if (lesPsusInChassis == "1") // currently testing LES PSU
            {
                testCaseId = 22745;
                fwFilePath = this.secLesFwFilePath;
            }
            else
            {
                testCaseId = 22746;
                fwFilePath = this.secNonLesFwFilePath;
            }

            TestCase testCase = new TestCase("SuccessfulSecFwUpdateForUpdatePsuFirmware", testCaseId);

            CmTestLog.Info(string.Format(
                "\n !!!!!!Verifying {0} Returns Successful Secondary Psu Fw Image Update for Psu. WorkItemId: {1}!!!!!!",
                this.currentApi, testCase.WorkItemId));
            TestResponse response = new TestResponse();

            // Get random valid Psu Id
            int[] psuIds = null;
            if (!ReturnSingleOrMultipleRandomPsus(1, ref psuIds, ref response))
                return response;
            UpdatePsu psu = new UpdatePsu(psuIds[0], fwFilePath, secondaryImage);

            // Initialize List to contain UpdatePsu elements
            List<UpdatePsu> psuList = new List<UpdatePsu>();
            psuList.Add(psu);

            // Verify Secondary Psu Fw Update
            VerifyPsuFwUpdate(ref psuList, ref response);

            testCase.LogPassOrFail(ref response, currentApi);
            return response;
        }
        /// <summary>
        /// Test Command: GetPsuFirmwareStatus
        /// The test case verifies: 
        /// all groups can execute command
        /// ParameterOutOfRange for invalid psuId 
        /// </summary>
        /// <returns>True if all check-points pass; false, otherwise.</returns>
        public TestResponse GetPsuFirmwareStatusTest()
        {
            CmTestLog.Start();
            TestResponse response = new TestResponse();
            this.currentApi = "GetPsuFirmwareStatus";

            try
            {
                // Run test cases that don't require valid psu Id
                VerifyResponseAndAddFailureDescription(
                    ParameterOutOfRangePsuIdGetPsuFirmwareStatus(), response);

                // Run test cases that require valid psu Id
                VerifyResponseAndAddFailureDescription(
                    AllGroupsCanExecuteGetPsuFirmwareStatus(), response);

            }
            catch (Exception ex)
            {
                ChassisManagerTestHelper.IsTrue(false, "Exception: " + ex.Message);
                response.Result = false;
                response.ResultDescription.Append(ex.Message);
            }

            CmTestLog.End(response.Result);
            return response;
        }
        private bool ReturnSingleOrMultipleRandomPsus(int numberOfRandomPsus, ref int[] psuArray, ref TestResponse response)
        {
            List<int> psuIdList = GetPsuLocations().ToList();

            // make sure there is at least one extra Psu to power chassis
            if (psuIdList.Count < (numberOfRandomPsus + 1))
            {
                LogMessage.Message = string.Format(
                        "{0}: There is not enough Psus to run tests.",
                        this.currentApi);
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                return false;
            }

            while (psuIdList.Count != numberOfRandomPsus)
            {
                psuIdList.Remove(ChassisManagerTestHelper.RandomOrDefault(psuIdList.ToArray()));
            }
            psuArray = psuIdList.ToArray();
            return true;
        }
        public void GetChassisInfoTest()
        {
            TestResponse response = adminUserCmTest.GetChassisInfoTest();

            Assert.IsTrue(response.Result, response.ResultDescription.ToString());
        }
        public void UpdatePsuFirmwareTest()
        {
            TestResponse response = adminUserCmTest.UpdatePsuFirmwareTest();

            Assert.IsTrue(response.Result, response.ResultDescription.ToString());
        }
        public void GetPsuFirmwareStatusTest()
        {
            TestResponse response = adminUserCmTest.GetPsuFirmwarestatusTest();

            Assert.IsTrue(response.Result, response.ResultDescription.ToString());
        }
        public void SetBladeMezzPassThroughModeTest()
        {
            TestResponse response = adminUserCmTest.SetBladeMezzPassThroughModeTest();

            Assert.IsTrue(response.Result, response.ResultDescription.ToString());
        }
        public void StartStopSendReceivePortSerialConsoleByAllUsersTest()
        {
            TestResponse response = adminUserCmTest.StartStopSendReceivePortSerialConsoleByAllUsersTest();

            Assert.IsTrue(response.Result, response.ResultDescription.ToString());
        }
        public void StartStopSerialPortConsoleTest()
        {
            TestResponse response = adminUserCmTest.StartStopSerialPortConsoleTest();

            Assert.IsTrue(response.Result, response.ResultDescription.ToString());
        }
        public void AllBladesSerialSessionFunctionalTest()
        {
            TestResponse response = adminUserCmTest.AllBladesSerialSessionFunctionalTest();

            Assert.IsTrue(response.Result, response.ResultDescription.ToString());
        }
        private TestResponse OnlyAdminCanExecuteUpdatePsuFirmware()
        {
            TestCase testCase = new TestCase("OnlyAdminCanExecuteUpdatePsuFirmware", 22713);

            CmTestLog.Info(string.Format(
                "\n !!!!!!Verifying {0} Can Only Be Executed By WcsCmAdmin Users. WorkItemId: {1}!!!!!!",
                this.currentApi, testCase.WorkItemId));
            TestResponse response = new TestResponse();

            // Get random Psu
            int[] psuIds = null;
            if (!ReturnSingleOrMultipleRandomPsus(1, ref psuIds, ref response))
                return response;
            UpdatePsu psu = new UpdatePsu(psuIds[0]);

            // Loop through different user types
            foreach (WCSSecurityRole roleId in Enum.GetValues(typeof(WCSSecurityRole)))
            {
                this.TestChannelContext = this.ListTestChannelContexts[(int)roleId];

                try
                {
                    string fwFilePath = lesPsusInChassis == "1" ? priLesFwFilePath : priNonLesFwFilePath;
                    psu.psuFwUpdateResponse = this.TestChannelContext.UpdatePSUFirmware(psu.index, fwFilePath, primaryImage);

                    LogMessage.Message = string.Format(
                            "{0}: Command returns completion code {1} for user {2} for psu Id {3}",
                            currentApi, psu.psuFwUpdateResponse.completionCode,
                            Enum.GetName(typeof(WCSSecurityRole), roleId), psu.index);

                    if (psu.psuFwUpdateResponse.completionCode == CompletionCode.Success &&
                        roleId == WCSSecurityRole.WcsCmAdmin)
                        LogMessage.Log(LogMessage.MessageType.Success, ref response);
                    else
                        LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                }
                catch (Exception ex)
                {
                    // Check error is due to permission HTTP 400 unauthorize
                    if (ex.Message.Contains("400"))
                    {
                        // Check if 400 error due to WcsAdmin (fail)
                        LogMessage.Message = string.Format("{0}: Command returned Bad Request for user {1} for psuId {2}",
                            currentApi, Enum.GetName(typeof(WCSSecurityRole), roleId), psu.index);

                        if (roleId != WCSSecurityRole.WcsCmAdmin)
                            LogMessage.Log(LogMessage.MessageType.Success, ref response);
                        else
                            LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                    }
                    else
                    {
                        ChassisManagerTestHelper.IsTrue(false, "Exception: " + ex.Message);
                        response.Result = false;
                        response.ResultDescription.Append(ex.Message);
                    }
                }
            }

            testCase.LogPassOrFail(ref response, currentApi);
            return response;
        }
        private TestResponse ParameterOutOfRangePsuIdUpdatePsuFirmware()
        {
            TestCase testCase = new TestCase("ParameterOutOfRangePsuIdUpdatePsuFirmware", 22773);

            CmTestLog.Info(string.Format(
                "\n !!!!!!Verifying {0} Returns ParameterOutOfRange for Invalid PsuId. WorkItemId: {1}!!!!!!",
                this.currentApi, testCase.WorkItemId));
            TestResponse response = new TestResponse();

            ChassisResponse updatePsuFwResponse = new ChassisResponse();
            this.TestChannelContext = this.ListTestChannelContexts[(int)WCSSecurityRole.WcsCmAdmin];
            string fwFilePath = lesPsusInChassis == "1" ? priLesFwFilePath : priNonLesFwFilePath;

            foreach (int invalidValue in Enum.GetValues(typeof(InvalidPsuId)))
            {
                updatePsuFwResponse = this.TestChannelContext.UpdatePSUFirmware(invalidValue, fwFilePath, primaryImage);
                LogMessage.Message = string.Format(
                        "{0}: Command returns completion code {1} for invalid Psu Id {2}",
                        this.currentApi, updatePsuFwResponse.completionCode, invalidValue);

                if (updatePsuFwResponse.completionCode != CompletionCode.ParameterOutOfRange)
                    LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                else
                    LogMessage.Log(LogMessage.MessageType.Success, ref response);
            }

            testCase.LogPassOrFail(ref response, currentApi);
            return response;
        }
        /// <summary>
        /// Test GetChassisInfo for all possible parameters by different users
        /// </summary>
        /// <returns>True if all check-points pass; false, otherwise.</returns>
        public TestResponse GetChassisInfoByAllUserTest()
        {
            CmTestLog.Start();
            TestResponse response = new TestResponse();

            this.EmptyLocations = this.GetEmptyLocations();
            this.JbodLocations = this.GetJbodLocations();

            // Loop through different user roles
            foreach (WCSSecurityRole roleId in Enum.GetValues(typeof(WCSSecurityRole)))
            {
                try
                {
                    TestResponse testResponse = this.GetChassisInfoByAllUsers(roleId);
                    response.Result &= testResponse.Result;
                    response.ResultDescription.Append(testResponse.ResultDescription);
                }
                catch (Exception ex)
                {
                    ChassisManagerTestHelper.IsTrue(false, ex.Message);
                    response.Result &= false;
                    response.ResultDescription.Append(ex.Message);
                }
            }

            return response;
        }
        public void StartStopBladeSerialSessionTest()
        {
            TestResponse response = adminUserCmTest.StartStopBladeSerialSessionTest();

            Assert.IsTrue(response.Result, response.ResultDescription.ToString());
        }
        /// <summary>
        /// Test GetChassisInfo for all possible parameters
        /// </summary>
        /// <returns>True if all check-points pass; false, otherwise.</returns>
        public TestResponse GetChassisInfoTest()
        {
            CmTestLog.Start();
            TestResponse response = new TestResponse();

            this.ServerLocations = this.GetServerLocations();
            this.EmptyLocations = this.GetEmptyLocations();
            this.JbodLocations = this.GetJbodLocations();

            try
            {
                ChassisInfoResponse chassisInfo = new ChassisInfoResponse();

                // Test GetChassisInfo, get all information
                CmTestLog.Info("Verifying chassis information when all params are true");
                chassisInfo = this.Channel.GetChassisInfo(true, true, true, true);

                // define an object of TestResponse class for test results
                TestResponse testResponse = this.VerifyChassisInfo(chassisInfo);
                response.Result &= testResponse.Result;
                response.ResultDescription.Append(testResponse.ResultDescription);

                CmTestLog.Info("Finished verification of GetchassisInfo when all information was returned blade, PSU, battery and chassis controller \n");

                // Test GetChassisInfo with no params
                CmTestLog.Info("Verifying chassis information when all params are false OR no Params\n");
                chassisInfo = this.Channel.GetChassisInfo(false, false, false, false);

                testResponse = this.VerifyChassisInfo(chassisInfo);
                response.Result &= testResponse.Result;
                response.ResultDescription.Append(testResponse.ResultDescription);

                CmTestLog.Info("Finished verification of GetchassisInfo with no params \n");

                // Test for GetChassisInfo with only blade info
                CmTestLog.Info("Verifying chassis information for only Blade, bladeInfo param is true\n");
                chassisInfo = this.Channel.GetChassisInfo(true, false, false, false);

                testResponse = this.VerifyOnlyChassisBladeInfo(chassisInfo);
                response.Result &= testResponse.Result;
                response.ResultDescription.Append(testResponse.ResultDescription);

                CmTestLog.Info("Finished verification of GetchassisInfo for only Blade information \n");

                // Test for GetChassisInfo for only PSU information
                CmTestLog.Info("Verifying chassis information for only psuInfo param is true");
                chassisInfo = this.Channel.GetChassisInfo(false, true, false, false);

                testResponse = this.VerifyOnlyChassisPsuInfo(chassisInfo);
                response.Result &= testResponse.Result;
                response.ResultDescription.Append(testResponse.ResultDescription);

                CmTestLog.Info("Finished verification of GetChassisInfo for only PSU information \n");

                // Test for GetChassisInfo for only Battery information
                CmTestLog.Info("Verifying chassis information for only batteryInfo param is true\n");
                chassisInfo = this.Channel.GetChassisInfo(false, false, false, true);

                testResponse = this.VerifyOnlyChassisBatteryInfo(chassisInfo);
                response.Result &= testResponse.Result;
                response.ResultDescription.Append(testResponse.ResultDescription);

                CmTestLog.Info("Finished verification of GetChassisInfo for only battery information \n");

                // Test for GetChassisInfo for only chassis controller information
                CmTestLog.Info("Verifying chassis information for only chassisControllerInfo param is true\n");
                chassisInfo = this.Channel.GetChassisInfo(false, false, true, false);

                testResponse = this.VerifyOnlyChassisControllerInfo(chassisInfo);
                response.Result &= testResponse.Result;
                response.ResultDescription.Append(testResponse.ResultDescription);

                CmTestLog.Info("Finished verification of GetChassisInfo for only chassis controller information \n");
            }
            catch (Exception ex)
            {
                ChassisManagerTestHelper.IsTrue(false, ex.Message);
                response.Result &= false;
                response.ResultDescription.Append(ex.Message);
            }

            CmTestLog.End(response.Result);
            return response;
        }
        private TestResponse SuccessfulPriSecUpdateForPrimaryImageTrueFalseForUpdatePsuFirmware()
        {
            TestCase testCase = new TestCase("SuccessfulPriSecUpdateForPrimaryImageTrueFalseForUpdatePsuFirmware", 22711);

            CmTestLog.Info(string.Format(
                "\n !!!!!!Verifying {0} Updates Primary Image When PrimaryImage True, Secondary Image When False. WorkItemId: {1}!!!!!!",
                this.currentApi, testCase.WorkItemId));
            TestResponse response = new TestResponse();

            // Get random valid Psu Ids
            int[] psuIds = null;
            if (!ReturnSingleOrMultipleRandomPsus(2, ref psuIds, ref response))
                return response;

            // Initialize multiple UpdatePsu elements and add to psuList
            List<UpdatePsu> psuList = new List<UpdatePsu>();
            if (lesPsusInChassis == "1") // currently testing LES PSU
            {
                psuList.Add(new UpdatePsu(psuIds[0], this.priLesFwFilePath, primaryImage));
                psuList.Add(new UpdatePsu(psuIds[1], this.secLesFwFilePath, secondaryImage));
            }
            else
            {
                psuList.Add(new UpdatePsu(psuIds[0], this.priNonLesFwFilePath, primaryImage));
                psuList.Add(new UpdatePsu(psuIds[1], this.secNonLesFwFilePath, secondaryImage));
            }

            // Verify Psu Update
            VerifyPsuFwUpdate(ref psuList, ref response);

            testCase.LogPassOrFail(ref response, this.currentApi);
            return response;
        }
        /// <summary>
        /// Verify chassis battery info
        /// </summary>
        /// <param name="allPassed">Flag indicating success/failure</param>
        /// <param name="chassisInfo">Chassis info response</param>
        /// <returns>returns success/failure</returns>
        private static TestResponse VerifyChassisBatteryInfo(ChassisInfoResponse chassisInfo)
        {
            TestResponse response = new TestResponse();

            CmTestLog.Info("Verifying battery info");
            if (CmConstants.NumBatteries == 0)
            {
                foreach (var battery in chassisInfo.batteryCollections)
                {
                    if (battery.completionCode != CompletionCode.Unknown || battery.presence != 0)
                    {
                        response.ResultDescription.Append(string.Format("\n Battery# {0} returns {1} when it should be Unknown", battery.id, battery.completionCode));
                        response.ResultDescription.Append(string.Format("Battery# {0} returns Presence value as {1}", battery.id, battery.presence));
                        response.Result &= false;
                    }
                }
            }
            else
            {
                foreach (var battery in chassisInfo.batteryCollections)
                {
                    if (!ChassisManagerTestHelper.AreEqual(CompletionCode.Success, battery.completionCode, string.Format("Battery# {0} returns {1}", battery.id, battery.completionCode)))
                    {
                        response.ResultDescription.Append(string.Format("\n Battery# {0} returns {1}", battery.id, battery.completionCode));
                        response.Result &= false;
                    }
                }
            }
            return response;
        }
        private void VerifyPsuFwUpdate(ref List<UpdatePsu> psuList, ref TestResponse response)
        {
            // initialize return
            bool allPassed = true;

            // Initialize fw revision lists
            List<string> previousRevisionList = new List<string>();
            List<string> updatedRevisionList = new List<string>();

            // Run test using WcsAdmin
            this.TestChannelContext = this.ListTestChannelContexts[(int)WCSSecurityRole.WcsCmAdmin];

            // Get Psu Fw Status for every PSU in list
            for (int index = 0; index < psuList.Count; index++)
            {
                UpdatePsu psu = psuList[index];
                psu.psuFwStatus = this.TestChannelContext.GetPSUFirmwareStatus(psu.index);
                LogMessage.Message = string.Format(
                        "{0}: GetPsuFirmwareStatus for PSU {1} before update - fwRevision: {2} completionCode: {3} fwUpdateStatus: {4} fwUpdateStage: {5}",
                        this.currentApi, psu.index, psu.psuFwStatus.fwRevision, psu.psuFwStatus.completionCode,
                        psu.psuFwStatus.fwUpdateStatus, psu.psuFwStatus.fwUpdateStage);

                // Verify PSU is available for update
                if (psu.psuFwStatus.completionCode != CompletionCode.Success ||
                    psu.psuFwStatus.fwUpdateStatus == "InProgress")
                {
                    LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                    psu.passed = false;
                    previousRevisionList.Add(null);
                }
                else
                {
                    LogMessage.Log(LogMessage.MessageType.Success, ref response);
                    previousRevisionList.Add(psu.psuFwStatus.fwRevision);
                }
                psuList[index] = psu;
            }

            // Verify at least one Psu available for update testing
            bool allFailed = true;
            psuList.ForEach(psu => allFailed &= !psu.passed);
            if (allFailed)
            {
                LogMessage.Message = "{0}: No Psu is available for update.";
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                return;
            }

            // Update Psus
            for (int index = 0; index < psuList.Count; index++)
            {
                UpdatePsu psu = psuList[index];
                if (!psu.passed)
                {
                    LogMessage.Message = string.Format(
                        "{0}: Psu {1} not ready for update, skipping.",
                        this.currentApi, psu.index);
                    LogMessage.Log(LogMessage.MessageType.Info, ref response);
                    continue;
                }

                psu.psuFwUpdateResponse = this.TestChannelContext.UpdatePSUFirmware(psu.index,
                    psu.psuFwFilePath, psu.primaryImage);
                LogMessage.Message = string.Format(
                        "{0}: Psu {1} returned completion code {2} and status description {3}",
                        this.currentApi, psu.index, psu.psuFwUpdateResponse.completionCode,
                        psu.psuFwUpdateResponse.statusDescription);

                if (psu.psuFwUpdateResponse.completionCode != CompletionCode.Success)
                {
                    LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                    psu.passed = false;
                }
                else
                    LogMessage.Log(LogMessage.MessageType.Success, ref response);

                psuList[index] = psu;
            }

            // Verify at least one Psu available for update testing
            allFailed = true;
            psuList.ForEach(psu => allFailed &= !psu.passed);
            if (allFailed)
            {
                LogMessage.Message = "{0}: All Psus failed to update.";
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                return;
            }

            // Sleep for 5 minutes
            LogMessage.Message = "Thread sleeping for 5 minutes...";
            LogMessage.Log(LogMessage.MessageType.Info, ref response);
            Thread.Sleep(TimeSpan.FromMinutes(5));

            // Verify Psus are being updated After 5 minutes
            for (int index = 0; index < psuList.Count; index++)
            {
                UpdatePsu psu = psuList[index];

                // Only verify Psus that are being updated
                if (!psu.passed)
                    continue;

                PrintGetPsuFwStatus(ref psu, true, psu.primaryImage, this.currentApi, psu.psuFwFilePath, ref allPassed);
                psuList[index] = psu;
            }

            // Verify at least one Psu available for update testing
            allFailed = true;
            psuList.ForEach(psu => allFailed &= !psu.passed);
            if (allFailed)
            {
                LogMessage.Message = "{0}: All Psus failed to update after 5 minutes.";
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                return;
            }

            // Sleep for 7 more minutes
            LogMessage.Message = "Thread sleeping for 7 minutes...";
            LogMessage.Log(LogMessage.MessageType.Info, ref response);
            Thread.Sleep(TimeSpan.FromMinutes(7));

            // Verify Psus have been updated
            for (int index = 0; index < psuList.Count; index++)
            {
                UpdatePsu psu = psuList[index];

                // Only verify Psus that were being updated
                if (!psu.passed)
                    continue;

                PrintGetPsuFwStatus(ref psu, false, psu.primaryImage, this.currentApi, psu.psuFwFilePath, ref allPassed);
                psuList[index] = psu;

                // Compare previous and updated fw revisions
                string[] previousRevision = previousRevisionList[index].Split('.');
                string[] currentRevision = psu.psuFwStatus.fwRevision.Split('.');

                if (psu.primaryImage) // outside digits must remain the same (ie xx.AB.xx)
                {
                    LogMessage.Message = string.Format(
                        "{0}: Primary Fw Revision for Psu {1} - Before: {2} After: {3}",
                        this.currentApi, psu.index, previousRevisionList[index], psu.psuFwStatus.fwRevision);

                    if ((previousRevision[0] == currentRevision[0] &&
                        previousRevision[2] == currentRevision[2]) ||
                        previousRevisionList[index].Contains('?'))
                        LogMessage.Log(LogMessage.MessageType.Success, ref response);
                    else
                    {
                        LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                        psu.passed = false;
                    }
                }
                else // middle digits must remain the same (ie AB.xx.CD)
                {
                    LogMessage.Message = string.Format(
                        "{0}: Secondary Fw Revision for Psu {1} - Before: {2} After: {3}",
                        this.currentApi, psu.index, previousRevisionList[index], psu.psuFwStatus.fwRevision);

                    if (previousRevision[1] == currentRevision[1] ||
                        previousRevisionList[index].Contains('?'))
                        LogMessage.Log(LogMessage.MessageType.Success, ref response);
                    else
                    {
                        LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                        psu.passed = false;
                    }
                }
            }

            // Update response
            if (!allPassed)
                response.Result = false;
        }
        /// <summary>
        /// Verify chassis controller info
        /// </summary>
        /// <param name="allPassed">Flag indicating success/failure</param>
        /// <param name="chassisInfo">Chassis info response</param>
        /// <returns>returns success/failure</returns>
        private static TestResponse VerifyChassisControllerInfo(ChassisInfoResponse chassisInfo)
        {
            TestResponse response = new TestResponse();

            CmTestLog.Info("Verifying chassis controller info");

            if (!ChassisManagerTestHelper.AreEqual(CompletionCode.Success, chassisInfo.chassisController.completionCode, "Chassis controller returns success"))
            {
                response.Result = false;
                response.ResultDescription.Append("\n Verify Chassis controller info failed with completion code: " + chassisInfo.chassisController.completionCode);
             }
            return response;
        }
 private void VerifyResponseAndAddFailureDescription(TestResponse bladeResp, TestResponse response)
 {
     if (!bladeResp.Result)
     {
         response.ResultDescription.Append(bladeResp.ResultDescription);
         response.Result = false;
     }
 }
        /// <summary>
        /// Verify chassis PSU info
        /// </summary>
        /// <param name="allPassed">Flag indicating success/failure</param>
        /// <param name="chassisInfo">Chassis info response</param>
        /// <returns>returns success/failure</returns>
        private static TestResponse VerifyChassisPsuInfo(ChassisInfoResponse chassisInfo)
        {
            TestResponse response = new TestResponse();

            CmTestLog.Info("Verifying PSU info");

            if (!ChassisManagerTestHelper.AreEqual(CmConstants.NumPsus, chassisInfo.psuCollections.Count, "Verified the number of PSUs is correct"))
            {
                response.Result = false;
                response.ResultDescription.Append("\n VerifyChassisBatteryInfo : Number of PSUs do not match the config value");
            }

            foreach (var psu in chassisInfo.psuCollections)
            {
                if (!ChassisManagerTestHelper.AreEqual(PowerState.ON, psu.state, string.Format("PSU# {0} power state is {1}", psu.id, psu.state)))
                {
                    response.ResultDescription.Append(string.Format("\nPSU# {0} power state is {1}", psu.id, psu.state));
                    response.Result &= false;
                }
            }
            return response;
        }
 public static void Log(MessageType type, ref TestResponse response)
 {
     switch (type)
     {
         case MessageType.Success:
             {
                 CmTestLog.Success(Message);
                 break;
             }
         case MessageType.Failure:
             {
                 CmTestLog.Failure(Message);
                 response.Result = false;
                 break;
             }
         case MessageType.Info:
             {
                 CmTestLog.Info(Message);
                 break;
             }
         default:
             break;
     }
     response.ResultDescription.Append(Message);
 }
        private TestResponse GetChassisInfoByAllUsers(WCSSecurityRole roleId)
        {
            TestResponse response = new TestResponse();
            try
            {
                // Use the Domain User Channel
                this.TestChannelContext = this.ListTestChannelContexts[(int)roleId];
                if (this.TestChannelContext != null)
                {
                    ChassisInfoResponse chassisInfo = new ChassisInfoResponse();

                    // Test GetChassisInfo, get all information
                    CmTestLog.Info("Verifying chassis information when all params are true");
                    chassisInfo = this.TestChannelContext.GetChassisInfo(true, true, true, true);

                    TestResponse testResponse = this.VerifyChassisInfo(chassisInfo);
                    response.Result &= testResponse.Result;
                    response.ResultDescription.Append(testResponse.ResultDescription);

                    CmTestLog.Info("Finished verification of GetchassisInfo when all information was returned blade, PSU, battery and chassis controller \n");

                    // Test GetChassisInfo with no params
                    CmTestLog.Info("Verifying chassis information when all params are false OR no Params\n");
                    chassisInfo = this.TestChannelContext.GetChassisInfo(false, false, false, false);

                    testResponse = this.VerifyChassisInfo(chassisInfo);
                    response.Result &= testResponse.Result;
                    response.ResultDescription.Append(testResponse.ResultDescription);

                    CmTestLog.Info("Finished verification of GetchassisInfo with no params \n");

                    // Test for GetChassisInfo with only blade info
                    CmTestLog.Info("Verifying chassis information for only Blade, bladeInfo param is true\n");
                    chassisInfo = this.TestChannelContext.GetChassisInfo(true, false, false, false);

                    testResponse = this.VerifyOnlyChassisBladeInfo(chassisInfo);
                    response.Result &= testResponse.Result;
                    response.ResultDescription.Append(testResponse.ResultDescription);

                    CmTestLog.Info("Finished verification of GetchassisInfo for only Blade information \n");

                    // Test for GetChassisInfo for only PSU information
                    CmTestLog.Info("Verifying chassis information for only psuInfo param is true\n");
                    chassisInfo = this.TestChannelContext.GetChassisInfo(false, true, false, false);

                    testResponse = this.VerifyOnlyChassisPsuInfo(chassisInfo);
                    response.Result &= testResponse.Result;
                    response.ResultDescription.Append(testResponse.ResultDescription);

                    CmTestLog.Info("Finished verification of GetChassisInfo for only PSU information \n");

                    // Test for GetChassisInfo for only Battery information
                    CmTestLog.Info("Verifying chassis information for only batteryInfo param is true\n");
                    chassisInfo = this.TestChannelContext.GetChassisInfo(false, false, false, true);

                    testResponse = this.VerifyOnlyChassisBatteryInfo(chassisInfo);
                    response.Result = testResponse.Result;
                    response.ResultDescription.Append(testResponse.ResultDescription);

                    CmTestLog.Info("Finished verification of GetChassisInfo for only battery information \n");

                    // Test for GetChassisInfo for only chassis controller information
                    CmTestLog.Info("Verifying chassis information for only chassisControllerInfo param is true\n");
                    chassisInfo = this.TestChannelContext.GetChassisInfo(false, false, true, false);

                    testResponse = this.VerifyOnlyChassisControllerInfo(chassisInfo);
                    response.Result = testResponse.Result;
                    response.ResultDescription.Append(testResponse.ResultDescription);

                    CmTestLog.Info("Finished verification of GetChassisInfo for only chassis controller information \n");
                }
            }
            catch (Exception ex)
            {
                ChassisManagerTestHelper.IsTrue(false, ex.Message);
                response.Result &= false;
                response.ResultDescription.Append(ex.Message);
            }
            return response;
        }
        private TestResponse AllGroupsCanExecuteGetPsuFirmwareStatus()
        {
            TestCase testCase = new TestCase("AllGroupsCanExecuteGetPsuFirmwareStatus", 22696);

            CmTestLog.Info(string.Format("\n !!!!!!Verifying {0} Can Be Executed By All Users. WorkItemId: {1}.!!!!!!",
                this.currentApi, testCase.WorkItemId));
            TestResponse response = new TestResponse();

            // Get random Psu
            int[] psuIds = null;
            if (!ReturnSingleOrMultipleRandomPsus(1, ref psuIds, ref response))
                return response;
            UpdatePsu psu = new UpdatePsu(psuIds[0]);

            // Loop through different user types
            foreach (WCSSecurityRole roleId in Enum.GetValues(typeof(WCSSecurityRole)))
            {
                // Use different user context
                this.TestChannelContext = this.ListTestChannelContexts[(int)roleId];

                // Get Pass Through Mode and verify
                psu.psuFwStatus = this.TestChannelContext.GetPSUFirmwareStatus(psu.index);

                LogMessage.Message = string.Format(
                        "{0}: Command returned completion code {1} for user {2} and psu Id {3}",
                        this.currentApi, psu.psuFwStatus.completionCode,
                        Enum.GetName(typeof(WCSSecurityRole), roleId), psu.index);

                if (psu.psuFwStatus.completionCode != CompletionCode.Success)
                    LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                else
                    LogMessage.Log(LogMessage.MessageType.Success, ref response);

                // Verify Correct psuId returned by GetPsuFirmwareStatus
                LogMessage.Message = string.Format(
                    "{0}: Command returned psu Id {0} for expected psu Id {1}",
                    this.currentApi, psu.psuFwStatus.id, psu.index);

                if (psu.psuFwStatus.id != psu.index)
                    LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                else
                    LogMessage.Log(LogMessage.MessageType.Success, ref response);
            }

            testCase.LogPassOrFail(ref response, this.currentApi);
            return response;
        }
        /// <summary>
        /// Verify chassis blade info
        /// </summary>
        /// <param name="allPassed">Flag indicating success/failure</param>
        /// <param name="chassisInfo">Chassis info response</param>
        /// <returns>returns success/failure</returns>
        private TestResponse VerifyChassisBladeInfo(ChassisInfoResponse chassisInfo)
        {
            TestResponse response = new TestResponse();

            CmTestLog.Info("Verifying blade info");
            response.Result = ChassisManagerTestHelper.AreEqual(CmConstants.Population, chassisInfo.bladeCollections.Count, "Verified the number of blades in the chassis");
            if (response.Result == false)
            {
                response.ResultDescription.Append("\nChassis blade info verification failed : Number of blades in the chassis do not match with the config value");
            }
            foreach (var bladeInfo in chassisInfo.bladeCollections)
            {
                if (!EmptyLocations.Contains(bladeInfo.bladeNumber))
                {
                response.Result &= ChassisManagerTestHelper.AreEqual(CompletionCode.Success, bladeInfo.completionCode, string.Format("Blade# {0} returns {1}", bladeInfo.bladeNumber, bladeInfo.completionCode));
                if (response.Result == false)
                {
                    response.ResultDescription.Append(string.Format("\nFailed to get blade " + bladeInfo.bladeNumber + " information, completion code returned: " + bladeInfo.completionCode));
                }
            }
            }
            return response;
        }
        private TestResponse InvalidPsuFwFileUpdateFailForUpdatePsuFirmware()
        {
            // Change test case Id and fwFilePath if testing Les or Non-Les Psus
            int testCaseId = -1;
            string fwFilePath;
            if (lesPsusInChassis == "1") // currently testing LES PSU
            {
                testCaseId = 22896;
                fwFilePath = this.secLesFwFilePath;
            }
            else
            {
                testCaseId = 22909;
                fwFilePath = this.secNonLesFwFilePath;
            }

            TestCase testCase = new TestCase("InvalidPsuFwFileUpdateFailForUpdatePsuFirmware", testCaseId);

            CmTestLog.Info(string.Format(
                "\n !!!!!!Verifying {0} Fails Update for Invalid Psu Fw File. WorkItemId: {1}!!!!!!",
                this.currentApi, testCase.WorkItemId));
            TestResponse response = new TestResponse();

            // Get random valid Psu Id
            int[] psuIds = null;
            if (!ReturnSingleOrMultipleRandomPsus(1, ref psuIds, ref response))
                return response;
            UpdatePsu psu = new UpdatePsu(psuIds[0], fwFilePath, primaryImage);

            // Run test case using WcsCmAdmin
            this.TestChannelContext = this.ListTestChannelContexts[(int)WCSSecurityRole.WcsCmAdmin];

            psu.psuFwStatus = this.TestChannelContext.GetPSUFirmwareStatus(psu.index);
            LogMessage.Message = string.Format(
                    "{0}: GetPsuFirmwareStatus for PSU {1} before update - fwRevision: {2} completionCode: {3} fwUpdateStatus: {4} fwUpdateStage: {5}",
                    this.currentApi, psu.index, psu.psuFwStatus.fwRevision, psu.psuFwStatus.completionCode,
                    psu.psuFwStatus.fwUpdateStatus, psu.psuFwStatus.fwUpdateStage);

            // Verify PSU is available for update
            if (psu.psuFwStatus.completionCode != CompletionCode.Success ||
                psu.psuFwStatus.fwUpdateStatus == "InProgress")
            {
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                return response;
            }
            else
                LogMessage.Log(LogMessage.MessageType.Success, ref response);

            // Update Psu with secondary fw image and true value for primaryImage
            psu.psuFwUpdateResponse = this.TestChannelContext.UpdatePSUFirmware(psu.index, psu.psuFwFilePath, primaryImage);
            LogMessage.Message = string.Format(
                    "{0}: Psu {1} returned completion code {2} and status description {3}",
                    this.currentApi, psu.index, psu.psuFwUpdateResponse.completionCode,
                    psu.psuFwUpdateResponse.statusDescription);

            if (psu.psuFwUpdateResponse.completionCode != CompletionCode.Success)
            {
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                return response;
            }
            else
                LogMessage.Log(LogMessage.MessageType.Success, ref response);

            // Sleep for 5 minutes
            LogMessage.Message = "Thread sleeping for 5 minutes...";
            LogMessage.Log(LogMessage.MessageType.Info, ref response);
            Thread.Sleep(TimeSpan.FromMinutes(5));

            // Verify Psu Fw Update has failed
            psu.psuFwStatus = this.TestChannelContext.GetPSUFirmwareStatus(psu.index);
            LogMessage.Message = string.Format(
                "{0}: GetPsuFirmwareStatus for PSU {1} - fwRevision: {2} completionCode: {3} fwUpdateStatus: {4} fwUpdateStage: {5}",
                    this.currentApi, psu.index, psu.psuFwStatus.fwRevision, psu.psuFwStatus.completionCode,
                    psu.psuFwStatus.fwUpdateStatus, psu.psuFwStatus.fwUpdateStage);

            if (psu.psuFwStatus.completionCode == CompletionCode.Success &&
                psu.psuFwStatus.fwUpdateStatus == "Failed" &&
                psu.psuFwStatus.fwUpdateStage == "SendModelId")
                LogMessage.Log(LogMessage.MessageType.Success, ref response);
            else
            {
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                return response;
            }

            // Update Psu with invalid psu image and true value for primaryImage
            string invalidFwFilePath = ConfigurationManager.AppSettings["InvalidPsuFwFilePath"].ToString();

            psu.psuFwUpdateResponse = this.TestChannelContext.UpdatePSUFirmware(psu.index, invalidFwFilePath, primaryImage);
            LogMessage.Message = string.Format(
                    "{0}: Psu {1} returned completion code {2} and status description {3}",
                    this.currentApi, psu.index, psu.psuFwUpdateResponse.completionCode,
                    psu.psuFwUpdateResponse.statusDescription);

            if (psu.psuFwUpdateResponse.completionCode != CompletionCode.Success)
            {
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                return response;
            }
            else
                LogMessage.Log(LogMessage.MessageType.Success, ref response);

            // Sleep for 5 minutes
            LogMessage.Message = "Thread sleeping for 5 minutes...";
            LogMessage.Log(LogMessage.MessageType.Info, ref response);
            Thread.Sleep(TimeSpan.FromMinutes(5));

            // Verify Psu Fw Update has failed
            psu.psuFwStatus = this.TestChannelContext.GetPSUFirmwareStatus(psu.index);
            LogMessage.Message = string.Format(
                "{0}: GetPsuFirmwareStatus for PSU {1} - fwRevision: {2} completionCode: {3} fwUpdateStatus: {4} fwUpdateStage: {5}",
                    this.currentApi, psu.index, psu.psuFwStatus.fwRevision, psu.psuFwStatus.completionCode,
                    psu.psuFwStatus.fwUpdateStatus, psu.psuFwStatus.fwUpdateStage);

            if (psu.psuFwStatus.completionCode == CompletionCode.Success &&
                psu.psuFwStatus.fwUpdateStatus == "Failed" &&
                psu.psuFwStatus.fwUpdateStage == "ExtractModelId")
                LogMessage.Log(LogMessage.MessageType.Success, ref response);
            else
            {
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                return response;
            }

            testCase.LogPassOrFail(ref response, this.currentApi);
            return response;
        }
        /// <summary>
        /// Verify chassis info
        /// </summary>
        /// <param name="allPassed">Flag indicating success/failure</param>
        /// <param name="chassisInfo">Chassis info response</param>
        /// <returns>returns success/failure</returns>
        private TestResponse VerifyChassisInfo(ChassisInfoResponse chassisInfo)
        {
            TestResponse response = new TestResponse();

            response.Result = ChassisManagerTestHelper.IsTrue(chassisInfo != null, "Received chasssis information ");

            // Return if chassis information is null
            if (response.Result == false)
            {
                response.ResultDescription.Append("\nReceived chassis object is null");
                return response;
            }

            if (chassisInfo.completionCode != CompletionCode.Success)
            {
                response.Result = false;
                response.ResultDescription.Append("\nFailed to get chassis information, completion code returned: " + chassisInfo.completionCode);
                CmTestLog.Failure(response.ResultDescription.ToString());
                return response;
            }
            CmTestLog.Success("Successfully received chassis info");

            TestResponse testResponse = VerifyChassisBladeInfo(chassisInfo);
            response.Result &= testResponse.Result;
            response.ResultDescription.Append(testResponse.ResultDescription);

            testResponse = VerifyChassisPsuInfo(chassisInfo);
            response.Result &= testResponse.Result;
            response.ResultDescription.Append(testResponse.ResultDescription);

            testResponse = VerifyChassisBatteryInfo(chassisInfo);
            response.Result &= testResponse.Result;
            response.ResultDescription.Append(testResponse.ResultDescription);

            testResponse = VerifyChassisControllerInfo(chassisInfo);
            response.Result &= testResponse.Result;
            response.ResultDescription.Append(testResponse.ResultDescription);

            return response;
        }
        private TestResponse ParameterOutOfRangePsuIdGetPsuFirmwareStatus()
        {
            TestCase testCase = new TestCase("ParameterOutOfRangePsuIdGetPsuFirmwareStatus", 22804);

            CmTestLog.Info(string.Format(
                "\n !!!!!!Verifying {0} Returns ParameterOutOfRange for Invalid PsuId. WorkItemId: {1}!!!!!!",
                this.currentApi, testCase.WorkItemId));
            TestResponse response = new TestResponse();

            PsuFirmwareStatus getPsuFwResponse = new PsuFirmwareStatus();
            this.TestChannelContext = this.ListTestChannelContexts[(int)WCSSecurityRole.WcsCmAdmin];

            foreach (int invalidValue in Enum.GetValues(typeof(InvalidPsuId)))
            {
                getPsuFwResponse = this.TestChannelContext.GetPSUFirmwareStatus(invalidValue);
                LogMessage.Message = string.Format(
                        "{0}: Command returns completion code {1} for invalid Psu Id {2}",
                        this.currentApi, getPsuFwResponse.completionCode, invalidValue);

                if (getPsuFwResponse.completionCode != CompletionCode.ParameterOutOfRange)
                    LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                else
                    LogMessage.Log(LogMessage.MessageType.Success, ref response);
            }

            testCase.LogPassOrFail(ref response, currentApi);
            return response;
        }
        /// <summary>
        /// Test Command: GetChassisInfo: Get Only Battery information (batteryInfo=true). 
        /// </summary>
        /// <param name="allPassed"></param>
        /// <param name="chassisHealth"></param>
        /// <returns>True if all check-points pass; false, otherwise.</returns>
        private TestResponse VerifyOnlyChassisBatteryInfo(ChassisInfoResponse chassisInfo)
        {
            TestResponse response = new TestResponse();

            try
            {
                response.Result = ChassisManagerTestHelper.IsTrue(chassisInfo != null, "Received chasssis info ");

                // Return if chassis information is null
                if (response.Result == false)
                {
                    response.ResultDescription.Append("\nReceived chassis object is null");
                    return response;
                }

                if (CmConstants.NumBatteries == 0)
                {
                    foreach (var battery in chassisInfo.batteryCollections)
                    {
                        if (battery.completionCode != CompletionCode.Unknown || battery.presence != 0)
                        {
                            response.ResultDescription.Append(string.Format("\n Battery# {0} returns {1} when it should be Unknown", battery.id, battery.completionCode));
                            response.ResultDescription.Append(string.Format("Battery# {0} returns Presence value as {1}", battery.id, battery.presence));
                            response.Result &= false;
                            return response;
                        }
                    }

                    response.Result = true;
                    response.ResultDescription.Append("\nSuccessfully verified response for case of non present batteries.");
                    CmTestLog.Success(response.ResultDescription.ToString());
                    return response;
                }
                else
                {
                    if (chassisInfo.completionCode != CompletionCode.Success)
                    {
                        response.Result = false;
                        response.ResultDescription.Append("\nFailed to get chassis information with only Chassis Battery Info set to true, completion code returned: " + chassisInfo.completionCode);
                        CmTestLog.Failure(response.ResultDescription.ToString());
                        return response;
                    }
                    CmTestLog.Success("Successfully received chassis info");

                    response = VerifyChassisBatteryInfo(chassisInfo);

                    // Verify blade information is empty
                    if (!ChassisManagerTestHelper.IsTrue(chassisInfo.bladeCollections.Count == 0, "Blade information is empty"))
                    {
                        response.Result &= false;
                        response.ResultDescription.Append("\nVerifyOnlyChassisBatteryInfo failed: Blade information is not empty");
                    }

                    // Verify PSU information is empty
                    if (!ChassisManagerTestHelper.IsTrue(chassisInfo.psuCollections.Count == 0, "PSU information is empty"))
                    {
                        response.Result &= false;
                        response.ResultDescription.Append("\nVerifyOnlyChassisBatteryInfo failed: PSU information is not empty");
                    }

                    // Verify chassis controller info is empty
                    if (!ChassisManagerTestHelper.IsTrue(chassisInfo.chassisController == null, "Chassis controller information is empty"))
                    {
                        response.Result &= false;
                        response.ResultDescription.Append("\nVerifyOnlyChassisBatteryInfo failed: Chassis Controller information is not empty");
                    }
                }
            }
            catch (Exception ex)
            {
                ChassisManagerTestHelper.IsTrue(false, ex.Message);
                response.Result = false;
                response.ResultDescription.Append(ex.Message);
            }

            return response;
        }
        private TestResponse PsuDoesNotOutputPowerForUpdatePsuFirmware()
        {
            TestCase testCase = new TestCase("PsuDoesNotOutputPowerForUpdatePsuFirmware", 22840);

            CmTestLog.Info(string.Format(
                "\n !!!!!!Verifying {0} Causes Psu To Not Output Power During Fw Update. WorkItemId: {1}!!!!!!",
                this.currentApi, testCase.WorkItemId));
            TestResponse response = new TestResponse();

            // Get random Psu
            int[] psuIds = null;
            if (!ReturnSingleOrMultipleRandomPsus(1, ref psuIds, ref response))
                return response;
            UpdatePsu psu = new UpdatePsu(psuIds[0], this.priLesFwFilePath, primaryImage);

            // Run test case using WcsCmAdmin
            this.TestChannelContext = this.ListTestChannelContexts[(int)WCSSecurityRole.WcsCmAdmin];

            psu.psuFwStatus = this.TestChannelContext.GetPSUFirmwareStatus(psu.index);
            LogMessage.Message = string.Format(
                    "{0}: GetPsuFirmwareStatus for PSU {1} before update - fwRevision: {2} completionCode: {3} fwUpdateStatus: {4} fwUpdateStage: {5}",
                    this.currentApi, psu.index, psu.psuFwStatus.fwRevision, psu.psuFwStatus.completionCode,
                    psu.psuFwStatus.fwUpdateStatus, psu.psuFwStatus.fwUpdateStage);

            // Verify PSU is available for update
            if (psu.psuFwStatus.completionCode != CompletionCode.Success ||
                psu.psuFwStatus.fwUpdateStatus == "InProgress")
            {
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                return response;
            }
            else
                LogMessage.Log(LogMessage.MessageType.Success, ref response);

            // Update PSU
            psu.psuFwUpdateResponse = this.TestChannelContext.UpdatePSUFirmware(psu.index,
                    psu.psuFwFilePath, psu.primaryImage);
            LogMessage.Message = string.Format(
                    "{0}: Psu {1} returned completion code {2} and status description {3}",
                    this.currentApi, psu.index, psu.psuFwUpdateResponse.completionCode,
                    psu.psuFwUpdateResponse.statusDescription);

            if (psu.psuFwUpdateResponse.completionCode != CompletionCode.Success)
            {
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                return response;
            }
            else
                LogMessage.Log(LogMessage.MessageType.Success, ref response);

            // Sleep for 1 minute
            LogMessage.Message = "Thread sleeping for 1 minutes...";
            LogMessage.Log(LogMessage.MessageType.Info, ref response);
            Thread.Sleep(TimeSpan.FromMinutes(1));

            // Check Psu Power Output is 0 using GetChassisHealth
            ChassisHealthResponse getChassisHealthResponse = new ChassisHealthResponse();
            getChassisHealthResponse = this.TestChannelContext.GetChassisHealth(false, true, false, false);
            PsuInfo psuHealth = getChassisHealthResponse.psuInfoCollection
                .FirstOrDefault(x => x.id == psu.index);

            LogMessage.Message = string.Format(
                "{0}: GetChassisHealth for Psu {1} - completionCode {2} and powerOut {3}",
                this.currentApi, psuHealth.id, getChassisHealthResponse.completionCode,
                psuHealth.powerOut);

            if (getChassisHealthResponse.completionCode == CompletionCode.Success &&
                psuHealth.powerOut == 0)
                LogMessage.Log(LogMessage.MessageType.Success, ref response);
            else
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);

            testCase.LogPassOrFail(ref response, this.currentApi);
            return response;
        }
        /// <summary>
        /// Test Command: GetChassisInfo: Get Only blade information (bladeInfo=true). 
        /// </summary>
        /// <param name="allPassed"></param>
        /// <param name="chassisInfo"></param>
        /// <returns>True if all check-points pass; false, otherwise.</returns>
        private TestResponse VerifyOnlyChassisBladeInfo(ChassisInfoResponse chassisInfo)
        {
            TestResponse response = new TestResponse();
            try
            {
                response.Result = ChassisManagerTestHelper.IsTrue(chassisInfo != null, "Received chasssis information ");

                // Return if chassis information is null
                if (response.Result == false)
                {
                    response.ResultDescription.Append("\nReceived chassis object is null");
                    return response;
                }

                if (chassisInfo.completionCode != CompletionCode.Success)
                {
                    response.Result = false;
                    response.ResultDescription.Append("\nFailed to get chassis information with only bladeInfo set to true, completion code returned: " + chassisInfo.completionCode);
                    CmTestLog.Failure(response.ResultDescription.ToString());
                    return response;
                }
                CmTestLog.Success("Successfully received chassis information");

                response = this.VerifyChassisBladeInfo(chassisInfo);

                // Verify battery info is empty
                if (!ChassisManagerTestHelper.IsTrue(chassisInfo.batteryCollections.Count == 0, "Battery information is empty"))
                {
                    response.Result &= false;
                    response.ResultDescription.Append("\nVerifyOnlyChassisBladeInfo failed: Battery information is not empty");
                }

                // Verify PSU information is empty
                if (!ChassisManagerTestHelper.IsTrue(chassisInfo.psuCollections.Count == 0, "PSU information is empty"))
                {
                    response.Result &= false;
                    response.ResultDescription.Append("\nVerifyOnlyChassisBatteryInfo failed: PSU information is not empty");
                }

                // Verify chassis controller info is empty
                if (!ChassisManagerTestHelper.IsTrue(chassisInfo.chassisController == null, "Chassis controller information is empty"))
                {
                    response.Result &= false;
                    response.ResultDescription.Append("\nVerifyOnlyChassisBatteryInfo failed: Chassis Controller information is not empty");
                }
            }
            catch (Exception ex)
            {
                ChassisManagerTestHelper.IsTrue(false, ex.Message);
                response.Result = false;
                response.ResultDescription.Append(ex.Message);
            }

            return response;
        }
        private TestResponse SuccessfulMultiplePriSecFwUpdatesForUpdatePsuFirmware()
        {
            // Change test case Id and fwFilePath if testing Les or Non-Les Psus
            int testCaseId = -1;
            if (lesPsusInChassis == "1") // currently testing LES PSU
                testCaseId = 22765;
            else
                testCaseId = 22768;

            TestCase testCase = new TestCase("SuccessfulMultiplePriSecFwUpdatesForUpdatePsuFirmware", testCaseId);

            CmTestLog.Info(string.Format(
                "\n !!!!!!Verifying {0} Returns Successful Psu Fw Image Updates for Multiple Primary and Secondary Fw Psus. WorkItemId: {1}!!!!!!",
                this.currentApi, testCase.WorkItemId));
            TestResponse response = new TestResponse();

            // Get random valid Psu Ids
            int[] psuIds = null;
            if (!ReturnSingleOrMultipleRandomPsus(3, ref psuIds, ref response))
                return response;

            // Initialize multiple UpdatePsu elements and add to psuList
            List<UpdatePsu> psuList = new List<UpdatePsu>();
            if (lesPsusInChassis == "1")
            {
                psuList.Add(new UpdatePsu(psuIds[0], this.priLesFwFilePath, primaryImage));
                psuList.Add(new UpdatePsu(psuIds[1], this.secLesFwFilePath, secondaryImage));
                psuList.Add(new UpdatePsu(psuIds[2], this.priLesFwFilePath, primaryImage));
            }
            else
            {
                psuList.Add(new UpdatePsu(psuIds[0], this.priNonLesFwFilePath, primaryImage));
                psuList.Add(new UpdatePsu(psuIds[1], this.secNonLesFwFilePath, secondaryImage));
                psuList.Add(new UpdatePsu(psuIds[2], this.priNonLesFwFilePath, primaryImage));
            }

            // Verify Primary and Secondary Psu Fw Update
            VerifyPsuFwUpdate(ref psuList, ref response);

            testCase.LogPassOrFail(ref response, currentApi);
            return response;
        }
        private TestResponse SuccessfulPriOrSecNotBothFwUpdateForUpdatePsuFirmware()
        {
            // Change test case Id and fwFilePath if testing Les or Non-Les Psus
            int testCaseId = -1;
            string fwFilePath;
            if (lesPsusInChassis == "1") // currently testing LES PSU
            {
                testCaseId = 22848;
                fwFilePath = this.priLesFwFilePath;
            }
            else
            {
                testCaseId = 22864;
                fwFilePath = this.priNonLesFwFilePath;
            }

            TestCase testCase = new TestCase("SuccessfulMultiplePriSecFwUpdatesForUpdatePsuFirmware", testCaseId);

            CmTestLog.Info(string.Format(
                "\n !!!!!!Verifying {0} Only Allows Successful Primary Or Secondary Psu Fw Image To Be Updated, Not Both. WorkItemId: {1}!!!!!!",
                this.currentApi, testCase.WorkItemId));
            TestResponse response = new TestResponse();

            // Get random valid Psu Id
            int[] psuIds = null;
            if (!ReturnSingleOrMultipleRandomPsus(1, ref psuIds, ref response))
                return response;
            UpdatePsu psu = new UpdatePsu(psuIds[0], fwFilePath, primaryImage);

            // Run test case using WcsCmAdmin
            this.TestChannelContext = this.ListTestChannelContexts[(int)WCSSecurityRole.WcsCmAdmin];

            psu.psuFwStatus = this.TestChannelContext.GetPSUFirmwareStatus(psu.index);
            LogMessage.Message = string.Format(
                    "{0}: GetPsuFirmwareStatus for PSU {1} before update - fwRevision: {2} completionCode: {3} fwUpdateStatus: {4} fwUpdateStage: {5}",
                    this.currentApi, psu.index, psu.psuFwStatus.fwRevision, psu.psuFwStatus.completionCode,
                    psu.psuFwStatus.fwUpdateStatus, psu.psuFwStatus.fwUpdateStage);

            // Verify PSU is available for update
            if (psu.psuFwStatus.completionCode != CompletionCode.Success ||
                psu.psuFwStatus.fwUpdateStatus == "InProgress")
            {
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                return response;
            }
            else
                LogMessage.Log(LogMessage.MessageType.Success, ref response);

            // Update PSU
            psu.psuFwUpdateResponse = this.TestChannelContext.UpdatePSUFirmware(psu.index,
                    psu.psuFwFilePath, psu.primaryImage);
            LogMessage.Message = string.Format(
                    "{0}: Psu {1} returned completion code {2} and status description {3}",
                    this.currentApi, psu.index, psu.psuFwUpdateResponse.completionCode,
                    psu.psuFwUpdateResponse.statusDescription);

            if (psu.psuFwUpdateResponse.completionCode != CompletionCode.Success)
            {
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                return response;
            }
            else
                LogMessage.Log(LogMessage.MessageType.Success, ref response);

            // Sleep for 5 minutes
            LogMessage.Message = "Thread sleeping for 5 minutes...";
            LogMessage.Log(LogMessage.MessageType.Info, ref response);
            Thread.Sleep(TimeSpan.FromMinutes(5));

            // Verify PSU is still updating
            psu.psuFwStatus = this.TestChannelContext.GetPSUFirmwareStatus(psu.index);
            LogMessage.Message = string.Format(
                    "{0}: GetPsuFirmwareStatus for PSU {1} after 5 minutes - fwRevision: {2} completionCode: {3} fwUpdateStatus: {4} fwUpdateStage: {5}",
                    this.currentApi, psu.index, psu.psuFwStatus.fwRevision, psu.psuFwStatus.completionCode,
                    psu.psuFwStatus.fwUpdateStatus, psu.psuFwStatus.fwUpdateStage);

            // Verify PSU is still updating
            if (psu.psuFwStatus.completionCode != CompletionCode.Success ||
                psu.psuFwStatus.fwUpdateStatus != "InProgress")
            {
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                return response;
            }
            else
                LogMessage.Log(LogMessage.MessageType.Success, ref response);

            // Attempt to update PSU with secondary image and verify Failure
            if (lesPsusInChassis == "1")
                psu.psuFwFilePath = this.secLesFwFilePath;
            else
                psu.psuFwFilePath = this.secNonLesFwFilePath;
            psu.psuFwUpdateResponse = this.TestChannelContext.UpdatePSUFirmware(psu.index, psu.psuFwFilePath, secondaryImage);
            LogMessage.Message = string.Format(
                    "{0}: Psu {1} returned completion code {2} and status description {3}",
                    this.currentApi, psu.index, psu.psuFwUpdateResponse.completionCode,
                    psu.psuFwUpdateResponse.statusDescription);

            if (psu.psuFwUpdateResponse.completionCode != CompletionCode.Failure)
            {
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                return response;
            }
            else
                LogMessage.Log(LogMessage.MessageType.Success, ref response);

            // Sleep for 7 more minutes
            LogMessage.Message = "Thread sleeping for 7 minutes...";
            LogMessage.Log(LogMessage.MessageType.Info, ref response);
            Thread.Sleep(TimeSpan.FromMinutes(7));

            // Verify successful Primary PSU Fw Update
            psu.psuFwStatus = this.TestChannelContext.GetPSUFirmwareStatus(psu.index);
            LogMessage.Message = string.Format(
                "{0}: GetPsuFWStatus for Psu {1} - fwRevision: {2} completionCode: {3} fwUpdateStatus: {4} fwUpdateStage: {5}",
                currentApi, psu.index, psu.psuFwStatus.fwRevision, psu.psuFwStatus.completionCode,
                psu.psuFwStatus.fwUpdateStatus, psu.psuFwStatus.fwUpdateStage);

            if (psu.psuFwStatus.completionCode != CompletionCode.Success ||
                    ((psu.psuFwStatus.fwUpdateStatus != "Success")
                    && (psu.psuFwStatus.fwUpdateStage != "Completed")))
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
            else
                LogMessage.Log(LogMessage.MessageType.Success, ref response);

            // Verify Successful Secondary PSU Fw Update if Primary was successful
            List<UpdatePsu> psuList = new List<UpdatePsu>();
            psuList.Add(psu);
            if (response.Result)
                VerifyPsuFwUpdate(ref psuList, ref response);

            testCase.LogPassOrFail(ref response, this.currentApi);
            return response;
        }