private void VerifyBladeAssetInfo(ref bool bladePassed, int bladeId, int user, string payload)
        {
            bool isTrue;
            int maxStringLength = 56;
            string propertyValue;

            BladeAssetInfoResponse bladeAssetInfo = new BladeAssetInfoResponse();

            this.TestChannelContext = this.ListTestChannelContexts[user];

            bladeAssetInfo = this.TestChannelContext.GetBladeAssetInfo(bladeId);

            // get completion code success
            bladePassed = ChassisManagerTestHelper.AreEqual(CompletionCode.Success, bladeAssetInfo.completionCode,
                string.Format("GetBladeAssetInfo: Completion Code Success for bladeId {0}", bladeId.ToString()));

            if (bladePassed)
            {
                // Get Blade Fru XML Sample
                string fruDefFileDir = Path.Combine(Directory.GetCurrentDirectory(), "TestData");
                string fruFileName = Path.Combine(fruDefFileDir, "BladeFruSample.xml");

                if (!File.Exists(fruFileName))
                {
                    throw new ApplicationException(string.Format("GetBladeAssetInfo: Sample Xml file is NOT found under the path {0}", fruDefFileDir));
                }

                // Extract BladeFruSample Xml file
                XmlReader bladeFruXml = XmlReader.Create(fruFileName);

                bladePassed &= ChassisManagerTestHelper.AreEqual(bladeId, bladeAssetInfo.bladeNumber,
                    string.Format("GetBladeAssetInfo: Received Blade Number for bladeId {0}", bladeId));

                bladeFruXml.ReadToFollowing("chassisAreaPartNumber");
                propertyValue = bladeFruXml.ReadElementContentAsString();
                bladePassed &= ChassisManagerTestHelper.AreEqual(propertyValue, bladeAssetInfo.chassisAreaPartNumber,
                    string.Format("GetBladeAssetInfo: Received Chassis Area Part Number for blade {0}", bladeId));

                isTrue = bladeAssetInfo.chassisAreaSerialNumber.Length <= 16;
                bladePassed &= ChassisManagerTestHelper.IsTrue(isTrue,
                    string.Format("GetBladeAssetInfo: Received Chassis Area Serial Number for blade {0}", bladeId));

                bladeFruXml.ReadToFollowing("boardAreaManufacturerName");
                propertyValue = bladeFruXml.ReadElementContentAsString();
                bladePassed &= ChassisManagerTestHelper.AreEqual(propertyValue, bladeAssetInfo.boardAreaManufacturerName,
                    string.Format("GetBladeAssetInfo: Received Board Area Manufacturer Name for blade {0}", bladeId));

                bladeFruXml.ReadToFollowing("boardAreaManufacturerDate");
                propertyValue = bladeFruXml.ReadElementContentAsString();
                Match propertyMatch = Regex.Match(propertyValue, @"0[1-9]|[1-12]/0[0-9]|[0-31]/[1-2][09][01789]\d\s\d?\d:\d?\d:\d?\d\s[aApP][mM]");
                bladePassed &= ChassisManagerTestHelper.IsTrue(propertyMatch.Success,
                    string.Format("GetBladeAssetInfo: Received Board Area Manufacturer Date for blade {0}", bladeId));

                bladeFruXml.ReadToFollowing("boardAreaProductName");
                propertyValue = bladeFruXml.ReadElementContentAsString();
                bladePassed &= ChassisManagerTestHelper.AreEqual(propertyValue, bladeAssetInfo.boardAreaProductName,
                    string.Format("BladeAssetInfo: Received Board Area Product Name for blade {0}", bladeId));

                isTrue = bladeAssetInfo.boardAreaSerialNumber.Length <= 16;
                bladePassed &= ChassisManagerTestHelper.IsTrue(isTrue,
                    string.Format("GetBladeAssetInfo: Received Board Area Serial Number for blade {0}", bladeId));

                bladeFruXml.ReadToFollowing("boardAreaPartNumber");
                propertyValue = bladeFruXml.ReadElementContentAsString();
                bladePassed &= ChassisManagerTestHelper.AreEqual(propertyValue, bladeAssetInfo.boardAreaPartNumber,
                    string.Format("GetBladeAssetInfo: Received Board Area Part Number for blade {0}", bladeId));

                bladeFruXml.ReadToFollowing("productAreaManufactureName");
                propertyValue = bladeFruXml.ReadElementContentAsString();
                bladePassed &= ChassisManagerTestHelper.AreEqual(propertyValue, bladeAssetInfo.productAreaManufactureName,
                    string.Format("GetBladeAssetInfo: Received Product Area Manufacture Name for blade {0}", bladeId));

                bladeFruXml.ReadToFollowing("productAreaProductName");
                propertyValue = bladeFruXml.ReadElementContentAsString();
                bladePassed &= ChassisManagerTestHelper.AreEqual(propertyValue, bladeAssetInfo.productAreaProductName,
                    string.Format("GetBladeAssetInfo: Received Product Area Product Name for blade {0}", bladeId));

                bladeFruXml.ReadToFollowing("productAreaPartModelNumber");
                propertyValue = bladeFruXml.ReadElementContentAsString();
                bladePassed &= ChassisManagerTestHelper.AreEqual(propertyValue, bladeAssetInfo.productAreaPartModelNumber,
                    string.Format("GetBladeAssetInfo: Received Product Area Part Model Number for blade {0}", bladeId));

                bladeFruXml.ReadToFollowing("productAreaProductVersion");
                propertyValue = bladeFruXml.ReadElementContentAsString();
                bladePassed &= ChassisManagerTestHelper.AreEqual(propertyValue, bladeAssetInfo.productAreaProductVersion,
                    string.Format("GetBladeAssetInfo: Received Product Area Product Version for blade {0}", bladeId));

                isTrue = bladeAssetInfo.productAreaSerialNumber.Length <= 16;
                bladePassed &= ChassisManagerTestHelper.IsTrue(isTrue,
                    string.Format("GetBladeAssetInfo: Received Product Area Serial Number for blade {0}", bladeId));

                isTrue = bladeAssetInfo.productAreaAssetTag.Length <= 10;
                bladePassed &= ChassisManagerTestHelper.IsTrue(isTrue,
                    string.Format("GetBladeAssetInfo: Received Product Area Asset Tag for blade {0}", bladeId));

                bladeFruXml.ReadToFollowing("manufacturer");
                propertyValue = bladeFruXml.ReadElementContentAsString();
                bladePassed &= ChassisManagerTestHelper.AreEqual(propertyValue, bladeAssetInfo.manufacturer,
                    string.Format("GetBladeAssetInfo: Received Manufacturer for blade {0}", bladeId));

                // Verify multirecord fields are set
                if (payload != null)
                {
                    string[] payLoadFields = payload.Split(',').Select(field => field.Trim()).ToArray();

                    int fieldCount = 0;
                    string expectedField = null;

                    // Verify payLoad matches MultiRecordFields (only first two fields allowed)
                    if (bladeAssetInfo.multiRecordFields.Count() <= 2)
                    {
                        foreach (string actualField in bladeAssetInfo.multiRecordFields)
                        {
                            if (payLoadFields[fieldCount].Length > 56)
                            {
                                expectedField = payLoadFields[fieldCount].Substring(0, maxStringLength);
                            }
                            else
                            {
                                expectedField = payLoadFields[fieldCount];
                            }

                            bladePassed &= ChassisManagerTestHelper.AreEqual(expectedField, actualField,
                                string.Format("GetBladeAssetInfo: Received Field{0} '{1}'", fieldCount.ToString(), payLoadFields[fieldCount]));
                            fieldCount++;
                        }
                    }
                    else
                    {
                        CmTestLog.Failure("GetBladeAssetInfo: Command exceeded number of MultiRecord Fields allowed");
                    }
                }

                // Close Xml Reader
                bladeFruXml.Close();
            }
        }
        /// <summary>
        /// Gets the Blade FRU areas information. The FRU area consists of 3 parts:
        /// (i) Chassis Info Area; (ii) Board Info Area; and (iii) Product Info Area.
        /// </summary>
        /// <returns>AssetInfoResponse</returns>
        public BladeAssetInfoResponse GetBladeAssetInfo(int bladeId)
        {
            Tracer.WriteInfo("Invoked GetBladeAssetInfo() for blade Id {0}", bladeId);
            BladeAssetInfoResponse assetInfo = new BladeAssetInfoResponse();
            try
            {
                assetInfo.bladeNumber = bladeId;
                assetInfo.statusDescription = String.Empty;
                assetInfo.completionCode = Contracts.CompletionCode.Unknown;

                Contracts.ChassisResponse varResponse = ValidateRequest("GetBladeAssetInfo", bladeId);

                if (varResponse.completionCode != Contracts.CompletionCode.Success)
                {
                    assetInfo.completionCode = varResponse.completionCode;
                    assetInfo.statusDescription = varResponse.statusDescription;
                    return assetInfo;
                }

                Ipmi.FruDevice fruData = WcsBladeFacade.GetFruDeviceInfo((byte)bladeId);
                if (fruData == null)
                {
                    Tracer.WriteError("GetBladeAssetInfo(). FruDevice fruData object is null for blade {0}. Aborting... ", bladeId);
                    assetInfo.completionCode = Contracts.CompletionCode.Failure;
                    assetInfo.statusDescription = assetInfo.completionCode.ToString();
                    return assetInfo;
                }

                if (fruData.CompletionCode == (byte)CompletionCode.Success)
                {
                    // Populate Chassis Info Area parameters
                    assetInfo.chassisAreaPartNumber = fruData.ChassisInfo.PartNumber.ToString();
                    assetInfo.chassisAreaSerialNumber = fruData.ChassisInfo.SerialNumber.ToString();

                    // Populate Board Info Area parameters
                    assetInfo.boardAreaManufacturerName = fruData.BoardInfo.Maufacturer.ToString();
                    assetInfo.boardAreaManufacturerDate = fruData.BoardInfo.MfgDateTime.ToString();
                    assetInfo.boardAreaProductName = fruData.BoardInfo.ProductName.ToString();
                    assetInfo.boardAreaSerialNumber = fruData.BoardInfo.SerialNumber.ToString();
                    assetInfo.boardAreaPartNumber = fruData.BoardInfo.ProductPartNumber.ToString();

                    // Populate Product Info Area parameters
                    assetInfo.productAreaManufactureName = fruData.ProductInfo.ManufacturerName.ToString();
                    assetInfo.productAreaProductName = fruData.ProductInfo.ProductName.ToString();
                    assetInfo.productAreaPartModelNumber = fruData.ProductInfo.PartModelNumber.ToString();
                    assetInfo.productAreaProductVersion = fruData.ProductInfo.ProductVersion.ToString();
                    assetInfo.productAreaSerialNumber = fruData.ProductInfo.SerialNumber.ToString();
                    assetInfo.productAreaAssetTag = fruData.ProductInfo.AssetTag.ToString();

                    // Populate Multi Record Info Area parameters
                    if (fruData.MultiRecordInfo != null)
                    {
                        assetInfo.manufacturer = fruData.MultiRecordInfo.Manufacturer.ToString();

                        List<Ipmi.FruByteString> fields = fruData.MultiRecordInfo.Fields.ToList();
                        foreach (Ipmi.FruByteString field in fields)
                        {
                            assetInfo.multiRecordFields.Add(field.ToString());
                        }
                    }
                    else
                    {
                        Tracer.WriteError("GetBladeAssetInfo(). FRU Multi Record Area is empty for blade Id{0}", bladeId);
                    }

                    assetInfo.completionCode = Contracts.CompletionCode.Success;
                }
                else
                {
                    Tracer.WriteError("GetBladeAssetInfo(). Blade Fru Read failed with completion code: {0:X}", fruData.CompletionCode);
                    assetInfo.completionCode = Contracts.CompletionCode.Failure;
                }
            }
            catch (Exception ex)
            {
                Tracer.WriteError(
                    "GetBladeAssetInfo() failed with the exception: " + ex.Message);
                if (assetInfo.completionCode != Contracts.CompletionCode.Success)
                {
                    assetInfo.completionCode = Contracts.CompletionCode.Failure;
                    assetInfo.statusDescription = String.Format("GetBladeAssetInfo() failed with unknown error.");
                }
            }

            return assetInfo;
        }
        /// <summary>
        /// command specific implementation 
        /// </summary>
        internal override void commandImplementation()
        {
            BladeAssetInfoResponse myResponse = new BladeAssetInfoResponse();
            try
            {
                if (!(this.argVal.ContainsKey('i')))
                {
                    Console.WriteLine(WcsCliConstants.commandFailure +
                        " No blade ID specified, please look at command help.");
                    return;
                }
                else
                {
                    dynamic bladeId = null;
                    this.argVal.TryGetValue('i', out bladeId);
                    myResponse = WcsCli2CmConnectionManager.channel.GetBladeAssetInfo((int)bladeId);
                }
            }

            catch (Exception ex)
            {
                SharedFunc.ExceptionOutput(ex);
                return;
            }

            if (ResponseValidation.ValidateBladeResponse(myResponse.bladeNumber, null, myResponse, false))
            {
                Console.WriteLine(WcsCliConstants.commandSuccess);
                Console.WriteLine();
                Console.WriteLine("--------------------------------------");
                Console.WriteLine("Blade Chassis Info Area");
                Console.WriteLine("--------------------------------------");
                Console.WriteLine(
                    "Chassis Part Number = " + myResponse.chassisAreaPartNumber);
                Console.WriteLine(
                    "Chassis Serial Number = " + myResponse.chassisAreaSerialNumber);
                Console.WriteLine("--------------------------------------");
                Console.WriteLine();

                Console.WriteLine("Blade Board Info Area");
                Console.WriteLine("--------------------------------------");
                Console.WriteLine(
                    "Board Manufacturer Name = " + myResponse.boardAreaManufacturerName);
                Console.WriteLine(
                    "Board Manufacturer Date = " + myResponse.boardAreaManufacturerDate);
                Console.WriteLine(
                    "Board Product Name = " + myResponse.boardAreaProductName);
                Console.WriteLine(
                    "Board Serial Number = " + myResponse.boardAreaSerialNumber);
                Console.WriteLine(
                    "Board Part Number = " + myResponse.boardAreaPartNumber);
                Console.WriteLine("--------------------------------------");
                Console.WriteLine();

                Console.WriteLine("Blade Product Info Area");
                Console.WriteLine("--------------------------------------");
                Console.WriteLine(
                    "Product Manufacturer Name = " + myResponse.productAreaManufactureName);
                Console.WriteLine(
                    "Product Product Name = " + myResponse.productAreaProductName);
                Console.WriteLine(
                    "Product Part/Model Number = " + myResponse.productAreaPartModelNumber);
                Console.WriteLine(
                    "Product Version = " + myResponse.productAreaProductVersion);
                Console.WriteLine(
                    "Product Serial Number = " + myResponse.productAreaSerialNumber);
                Console.WriteLine("PD Product Asset Tag = "
                    + myResponse.productAreaAssetTag);
                Console.WriteLine("--------------------------------------");
                Console.WriteLine();

                Console.WriteLine("Multi Record Info Area");
                Console.WriteLine("--------------------------------------");
                Console.WriteLine("Manufacturer = " + myResponse.manufacturer);
                Console.WriteLine("Custom Fields");
                Console.WriteLine(string.Join("\n", myResponse.multiRecordFields.ToArray()));
            }
        }