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 {
public abstract MetadataSet GetMetadata (string name);
+ public abstract XmlDocument GetConfiguration (string name);
+
#endregion
#region Default Context
{
return LoadMetadata (name);
}
+
+ public override XmlDocument GetConfiguration (string name)
+ {
+ return LoadConfiguration (name);
+ }
}
class _CreateMetadataContext : TestContext {
{
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 {
{
return RoundTrip (name);
}
+
+ public override XmlDocument GetConfiguration (string name)
+ {
+ var metadata = GetMetadata (name);
+ var doc = new XmlDocument ();
+ doc.LoadXml (SaveConfigToString (metadata));
+ return doc;
+ }
}
#endregion
#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);
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;
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
}
}