Opc.Ua.ServerTest.BrowseTest.VerifyTargetAttributes C# (CSharp) Method

VerifyTargetAttributes() private method

Reads the attribute values in order to compare them to the returned results.
private VerifyTargetAttributes ( Node node, BrowseDescription description, ReferenceDescriptionCollection references ) : bool
node Node
description BrowseDescription
references ReferenceDescriptionCollection
return bool
        private bool VerifyTargetAttributes(
            Node node, 
            BrowseDescription description, 
            ReferenceDescriptionCollection references)
        {
            // check if nothing to do.
            if (references.Count == 0)
            {
                return true;
            }
            
            bool error = false;

            // build list of values to read.
            ReadValueIdCollection valuesToRead = new ReadValueIdCollection();

            for (int ii = 0; ii < references.Count; ii++)
            {
                ReferenceDescription reference = references[ii];

                // ignore invalid or external references.
                if (reference == null || reference.NodeId == null || reference.NodeId.IsAbsolute)
                {
                    continue;
                }

                ReadValueId valueToRead = new ReadValueId();

                valueToRead.NodeId = (NodeId)reference.NodeId;
                valueToRead.AttributeId = Attributes.NodeId;
                valueToRead.Handle = reference;

                valuesToRead.Add(valueToRead);
                                
                if ((description.ResultMask & (uint)BrowseResultMask.NodeClass) != 0)
                {
                    valueToRead = new ReadValueId();

                    valueToRead.NodeId = (NodeId)reference.NodeId;
                    valueToRead.AttributeId = Attributes.NodeClass;
                    valueToRead.Handle = reference;

                    valuesToRead.Add(valueToRead);
                }
                else
                {
                    if (reference.NodeClass != 0)
                    {
                        error = true;
                        
                        Log(
                            "Unexpected NodeClass when Browsing Node '{0}'. NodeId = {1}, TargetId = {2}, NodeClass = {3}", 
                            node, 
                            node.NodeId, 
                            reference.NodeId, 
                            reference.NodeClass);

                        continue;
                    }
                }
                                
                if ((description.ResultMask & (uint)BrowseResultMask.BrowseName) != 0)
                {
                    valueToRead = new ReadValueId();

                    valueToRead.NodeId = (NodeId)reference.NodeId;
                    valueToRead.AttributeId = Attributes.BrowseName;
                    valueToRead.Handle = reference;

                    valuesToRead.Add(valueToRead);
                }
                else
                {
                    if (!QualifiedName.IsNull(reference.BrowseName))
                    {
                        error = true;
                        
                        Log(
                            "Unexpected BrowseName when Browsing Node '{0}'. NodeId = {1}, TargetId = {2}, BrowseName = {3}", 
                            node, 
                            node.NodeId, 
                            reference.NodeId, 
                            reference.BrowseName);

                        continue;
                    }
                }
                                
                if ((description.ResultMask & (uint)BrowseResultMask.DisplayName) != 0)
                {
                    valueToRead = new ReadValueId();

                    valueToRead.NodeId = (NodeId)reference.NodeId;
                    valueToRead.AttributeId = Attributes.DisplayName;
                    valueToRead.Handle = reference;

                    valuesToRead.Add(valueToRead);
                }
                else
                {
                    if (!LocalizedText.IsNullOrEmpty(reference.DisplayName))
                    {
                        error = true;
                        
                        Log(
                            "Unexpected DisplayName when Browsing Node '{0}'. NodeId = {1}, TargetId = {2}, DisplayName = {3}", 
                            node, 
                            node.NodeId, 
                            reference.NodeId, 
                            reference.DisplayName);

                        continue;
                    }
                }
            }
            
            // halt if errors occured.
            if (error)
            {
                return false;
            }

            // read values from server.
            DataValueCollection results;
            DiagnosticInfoCollection diagnosticInfos;

            RequestHeader requestHeader = new RequestHeader();
            requestHeader.ReturnDiagnostics = 0;

            Session.Read(
                requestHeader,
                0,
                TimestampsToReturn.Neither,
                valuesToRead,
                out results,
                out diagnosticInfos);
            
            ClientBase.ValidateResponse(results, valuesToRead);
            ClientBase.ValidateDiagnosticInfos(diagnosticInfos, valuesToRead);
            
            // check diagnostics.
            if (diagnosticInfos != null && diagnosticInfos.Count > 0)
            {
                Log("Returned non-empty DiagnosticInfos array when Reading Attributes while Browsing Node '{0}'. NodeId = {1}", node, node.NodeId);
                return false;
            }

            for (int ii = 0; ii < valuesToRead.Count; ii++)
            {
                if (results[ii].StatusCode != StatusCodes.Good)
                {
                    error = true;
                    
                    Log(
                        "Could not read {2} when Browsing Node '{0}'. NodeId = {1}, TargetId = {3}, Status = {4}", 
                        node, 
                        node.NodeId, 
                        Attributes.GetBrowseName(valuesToRead[ii].AttributeId), 
                        valuesToRead[ii].NodeId,
                        results[ii].StatusCode);

                    continue;
                }
                
                ReferenceDescription reference = (ReferenceDescription)valuesToRead[ii].Handle;

                if (valuesToRead[ii].AttributeId == Attributes.NodeId)
                {
                    NodeId expectedId = results[ii].Value as NodeId;

                    if (expectedId != reference.NodeId)
                    {
                        error = true;
                        
                        Log(
                            "Incorrect NodeId Browsing Node '{0}'. NodeId = {1}, TargetId = {2}, Expected = {3}, Actual = {4}", 
                            node, 
                            node.NodeId, 
                            reference.NodeId,
                            expectedId,
                            reference.NodeId);
                    }

                    continue;
                }
                
                if (valuesToRead[ii].AttributeId == Attributes.NodeClass)
                {
                    int? expectedClass = results[ii].Value as int?;

                    if (expectedClass == null || expectedClass.Value != (int)reference.NodeClass)
                    {
                        error = true;
                        
                        Log(
                            "Incorrect NodeClass Browsing Node '{0}'. NodeId = {1}, TargetId = {2}, Expected = {3}, Actual = {4}", 
                            node, 
                            node.NodeId, 
                            reference.NodeId,
                            expectedClass,
                            reference.NodeClass);
                    }

                    continue;
                }

                if (valuesToRead[ii].AttributeId == Attributes.BrowseName)
                {
                    QualifiedName expectedName = results[ii].Value as QualifiedName;

                    if (expectedName != reference.BrowseName)
                    {
                        error = true;
                        
                        Log(
                            "Incorrect BrowseName Browsing Node '{0}'. NodeId = {1}, TargetId = {2}, Expected = {3}, Actual = {4}", 
                            node, 
                            node.NodeId, 
                            reference.NodeId,
                            expectedName,
                            reference.BrowseName);
                    }

                    continue;
                }

                if (valuesToRead[ii].AttributeId == Attributes.DisplayName)
                {
                    LocalizedText expectedName = results[ii].Value as LocalizedText;

                    if (expectedName != reference.DisplayName)
                    {
                        error = true;
                        
                        Log(
                            "Incorrect DisplayName Browsing Node '{0}'. NodeId = {1}, TargetId = {2}, Expected = {3}, Actual = {4}", 
                            node, 
                            node.NodeId, 
                            reference.NodeId,
                            expectedName,
                            reference.DisplayName);
                    }

                    continue;
                }
            }

            return !error;
        }