Revert "Merge pull request #5330 from alexanderkyte/dedup_mkbundle"
[mono.git] / mcs / class / System.ServiceModel / Test / MetadataTests / TestContext.cs
index 989be632418971e9ea942149945bffd7b7257f96..be7bdb27bd4c38f11b01338b219fe558f010a61d 100644 (file)
 
 using System;
 using System.IO;
-using System.Xml;
 using System.Text;
+using System.Configuration;
+using System.Collections.Generic;
+using System.Xml;
+using System.Xml.XPath;
 using System.Reflection;
+using System.ServiceModel;
+using System.ServiceModel.Channels;
+using System.ServiceModel.Configuration;
 using System.ServiceModel.Description;
 
+using SysConfig = System.Configuration.Configuration;
+
 namespace MonoTests.System.ServiceModel.MetadataTests {
 
        public abstract class TestContext {
@@ -39,6 +47,8 @@ namespace MonoTests.System.ServiceModel.MetadataTests {
 
                public abstract MetadataSet GetMetadata (string name);
 
+               public abstract XmlDocument GetConfiguration (string name);
+
                #endregion
 
                #region Default Context
@@ -58,6 +68,11 @@ namespace MonoTests.System.ServiceModel.MetadataTests {
                        {
                                return LoadMetadata (name);
                        }
+
+                       public override XmlDocument GetConfiguration (string name)
+                       {
+                               return LoadConfiguration (name);
+                       }
                }
 
                class _CreateMetadataContext : TestContext {
@@ -65,6 +80,14 @@ namespace MonoTests.System.ServiceModel.MetadataTests {
                        {
                                return MetadataSamples.GetMetadataByName (name);
                        }
+
+                       public override XmlDocument GetConfiguration (string name)
+                       {
+                               var metadata = GetMetadata (name);
+                               var doc = new XmlDocument ();
+                               doc.LoadXml (SaveConfigToString (metadata));
+                               return doc;
+                       }
                }
 
                class _RoundTripContext : TestContext {
@@ -72,6 +95,14 @@ namespace MonoTests.System.ServiceModel.MetadataTests {
                        {
                                return RoundTrip (name);
                        }
+
+                       public override XmlDocument GetConfiguration (string name)
+                       {
+                               var metadata = GetMetadata (name);
+                               var doc = new XmlDocument ();
+                               doc.LoadXml (SaveConfigToString (metadata));
+                               return doc;
+                       }
                }
 
                #endregion
@@ -87,6 +118,15 @@ namespace MonoTests.System.ServiceModel.MetadataTests {
 #endif
                }
 
+               public static XmlDocument LoadConfiguration (string name)
+               {
+#if USE_EMBEDDED_METADATA
+                       return LoadConfigurationFromResource (name);
+#else
+                       return LoadConfigurationFromFile (name);
+#endif
+               }
+
                public static void SaveMetadata (string name, MetadataSet metadata)
                {
                        SaveMetadataToFile (name, metadata);
@@ -124,10 +164,44 @@ namespace MonoTests.System.ServiceModel.MetadataTests {
                                return MetadataSet.ReadFrom (reader);
                        }
                }
-               
-               public static void SaveMetadataToFile (string name, MetadataSet metadata)
+
+               public static XmlDocument LoadConfigurationFromFile (string name)
+               {
+                       var asm = Assembly.GetExecutingAssembly ();
+                       if (!name.EndsWith (".config"))
+                               name = name + ".config";
+                       var uri = new Uri (asm.CodeBase);
+                       var path = Path.GetDirectoryName (uri.AbsolutePath);
+                       path = Path.Combine (path, "Test");
+                       path = Path.Combine (path, "MetadataTests");
+                       path = Path.Combine (path, "Resources");
+                       var filename = Path.Combine (path, name);
+                       using (var stream = new StreamReader (filename)) {
+                               var xml = new XmlDocument ();
+                               xml.Load (stream);
+                               return xml;
+                       }
+               }
+
+               public static XmlDocument LoadConfigurationFromResource (string name)
+               {
+                       var asm = Assembly.GetExecutingAssembly ();
+                       if (!name.EndsWith (".config"))
+                               name = name + ".config";
+                       
+                       var resname = "MetadataTests.Resources." + name;
+                       using (var stream = asm.GetManifestResourceStream (resname)) {
+                               if (stream == null)
+                                       throw new InvalidOperationException (
+                                               "No such resource: " + name);
+                               var xml = new XmlDocument ();
+                               xml.Load (stream);
+                               return xml;
+                       }
+               }
+
+               public static void SaveMetadataToFile (string filename, MetadataSet metadata)
                {
-                       var filename = name + ".xml";
                        if (File.Exists (filename))
                                return;
 
@@ -169,6 +243,77 @@ namespace MonoTests.System.ServiceModel.MetadataTests {
                        return LoadMetadataFromString (doc);
                }
 
+               public static void GenerateConfig (MetadataSet metadata, SysConfig config)
+               {
+                       WsdlImporter importer = new WsdlImporter (metadata);
+                       
+                       var endpoints = importer.ImportAllEndpoints ();
+                       
+                       var generator = new ServiceContractGenerator (config);
+                       generator.Options = ServiceContractGenerationOptions.None;
+                       
+                       foreach (var endpoint in endpoints) {
+                               ChannelEndpointElement channelElement;
+                               generator.GenerateServiceEndpoint (endpoint, out channelElement);
+                       }
+               }
+
+               public static void GenerateConfig (string filename, MetadataSet metadata)
+               {
+                       var fileMap = new ExeConfigurationFileMap ();
+                       fileMap.ExeConfigFilename = filename;
+                       var config = ConfigurationManager.OpenMappedExeConfiguration (
+                               fileMap, ConfigurationUserLevel.None);
+                               
+                       GenerateConfig (metadata, config);
+                       config.Save (ConfigurationSaveMode.Minimal);
+                       NormalizeConfig (filename);
+               }
+
+               internal static string SaveConfigToString (MetadataSet metadata)
+               {
+                       var filename = Path.GetTempFileName ();
+                       File.Delete (filename);
+
+                       try {
+                               GenerateConfig (filename, metadata);
+
+                               using (var reader = new StreamReader (filename))
+                                       return reader.ReadToEnd ();
+                       } finally {
+                               File.Delete (filename);
+                       }
+               }
+               
+               public static void NormalizeConfig (string filename)
+               {
+                       // Mono-specific hack.
+                       if (Environment.OSVersion.Platform == PlatformID.Win32NT)
+                               return;
+
+                       var doc = new XmlDocument ();
+                       doc.Load (filename);
+                       var nav = doc.CreateNavigator ();
+                       
+                       var empty = new List<XPathNavigator> ();
+                       var iter = nav.Select ("/configuration/system.serviceModel//*");
+                       foreach (XPathNavigator node in iter) {
+                               if (!node.HasChildren && !node.HasAttributes && string.IsNullOrEmpty (node.Value))
+                                       empty.Add (node);
+                       }
+                       foreach (var node in empty)
+                               node.DeleteSelf ();
+                       
+                       var settings = new XmlWriterSettings ();
+                       settings.Indent = true;
+                       settings.NewLineHandling = NewLineHandling.Replace;
+                       
+                       using (var writer = XmlWriter.Create (filename, settings)) {
+                               doc.WriteTo (writer);
+                       }
+                       Console.WriteLine ();
+               }
+
                #endregion
        }
 }