001 // jademx - JADE management using JMX
002 // Copyright 2005 Caboodle Networks, Inc.
003 //
004 // This library is free software; you can redistribute it and/or
005 // modify it under the terms of the GNU Lesser General Public
006 // License as published by the Free Software Foundation; either
007 // version 2.1 of the License, or (at your option) any later version.
008 //
009 // This library is distributed in the hope that it will be useful,
010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 // Lesser General Public License for more details.
013 //
014 // You should have received a copy of the GNU Lesser General Public
015 // License along with this library; if not, write to the Free Software
016 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
017
018 package jade.jademx.mbean;
019
020 import javax.management.ObjectName;
021
022 import jade.jademx.JadeMXSuiteTest;
023 import jade.jademx.agent.JademxPingAgent;
024 import jade.jademx.server.JadeMXServer;
025 import jade.jademx.server.JadeMXServerFactory;
026 import jade.wrapper.PlatformState;
027 import junit.framework.Test;
028 import junit.framework.TestCase;
029 import junit.framework.TestSuite;
030
031 /**
032 * JadePlatform MBean test
033 * @author David Bernstein, <a href="http://www.caboodlenetworks.com"
034 * >Caboodle Networks, Inc.</a>
035 */
036 public class JadePlatformTest extends TestCase {
037
038 ///** test(suite) name */
039 //private static String name =
040 // JadeMXSuiteTest.nameWithClass(
041 // JadePlatformTest.class,
042 // "testing JadePlatform: JADE platform MBean class");
043
044
045 /** jadeMXServer we're using */
046 private JadeMXServer jadeMXServer = null;
047
048 /** runtime for test use */
049 private JadeRuntime jadeRuntime = null;
050
051 /** resource name for configuration of one empty platform */
052 private static final String EMPTY_PLATFORM_CONFIG_RESOURCE =
053 "jade/jademx/config/one-empty-platform.xml";
054 /** resource name for configuration of two ping agents */
055 private static final String TWO_PING_CONFIG_RESOURCE =
056 "jade/jademx/config/two-ping-agents.xml";
057 /** name for 1st ping agent */
058 private static final String AGENT_LOCAL_NAME_PINGER1 = "pinger1";
059 /** name for 2nd ping agent */
060 private static final String AGENT_LOCAL_NAME_PINGER2 = "pinger2";
061 /** intentionally non-existent agent name */
062 private static final String AGENT_LOCAL_NAME_BAD = "nosuchagent";
063 /** intentionally non-existent class name */
064 private static final String BAD_CLASS_NAME = "no.such.class.Name";
065
066 // tests
067
068
069 /* (non-Javadoc)
070 * @see junit.framework.TestCase#setUp()
071 */
072 protected void setUp() throws Exception {
073 //System.err.println( ">>>starting test "+getName());
074 // first get JadeMXServer
075 jadeMXServer = JadeMXServerFactory.jadeMXServerBySysProp();
076 // now get a factory to use
077 JadeFactory jadeFactory =
078 new JadeFactory( jadeMXServer );
079 jadeRuntime = (JadeRuntime)jadeFactory.runtimeInstance();
080 //JadeMXSuiteTest.listMBeans(mBeanServer, "at end of setUp()");
081 }
082
083
084
085 /* (non-Javadoc)
086 * @see junit.framework.TestCase#tearDown()
087 */
088 protected void tearDown() throws Exception {
089 //JadeMXSuiteTest.listMBeans(mBeanServer,
090 //"at start of JadePlatformTest.tearDown()");
091 if ( null != jadeRuntime ) {
092 jadeRuntime.shutdown();
093 }
094 //JadeMXSuiteTest.listMBeans(
095 // jadeMXServer.getMBeanServer(),
096 // "at end of JadePlatformTest.tearDown() for test "+getName());
097 }
098
099 /**
100 * test getting platform's runtime
101 * @throws JademxException some unexpected error
102 */
103 public void testGetJadeRuntime() throws JademxException {
104 JadePlatform platformMBeans[] = null;
105 int platformCount = 0;
106 platformMBeans = jadeRuntime.platformsFromConfigResource(
107 EMPTY_PLATFORM_CONFIG_RESOURCE );
108 // should be exactly one platform returned
109 assertNotNull(
110 "JadeRuntime.platformsFromConfigResources()"+
111 " returned null",
112 platformMBeans );
113 platformCount = platformMBeans.length;
114 assertEquals( "expected exactly one platform to be returned",
115 1, platformCount);
116 JadeRuntime jr = platformMBeans[0].getJadeRuntime();
117 assertEquals( jadeRuntime, jr );
118 }
119
120 /**
121 * test getting thread information about a platform
122 * @throws JademxException some unexpected error
123 */
124 public void testThreadInfo() throws JademxException {
125 JadePlatform platformMBeans[] = null;
126 int platformCount = 0;
127 String DEFAULT_THREAD_GROUP_NAME = "JADE runtime";
128 String DEFAULT_FIRST_PLATFORM_THREAD_NAME = "JADE platform 0";
129 platformMBeans = jadeRuntime.platformsFromConfigResource(
130 EMPTY_PLATFORM_CONFIG_RESOURCE );
131 // should be exactly one platform returned
132 assertNotNull(
133 "JadeRuntime.platformsFromConfigResources()"+
134 " returned null",
135 platformMBeans );
136 platformCount = platformMBeans.length;
137 assertEquals( "expected exactly one platform to be returned",
138 1, platformCount);
139 String threadGroupName = platformMBeans[0].getThreadGroupName();
140 assertEquals( "expected thread group name \""+
141 DEFAULT_THREAD_GROUP_NAME+"\""+" but got \""+threadGroupName+
142 "\"", DEFAULT_THREAD_GROUP_NAME, threadGroupName);
143 long threadId = platformMBeans[0].getThreadId();
144 assertTrue( "expected non-negative threadId, but got"+threadId,
145 (threadId >= 0) );
146 String threadName = platformMBeans[0].getThreadName();
147 assertEquals( "expected thread name \""+
148 DEFAULT_FIRST_PLATFORM_THREAD_NAME+"\""+" but got \""+
149 threadName+
150 "\"", DEFAULT_FIRST_PLATFORM_THREAD_NAME, threadName);
151 }
152
153 /**
154 * test that platform begins life in ready state
155 * @throws JademxException some unexpected error
156 */
157 public void testPlatformInitialState() throws JademxException {
158 JadePlatform platformMBeans[] = null;
159 String PLATFORM_READY_STATE_NAME = "Ready";
160 platformMBeans = jadeRuntime.platformsFromConfigResource(
161 EMPTY_PLATFORM_CONFIG_RESOURCE );
162 // should be exactly one platform returned
163 assertNotNull(
164 "JadeRuntime.platformsFromConfigResource()"+
165 " returned null",
166 platformMBeans );
167 int platformCount = platformMBeans.length;
168 assertEquals( "expected exactly one platform to be returned",
169 1, platformCount);
170 int stateCode = platformMBeans[0].getStateCode();
171 assertEquals( "expected initial state code "+
172 PlatformState.cPLATFORM_STATE_READY+
173 " but got "+stateCode,
174 PlatformState.cPLATFORM_STATE_READY, stateCode);
175 String stateName = platformMBeans[0].getStateName();
176 assertEquals( "expected initial state name "+
177 PLATFORM_READY_STATE_NAME+
178 " but got "+stateName,
179 PLATFORM_READY_STATE_NAME, stateName);
180 }
181
182 /**
183 * test agent name retrieval
184 * @throws JademxException some unexpected error
185 */
186 public void testAgentNameRetrieval() throws JademxException {
187
188 JadePlatform platformMBean = null;
189 JadePlatform platformMBeans[] =
190 jadeRuntime.platformsFromConfigResource(
191 TWO_PING_CONFIG_RESOURCE );
192 // should be exactly one platform returned
193 assertNotNull(
194 "JadeRuntime.platformsFromConfigResource()"+
195 " returned null",
196 platformMBeans );
197 int platformCount = platformMBeans.length;
198 assertEquals( "expected exactly one platform to be returned",
199 1, platformCount);
200 platformMBean = platformMBeans[0];
201
202 // test JadePlatform.getAgentNames()
203 String agentNames[] = platformMBean.getAgentNames();
204 int agentCount = agentNames.length;
205 if ( 2 != agentCount ) {
206 for ( int i = 0; i < agentNames.length; i++ ) {
207 System.err.println("agent "+i+": "+agentNames[i]);
208 }
209 assertTrue("expected 2 agent names but got back "+agentCount,
210 (2==agentCount));
211 }
212 String agentName;
213 String typeProp =
214 JadeBaseMBean.OBJ_NAME_KEY_TYPE + "=" +
215 JadeAgentMBeanDef.TYPE;
216
217 String nameProp =
218 JadeBaseMBean.OBJ_NAME_KEY_NAME + "=" +
219 AGENT_LOCAL_NAME_PINGER1;
220 agentName = platformMBean.getAgentName( AGENT_LOCAL_NAME_PINGER1 );
221 assertNotNull( "got null looking for agent MBean for "+
222 AGENT_LOCAL_NAME_PINGER1, agentName );
223 assertTrue( "string \""+typeProp+
224 "\" not contained in agent MBean name \""+agentName+"\"",
225 (agentName.indexOf(typeProp)>=0));
226 assertTrue( "string \""+nameProp+
227 "\" not contained in agent MBean name \""+agentName+"\"",
228 (agentName.indexOf(nameProp)>=0));
229
230 nameProp =
231 JadeBaseMBean.OBJ_NAME_KEY_NAME + "=" +
232 AGENT_LOCAL_NAME_PINGER2;
233 agentName = platformMBean.getAgentName( AGENT_LOCAL_NAME_PINGER2 );
234 assertNotNull( "got null looking for agent MBean for "+
235 AGENT_LOCAL_NAME_PINGER2, agentName );
236 assertTrue( "string \""+typeProp+
237 "\" not contained in agent MBean name \""+agentName+"\"",
238 (agentName.indexOf(typeProp)>=0));
239 assertTrue( "string \""+nameProp+
240 "\" not contained in agent MBean name \""+agentName+"\"",
241 (agentName.indexOf(nameProp)>=0));
242
243 try {
244 agentName = platformMBean.getAgentName( AGENT_LOCAL_NAME_BAD );
245 fail("calling JadePlatform.getAgentName(\""+AGENT_LOCAL_NAME_BAD+
246 "\") should raise an exception");
247 }
248 catch ( JademxException e ) {
249 assertTrue(true);
250 }
251
252 }
253
254 /**
255 * test <code>JadePlatform.createNewAgentReturnName()</code>
256 * @throws JademxException some unexpected error
257 */
258 public void testAgentCreateReturnName() throws JademxException {
259 // create the platform
260 JadePlatform platformMBeans[] = jadeRuntime.platformsFromConfigResource(
261 EMPTY_PLATFORM_CONFIG_RESOURCE );
262 // test agent creation where it should work
263 String agentName = platformMBeans[0].createNewAgentReturnName(
264 AGENT_LOCAL_NAME_PINGER1,
265 JademxPingAgent.class.getName(),
266 new Object[0] );
267 String typeProp =
268 JadeBaseMBean.OBJ_NAME_KEY_TYPE + "=" +
269 JadeAgentMBeanDef.TYPE;
270 String nameProp =
271 JadeBaseMBean.OBJ_NAME_KEY_NAME + "=" +
272 AGENT_LOCAL_NAME_PINGER1;
273 assertNotNull( "got null looking trying to create agent "+
274 AGENT_LOCAL_NAME_PINGER1, agentName );
275 assertTrue( "string \""+typeProp+
276 "\" not contained in agent MBean name \""+agentName+"\"",
277 (agentName.indexOf(typeProp)>=0));
278 assertTrue( "string \""+nameProp+
279 "\" not contained in agent MBean name \""+agentName+"\"",
280 (agentName.indexOf(nameProp)>=0));
281
282 ObjectName agentNames[] = platformMBeans[0].getAgentObjectNames();
283 assertEquals( agentName, agentNames[0].toString() );
284
285 // test agent creation where it should fail: duplicate agent name
286 try {
287 agentName = platformMBeans[0].createNewAgentReturnName(
288 AGENT_LOCAL_NAME_PINGER1,
289 JademxPingAgent.class.getName(),
290 new Object[0] );
291 fail("calling JadePlatform.createNewAgentReturnName()"+
292 " for existing agent name \""+AGENT_LOCAL_NAME_PINGER1+
293 "\" should raise an exception");
294 }
295 catch ( JademxException e ) {
296 assertTrue(true);
297 }
298
299 // test agent creation where it should fail: bad class name
300 try {
301 agentName = platformMBeans[0].createNewAgentReturnName(
302 AGENT_LOCAL_NAME_PINGER2,
303 BAD_CLASS_NAME,
304 new Object[0] );
305 fail("calling JadePlatform.createNewAgentReturnName()"+
306 " with class name \""+BAD_CLASS_NAME+
307 "\" should raise an exception");
308 }
309 catch ( JademxException e ) {
310 assertTrue(true);
311 }
312
313 }
314
315 //TODO: try testing JadeAgent with the ping agent
316
317 // suite
318
319 /**
320 * return the implicit suite of tests
321 * @return the implicit suite of tests
322 */
323 public static Test suite() {
324 return new TestSuite(
325 JadePlatformTest.class,
326 JadeMXSuiteTest.nameWithClass( JadePlatformTest.class,
327 "testing JadePlatform: jade platform MBean class") );
328 }
329
330
331
332 }