コード例 #1
0
        public void StreamScopeGenerated()
        {
            var metadataText =
                "stream { " +
                "    event.header := struct { };" +
                "    packet.context := struct { };" +
                "};";
            var parser = GetParser(metadataText);

            var metadataContext = parser.file();

            this.ValidateEmptyErrorListener();

            var metadataCustomization = new TestCtfMetadataCustomization();
            var listener = new CtfListener(parser, metadataCustomization, metadataCustomization);

            Assert.IsNotNull(listener.GlobalScope);

            var treeWalker = new ParseTreeWalker();

            treeWalker.Walk(listener, metadataContext);

            Assert.IsTrue(listener.GlobalScope.Children.Count == 1);
            Assert.IsTrue(listener.GlobalScope.Children.First().Value.Name.Contains("[stream]"));
        }
コード例 #2
0
        public void TraceScopeGenerated()
        {
            var metadataText =
                "trace {" +
                " major = 1;" +
                " minor = 8;" +
                " byte_order = \"le\";" +
                " packet.header := struct { };" +
                "};";
            var parser = GetParser(metadataText);

            var metadataContext = parser.file();

            this.ValidateEmptyErrorListener();

            var metadataCustomization = new TestCtfMetadataCustomization();
            var listener = new CtfListener(parser, metadataCustomization, metadataCustomization);

            Assert.IsNotNull(listener.GlobalScope);

            var treeWalker = new ParseTreeWalker();

            treeWalker.Walk(listener, metadataContext);

            Assert.IsTrue(listener.GlobalScope.Children.Count == 1);
            Assert.IsTrue(StringComparer.CurrentCulture.Equals(listener.GlobalScope.Children.First().Key, "trace"));
            Assert.IsNotNull(listener.GlobalScope.Children["trace"]);
        }
コード例 #3
0
        public void GlobalScopeExists()
        {
            var metadataText = "";
            var parser       = GetParser(metadataText);

            var metadataContext       = parser.file();
            var metadataCustomization = new TestCtfMetadataCustomization();

            var listener = new CtfListener(parser, metadataCustomization, metadataCustomization);

            Assert.IsNotNull(listener.GlobalScope);
        }
コード例 #4
0
        public void UnnamedClockThrows()
        {
            var metadataText = "clock {};";
            var parser       = GetParser(metadataText);

            var metadataContext = parser.file();

            this.ValidateEmptyErrorListener();

            var metadataCustomization = new TestCtfMetadataCustomization();
            var listener = new CtfListener(parser, metadataCustomization, metadataCustomization);

            Assert.IsNotNull(listener.GlobalScope);

            var treeWalker = new ParseTreeWalker();

            Assert.ThrowsException <CtfMetadataException>(
                () => treeWalker.Walk(listener, metadataContext));
        }
コード例 #5
0
        public void TraceWithoutPacketHeaderThrows()
        {
            var metadataText =
                "trace {" +
                " major = 1;" +
                " minor = 8;" +
                "};";
            var parser = GetParser(metadataText);

            var metadataContext = parser.file();

            this.ValidateEmptyErrorListener();

            var metadataCustomization = new TestCtfMetadataCustomization();
            var listener = new CtfListener(parser, metadataCustomization, metadataCustomization);

            Assert.IsNotNull(listener.GlobalScope);

            var treeWalker = new ParseTreeWalker();

            Assert.ThrowsException <CtfMetadataException>(() => treeWalker.Walk(listener, metadataContext));
        }
コード例 #6
0
        public void StringScopeGenerated()
        {
            var metadataText =
                "typealias string { encoding=UTF8; } := utf8_string;";

            var parser = GetParser(metadataText);

            var metadataContext = parser.file();

            this.ValidateEmptyErrorListener();

            var metadataCustomization = new TestCtfMetadataCustomization();
            var listener = new CtfListener(parser, metadataCustomization, metadataCustomization);

            Assert.IsNotNull(listener.GlobalScope);

            var treeWalker = new ParseTreeWalker();

            treeWalker.Walk(listener, metadataContext);

            Assert.IsTrue(listener.GlobalScope.Children.Count == 0);
        }
コード例 #7
0
        public void IntegerScopeGenerated()
        {
            var metadataText =
                "typealias integer { size=32; } := uint32;";

            var parser = GetParser(metadataText);

            var metadataContext = parser.file();

            this.ValidateEmptyErrorListener();

            var metadataCustomization = new TestCtfMetadataCustomization();
            var listener = new CtfListener(parser, metadataCustomization, metadataCustomization);

            Assert.IsNotNull(listener.GlobalScope);

            var treeWalker = new ParseTreeWalker();

            treeWalker.Walk(listener, metadataContext);

            Assert.IsTrue(listener.GlobalScope.Children.Count == 0);
        }
