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;
        }
        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;
        }
        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;
        }
        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;
        }
        private TestResponse InvalidRequestForInvalidPassThroughSetBladeMezzPassThroughMode(int bladeId)
        {
            TestCase testCase = new TestCase("InvalidRequestForInvalidPassThroughSetBladeMezzPassThroughMode", 24197);

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

            BladeResponse setBladeMezzResponse = new BladeResponse();
            this.TestChannelContext = this.ListTestChannelContexts[(int)WCSSecurityRole.WcsCmAdmin];

            Dictionary<string, string> InvalidPassThroughModeEnabled = new Dictionary<string, string>();

            InvalidPassThroughModeEnabled.Add("min64", "-9223372036854775808");
            InvalidPassThroughModeEnabled.Add("max64", "9223372036854775807");
            InvalidPassThroughModeEnabled.Add("invalidString", "abc123_!&");
            InvalidPassThroughModeEnabled.Add("emptyString", string.Empty);
            InvalidPassThroughModeEnabled.Add("invalidTrue1", "ttrue");
            InvalidPassThroughModeEnabled.Add("invalidTrue2", "frue");
            InvalidPassThroughModeEnabled.Add("invalidFalse1", "ffalse");
            InvalidPassThroughModeEnabled.Add("invalidFalse2", "fazse");
            InvalidPassThroughModeEnabled.Add("nullString", null);

            // test SetBladeMezzPassThroughMode passThroughModeEnabled parameter for each invalid value
            foreach (string invalidValue in InvalidPassThroughModeEnabled.Values)
            {
                setBladeMezzResponse = this.TestChannelContext.SetBladeMezzPassThroughMode(bladeId, invalidValue);
                LogMessage.Message = string.Format(
                        "{0}: Command returns completion code {1} and status description {2} for invalid passThroughModeEnabled {3} for bladeId {4}",
                        currentApi, setBladeMezzResponse.completionCode, setBladeMezzResponse.statusDescription, invalidValue, bladeId);

                if (setBladeMezzResponse.completionCode == CompletionCode.Failure &&
                    setBladeMezzResponse.statusDescription == "Invalid Request")
                    LogMessage.Log(LogMessage.MessageType.Success, ref response);
                else
                    LogMessage.Log(LogMessage.MessageType.Failure, ref response);
            }

            testCase.LogPassOrFail(ref response, currentApi);
            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;
        }
        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;
        }
        private TestResponse CommandNotValidJBODGetBladeMezzPassThroughMode(int bladeId)
        {
            TestCase testCase = new TestCase("CommandNotValidJBODGetBladeMezzPassThroughMode", 24167);

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

            BladeMezzPassThroughModeResponse getBladeMezzResponse = new BladeMezzPassThroughModeResponse();
            this.TestChannelContext = this.ListTestChannelContexts[(int)WCSSecurityRole.WcsCmAdmin];

            // Call API and verify CommandNotValidForBlade
            getBladeMezzResponse = this.TestChannelContext.GetBladeMezzPassThroughMode(bladeId);
            LogMessage.Message = string.Format(
                    "{0}: Command for JBOD location returned completion code {1} and blade Id {2}",
                    this.currentApi, getBladeMezzResponse.completionCode, bladeId);

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

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

            return response;
        }
        private TestResponse CorrectFruContentForGetBladeMezzAssetInfo(int bladeId)
        {
            TestCase testCase = new TestCase("CorrectFruContentForGetBladeMezzAssetInfo", 27202);

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

            BladeMessAssetInfoResponse getMezzAssetResponse = new BladeMessAssetInfoResponse();
            this.TestChannelContext = this.ListTestChannelContexts[(int)WCSSecurityRole.WcsCmAdmin];

            // Call API and verify FRU output is correct
            getMezzAssetResponse = this.TestChannelContext.GetBladeMezzAssetInfo(bladeId);
            VerifyMezzFruContent(getMezzAssetResponse, ref response);

            testCase.LogPassOrFail(ref response, this.currentApi);
            return response;
        }
        private TestResponse VerifySuccessWithCapitalizationOfPassThroughSetBladeMezzPassThroughMode(int bladeId)
        {
            TestCase testCase = new TestCase("VerifySuccessWithCapitalizationOfPassThroughSetBladeMezzPassThroughMode", 24201);

            CmTestLog.Info(string.Format(
                "\n !!!!!!Verifying {0} Returns Completion Code Success for PassThroughModeEnabled With Capitalization. WorkItemIds: 24200 and {1}!!!!!!",
                this.currentApi, testCase.WorkItemId));
            TestResponse response = new TestResponse();

            BladeResponse setBladeMezzResponse = new BladeResponse();
            this.TestChannelContext = this.ListTestChannelContexts[(int)WCSSecurityRole.WcsCmAdmin];

            Dictionary<string, string> CapitalizedPassThroughModeEnabled = new Dictionary<string, string>();

            CapitalizedPassThroughModeEnabled.Add("Value1", "true");
            CapitalizedPassThroughModeEnabled.Add("Value2", "false");
            CapitalizedPassThroughModeEnabled.Add("Value3", "TRUE");
            CapitalizedPassThroughModeEnabled.Add("Value4", "FALSE");
            CapitalizedPassThroughModeEnabled.Add("Value5", "tRue");
            CapitalizedPassThroughModeEnabled.Add("Value6", "faLse");

            foreach (string capitalizedValue in CapitalizedPassThroughModeEnabled.Values)
            {
                setBladeMezzResponse = this.TestChannelContext.SetBladeMezzPassThroughMode(bladeId, capitalizedValue);

                LogMessage.Message = string.Format(
                        "{0}: Command returned Completion Code {1} for PassThroughModeEnabled value {2} for blade Id {3}",
                        this.currentApi, setBladeMezzResponse.completionCode, capitalizedValue, bladeId);

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

            testCase.LogPassOrFail(ref response, currentApi);
            return response;
        }
        private TestResponse AllGroupsCanExecuteGetBladeMezzPassThroughMode(int bladeId)
        {
            TestCase testCase = new TestCase("AllGroupsCanExecuteGetBladeMezzPassThroughMode", 24166);

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

            // Loop through different user types
            foreach (WCSSecurityRole roleId in Enum.GetValues(typeof(WCSSecurityRole)))
            {
                BladeMezzPassThroughModeResponse getBladeMezzResponse = new BladeMezzPassThroughModeResponse();

                // Use different user context
                this.TestChannelContext = this.ListTestChannelContexts[(int)roleId];

                // Get Pass Through Mode and verify
                getBladeMezzResponse = this.TestChannelContext.GetBladeMezzPassThroughMode(bladeId);

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

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

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

            return response;
        }
        private TestResponse TrueAfterRestartGetBladeMezzPassThroughMode(int bladeId)
        {
            TestCase testCase = new TestCase("TrueAfterRestartGetBladeMezzPassThroughMode", 24181);

            CmTestLog.Info(string.Format(
                "\n !!!!!!Verifying {0} Returns Correct Pass-ThroughMode After Restarting Blade. WorkItemId: {1}!!!!!!",
                this.currentApi, testCase.WorkItemId));
            TestResponse response = new TestResponse();

            BladeResponse setBladeActivePowerCycleResponse = new BladeResponse();
            BladeStateResponse getBladeStateResponse = new BladeStateResponse();
            this.TestChannelContext = this.ListTestChannelContexts[(int)WCSSecurityRole.WcsCmAdmin];

            // Restart blade
            setBladeActivePowerCycleResponse = this.TestChannelContext.SetBladeActivePowerCycle(bladeId, Convert.ToInt32(CmConstants.OffTimeSec));
            if (setBladeActivePowerCycleResponse.completionCode != CompletionCode.Success)
            {
                LogMessage.Message = string.Format(
                    "{0}: Failed to restart blade {1} with completion code {2}",
                    this.currentApi, bladeId, setBladeActivePowerCycleResponse.completionCode);
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
            }

            // Sleep Thread for 2 minutes 30 seconds
            CmTestLog.Info(string.Format("Thread sleeping for {0} seconds...",
                TimeSpan.FromSeconds(150)));
            Thread.Sleep(TimeSpan.FromSeconds(150));

            // Verify blade soft-powered on
            getBladeStateResponse = this.TestChannelContext.GetBladeState(bladeId);
            if (getBladeStateResponse.completionCode != CompletionCode.Success ||
                getBladeStateResponse.bladeState != PowerState.ON)
            {
                LogMessage.Message = string.Format(
                        "{0}: Blade {1} did not soft-power ON",
                        this.currentApi, bladeId);
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
            }
            else
            {
                CallAndVerifyGetBladeMezzPassThroughMode(bladeId, ref response, "true");
            }

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

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

            BladeResponse setBladeMezzResponse = new BladeResponse();
            this.TestChannelContext = this.ListTestChannelContexts[(int)WCSSecurityRole.WcsCmAdmin];

            foreach (int invalidValue in Enum.GetValues(typeof(InvalidBladeId)))
            {
                setBladeMezzResponse = this.TestChannelContext.SetBladeMezzPassThroughMode(invalidValue, "true");
                LogMessage.Message = string.Format(
                        "{0}: Command returns completion code {1} for invalid blade Id {2}",
                        this.currentApi, setBladeMezzResponse.completionCode, invalidValue);

                if (setBladeMezzResponse.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;
        }
        private TestResponse OnlyAdminCanExecuteSetBladeMezzPassThroughMode(int bladeId)
        {
            TestCase testCase = new TestCase("OnlyAdminCanExecuteSetBladeMezzPassThroughMode", 24171);

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

            BladeResponse setBladeMezzResponse = new BladeResponse();

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

                try
                {
                    setBladeMezzResponse = this.TestChannelContext.SetBladeMezzPassThroughMode(bladeId, "true");
                    LogMessage.Message = string.Format(
                            "{0}: Command returns completion code {1} for user {2} for blade Id {3}",
                            currentApi, setBladeMezzResponse.completionCode, Enum.GetName(typeof(WCSSecurityRole), roleId), bladeId);

                    if (setBladeMezzResponse.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 bladeId {2}",
                            currentApi, Enum.GetName(typeof(WCSSecurityRole), roleId), bladeId);

                        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 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;
        }
        private TestResponse CorrectModeAfterToggleGetBladeMezzPassThroughMode(int bladeId)
        {
            TestCase testCase = new TestCase("CorrectModeAfterToggleGetBladeMezzPassThroughMode", 24180);

            CmTestLog.Info(string.Format(
                "\n !!!!!!Verifying {0} Returns Correct Pass-ThroughMode After Toggling SetBladeMezzPassThroughMode. WorkItemId: {1}!!!!!!",
                this.currentApi, testCase.WorkItemId));
            TestResponse response = new TestResponse();

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

            CallAndVerifySetBladeMezzPassThroughMode(bladeId, ref response, "true");
            CallAndVerifyGetBladeMezzPassThroughMode(bladeId, ref response, "true");
            CallAndVerifyGetBladeMezzPassThroughMode(bladeId, ref response, "true");

            CallAndVerifySetBladeMezzPassThroughMode(bladeId, ref response, "false");
            CallAndVerifyGetBladeMezzPassThroughMode(bladeId, ref response, "false");
            CallAndVerifyGetBladeMezzPassThroughMode(bladeId, ref response, "false");

            CallAndVerifySetBladeMezzPassThroughMode(bladeId, ref response, "true");
            CallAndVerifyGetBladeMezzPassThroughMode(bladeId, ref response, "true");

            CallAndVerifySetBladeMezzPassThroughMode(bladeId, ref response, "true");
            CallAndVerifyGetBladeMezzPassThroughMode(bladeId, ref response, "true");

            CallAndVerifySetBladeMezzPassThroughMode(bladeId, ref response, "false");
            CallAndVerifyGetBladeMezzPassThroughMode(bladeId, ref response, "false");

            CallAndVerifySetBladeMezzPassThroughMode(bladeId, ref response, "false");
            CallAndVerifyGetBladeMezzPassThroughMode(bladeId, ref response, "false");

            testCase.LogPassOrFail(ref response, currentApi);

            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;
        }
        private TestResponse DevicePoweredOffForHardOffGetBladeMezzAssetInfo(int bladeId)
        {
            TestCase testCase = new TestCase("FailureForHardOffGetBladeMezzAssetInfo", 27452);

            CmTestLog.Info(string.Format(
                "\n !!!!!!Verifying {0} Returns DevicePoweredOff for Server Blade Hard-Powered Off. WorkItemId: {1}!!!!!!",
                this.currentApi, testCase.WorkItemId));
            TestResponse response = new TestResponse();

            BladeMessAssetInfoResponse getMezzAssetResponse = new BladeMessAssetInfoResponse();
            this.TestChannelContext = this.ListTestChannelContexts[(int)WCSSecurityRole.WcsCmAdmin];

            // Hard-Power Off server blade
            BladeResponse bladeResponse = this.TestChannelContext.SetPowerOff(bladeId);
            if (bladeResponse.completionCode != CompletionCode.Success)
            {
                LogMessage.Message = string.Format(
                    "{0}: Unable to hard-power Off server blade {1}",
                    this.currentApi, bladeId);
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
            }
            else
            {
                CmTestLog.Info(string.Format("Hard-powered Off blade {0}. Thread sleeping for {1} seconds...",
                bladeId, CmConstants.BladePowerOffSeconds));
                Thread.Sleep(TimeSpan.FromSeconds(CmConstants.BladePowerOffSeconds));

                // Call API and verify DevicePoweredOff
                getMezzAssetResponse = this.TestChannelContext.GetBladeMezzAssetInfo(bladeId);
                LogMessage.Message = string.Format(
                        "{0}: Command returns completion code {1} after blade {2} is hard-powered Off",
                        this.currentApi, getMezzAssetResponse.completionCode, bladeId);
                if (getMezzAssetResponse.completionCode != CompletionCode.DevicePoweredOff)
                    LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                else
                    LogMessage.Log(LogMessage.MessageType.Success, ref response);
            }

            // Test CleanUp: Hard-Power On and Soft-Power On Blade
            bladeResponse = this.TestChannelContext.SetPowerOn(bladeId);
            if (bladeResponse.completionCode != CompletionCode.Success)
            {
                LogMessage.Message = string.Format(
                    "{0}: Unable to hard-power On server blade {1}",
                    this.currentApi, bladeId);
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                return response;
            }

            CmTestLog.Info(string.Format("Hard-powered On blade {0}. Thread sleeping for {1} seconds...",
                bladeId, CmConstants.BladePowerOnSeconds));
            Thread.Sleep(TimeSpan.FromSeconds(CmConstants.BladePowerOnSeconds));

            bladeResponse = this.TestChannelContext.SetBladeOn(bladeId);
            if (bladeResponse.completionCode != CompletionCode.Success)
            {
                LogMessage.Message = string.Format(
                    "{0}: Unable to soft-power on server blade {1}",
                    this.currentApi, bladeId);
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                return response;
            }

            CmTestLog.Info(string.Format("Soft-powered on blade {0}. Thread sleeping for {1} seconds...",
                bladeId, CmConstants.BladePowerOnSeconds));
            Thread.Sleep(TimeSpan.FromSeconds(CmConstants.BladePowerOnSeconds));

            testCase.LogPassOrFail(ref response, this.currentApi);
            return response;
        }
        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 FailureForEmptySetBladeMezzPassThroughMode(int bladeId)
        {
            TestCase testCase = new TestCase("FailureForEmptySetBladeMezzPassThroughMode", 24169);

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

            BladeResponse setBladeMezzResponse = new BladeResponse();
            this.TestChannelContext = this.ListTestChannelContexts[(int)WCSSecurityRole.WcsCmAdmin];

            // Call API and verify Failure
            setBladeMezzResponse = this.TestChannelContext.SetBladeMezzPassThroughMode(bladeId, "true");
            LogMessage.Message = string.Format(
                    "{0}: Command failed for empty location with completion code {1} and blade Id {2}",
                    this.currentApi, setBladeMezzResponse.completionCode, bladeId);

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

            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;
        }
        private TestResponse FailureForSoftOffSetBladeMezzPassThroughMode(int bladeId)
        {
            TestCase testCase = new TestCase("FailureForSoftOffSetBladeMezzPassThroughMode", 27172);

            CmTestLog.Info(string.Format(
                "\n !!!!!!Verifying {0} Returns Failure for Server Blade Soft-Powered Off. WorkItemId: {1}!!!!!!",
                this.currentApi, testCase.WorkItemId));
            TestResponse response = new TestResponse();

            BladeResponse setBladeMezzResponse = new BladeResponse();
            this.TestChannelContext = this.ListTestChannelContexts[(int)WCSSecurityRole.WcsCmAdmin];

            // Soft-Power Off server blade
            BladeResponse bladeResponse = this.TestChannelContext.SetBladeOff(bladeId);
            if (bladeResponse.completionCode != CompletionCode.Success)
            {
                LogMessage.Message = string.Format(
                    "{0}: Unable to soft-power off server blade {1}",
                    this.currentApi, bladeId);
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
            }
            else
            {
                CmTestLog.Info(string.Format("Hard-powered On blade {0}. Thread sleeping for {1} seconds...",
                bladeId, CmConstants.BladePowerOnSeconds));
                Thread.Sleep(TimeSpan.FromSeconds(CmConstants.BladePowerOnSeconds));

                // Call API and verify Failure
                setBladeMezzResponse = this.TestChannelContext.SetBladeMezzPassThroughMode(bladeId, "true");
                LogMessage.Message = string.Format(
                        "{0}: Command returns completion code {1} after blade {2} is soft-powered off",
                        this.currentApi, setBladeMezzResponse.completionCode, bladeId);

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

            // Code clean-up. Soft-power on blade
            bladeResponse = this.TestChannelContext.SetBladeOn(bladeId);
            if (bladeResponse.completionCode != CompletionCode.Success)
            {
                LogMessage.Message = string.Format(
                    "{0}: Unable to soft-power on server blade {1}",
                    this.currentApi, bladeId);
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                return response;
            }

            testCase.LogPassOrFail(ref response, currentApi);
            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 FruContentMatchesAfterSoftCycleForGetBladeMezzAssetInfo(int bladeId)
        {
            TestCase testCase = new TestCase("FruContentMatchesAfterSoftCycleForGetBladeMezzAssetInfo", 27450);

            CmTestLog.Info(string.Format("\n !!!!!!Verifying {0} Returns Same Fru Information After Soft-Power Cycle. WorkItemId: {1}!!!!!!",
                this.currentApi, testCase.WorkItemId));
            TestResponse response = new TestResponse();

            BladeMessAssetInfoResponse previousGetMezzAssetResponse = new BladeMessAssetInfoResponse();
            BladeMessAssetInfoResponse currentGetMezzAssetResponse = new BladeMessAssetInfoResponse();
            this.TestChannelContext = this.ListTestChannelContexts[(int)WCSSecurityRole.WcsCmAdmin];

            previousGetMezzAssetResponse = this.TestChannelContext.GetBladeMezzAssetInfo(bladeId);

            // Soft-Power Cycle Blade
            BladeResponse setPowerResponse = this.TestChannelContext.SetBladeActivePowerCycle(bladeId, (int)CmConstants.OffTimeSec);
            LogMessage.Message = string.Format("{0}: Soft-Power Cycled Blade {1}",
                this.currentApi, bladeId);
            if (setPowerResponse.completionCode != CompletionCode.Success)
            {
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                return response;
            }
            else
                LogMessage.Log(LogMessage.MessageType.Success, ref  response);

            // Thread Sleep
            LogMessage.Message = string.Format("Blade Soft-Power Cycling. Thread sleeping for {0} seconds...",
                (CmConstants.BladePowerOffSeconds + CmConstants.BladePowerOnSeconds));
            LogMessage.Log(LogMessage.MessageType.Info, ref response);
            Thread.Sleep(TimeSpan.FromSeconds(CmConstants.BladePowerOffSeconds + CmConstants.BladePowerOnSeconds));

            // Get Fru Content after Soft-Power cycle
            currentGetMezzAssetResponse = this.TestChannelContext.GetBladeMezzAssetInfo(bladeId);
            LogMessage.Message = string.Format(
                "{0}: Command returns completionCode {1} for blade {2}",
                this.currentApi, currentGetMezzAssetResponse.completionCode, bladeId);
            if (currentGetMezzAssetResponse.completionCode != CompletionCode.Success)
            {
                LogMessage.Log(LogMessage.MessageType.Failure, ref response);
                return response;
            }
            else
                LogMessage.Log(LogMessage.MessageType.Success, ref response);

            // Verify Fru Contents are same as before
            VerifyFruStringsMatch(previousGetMezzAssetResponse.bladeNumber.ToString(),
                currentGetMezzAssetResponse.bladeNumber.ToString(), ref response);
            VerifyFruStringsMatch(previousGetMezzAssetResponse.productAreaManufactureName,
                currentGetMezzAssetResponse.productAreaManufactureName, ref response);
            VerifyFruStringsMatch(previousGetMezzAssetResponse.productAreaProductName,
                currentGetMezzAssetResponse.productAreaProductName, ref response);
            VerifyFruStringsMatch(previousGetMezzAssetResponse.productAreaPartModelNumber,
                currentGetMezzAssetResponse.productAreaPartModelNumber, ref response);
            VerifyFruStringsMatch(previousGetMezzAssetResponse.productAreaProductVersion,
                currentGetMezzAssetResponse.productAreaProductVersion, ref response);
            VerifyFruStringsMatch(previousGetMezzAssetResponse.productAreaSerialNumber,
                currentGetMezzAssetResponse.productAreaSerialNumber, ref response);
            VerifyFruStringsMatch(previousGetMezzAssetResponse.productAreaAssetTag,
                currentGetMezzAssetResponse.productAreaAssetTag, ref response);

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