/**
* Copyright (c) 2009-2011 VMware, Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.springsource.insight.plugin.jmx;
import java.util.Map;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import org.junit.Before;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
import com.springsource.insight.collection.method.custom.ScoreGeneratorsFactory;
import com.springsource.insight.collection.test.AbstractCollectionTestSupport;
import com.springsource.insight.intercept.endpoint.EndPointAnalysis;
import com.springsource.insight.intercept.endpoint.EndPointName;
import com.springsource.insight.intercept.operation.Operation;
import com.springsource.insight.intercept.plugin.CollectionSettingsRegistry;
import com.springsource.insight.util.StringUtil;
import com.springsource.insight.util.props.NamedPropertySource;
import com.springsource.insight.util.props.PropertiesUtil;
/**
*
*/
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class JmxInvocationEndPointAnalyzerTest extends AbstractCollectionTestSupport {
private CollectionSettingsRegistry registry;
private JmxInvocationEndPointAnalyzer analyzer;
public JmxInvocationEndPointAnalyzerTest() {
super();
}
@Override
@Before
public void setUp() {
super.setUp();
registry = new CollectionSettingsRegistry();
analyzer = new JmxInvocationEndPointAnalyzer(registry);
}
@Test
public void testDefaultFormatting() throws Exception {
assertEndPointAnalysis(mockInvocationOperation("testDefaultFormatting"), 7365);
}
@Test
public void testCustomScoreFormatting() throws Exception {
for (String scoreType : ScoreGeneratorsFactory.BUILTIN_GENERATORS_NAMES) {
if (ScoreGeneratorsFactory.DEFAULT_SCORE.equals(scoreType)) {
continue;
}
analyzer.incrementalUpdate(JmxInvocationEndPointAnalyzer.SCORE_VALUE, scoreType);
Operation op = mockInvocationOperation("testCustomScoreFormattingFor" + StringUtil.capitalize(scoreType));
assertEndPointAnalysis(op, 3777347);
}
}
private EndPointAnalysis assertEndPointAnalysis(Operation op, int depth) {
EndPointAnalysis analysis = analyzer.makeEndPoint(createMockOperationWrapperFrame(op), depth);
assertNotNull("No analysis", analysis);
assertSame("Mismatched source operation", op, analysis.getSourceOperation());
NamedPropertySource props = JmxInvocationEndPointAnalyzer.toPropertySource(op);
EndPointName name = analysis.getEndPointName();
assertEquals("Mismatched endpoint",
PropertiesUtil.format(analyzer.getSettingFormat(JmxInvocationEndPointAnalyzer.ENDPOINT_FORMAT), props),
name.getName());
assertEquals("Mismatched label",
PropertiesUtil.format(analyzer.getSettingFormat(JmxInvocationEndPointAnalyzer.LABEL_FORMAT), props),
analysis.getResourceLabel());
assertEquals("Mismatched example",
PropertiesUtil.format(analyzer.getSettingFormat(JmxInvocationEndPointAnalyzer.EXAMPLE_FORMAT), props),
analysis.getExample());
String scoreType = analyzer.getSettingFormat(JmxInvocationEndPointAnalyzer.SCORE_VALUE);
Number expScore = JmxInvocationEndPointAnalyzer.DEFAULT_SCORE_FORMAT.equals(scoreType)
? Integer.valueOf(EndPointAnalysis.depth2score(depth))
: JmxInvocationEndPointAnalyzer.resolveOperationScore(op, scoreType);
assertNotNull("Cannot resolve score for mode=" + scoreType, expScore);
assertEquals("Mismatched score", expScore.intValue(), analysis.getScore());
return analysis;
}
private Operation mockInvocationOperation(final String method) throws MalformedObjectNameException {
return mockInvocationOperation(method,
new String[]{getClass().getName(), String.class.getName(), Map.Entry.class.getName()},
new Object[]{this, method, new Map.Entry<String, String>() {
public String getKey() {
return method;
}
public String getValue() {
return method;
}
public String setValue(String value) {
throw new UnsupportedOperationException("setValue(" + value + ") N/A");
}
}});
}
private Operation mockInvocationOperation(String method, String[] paramsType, Object[] argVals) throws MalformedObjectNameException {
return mockInvocationOperation(getClass(), method, paramsType, argVals);
}
private static Operation mockInvocationOperation(Class<?> clazz, String method, String[] paramsType, Object[] argVals) throws MalformedObjectNameException {
Package pkg = clazz.getPackage();
ObjectName name = new ObjectName(pkg.getName() + ":" + JmxInvocationEndPointAnalyzer.NAME_KEY + "=" + clazz.getSimpleName());
return mockInvocationOperation(name, method, paramsType, argVals);
}
private static Operation mockInvocationOperation(ObjectName name, String method, String[] paramsType, Object[] argVals) {
return JmxInvocationEndPointAnalyzer.updateOperation(
new Operation().put(JmxPluginRuntimeDescriptor.BEAN_NAME_PROP, name.getCanonicalName()), method, paramsType, argVals);
}
}