public void TestEverythingTogether()
		{
			var tpp = new TraceParameterProvider();
			tpp
				.For<IEmailer>(m => m.Send(Any<IEmail>.Value, Any<DateTime>.Value))
					.With<IEmail>()
						.Trace(e => e.From).As("sender")
						.Trace(e => e.To).As("recipient")
						.Trace(e => e.Subject).As("s")
							.And(e => e.Body).As("b")
							.TogetherAs("message")
						.Trace(e => String.Join("/", e.Attachments.Select(Convert.ToBase64String).ToArray()))
							.As("attachments")
					.EndWith()
					.Trace("when")
				.ForAnything()
					.AddContext("context", () => "testing");

			var proxy = (IEmailer)new TypeImplementer(typeof(IEmailer), tpp).EventSource;
			EnableLogging(proxy);
			proxy.Send(new EMail("from", "to", "subject", "body", new byte[][] { new byte[] { 1 } }), DateTime.Parse("1/1/2000"));

			// look at the events again
			var events = _listener.Events.ToArray();
			Assert.AreEqual(1, events.Length);

			var payload = events[0].Payload.Select(o => o.ToString()).ToArray();

			Assert.AreEqual(6, payload.Length);
			Assert.That(payload[0] == ("from"));
			Assert.That(payload[1] == ("to"));
			Assert.That(payload[2] == ("{\"s\":\"subject\",\"b\":\"body\"}"));
			Assert.That(payload[3] == ("AQ=="));
			Assert.That(payload[4] == ("1/1/2000 12:00:00 AM"));
			Assert.That(payload[5] == ("testing"));
		}
		public void AndExpressionWithNameAlternateSyntax()
		{
			var tpp = new TraceParameterProvider();
			tpp.For<IEmailer>()
				.With<IEmail>()
					.Trace("email", e => e.From, e => e.To)
				.EndWith();

			var builders = tpp.Builders.ToArray();
			Assert.That(builders.Length, Is.EqualTo(1));
			Assert.That(builders[0].Alias, Is.EqualTo("email"));

			var values = builders[0].Values.ToArray();
			ValidateValue(values[0], "From", "email", true);
			ValidateValue(values[1], "To", "email", true);
		}
		public void AndExpressionAlternateSyntaxWithRename()
		{
			var tpp = new TraceParameterProvider();
			tpp.For<IEmailer>()
				.With<IEmail>()
					.Trace(e => e.From, e => e.To).As("Sender", "Recipient")
					.TogetherAs("metadata")
				.EndWith();

			var builders = tpp.Builders.ToArray();
			Assert.That(builders.Length, Is.EqualTo(1));
			Assert.That(builders[0].Alias, Is.EqualTo("metadata"));

			var values = builders[0].Values.ToArray();
			ValidateValue(values[0], "Sender", null, true);
			ValidateValue(values[1], "Recipient", null, true);
		}
		public void AndNameAlternateSyntax()
		{
			var tpp = new TraceParameterProvider();
			tpp.For<IEmailer>()
				.Trace("email", "when");

			var builders = tpp.Builders.ToArray();
			Assert.That(builders.Length, Is.EqualTo(1));
			Assert.That(builders[0].Alias, Is.EqualTo("email"));

			var values = builders[0].Values.ToArray();
			ValidateValue(values[0], "email", "email", false);
			ValidateValue(values[1], "when", "when", false);
		}
		public void ParameterProviderAddsMappingForSubClassWhenBaseClassIsMapped()
		{
			var tpp = new TraceParameterProvider();
			tpp.ForAnything()
				.With<BaseClass>()
				.Trace(c => c.Message);

			var proxy2 = new TypeImplementer(typeof(ISubClassEventSource), tpp).EventSource;                

			Assert.DoesNotThrow(delegate
			{
				var proxy = new TypeImplementer(typeof(ISubClassEventSource), tpp).EventSource;                
			});
		}
		public void AddContext()
		{
			var traceDescription = new TraceParameterProvider().For<IEmailer>()
				.AddContext("context", () => "foo");

			ParameterBuilder traceBuilder = (ParameterBuilder)traceDescription;

			Assert.That(traceBuilder.Alias, Is.EqualTo("context"));

			var traceValues = traceBuilder.Values.ToArray();
			Assert.That(traceValues.Length, Is.EqualTo(1));
			ValidateValue(traceValues[0], "context", null, true);
		}
		public void TraceParameterMemberAs()
		{
			var traceDescription = new TraceParameterProvider().For<IEmailer>()
				.With<IEmail>()
					.Trace(email => email.From)
					.As("sender")
				.EndWith();

			ParameterBuilder traceBuilder = (ParameterBuilder)traceDescription;
			Assert.That(traceBuilder.Alias, Is.EqualTo("sender"));

			var traceValues = traceBuilder.Values.ToArray();
			Assert.That(traceValues.Length, Is.EqualTo(1));
			ValidateValue(traceValues[0], "sender", null, true);
		}
		public void TraceAllParametersByDefault()
		{
			var tpp = new TraceParameterProvider();

			var proxy = (IEmailer)new TypeImplementer(typeof(IEmailer), tpp).EventSource;
			EnableLogging(proxy);
			proxy.Send(new EMail("from", "to", "subject", "body", new byte[][] { new byte[] { 1 } }), DateTime.Parse("1/1/2000"));

			// look at the events again
			var events = _listener.Events.ToArray();
			Assert.AreEqual(1, events.Length);

			var payload = events[0].Payload.Select(o => o.ToString()).ToArray();
			Assert.AreEqual(2, payload.Length);
			Assert.That(payload.Contains("{\"From\":\"from\",\"To\":\"to\",\"Subject\":\"subject\",\"Body\":\"body\",\"Attachments\":[\"AQ==\"]}"));
			Assert.That(payload.Contains("1/1/2000 12:00:00 AM"));
		}
		public void TraceParameterNameAs()
		{
			var traceDescription = new TraceParameterProvider().For<IEmailer>()
				.Trace("email")
					.As("message");

			ParameterBuilder traceBuilder = (ParameterBuilder)traceDescription;

			Assert.That(traceBuilder.Alias, Is.EqualTo("message"));

			var traceValues = traceBuilder.Values.ToArray();
			Assert.That(traceValues.Length, Is.EqualTo(1));
			ValidateValue(traceValues[0], "message", "email", false);
		}
        public void TraceParameterExpressionAndName()
        {
			var traceDescription = new TraceParameterProvider().For<IEmailer>()
				.With<IEmail>()
					.Trace("email", email => email.From)
				.EndWith();

			ParameterBuilder traceBuilder = (ParameterBuilder)traceDescription;

			Assert.That(traceBuilder.Values.First().Matches(typeof(IEmailer).GetMethod("Send").GetParameters()).Count(), Is.EqualTo(1));
			Assert.That(traceBuilder.Values.First().Matches(typeof(IEmailer).GetMethod("OtherName").GetParameters()).Count(), Is.EqualTo(0));

			Assert.That(traceBuilder.Alias, Is.EqualTo("email"));

			var traceValues = traceBuilder.Values.ToArray();
			Assert.That(traceValues.Length, Is.EqualTo(1));
			ValidateValue(traceValues[0], "From", "email", true);
        }
		public void ForMethod()
		{
			var traceDescription = new TraceParameterProvider().For<IEmailer>(e => e.Send(Any<IEmail>.Value, Any<DateTime>.Value));

			ParameterBuilder traceBuilder = (ParameterBuilder)traceDescription;

			Assert.True(traceBuilder.Matches(typeof(IEmailer).GetMethod("Send")));
			Assert.False(traceBuilder.Matches(typeof(IEmailer).GetMethod("Receive")));
			Assert.False(traceBuilder.Matches(typeof(INotEmail).GetMethod("Nothing")));
		}
		public void ForInterface()
		{
			var traceDescription = new TraceParameterProvider().For<IEmailer>();

			ParameterBuilder traceBuilder = (ParameterBuilder)traceDescription;

			Assert.True(traceBuilder.Matches(typeof(IEmailer).GetMethod("Send")));
			Assert.True(traceBuilder.Matches(typeof(IEmailer).GetMethod("Receive")));
			Assert.False(traceBuilder.Matches(typeof(INotEmail).GetMethod("Nothing")));
		}
		public void Test33()
		{
			var tpp = new TraceParameterProvider();
			tpp.ForAnything().Trace((RagStatus r) => r.ToString());

			var proxy = (ITest33)new TypeImplementer(typeof(ITest33), tpp).EventSource;
			EnableLogging(proxy);

			// do some logging
			proxy.LogItServiceStatusEvent("it", RagStatus.Up);

			// look at the events
			var events = _listener.Events.ToArray();
			Assert.AreEqual(1, events.Length);
			Assert.AreEqual(2, events[0].Payload.Count);
			Assert.AreEqual("it", events[0].Payload[0]);
			Assert.AreEqual("Up", events[0].Payload[1]);
		}
		public void WithTypeAndNameTrace()
		{
			var tpp = new TraceParameterProvider();
			tpp.For<IEmailer>()
				.With<IEmail>("email")
					.Trace(e => e.From)
					.Trace(e => e.To);

			var builders = tpp.Builders.ToArray();
			Assert.That(builders.Length, Is.EqualTo(2));

			Assert.That(builders[0].Alias, Is.EqualTo("From"));
			ValidateValue(builders[0].Values.First(), "From", "email", true);
			Assert.That(builders[1].Alias, Is.EqualTo("To"));
			ValidateValue(builders[1].Values.First(), "To", "email", true);
		}
        public void TraceParameterExpressionAs()
        {
			var traceDescription = new TraceParameterProvider().For<IEmailer>()
				.With<IEmail>()
					.Trace(email => string.Join("/", email.Attachments.Select(Convert.ToBase64String).ToArray()))
					.As("attachments")
				.EndWith();

			ParameterBuilder traceBuilder = (ParameterBuilder)traceDescription;
			Assert.That(traceBuilder.Alias, Is.EqualTo("attachments"));

			var traceValues = traceBuilder.Values.ToArray();
            Assert.That(traceValues.Length, Is.EqualTo(1));
			ValidateValue(traceValues[0], "attachments", null, true);
        }
		public void WithChained()
		{
			var tpp = new TraceParameterProvider();
			tpp.For<IEmailer>()
				.With<IEmail>("email")
					.Trace(e => e.From)
					.Trace(e => e.To)
				.With<OtherClass>()
					.Trace(c => c.ToString()).As("other");

			var builders = tpp.Builders.ToArray();
			Assert.That(builders.Length, Is.EqualTo(3));

			Assert.That(builders[0].Alias, Is.EqualTo("From"));
			ValidateValue(builders[0].Values.First(), "From", "email", true);
			Assert.That(builders[0].Values.First().ParameterType, Is.EqualTo(typeof(IEmail)));
			Assert.That(builders[1].Alias, Is.EqualTo("To"));
			Assert.That(builders[1].Values.First().ParameterType, Is.EqualTo(typeof(IEmail)));
			ValidateValue(builders[1].Values.First(), "To", "email", true);
			Assert.That(builders[2].Alias, Is.EqualTo("other"));
			Assert.That(builders[2].Values.First().ParameterType, Is.EqualTo(typeof(OtherClass)));
		}
		public void TwoNameTraces()
		{
			var tpp = new TraceParameterProvider();
			tpp.For<IEmailer>()
				.Trace("email")
				.Trace("when");

			var builders = tpp.Builders.ToArray();
			Assert.That(builders.Length, Is.EqualTo(2));

			ValidateValue(builders[0].Values.First(), "email", "email", false);
			ValidateValue(builders[1].Values.First(), "when", "when", false);
		}
		public void IgnoreParameterByType()
		{
			var tpp = new TraceParameterProvider();
			tpp.For<IEmailer>().Ignore<IEmail>();

			var proxy = (IEmailer)new TypeImplementer(typeof(IEmailer), tpp).EventSource;
			EnableLogging(proxy);
			proxy.Send(new EMail("from", "to", "subject", "body", new byte[][] { new byte[] { 1 } }), DateTime.Parse("1/1/2000"));

			// look at the events again
			var events = _listener.Events.ToArray();
			Assert.AreEqual(1, events.Length);

			var payload = events[0].Payload.Select(o => o.ToString()).ToArray();
			Assert.AreEqual(1, payload.Length);
			Assert.That(payload.Contains("1/1/2000 12:00:00 AM"));
		}
		public void TwoTracesRenamed()
        {
			var tpp = new TraceParameterProvider();
			tpp.For<IEmailer>()
				.With<IEmail>()
					.Trace(email => email.From).As("Sender")
					.Trace(email => email.To).As("Recipient")
				.EndWith();

			var builders = tpp.Builders.ToArray();
			Assert.That(builders.Length, Is.EqualTo(2));

			ValidateValue(builders[0].Values.First(), "Sender", null, true);
			ValidateValue(builders[1].Values.First(), "Recipient", null, true);
		}
		public void CanAddRulesToEventSource()
		{
			var tpp = new TraceParameterProvider();
			tpp.ForAnything().With<Exception>()
				.Trace(e => e.Message)
				.Trace(e => e.StackTrace);

			var proxy = (EventSourceWithRules)new TypeImplementer(typeof(EventSourceWithRules), tpp).EventSource;
			EnableLogging(proxy);
			proxy.TraceException(new Exception("oops, world"));

			// look at the events
			var events = _listener.Events.ToArray();
			Assert.AreEqual(1, events.Length);
			Assert.AreEqual(2, events[0].Payload.Count);
			Assert.That(events[0].Payload.Contains("oops, world"));
		}
		public void AndTracesTogetherAs()
		{
			var tpp = new TraceParameterProvider();
			tpp.For<IEmailer>()
				.With<IEmail>()
					.Trace(email => email.From)
						.And(email => email.To)
						.As("Sender", "Recipient")
					.TogetherAs("Metadata")
				.EndWith();

			var builders = tpp.Builders.ToArray();
			Assert.That(builders.Length, Is.EqualTo(1));

			Assert.That(builders[0].Alias, Is.EqualTo("Metadata"));

			var values = builders[0].Values.ToArray();
			ValidateValue(values[0], "Sender", null, true);
			ValidateValue(values[1], "Recipient", null, true);
		}
		public void ContextShouldBeLast()
		{
			var tpp = new TraceParameterProvider();
			tpp.ForAnything().AddContext("arg2", () => "extra");

			var proxy = (IPayloadOrder)new TypeImplementer(typeof(IPayloadOrder), tpp).EventSource;
			EnableLogging(proxy);

			proxy.ForLoopIteration(0);

			// look at the events
			var events = _listener.Events.ToArray();
			Assert.AreEqual(1, events.Length);

			var payload = events[0].Payload.Select(o => o.ToString()).ToArray();

			Assert.AreEqual(2, payload.Length);
			Assert.That(payload[0] == ("0"));
			Assert.That(payload[1] == ("extra"));
		}
示例#23
0
		/// <summary>
		/// Initializes a new instance of the TypeImplementer class.
		/// </summary>
		/// <param name="interfaceType">The type to implement.</param>
		/// <param name="parameterProvider">An optional parameter provider to use when building the type. Used for testing.</param>
		public TypeImplementer(Type interfaceType, TraceParameterProvider parameterProvider = null)
		{
			_interfaceType = interfaceType;
			_contextProvider = ProviderManager.GetProvider<TraceContextProvider>(interfaceType, typeof(TraceContextProviderAttribute), null);
			_serializationProvider = TraceSerializationProvider.GetSerializationProvider(interfaceType);
			_eventAttributeProvider = ProviderManager.GetProvider<EventAttributeProvider>(interfaceType, typeof(EventAttributeProviderAttribute), () => new EventAttributeProvider());
			_traceParameterProvider = parameterProvider ?? TraceParameterProvider.GetParameterProvider(interfaceType);

			// only interfaces support context
			if (_contextProvider != null && !_interfaceType.IsInterface)
				throw new InvalidOperationException("Context Providers can only be added to interface-based logs.");

			ImplementType();
		}