Example #1
0
        public void ProcessMessage_ResolveTagHelperDescriptors_ResolvesDesignTimeTagHelperDescriptors()
        {
            // Arrange
            var expectedSourceLocation = new SourceLocation(absoluteIndex: 1, lineIndex: 2, characterIndex: 3);
            var sourceLocationJson     = JsonConvert.SerializeObject(expectedSourceLocation);
            var messageData            = new JObject
            {
                { "AssemblyName", CustomTagHelperAssembly },
                { "SourceLocation", JObject.Parse(sourceLocationJson) }
            };
            var message = new JObject
            {
                { "MessageType", RazorPluginMessageTypes.ResolveTagHelperDescriptors },
                { "Data", messageData },
            };
            ResolveTagHelperDescriptorsMessage responseMessage = null;
            var messageBroker = new TestPluginMessageBroker(
                data => responseMessage = (ResolveTagHelperDescriptorsMessage)data);
            var assembly            = new TestAssembly(typeof(DesignTimeTagHelper));
            var assemblyNameLookups = new Dictionary <string, Assembly>
            {
                { CustomTagHelperAssembly, assembly }
            };
            var assemblyLoadContext = new TestAssemblyLoadContext(assemblyNameLookups);
            var plugin             = new RazorPlugin(messageBroker);
            var expectedDescriptor = new TagHelperDescriptor
            {
                Prefix               = DefaultPrefix,
                TagName              = "design-time",
                TypeName             = typeof(DesignTimeTagHelper).FullName,
                AssemblyName         = typeof(DesignTimeTagHelper).Assembly.GetName().Name,
                AllowedChildren      = new[] { "br" },
                TagStructure         = TagStructure.NormalOrSelfClosing,
                DesignTimeDescriptor = new TagHelperDesignTimeDescriptor
                {
                    OutputElementHint = "strong"
                }
            };

            // Act
            var handled = plugin.ProcessMessage(message, assemblyLoadContext);

            // Assert
            Assert.NotNull(responseMessage);
            Assert.Equal(
                RazorPluginMessageTypes.ResolveTagHelperDescriptors,
                responseMessage.MessageType,
                StringComparer.Ordinal);
            var responseData = responseMessage.Data;

            Assert.Equal(CustomTagHelperAssembly, responseData.AssemblyName, StringComparer.Ordinal);
            var actualDescriptor = Assert.Single(responseData.Descriptors);

            Assert.Equal(expectedDescriptor, actualDescriptor, CaseSensitiveTagHelperDescriptorComparer.Default);
            Assert.Empty(responseData.Errors);
            Assert.True(handled);
        }
Example #2
0
        public void ProcessMessage_ResolveTagHelperDescriptors_ResolvesTagHelperDescriptors()
        {
            // Arrange
            var expectedSourceLocation = new SourceLocation(absoluteIndex: 1, lineIndex: 2, characterIndex: 3);
            var sourceLocationJson     = JsonConvert.SerializeObject(expectedSourceLocation);
            var messageData            = new JObject
            {
                { "AssemblyName", CustomTagHelperAssembly },
                { "SourceLocation", JObject.Parse(sourceLocationJson) }
            };
            var message = new JObject
            {
                { "MessageType", RazorPluginMessageTypes.ResolveTagHelperDescriptors },
                { "Data", messageData },
            };
            ResolveTagHelperDescriptorsMessage responseMessage = null;
            var messageBroker = new TestPluginMessageBroker(
                data => responseMessage = (ResolveTagHelperDescriptorsMessage)data);
            var assembly            = new TestAssembly(typeof(CustomTagHelper));
            var assemblyNameLookups = new Dictionary <string, Assembly>
            {
                { CustomTagHelperAssembly, assembly }
            };
            var assemblyLoadContext = new TestAssemblyLoadContext(assemblyNameLookups);
            var plugin = new RazorPlugin(messageBroker);

            // Act
            var handled = plugin.ProcessMessage(message, assemblyLoadContext);

            // Assert
            Assert.NotNull(responseMessage);
            Assert.Equal(
                RazorPluginMessageTypes.ResolveTagHelperDescriptors,
                responseMessage.MessageType,
                StringComparer.Ordinal);
            var responseData = responseMessage.Data;

            Assert.Equal(CustomTagHelperAssembly, responseData.AssemblyName, StringComparer.Ordinal);
            var actualDescriptor = Assert.Single(responseData.Descriptors);

            Assert.Equal(
                CustomTagHelperDescriptor,
                actualDescriptor,
                CaseSensitiveTagHelperDescriptorComparer.Default);
            Assert.Empty(responseData.Errors);
            Assert.True(handled);
        }
