Inheritance: OnMethodBoundaryAspect
示例#1
0
        public void SimpleStoreTest()
        {
            var config = new MeasurementStoreConfig()
            {
                StoreType        = StoreType.MicrosoftSqlServer,
                ConnectionString = @"server=(localdb)\MSSqlLocalDb;Database=SimpleStoreTest"
            };
            var trace = new MeasuredTrace()
            {
                PackageFileName = "xyz"
            };
            var measurement = new CpuSampled()
            {
                ProcessName = "Foo", IsDpc = true, Count = 100, TotalSamplesDuringInterval = 1000, CpuCoreCount = 1
            };
            var measurement2 = new TraceAttribute()
            {
                Name = "FooA"
            };

            trace.AddMeasurement(measurement);
            trace.AddMeasurement(measurement2);
            using (var store = new MeasurementStore(config))
            {
                store.Database.EnsureCreated();
                store.Database.EnsureDeleted();
                store.Database.EnsureCreated();
                Assert.True(store.SaveTraceAndMeasurements(trace) == 3);
            }
        }
示例#2
0
 public void Set(TraceAttribute Other, Trace Parent)
 {
     this.CustomCode    = Other.CustomCode;
     this.Element       = Other.Element;
     this.IncrementMode = Other.IncrementMode;
     this.Parent        = Parent;
     this.TraceSource   = Other.TraceSource;
     this.LinkReverse   = Other.LinkReverse;
 }
