public void AddingBindingRedirectToEmptyConfig() { // Arrange var mockFileSystem = new MockFileSystem(); mockFileSystem.AddFile("config", @"<configuration></configuration>"); var bindingRedirectManager = new BindingRedirectManager(mockFileSystem, "config"); AssemblyBinding assemblyBinding = GetAssemblyBinding("AssemblyName", "token", "3.0.0.0"); // Act bindingRedirectManager.AddBindingRedirects(new[] { assemblyBinding }); // Assert string outputContent = mockFileSystem.OpenFile("config").ReadToEnd(); Assert.Equal(@"<?xml version=""1.0"" encoding=""utf-8""?> <configuration> <runtime> <assemblyBinding xmlns=""urn:schemas-microsoft-com:asm.v1""> <dependentAssembly> <assemblyIdentity name=""AssemblyName"" publicKeyToken=""token"" culture=""neutral"" /> <bindingRedirect oldVersion=""0.0.0.0-3.0.0.0"" newVersion=""3.0.0.0"" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>", outputContent); }
public void AddingBindingRedirectToEmptyConfig() { // Arrange var mockFileSystem = new Mock <IFileSystem>(); mockFileSystem.Setup(m => m.FileExists("config")).Returns(true); mockFileSystem.Setup(m => m.OpenFile("config")).Returns(@"<configuration></configuration>".AsStream()); var ms = new MemoryStream(); mockFileSystem.Setup(m => m.AddFile("config", It.IsAny <Stream>())).Callback <string, Stream>((path, stream) => { stream.CopyTo(ms); ms.Seek(0, SeekOrigin.Begin); }); var bindingRedirectManager = new BindingRedirectManager(mockFileSystem.Object, "config"); AssemblyBinding assemblyBinding = GetAssemblyBinding("A", "key", "3.0.0.0"); // Act bindingRedirectManager.AddBindingRedirects(new[] { assemblyBinding }); // Assert Assert.AreEqual(@"<?xml version=""1.0"" encoding=""utf-8""?> <configuration> <runtime> <assemblyBinding xmlns=""urn:schemas-microsoft-com:asm.v1""> <dependentAssembly> <assemblyIdentity name=""AssemblyName"" publicKeyToken=""token"" culture=""neutral"" /> <bindingRedirect oldVersion=""0.0.0.0-3.0.0.0"" newVersion=""3.0.0.0"" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>", ms.ReadToEnd()); }
public void CodeBase_WhenCodeBaseIsNull_InitializesPropertyToNull() { var binding = new AssemblyBinding(new AssemblyName("Gallio")); binding.CodeBase = null; Assert.IsNull(binding.CodeBase); }
public void CodeBase_WhenCodeBaseIsAnAbsoluteUri_InitializesPropertyToUri() { var binding = new AssemblyBinding(new AssemblyName("Gallio")); var codeBase = new Uri("file:///c:/foo.dll"); binding.CodeBase = codeBase; Assert.AreEqual(codeBase, binding.CodeBase); }
public void AddBindingRedirect_WhenBindingRedirectIsNotNull_AddsTheRedirect() { var binding = new AssemblyBinding(new AssemblyName("Gallio")); binding.AddBindingRedirect(new AssemblyBinding.BindingRedirect("1.2.3.4")); Assert.AreElementsEqual(new[] { new AssemblyBinding.BindingRedirect("1.2.3.4") }, binding.BindingRedirects, (x, y) => x.OldVersion == y.OldVersion); }
public void QualifyPartialName_CanGetSet() { var binding = new AssemblyBinding(new AssemblyName("Gallio")); binding.QualifyPartialName = true; Assert.IsTrue(binding.QualifyPartialName); binding.QualifyPartialName = false; Assert.IsFalse(binding.QualifyPartialName); }
public void ApplyPublisherPolicy_CanGetSet() { var binding = new AssemblyBinding(new AssemblyName("Gallio")); binding.ApplyPublisherPolicy = true; Assert.IsTrue(binding.ApplyPublisherPolicy); binding.ApplyPublisherPolicy = false; Assert.IsFalse(binding.ApplyPublisherPolicy); }
public void AddingBindingRedirectWithMultipleAssemblyBindingSectionsAddsToFirstOne() { // Arrange var mockFileSystem = new MockFileSystem(); mockFileSystem.AddFile("config", @" <configuration> <runtime> <assemblyBinding xmlns=""urn:schemas-microsoft-com:asm.v1""> <dependentAssembly> <assemblyIdentity name=""System.Web.Mvc"" publicKeyToken=""31bf3856ad364e35"" /> <bindingRedirect oldVersion=""1.0.0.0"" newVersion=""2.0.0.0"" /> </dependentAssembly> </assemblyBinding> <assemblyBinding xmlns=""urn:schemas-microsoft-com:asm.v1""> <dependentAssembly> <assemblyIdentity name=""A.Library"" publicKeyToken=""a34a755ec277222f"" /> <bindingRedirect oldVersion=""1.0.0.0-2.0.0.0"" newVersion=""2.0.0.0"" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>"); var bindingRedirectManager = new BindingRedirectManager(mockFileSystem, "config"); AssemblyBinding assemblyBinding = GetAssemblyBinding("AssemblyName", "token", "3.0.0.0"); // Act bindingRedirectManager.AddBindingRedirects(new[] { assemblyBinding }); // Assert string outputContent = mockFileSystem.OpenFile("config").ReadToEnd(); Assert.Equal(@"<?xml version=""1.0"" encoding=""utf-8""?> <configuration> <runtime> <assemblyBinding xmlns=""urn:schemas-microsoft-com:asm.v1""> <dependentAssembly> <assemblyIdentity name=""System.Web.Mvc"" publicKeyToken=""31bf3856ad364e35"" /> <bindingRedirect oldVersion=""1.0.0.0"" newVersion=""2.0.0.0"" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name=""AssemblyName"" publicKeyToken=""token"" culture=""neutral"" /> <bindingRedirect oldVersion=""0.0.0.0-3.0.0.0"" newVersion=""3.0.0.0"" /> </dependentAssembly> </assemblyBinding> <assemblyBinding xmlns=""urn:schemas-microsoft-com:asm.v1""> <dependentAssembly> <assemblyIdentity name=""A.Library"" publicKeyToken=""a34a755ec277222f"" /> <bindingRedirect oldVersion=""1.0.0.0-2.0.0.0"" newVersion=""2.0.0.0"" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>", outputContent); }
public void Constructor_WhenAssemblyNotNull_InitializesProperties() { var assembly = GetType().Assembly; var assemblyReference = new AssemblyBinding(assembly); Assert.Multiple(() => { Assert.AreEqual(assembly.GetName().FullName, assemblyReference.AssemblyName.FullName); Assert.AreEqual(assembly.CodeBase, assemblyReference.CodeBase.ToString()); Assert.IsFalse(assemblyReference.QualifyPartialName); Assert.IsEmpty(assemblyReference.BindingRedirects); Assert.IsTrue(assemblyReference.ApplyPublisherPolicy); }); }
public void Constructor_WhenAssemblyNameNotNull_InitializesProperties() { var assemblyName = new AssemblyName("Gallio"); var assemblyReference = new AssemblyBinding(assemblyName); Assert.Multiple(() => { Assert.AreSame(assemblyName, assemblyReference.AssemblyName); Assert.IsNull(assemblyReference.CodeBase); Assert.IsFalse(assemblyReference.QualifyPartialName); Assert.IsEmpty(assemblyReference.BindingRedirects); Assert.IsTrue(assemblyReference.ApplyPublisherPolicy); }); }
public void CtorCopiesAssemblyProperties() { // Arrange var assembly = new Mock<IAssembly>(); assembly.Setup(m => m.Name).Returns("AssemblyName"); assembly.Setup(m => m.Culture).Returns("en-GB"); assembly.Setup(m => m.PublicKeyToken).Returns("token"); assembly.Setup(m => m.Version).Returns(new Version("1.0.0.0")); // Act var binding = new AssemblyBinding(assembly.Object); // Assert Assert.Equal("AssemblyName", binding.Name); Assert.Equal("en-GB", binding.Culture); Assert.Equal("token", binding.PublicKeyToken); Assert.Equal("1.0.0.0", binding.NewVersion); Assert.Equal("0.0.0.0-1.0.0.0", binding.OldVersion); }
public void CtorCopiesAssemblyProperties() { // Arrange var assembly = new Mock <IAssembly>(); assembly.Setup(m => m.Name).Returns("AssemblyName"); assembly.Setup(m => m.Culture).Returns("en-GB"); assembly.Setup(m => m.PublicKeyToken).Returns("token"); assembly.Setup(m => m.Version).Returns(new Version("1.0.0.0")); // Act var binding = new AssemblyBinding(assembly.Object); // Assert Assert.Equal("AssemblyName", binding.Name); Assert.Equal("en-GB", binding.Culture); Assert.Equal("token", binding.PublicKeyToken); Assert.Equal("1.0.0.0", binding.NewVersion); Assert.Equal("0.0.0.0-1.0.0.0", binding.OldVersion); }
public void AddBindingRedirectUpdatesElementsPreservingCommentsAndWhitespace() { // Arrange var mockFileSystem = new MockFileSystem(); mockFileSystem.AddFile("config", @"<?xml version=""1.0"" encoding=""utf-8""?> <configuration> <runtime> <assemblyBinding xmlns=""urn:schemas-microsoft-com:asm.v1""> <dependentAssembly><assemblyIdentity name=""AssemblyName"" publicKeyToken=""token"" culture=""neutral"" /> <!-- This is a comment that should not be removed --> <bindingRedirect oldVersion=""2.0.0.0"" newVersion=""3.0.0.0"" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>"); var bindingRedirectManager = new BindingRedirectManager(mockFileSystem, "config"); AssemblyBinding assemblyBinding = GetAssemblyBinding("AssemblyName", "token", "4.0.0.0"); // Act bindingRedirectManager.AddBindingRedirects(new[] { assemblyBinding }); // Assert string outputContent = mockFileSystem.OpenFile("config").ReadToEnd(); Assert.Equal(@"<?xml version=""1.0"" encoding=""utf-8""?> <configuration> <runtime> <assemblyBinding xmlns=""urn:schemas-microsoft-com:asm.v1""> <dependentAssembly><assemblyIdentity name=""AssemblyName"" publicKeyToken=""token"" culture=""neutral"" /> <!-- This is a comment that should not be removed --> <bindingRedirect oldVersion=""0.0.0.0-4.0.0.0"" newVersion=""4.0.0.0"" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>", outputContent); }
public void ParseAssemblyBindingConfigSectionPreservesContent() { // Arrange string assemblyBindingXml = @"<assemblyBinding xmlns=""urn:schemas-microsoft-com:asm.v1""> <dependentAssembly> <assemblyIdentity name=""myAssembly"" publicKeyToken=""32ab4ba45e0a69a1"" culture=""neutral"" processorArchitecture=""x86"" /> <bindingRedirect oldVersion=""0.0.0.1-1.0.0.0"" newVersion=""2.0.0.0""/> <codeBase version=""2.0.0.0"" href=""http://www.litwareinc.com/myAssembly.dll""/> <publisherPolicy apply=""no""/> </dependentAssembly> </assemblyBinding>"; var dependentAssembly = XElement.Parse(assemblyBindingXml).Elements().First(); // Act var binding = AssemblyBinding.Parse(dependentAssembly); // Assert Assert.Equal("myAssembly", binding.Name); Assert.Equal("32ab4ba45e0a69a1", binding.PublicKeyToken); Assert.Equal("neutral", binding.Culture); Assert.Equal("x86", binding.ProcessorArchitecture); Assert.Equal("0.0.0.1-1.0.0.0", binding.OldVersion); Assert.Equal("2.0.0.0", binding.NewVersion); Assert.Equal("2.0.0.0", binding.CodeBaseVersion); Assert.Equal("http://www.litwareinc.com/myAssembly.dll", binding.CodeBaseHref); Assert.Equal("no", binding.PublisherPolicy); Assert.Equal(@"<dependentAssembly xmlns=""urn:schemas-microsoft-com:asm.v1""> <assemblyIdentity name=""myAssembly"" publicKeyToken=""32ab4ba45e0a69a1"" culture=""neutral"" processorArchitecture=""x86"" /> <bindingRedirect oldVersion=""0.0.0.1-1.0.0.0"" newVersion=""2.0.0.0"" /> <publisherPolicy apply=""no"" /> <codeBase href=""http://www.litwareinc.com/myAssembly.dll"" version=""2.0.0.0"" /> </dependentAssembly>", binding.ToString()); }
/// <summary> /// Adds a binding to the configuration for the specified assembly. /// </summary> /// <remarks> /// <para> /// Depending on how the binding is configured, this method will add an assembly dependency /// record and possibly an assembly qualification record. /// </para> /// </remarks> /// <param name="assemblyBinding">The assembly binding.</param> /// <exception cref="ArgumentNullException">Thrown if <paramref name="assemblyBinding"/> is null.</exception> public void AddAssemblyBinding(AssemblyBinding assemblyBinding) { if (assemblyBinding == null) { throw new ArgumentNullException("assemblyBinding"); } AssemblyName assemblyName = assemblyBinding.AssemblyName; byte[] publicKeyTokenBytes = assemblyName.GetPublicKeyToken(); string publicKeyToken = publicKeyTokenBytes != null && publicKeyTokenBytes.Length != 0 ? ToHex(publicKeyTokenBytes) : null; if (assemblyBinding.QualifyPartialName && publicKeyToken != null) { AddAssemblyQualification(assemblyName.Name, assemblyName.FullName); } AssemblyDependency assemblyDependency = AddAssemblyDependency( assemblyName.Name, publicKeyToken, AssemblyUtils.GetAssemblyNameCulture(assemblyName), GetProcessorArchitectureName(assemblyName.ProcessorArchitecture)); foreach (AssemblyBinding.BindingRedirect bindingRedirect in assemblyBinding.BindingRedirects) { assemblyDependency.AddAssemblyBindingRedirect(bindingRedirect.OldVersion, assemblyName.Version.ToString()); } // Note: If unsigned assembly appears outside of appbase then we get an exception: // "The private assembly was located outside the appbase directory." if (assemblyBinding.CodeBase != null && publicKeyToken != null) { assemblyDependency.AddAssemblyCodeBase(assemblyName.Version.ToString(), assemblyBinding.CodeBase.ToString()); } assemblyDependency.ApplyPublisherPolicy = assemblyBinding.ApplyPublisherPolicy; }
private static void RemoveDuplicates(AssemblyBinding redirects) { var cleaned = new List<DependentAssembly>(); var groups = redirects.DependentAssemblies.GroupBy(x => x.AssemblyIdentity.Name); foreach (var @group in groups) { Log(string.Format("Found {0} versions of {1}...", group.Count(), group.Key)); if (group.Count() == 1) { var single = group.Single(); Log(string.Format("{0}", single.BindingRedirect.NewVersion), true, ConsoleColor.Yellow); cleaned.Add(single); continue; } var highestVersion = group.OrderByDescending(x => x.BindingRedirect.NewVersion).First(); Log(string.Format("{0}", highestVersion.BindingRedirect.NewVersion), true, ConsoleColor.Green); cleaned.Add(highestVersion); } redirects.DependentAssemblies = cleaned; }
private void RemoveBindingRedirects() { IEnumerable <AssemblyBinding> bindingRedirects = BindingRedirectResolver.GetBindingRedirects(AppDomain.CurrentDomain.BaseDirectory, AppDomain.CurrentDomain); string configurationFilePath = Path.Combine(mProjectManager.Project.Root, mConfigurationFileName); XDocument document = XDocument.Load(configurationFilePath); XElement runtimeElement = document.Root.Element("runtime"); IEnumerable <XElement> assemblyBindingElements = Enumerable.Empty <XElement>(); if (runtimeElement != null) { assemblyBindingElements = runtimeElement.Elements(XName.Get("assemblyBinding", "urn:schemas-microsoft-com:asm.v1")).Elements(XName.Get("dependentAssembly", "urn:schemas-microsoft-com:asm.v1")); } IEnumerable <AssemblyBinding> configurationBindingRedirects = assemblyBindingElements.Select(x => AssemblyBinding.Parse(x)); IEnumerable <AssemblyBinding> candidates = configurationBindingRedirects.Except(bindingRedirects); if (candidates.Any()) { BindingRedirectManager bindingRedirectManager = new BindingRedirectManager(mProjectManager.Project, mConfigurationFileName); bindingRedirectManager.RemoveBindingRedirects(candidates); } }
private static void UpdateBindingRedirectElement(XElement element, AssemblyBinding bindingRedirect) { var bindingRedirectElement = element.Element(AssemblyBinding.GetQualifiedName("bindingRedirect")); // Since we've successfully parsed this node, it has to be valid and this child must exist. Debug.Assert(bindingRedirectElement != null); bindingRedirectElement.Attribute("oldVersion").SetValue(bindingRedirect.OldVersion); bindingRedirectElement.Attribute("newVersion").SetValue(bindingRedirect.NewVersion); }
private static IList <IPluginDescriptor> RegisterPlugins(IRegistry registry, IList <PluginData> topologicallySortedPlugins) { IPluginDescriptor[] pluginDescriptors = new IPluginDescriptor[topologicallySortedPlugins.Count]; for (int i = 0; i < topologicallySortedPlugins.Count; i++) { Plugin plugin = topologicallySortedPlugins[i].Plugin; DirectoryInfo baseDirectory = topologicallySortedPlugins[i].BaseDirectory; try { var pluginType = plugin.PluginType != null ? new TypeName(plugin.PluginType) : new TypeName(typeof(DefaultPlugin)); List <string> disabledReasons = new List <string>(); var pluginRegistration = new PluginRegistration(plugin.PluginId, pluginType, baseDirectory); if (plugin.Parameters != null) { pluginRegistration.PluginProperties = plugin.Parameters.PropertySet; } if (plugin.Traits != null) { pluginRegistration.TraitsProperties = plugin.Traits.PropertySet; } pluginRegistration.ProbingPaths = plugin.ProbingPaths; pluginRegistration.RecommendedInstallationPath = plugin.RecommendedInstallationPath; if (plugin.EnableCondition != null) { pluginRegistration.EnableCondition = Condition.Parse(plugin.EnableCondition); } foreach (var file in plugin.Files) { pluginRegistration.FilePaths.Add(file.Path); } foreach (var dependency in plugin.Dependencies) { string pluginDependencyId = dependency.PluginId; IPluginDescriptor pluginDependency = registry.Plugins[pluginDependencyId]; if (pluginDependency == null) { disabledReasons.Add(string.Format("Could not find plugin '{0}' upon which this plugin depends.", pluginDependencyId)); } else { pluginRegistration.PluginDependencies.Add(pluginDependency); } } foreach (var assembly in plugin.Assemblies) { Uri absoluteCodeBase; if (assembly.CodeBase != null) { List <string> attemptedPaths = new List <string>(); string foundCodeBasePath = ProbeForCodeBase(baseDirectory, plugin.ProbingPaths, assembly.CodeBase, attemptedPaths); if (foundCodeBasePath == null) { StringBuilder formattedPaths = new StringBuilder(); foreach (string path in attemptedPaths) { if (formattedPaths.Length != 0) { formattedPaths.Append(", "); } formattedPaths.Append("'").Append(path).Append("'"); } disabledReasons.Add(string.Format("Could not find assembly '{0}' after probing for its code base in {1}.", assembly.FullName, formattedPaths)); absoluteCodeBase = null; } else { absoluteCodeBase = new Uri(foundCodeBasePath); } } else { #if STRICT_GAC_CHECKS if (!IsAssemblyRegisteredInGAC(assembly.FullName)) { disabledReasons.Add( string.Format("Could not find assembly '{0}' in the global assembly cache.", assembly.FullName)); } #endif absoluteCodeBase = null; } var assemblyBinding = new AssemblyBinding(new AssemblyName(assembly.FullName)) { CodeBase = absoluteCodeBase, QualifyPartialName = assembly.QualifyPartialName, ApplyPublisherPolicy = assembly.ApplyPublisherPolicy }; foreach (BindingRedirect redirect in assembly.BindingRedirects) { assemblyBinding.AddBindingRedirect(new AssemblyBinding.BindingRedirect(redirect.OldVersion)); } pluginRegistration.AssemblyBindings.Add(assemblyBinding); } IPluginDescriptor pluginDescriptor = registry.RegisterPlugin(pluginRegistration); pluginDescriptors[i] = pluginDescriptor; if (disabledReasons.Count != 0) { pluginDescriptor.Disable(disabledReasons[0]); } } catch (Exception ex) { throw new RuntimeException(string.Format("Could not register plugin '{0}'.", plugin.PluginId), ex); } } return(pluginDescriptors); }
public void CodeBase_WhenCodeBaseIsNotAnAbsoluteUri_Throws() { var binding = new AssemblyBinding(new AssemblyName("Gallio")); Assert.Throws <ArgumentException>(() => binding.CodeBase = new Uri("bar/foo.dll", UriKind.Relative)); }
private static XElement SerializeBinding(AssemblyBinding binding) { var xmlBindings = binding.DependentAssemblies.Select( x => new XElement( Ns + "dependentAssembly", GetAssemblyIdentityXElement(x.AssemblyIdentity), GetBindingRedirectXElement(x.BindingRedirect))); var xml = new XElement(Ns + "assemblyBinding", xmlBindings); return xml; }
public void AddBindingRedirect_WhenBindingRedirectIsNull_Throws() { var binding = new AssemblyBinding(new AssemblyName("Gallio")); Assert.Throws <ArgumentNullException>(() => binding.AddBindingRedirect(null)); }
public void SetUp() { item = new AssemblyBinding(); }