public void GetHashCode_ReturnsSameValue_ForEquivalentObjects() { var first = new ExactMethodMatcher("Method 1", new[] { "Parameter 1", "Parameter 2" }); var second = new ExactMethodMatcher("Method 1", new[] { "Parameter 1", "Parameter 2" }); Assert.AreEqual(first.GetHashCode(), second.GetHashCode()); }
public void Equals_ReturnsFalse_IfParameterTypesDoNotMatch() { var first = new ExactMethodMatcher("Method 1", new[] { "Parameter 1", "Parameter 2" }); var second = new ExactMethodMatcher("Method 1", new[] { "Parameter 3", "Parameter 2" }); Assert.IsFalse(first.Equals(second)); }
public void Equals_ReturnsTrue_ForEquivalentObjects() { var first = new ExactMethodMatcher("Method 1", new[] { "Parameter 1", "Parameter 2" }); var second = new ExactMethodMatcher("Method 1", new[] { "Parameter 1", "Parameter 2" }); Assert.IsTrue(first.Equals(second)); }
/// <summary> /// Creates an XML-renderable Extension object that represents the instrumentation settings /// specified by the supplied list of targets. /// </summary> /// <param name="targets">The set of targets to be instrumented.</param> /// <returns>An Extension object representing the in-memory New Relic custom /// instrumentation configuration XML document.</returns> public static Extension Render(IEnumerable <InstrumentationTarget> targets) { Instrumentation toReturn = new Instrumentation(); // Group the targets by metric name... var byMetricName = targets.GroupBy(x => x.MetricName ?? string.Empty); foreach (var groupedByMetricName in byMetricName.OrderBy(x => x.Key)) { // Then by name var byName = groupedByMetricName.GroupBy(x => x.Name ?? string.Empty); foreach (var groupedByName in byName.OrderBy(x => x.Key)) { // Then by priority var byPriority = groupedByName.GroupBy(x => x.TransactionNamingPriority ?? string.Empty); foreach (var groupedByPriority in byPriority.OrderBy(x => x.Key)) { // Then group by metric var byMetric = groupedByPriority.GroupBy(x => x.Metric); foreach (var groupedByMetric in byMetric.OrderBy(x => x.Key)) { string metricName = groupedByMetricName.Key == string.Empty ? null : groupedByMetricName.Key; string name = groupedByName.Key == string.Empty ? null : groupedByName.Key; string priority = groupedByPriority.Key == string.Empty ? null : groupedByPriority.Key; TracerFactory tracerFactory = new TracerFactory(metricName, name, priority, groupedByMetric.Key); var byType = groupedByMetric.GroupBy(x => x.Target.DeclaringType); foreach (var groupedByType in byType.OrderBy(x => x.Key.Assembly.FullName).ThenBy(x => x.Key.FullName)) { Match match = GetMatchFromType(groupedByType.Key); // Each item in the groupedByType enumerable is a method to be instrumented foreach (var toInstrument in groupedByType.OrderBy(x => x.Target.Name)) { ExactMethodMatcher methodMatcher = GetMatcherFromTarget(toInstrument); match.Matches.Add(methodMatcher); } // De-dupe the method matchers, in case we have some parameterless // entries and some with - as the parameterless ones will take precedence // anyway, there's no point keeping the others HashSet <ExactMethodMatcher> toDelete = new HashSet <ExactMethodMatcher>(); foreach (var matcher in match.Matches.Where(x => string.IsNullOrWhiteSpace(x.ParameterTypes))) { toDelete.UnionWith(match.Matches.Where(x => x.MethodName == matcher.MethodName && !string.IsNullOrWhiteSpace(x.ParameterTypes))); } match.Matches.RemoveAll(x => toDelete.Contains(x)); tracerFactory.MatchDefinitions.Add(match); } toReturn.TracerFactories.Add(tracerFactory); } } } } return(new Extension() { Instrumentation = toReturn }); }