示例#3
0
        public void BasicQueriesWork()
        {
            var config = new MeasurementStoreConfig()
            {
                StoreType        = StoreType.MicrosoftSqlServer,
                ConnectionString = @"server=(localdb)\MSSqlLocalDb;Database=QueryTests;MultipleActiveResultSets = True"
            };

            using (var store = new MeasurementStore(config))
            {
                store.Database.EnsureCreated();
                store.Database.EnsureDeleted();
                store.Database.EnsureCreated();
                foreach (var n in new[] { 1, 2, 3 })
                {
                    var trace = new MeasuredTrace()
                    {
                        PackageFileName = $"Trace{n}"
                    };
                    var measurement = new CpuSampled()
                    {
                        ProcessName = "ProcessX",
                        IsDpc       = true,
                        Count       = 100,
                        TotalSamplesDuringInterval = 1000,
                        CpuCoreCount = 1
                    };
                    var measurement2 = new TraceAttribute()
                    {
                        Name = "AttributeX", WholeNumberValue = n
                    };
                    trace.AddMeasurement(measurement);
                    trace.AddMeasurement(measurement2);
                    Assert.True(store.SaveTraceAndMeasurements(trace) == 3);
                    trace.ProcessingRecords.Add(new ProcessingRecord()
                    {
                        Path            = "xxx",
                        StateChangeTime = new DateTime(1980, 2, 2),
                        ProcessingState = ProcessingState.Discovered
                    });
                    Assert.True(store.SaveChanges() == 1);
                }
            }
            using (var store = new MeasurementStore(config))
            {
                foreach (var trace in store.GetTraceByFilter(t => true, true))
                {
                    Assert.NotEmpty(trace.ProcessingRecords);
                    var measurements = trace.GetMeasurementsAll();
                    Assert.True(measurements.Count() == 2);
                }
            }
        }
        public void Inject()
        {
            var typeName   = Guid.NewGuid().ToString("N");
            var methodName = Guid.NewGuid().ToString("N");

            AssemblyManager.Manage((assembly) =>
            {
                var traceAttributeCtor = assembly.MainModule.Import(
                    typeof(TraceAttribute).GetConstructor(Type.EmptyTypes));
                var attribute = new CustomAttribute(traceAttributeCtor);

                var type   = AssemblyManager.AddType(assembly, typeName);
                var method = AssemblyManager.AddMethod(type, methodName);
                method.CustomAttributes.Add(attribute);

                var processor = method.Body.GetILProcessor();
                processor.Append(Instruction.Create(OpCodes.Ret));
            }, (assembly) =>
            {
                var injector = new TraceAttribute();

                var targetMethod = (from type in assembly.MainModule.GetAllTypes()
                                    where type.Name == typeName
                                    from method in type.Methods
                                    where method.Name == methodName
                                    select method).First();

                Assert.AreEqual(1, targetMethod.Body.Instructions.Count);
                injector.Inject(targetMethod);
                var instructions = targetMethod.Body.Instructions;
                Assert.AreEqual(12, instructions.Count);

                Assert.AreEqual(OpCodes.Call, instructions[0].OpCode);
                Assert.AreEqual(OpCodes.Callvirt, instructions[1].OpCode);
                Assert.AreEqual(OpCodes.Stloc, instructions[2].OpCode);
                Assert.AreEqual(OpCodes.Ldloc, instructions[3].OpCode);
                Assert.AreEqual(OpCodes.Ldstr, instructions[4].OpCode);
                Assert.AreEqual(OpCodes.Call, instructions[5].OpCode);
                Assert.AreEqual(OpCodes.Call, instructions[6].OpCode);
                Assert.AreEqual(OpCodes.Ldloc, instructions[7].OpCode);
                Assert.AreEqual(OpCodes.Ldstr, instructions[8].OpCode);
                Assert.AreEqual(OpCodes.Call, instructions[9].OpCode);
                Assert.AreEqual(OpCodes.Call, instructions[10].OpCode);
                Assert.AreEqual(OpCodes.Ret, instructions[11].OpCode);
            }, false);
        }
        public void InjectWithThrowOpCode()
        {
            var typeName   = Guid.NewGuid().ToString("N");
            var methodName = Guid.NewGuid().ToString("N");

            AssemblyManager.Manage((assembly) =>
            {
                var traceAttributeCtor = assembly.MainModule.Import(
                    typeof(TraceAttribute).GetConstructor(Type.EmptyTypes));
                var attribute = new CustomAttribute(traceAttributeCtor);

                var type   = AssemblyManager.AddType(assembly, typeName);
                var method = AssemblyManager.AddMethod(type, methodName,
                                                       new List <ParameterDefinition> {
                    new ParameterDefinition(assembly.MainModule.Import(typeof(bool)))
                }, null);
                method.CustomAttributes.Add(attribute);

                var processor = method.Body.GetILProcessor();

                var first = Instruction.Create(OpCodes.Ldarg_0);
                processor.Append(first);
                var argumentNullExceptionCtor = assembly.MainModule.Import(
                    typeof(ArgumentNullException).GetConstructor(new Type[] { typeof(string) }));
                processor.Append(Instruction.Create(OpCodes.Ldstr, "error"));
                processor.Append(Instruction.Create(OpCodes.Newobj, argumentNullExceptionCtor));
                processor.Append(Instruction.Create(OpCodes.Throw));
                var last = Instruction.Create(OpCodes.Ret);
                processor.Append(last);
                processor.InsertAfter(first, Instruction.Create(OpCodes.Brfalse_S, last));
            }, (assembly) =>
            {
                var injector = new TraceAttribute();

                var targetMethod = (from type in assembly.MainModule.GetAllTypes()
                                    where type.Name == typeName
                                    from method in type.Methods
                                    where method.Name == methodName
                                    select method).First();

                Assert.AreEqual(6, targetMethod.Body.Instructions.Count);
                injector.Inject(targetMethod);
                Assert.AreEqual(21, targetMethod.Body.Instructions.Count);

                var instructions = targetMethod.Body.Instructions;

                Assert.AreEqual(OpCodes.Call, instructions[0].OpCode);
                Assert.AreEqual(OpCodes.Callvirt, instructions[1].OpCode);
                Assert.AreEqual(OpCodes.Stloc, instructions[2].OpCode);

                Assert.AreEqual(OpCodes.Ldloc, instructions[3].OpCode);
                Assert.AreEqual(OpCodes.Ldstr, instructions[4].OpCode);
                Assert.AreEqual(OpCodes.Call, instructions[5].OpCode);
                Assert.AreEqual(OpCodes.Call, instructions[6].OpCode);

                Assert.AreEqual(OpCodes.Ldarg_0, instructions[7].OpCode);
                Assert.AreEqual(OpCodes.Brfalse_S, instructions[8].OpCode);
                Assert.AreEqual(OpCodes.Ldstr, instructions[9].OpCode);
                Assert.AreEqual(OpCodes.Newobj, instructions[10].OpCode);

                Assert.AreEqual(OpCodes.Ldloc, instructions[11].OpCode);
                Assert.AreEqual(OpCodes.Ldstr, instructions[12].OpCode);
                Assert.AreEqual(OpCodes.Call, instructions[13].OpCode);
                Assert.AreEqual(OpCodes.Call, instructions[14].OpCode);
                Assert.AreEqual(OpCodes.Throw, instructions[15].OpCode);

                Assert.AreEqual(OpCodes.Ldloc, instructions[16].OpCode);
                Assert.AreEqual(OpCodes.Ldstr, instructions[17].OpCode);
                Assert.AreEqual(OpCodes.Call, instructions[18].OpCode);
                Assert.AreEqual(OpCodes.Call, instructions[19].OpCode);
                Assert.AreEqual(OpCodes.Ret, instructions[20].OpCode);
            }, false);
        }
示例#6
0
 public TraceAttribute(TraceAttribute Other, Trace Parent)
 {
     this.Set(Other, Parent);
 }