| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.ServiceModel;
- using System.ServiceModel.Channels;
- using System.ServiceModel.Description;
- using NUnit.Framework;
- using System.Reflection;
- using System.Threading;
- using System.Configuration;
- using System.IO;
- using System.Net;
- using MonoTests.stand_alone.WebHarness;
- using System.ServiceModel.Dispatcher;
- using System.Collections.ObjectModel;
- namespace MonoTests.Features
- {
- public class Configuration
- {
- static Configuration() {
- onlyServers = Boolean.Parse (ConfigurationManager.AppSettings ["onlyServers"] ?? "false");
- onlyClients = Boolean.Parse (ConfigurationManager.AppSettings ["onlyClients"] ?? "false");
- endpointBase = ConfigurationManager.AppSettings ["endpointBase"] ?? "http://localhost:9999/";
- if (!endpointBase.EndsWith ("/"))
- endpointBase = endpointBase + '/';
- logMessages = Boolean.Parse (ConfigurationManager.AppSettings ["logMessages"] ?? "false");
- }
- public static bool onlyServers;
- public static bool onlyClients;
- public static string endpointBase;
- public static bool logMessages;
- public static bool IsLocal { get { return !onlyServers && !onlyClients; } }
- }
- class LoggerMessageInspector : IDispatchMessageInspector
- {
- #region IDispatchMessageInspector Members
- public object AfterReceiveRequest (ref Message request, IClientChannel channel, InstanceContext instanceContext) {
- Console.WriteLine ("****Begin message received by host:");
- Console.WriteLine (request);
- Console.WriteLine ("****End message received by host:");
- return new object ();
- }
- public void BeforeSendReply (ref Message reply, object correlationState) {
- Console.WriteLine ("****Begin message reply from host:");
- Console.WriteLine (reply);
- Console.WriteLine ("****End message reply from host:");
- }
- #endregion
- }
- class LoggerBehavior : IServiceBehavior
- {
- #region IServiceBehavior Members
- public void AddBindingParameters (ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) {
- }
- public void ApplyDispatchBehavior (ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) {
- ChannelDispatcher dispatcher = serviceHostBase.ChannelDispatchers [0] as ChannelDispatcher;
- dispatcher.Endpoints [0].DispatchRuntime.MessageInspectors.Add (new LoggerMessageInspector ());
- }
- public void Validate (ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) {
- }
- #endregion
- }
- public abstract class TestFixtureBase<TClient, TServer, IServer> where TClient : new() where TServer: new()
- {
- ServiceHost _hostBase;
- ChannelFactory<IServer> factory;
- protected TestFixtureBase () { }
- [TearDown]
- public void TearDown ()
- {
- if (_hostBase != null)
- _hostBase.Close ();
- if (factory != null)
- factory.Close ();
- }
- [SetUp]
- public virtual void Run (){
- bool runServer = true;
- bool runClient = true;
- if (Configuration.onlyClients)
- runServer = false;
- if (Configuration.onlyServers)
- runClient = false;
- Run (runServer, runClient);
- }
- public void CheckWsdlImpl () {
- string goldWsdl;
- try {
- Assembly _assembly = Assembly.GetExecutingAssembly ();
- StreamReader _stream = new StreamReader (_assembly.GetManifestResourceStream ("MonoTests.System.ServiceModel.Test.FeatureBased.Features.Contracts." + typeof (TServer).Name + ".xml"));
- goldWsdl = _stream.ReadToEnd ();
- }
- catch {
- Console.WriteLine ("Couldn't test WSDL of server " + typeof (TServer).Name + " because gold wsdl is not embedded in test !");
- return;
- }
- string currentWsdl = "";
- HttpWebRequest myReq = (HttpWebRequest) WebRequest.Create (getMexEndpoint () + "?wsdl");
- // Obtain a 'Stream' object associated with the response object.
- WebResponse response = myReq.GetResponse ();
- Stream ReceiveStream = response.GetResponseStream ();
- Encoding encode = global::System.Text.Encoding.GetEncoding ("utf-8");
- // Pipe the stream to a higher level stream reader with the required encoding format.
- StreamReader readStream = new StreamReader (ReceiveStream, encode);
- Console.WriteLine ("\nResponse stream received");
- int maxLen = 10 * 1024;
- Char [] read = new Char [maxLen];
- // Read 256 charcters at a time.
- int count = readStream.Read (read, 0, maxLen);
- while (count > 0) {
- currentWsdl = currentWsdl + new String (read, 0, count);
- count = readStream.Read (read, 0, 256);
- }
- readStream.Close ();
- response.Close ();
- XmlComparer comparer = new XmlComparer (XmlComparer.Flags.IgnoreAttribOrder, true);
- Assert.IsTrue (comparer.AreEqual (goldWsdl, currentWsdl), "Service WSDL does not match gold WSDL");
- }
- protected void Run (bool runServer, bool runClient) {
- if (runServer) {
- _hostBase = InitializeServiceHost ();
- _hostBase.Open ();
- }
- }
- string getEndpoint()
- {
- return Configuration.endpointBase + typeof(TServer).Name;
- }
- public string getMexEndpoint ()
- {
- return getEndpoint () + "_wsdl"; // should be getEndpoint() but currently implementation is buggy
- }
- TClient _client;
- protected virtual TClient InitializeClient () {
- //return new TClient(new BasicHttpBinding(), new EndpointAddress( getEndpoint) );
- Type [] paramsTypes = new Type [] { typeof (Binding), typeof (EndpointAddress) };
- object [] parameters = new object [] { new BasicHttpBinding (), new EndpointAddress (getEndpoint())};
- ConstructorInfo info = typeof (TClient).GetConstructor (paramsTypes);
- return (TClient) info.Invoke (parameters);
- }
- public TClient ClientProxy {
- get {
- if (_client == null)
- _client = InitializeClient ();
- return _client;
- }
- }
- public IServer Client {
- get {
- factory = new ChannelFactory<IServer> (new BasicHttpBinding (), new EndpointAddress (getEndpoint ()));
- return factory.CreateChannel ();
- }
- }
- protected virtual ServiceHost InitializeServiceHost () {
- ServiceHost host = new ServiceHost(typeof(TServer));
- host.AddServiceEndpoint(typeof(IServer), new BasicHttpBinding(), getEndpoint());
- ServiceMetadataBehavior smb = new ServiceMetadataBehavior ();
- smb.HttpGetEnabled = true;
- smb.HttpGetUrl = new Uri (getMexEndpoint ());
- host.Description.Behaviors.Add (smb);
- host.Description.Behaviors.Add (new ServiceThrottlingBehavior () { MaxConcurrentCalls = 1, MaxConcurrentSessions = 1 });
- if (Configuration.logMessages)
- host.Description.Behaviors.Add (new LoggerBehavior ());
- return host;
- }
- protected ServiceHost Host {
- get {
- return _hostBase;
- }
- }
- [TearDown]
- protected virtual void Close () {
- if (!Configuration.onlyClients && !Configuration.onlyServers && Host.State == CommunicationState.Opened)
- Host.Close ();
- }
- }
- }
|