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); }
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); }
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); }
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); }