public void DiagnosticTracerRaisesEventsOnError() { var containerBuilder = new ContainerBuilder(); containerBuilder.Register <string>(ctxt => throw new InvalidOperationException()); var container = containerBuilder.Build(); var tracer = new DotDiagnosticTracer(); container.SubscribeToDiagnostics(tracer); string lastOpResult = null; tracer.OperationCompleted += (sender, args) => { Assert.Same(tracer, sender); lastOpResult = args.TraceContent; }; try { container.Resolve <string>(); } catch { } Assert.Contains(nameof(InvalidOperationException), lastOpResult); Assert.StartsWith("digraph G {", lastOpResult); Assert.EndsWith("}", lastOpResult.Trim()); }
public void DiagnosticTracerDoesNotLeakMemory() { var containerBuilder = new ContainerBuilder(); containerBuilder.RegisterType <Implementor>().As <IService>(); containerBuilder.RegisterDecorator <Decorator, IService>(); var container = containerBuilder.Build(); var tracer = new DotDiagnosticTracer(); container.SubscribeToDiagnostics(tracer); container.Resolve <IService>(); // The dictionary of tracked operations and // graphs should be empty. Assert.Equal(0, tracer.OperationsInProgress); }
public DIConfig(string functionName) { var tracer = new DotDiagnosticTracer(); tracer.OperationCompleted += (sender, args) => { // Writing the DOT trace to a file will let you render // it to a graph with Graphviz later, but this is // NOT A GOOD COPY/PASTE EXAMPLE. You'll want to do // things in an async fashion with good error handling. var path = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.dot"); using var file = new StreamWriter(path); file.WriteLine(args.TraceContent); }; DependencyInjection.Initialize(builder => { builder.RegisterType <Greeter>().As <IGreeter>(); }, functionName, c => c.SubscribeToDiagnostics(tracer)); }
public void LabelPosition() { using var container = BuildGraphContainer(); var tracer = new DotDiagnosticTracer(); string result = null; tracer.OperationCompleted += (sender, args) => { result = args.TraceContent; }; container.SubscribeToDiagnostics(tracer); using var scope = container.BeginLifetimeScope(); scope.Resolve <IHandler <string> >(); // Label should be at the top. Assert.Contains("labelloc=t", result); }
public void GeneratesComplexGraph() { using var container = BuildGraphContainer(); var tracer = new DotDiagnosticTracer(); string result = null; tracer.OperationCompleted += (sender, args) => { result = args.TraceContent; _output.WriteLine(result); }; container.SubscribeToDiagnostics(tracer); using var scope = container.BeginLifetimeScope(); scope.Resolve <IHandler <string> >(); Assert.NotNull(result); }
public void DiagnosticTracerHandlesDecorators() { var containerBuilder = new ContainerBuilder(); containerBuilder.RegisterType <Implementor>().As <IService>(); containerBuilder.RegisterDecorator <Decorator, IService>(); var container = containerBuilder.Build(); var tracer = new DotDiagnosticTracer(); container.SubscribeToDiagnostics(tracer); string lastOpResult = null; tracer.OperationCompleted += (sender, args) => { Assert.Same(tracer, sender); lastOpResult = args.TraceContent; }; container.Resolve <IService>(); Assert.Contains("Decorator", lastOpResult); }
public void TypeNamesArePrettyPrinted() { using var container = BuildGraphContainer(); var tracer = new DotDiagnosticTracer(); string result = null; tracer.OperationCompleted += (sender, args) => { result = args.TraceContent; }; container.SubscribeToDiagnostics(tracer); using var scope = container.BeginLifetimeScope(); scope.Resolve <IHandler <string> >(); // Label should be pretty-printed. Assert.Contains("label=<Autofac.Diagnostics.DotGraph.Test.ComplexGraphTests.IHandler<string>", result); // No raw type names. Assert.DoesNotContain("`1", result); Assert.DoesNotContain("Culture=neutral", result); }
public void DiagnosticTracerRaisesEventsOnSuccess() { var containerBuilder = new ContainerBuilder(); containerBuilder.Register(ctxt => "Hello"); var container = containerBuilder.Build(); var tracer = new DotDiagnosticTracer(); container.SubscribeToDiagnostics(tracer); string lastOpResult = null; tracer.OperationCompleted += (sender, args) => { Assert.Same(tracer, sender); lastOpResult = args.TraceContent; }; container.Resolve <string>(); Assert.Contains("λ:string", lastOpResult); Assert.StartsWith("digraph G {", lastOpResult); Assert.EndsWith("}", lastOpResult.Trim()); }