Example #3
0
        public void ProcessMessage_ResolveTagHelperDescriptors_ReturnsErrors()
        {
            // Arrange
            var expectedSourceLocation = new SourceLocation(absoluteIndex: 1, lineIndex: 2, characterIndex: 3);
            var sourceLocationJson     = JsonConvert.SerializeObject(expectedSourceLocation);
            var messageData            = new JObject
            {
                { "AssemblyName", "invalid" },
                { "SourceLocation", JObject.Parse(sourceLocationJson) }
            };
            var message = new JObject
            {
                { "MessageType", RazorPluginMessageTypes.ResolveTagHelperDescriptors },
                { "Data", messageData },
            };
            ResolveTagHelperDescriptorsMessage responseMessage = null;
            var messageBroker = new TestPluginMessageBroker(
                data => responseMessage = (ResolveTagHelperDescriptorsMessage)data);
            var assemblyLoadContext = new ThrowingAssemblyLoadContext("Invalid assembly");
            var plugin = new RazorPlugin(messageBroker);

            // Act
            var handled = plugin.ProcessMessage(message, assemblyLoadContext);

            // Assert
            Assert.NotNull(responseMessage);
            Assert.Equal(
                RazorPluginMessageTypes.ResolveTagHelperDescriptors,
                responseMessage.MessageType,
                StringComparer.Ordinal);
            var responseData = responseMessage.Data;

            Assert.Equal("invalid", responseData.AssemblyName, StringComparer.Ordinal);
            Assert.Empty(responseData.Descriptors);
            var error = Assert.Single(responseData.Errors);

            Assert.Equal(
                "Cannot resolve TagHelper containing assembly 'invalid'. Error: Invalid assembly: invalid",
                error.Message,
                StringComparer.Ordinal);
            Assert.Equal(expectedSourceLocation, error.Location);
            Assert.Equal(7, error.Length);
            Assert.True(handled);
        }
Example #4
0
        public bool ProcessMessage(JObject data, IAssemblyLoadContext assemblyLoadContext)
        {
            var message = data.ToObject <RazorPluginRequestMessage>();

            if (message.MessageType == null)
            {
                throw new InvalidOperationException(
                          Resources.FormatValueMustBeProvidedInMessage(
                              nameof(message.MessageType),
                              nameof(RazorPluginRequestMessage)));
            }

            switch (message.MessageType)
            {
            case RazorPluginMessageTypes.ResolveTagHelperDescriptors:
                if (message.Data == null)
                {
                    throw new InvalidOperationException(
                              Resources.FormatValueMustBeProvidedInMessage(
                                  nameof(message.Data),
                                  RazorPluginMessageTypes.ResolveTagHelperDescriptors));
                }

                var messageData = message.Data.ToObject <ResolveTagHelperDescriptorsRequestData>();

                if (messageData.AssemblyName == null)
                {
                    throw new InvalidOperationException(
                              Resources.FormatValueMustBeProvidedInMessage(
                                  nameof(messageData.AssemblyName),
                                  RazorPluginMessageTypes.ResolveTagHelperDescriptors));
                }
                else if (messageData.SourceLocation == SourceLocation.Undefined)
                {
                    throw new InvalidOperationException(
                              Resources.FormatValueMustBeProvidedInMessage(
                                  nameof(messageData.SourceLocation),
                                  RazorPluginMessageTypes.ResolveTagHelperDescriptors));
                }

                var assemblyName          = messageData.AssemblyName;
                var errorSink             = new ErrorSink();
                var tagHelperTypeResolver = new AssemblyLoadContextTagHelperTypeResolver(assemblyLoadContext);
                var tagHelperTypes        = tagHelperTypeResolver.Resolve(
                    assemblyName,
                    messageData.SourceLocation,
                    errorSink);
                var tagHelperDescriptors = tagHelperTypes.SelectMany(
                    type => TagHelperDescriptorFactory.CreateDescriptors(
                        assemblyName,
                        type,
                        designTime: true,
                        errorSink: errorSink));

                var responseMessage = new ResolveTagHelperDescriptorsMessage(
                    new ResolveTagHelperDescriptorsResponseData
                {
                    AssemblyName = assemblyName,
                    Descriptors  = tagHelperDescriptors,
                    Errors       = errorSink.Errors
                });

                _messageBroker.SendMessage(responseMessage);
                break;

            default:
                // Unknown message.
                return(false);
            }

            return(true);
        }