コード例 #8
0
        public void ClockScopeGenerated()
        {
            var metadataText = "clock { name = \"testClock\"; };";
            var parser       = GetParser(metadataText);

            var metadataContext = parser.file();

            this.ValidateEmptyErrorListener();

            var metadataCustomization = new TestCtfMetadataCustomization();
            var listener = new CtfListener(parser, metadataCustomization, metadataCustomization);

            Assert.IsNotNull(listener.GlobalScope);

            var treeWalker = new ParseTreeWalker();

            treeWalker.Walk(listener, metadataContext);

            Assert.IsTrue(listener.GlobalScope.Children.Count == 1);
            Assert.IsTrue(StringComparer.CurrentCulture.Equals(listener.GlobalScope.Children.First().Key, "clock"));
            Assert.IsNotNull(listener.GlobalScope.Children["clock"]);
        }
        /// <summary>
        /// Parse the CTF stream.
        /// </summary>
        /// <param name="metadataStream">Metadata stream</param>
        /// <returns>Metadata parsed from the stream</returns>
        public ICtfMetadata Parse(Stream metadataStream)
        {
            string metadata = this.GetMetadata(metadataStream);

            this.parser = GetContext(metadata);

            // Error listeners can be switched out for debugging purposes. Leaving these comments here for easy access.

            //this.parser.RemoveErrorListeners();
            //this.parser.AddErrorListener(new DebugErrorListener());
            //this.parser.AddErrorListener(new DiagnosticErrorListener(false));

            var fileContext = this.parser.file();

            this.listener = new CtfListener(this.parser, this.metadataCustomization, this.metadataBuilder);

            var treeWalker = new ParseTreeWalker();

            treeWalker.Walk(this.listener, fileContext);

            return(this.listener.GlobalScope);
        }
コード例 #10
0
        private void NamedEnumTest(
            string typeName,
            bool baseTypeSigned,
            ushort baseTypeSize,
            IList <EnumeratorTestValue> mappings)
        {
            var metadataText = new StringBuilder(
                $"enum {typeName} : integer " +
                $"{{ size = {baseTypeSize.ToString()}; signed = {baseTypeSigned.ToString()}; }} {{ ");

            foreach (var mapping in mappings)
            {
                metadataText.Append(mapping.ToString());
            }

            metadataText.Append("};");

            var parser = GetParser(metadataText.ToString());

            var metadataContext = parser.file();

            this.ValidateEmptyErrorListener();

            var metadataCustomization = new TestCtfMetadataCustomization();

            var listener = new CtfListener(parser, metadataCustomization, metadataCustomization);

            Assert.IsNotNull(listener.GlobalScope);

            var treeWalker = new ParseTreeWalker();

            treeWalker.Walk(listener, metadataContext);

            bool typeExists = listener.GlobalScope.Types.TryGetValue(typeName, out var typeDeclaration);

            Assert.IsTrue(typeExists);

            var ctfMetadataType = typeDeclaration.Type;

            Assert.IsTrue(ctfMetadataType is CtfEnumDescriptor);

            var enumType = (CtfEnumDescriptor)ctfMetadataType;

            Assert.AreEqual(baseTypeSigned, enumType.BaseType.Signed);
            Assert.AreEqual(baseTypeSize, enumType.BaseType.Size);
            // According to spec 1.8.2 section 4.1.5, integers that are a multiple of 8-bits are 8-bit aligned.
            // Otherwise they are one bit aligned
            Assert.AreEqual((baseTypeSize & 0x07) == 0 ? 8 : 1, enumType.Align);

            var enumValues       = enumType.EnumeratorValues.ToList();
            var enumValuesByName = new Dictionary <string, ICtfNamedRange>();

            foreach (var enumValue in enumValues)
            {
                enumValuesByName.Add(enumValue.Name, enumValue);
            }

            Assert.AreEqual(mappings.Count, enumValues.Count());
            foreach (var mapping in mappings)
            {
                bool mappingExists = enumValuesByName.TryGetValue(mapping.Name.Trim('"'), out var enumValue);
                Assert.IsTrue(mappingExists);

                ValidateEnumValue(enumType.BaseType.Signed, enumValue, mapping);
            }
        }