/* * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.qpid.qmf2.test; import javax.jms.Connection; // Misc Imports import java.io.*; import java.util.HashMap; import java.util.List; import java.util.Map; // QMF2 Imports import org.apache.qpid.qmf2.common.ObjectId; import org.apache.qpid.qmf2.common.QmfData; import org.apache.qpid.qmf2.common.QmfEvent; import org.apache.qpid.qmf2.common.QmfEventListener; import org.apache.qpid.qmf2.common.QmfException; import org.apache.qpid.qmf2.common.WorkItem; import org.apache.qpid.qmf2.console.Agent; import org.apache.qpid.qmf2.console.AgentAddedWorkItem; import org.apache.qpid.qmf2.console.AgentHeartbeatWorkItem; import org.apache.qpid.qmf2.console.Console; import org.apache.qpid.qmf2.console.EventReceivedWorkItem; import org.apache.qpid.qmf2.console.MethodResult; import org.apache.qpid.qmf2.console.MethodResponseWorkItem; import org.apache.qpid.qmf2.console.ObjectUpdateWorkItem; import org.apache.qpid.qmf2.console.QmfConsoleData; import org.apache.qpid.qmf2.util.ConnectionHelper; import static org.apache.qpid.qmf2.common.WorkItem.WorkItemType.*; /** * This class is the Console part of AgentTest which together provide a test of a number of core Console and * Agent behaviours such as Schema creation, registration and lookup, Object lookup, method invocation on Objects * Object refreshing (updating state of local proxy objects from the real Agent). * * N.B. AgentTest needs to be running for this test to behave as expected. * * @author Fraser Adams */ public final class AgentTestConsole implements QmfEventListener { private Console _console; private Agent _gizmo; public AgentTestConsole(String url) { try { System.out.println("*** Starting AgentTestConsole used to test basic Console and Agent behaviour ***"); Connection connection = ConnectionHelper.createConnection(url, "{reconnect: true}"); _console = new Console(this); _console.addConnection(connection); // Wait until the gizmo Agent has been discovered synchronized(this) { while (_gizmo == null) { long startTime = System.currentTimeMillis(); try { wait(10*1000); } catch (InterruptedException ie) { continue; } // Measure elapsed time to test against spurious wakeups and ensure we really have timed out long elapsedTime = (System.currentTimeMillis() - startTime)/1000; if (_gizmo == null && elapsedTime >= 10) { System.out.println("gizmo Agent not found, you probably need to run AgentTest"); System.exit(1); } } } System.out.println("Testing lookup of control objects by name"); List controls = _console.getObjects("com.profitron.gizmo", "control"); if (controls.size() > 0) { System.out.println("control object found"); QmfConsoleData control = controls.get(0); //control.listValues(); ObjectId oid = control.getObjectId(); //System.out.println("Agent Name = " + oid.getAgentName()); //System.out.println("Agent Epoch = " + oid.getAgentEpoch()); //System.out.println("Object Name = " + oid.getObjectName()); System.out.println("Testing lookup of object by ObjectId"); controls = _console.getObjects(oid); if (controls.size() == 0) { System.out.println("No objects returned from ObjectId lookup: AgentTestConsole failed"); System.exit(1); } System.out.println("MethodCount = " + control.getLongValue("methodCount")); QmfData inArgs; QmfData outArgs; MethodResult results; /* System.out.println("Testing invokeMethod(toString, args) - method called directly on Agent"); results = _gizmo.invokeMethod("toString", null); System.out.println("gizmo.toString() = " + results.getArguments().getStringValue("string")); */ // ********** Invoke create_child nethod ********** System.out.println("Testing invokeMethod(create_child, args)"); inArgs = new QmfData(); inArgs.setValue("name", "child 1"); results = control.invokeMethod("create_child", inArgs); if (!results.succeeded()) { System.out.println("create_child returned an exception object"); System.exit(1); } if (!results.hasValue("childAddr")) { System.out.println("create_child returned an unexpected value"); System.exit(1); } ObjectId childId = results.getRefValue("childAddr"); System.out.println("childId = " + childId); System.out.println("childAddr subtype = " + results.getSubtype("childAddr")); QmfConsoleData child1 = _console.getObjects(childId).get(0); System.out.println("child1 name = " + child1.getStringValue("name")); // Update and display state of control object control.refresh(); System.out.println("MethodCount = " + control.getLongValue("methodCount")); // ********** Invoke event nethod ********** System.out.println("Testing invokeMethod(event, args) "); inArgs = new QmfData(); inArgs.setValue("text", "Attention Will Robinson!! Aliens have just invaded"); inArgs.setValue("severity", 0); control.invokeMethod("event", inArgs); // Update and display state of control object control.refresh(); System.out.println("MethodCount = " + control.getLongValue("methodCount")); // ********** Invoke fail nethod ********** System.out.println("Testing invokeMethod(fail, args) "); QmfData details = new QmfData(); details.setValue("detail1", "something bad"); details.setValue("detail2", "something even badder"); inArgs = new QmfData(); inArgs.setValue("details", details.mapEncode()); results = control.invokeMethod("fail", inArgs); System.out.println("whatHappened: " + results.getStringValue("whatHappened")); System.out.println("howBad: " + results.getLongValue("howBad")); // Update and display state of control object control.refresh(); System.out.println("MethodCount = " + control.getLongValue("methodCount")); // ********** Invoke echo nethod asynchronously ********** System.out.println("Testing asynchronous call of invokeMethod(echo, args) "); inArgs = new QmfData(); inArgs.setValue("message", "This message should be echoed by the Agent"); control.invokeMethod("echo", inArgs, "echoMethodCorrelationId"); // Asynchronous update and display state of control object. The state here should be the same as // the last time it was called as this is an asynchronous refresh. The ObjectUpdateWorkItem in // the event handler contains the new state control.refresh("echoMethodCorrelationId"); System.out.println("MethodCount = " + control.getLongValue("methodCount") + " (should be same as last value)"); // ********** Invoke stop nethod, this will stop the Agent ********** System.out.println("Testing invokeMethod(stop, args) "); inArgs = new QmfData(); inArgs.setValue("message", "Ladies and gentlemen Elvis has just left the building"); control.invokeMethod("stop", inArgs); } else { System.out.println("No control objects returned: AgentTestConsole failed"); System.exit(1); } } catch (QmfException qmfe) { System.err.println("QmfException " + qmfe.getMessage() + ": AgentTestConsole failed"); System.exit(1); } } public void onEvent(WorkItem wi) { System.out.println("WorkItem type: " + wi.getType()); if (wi.getType() == AGENT_ADDED) { AgentAddedWorkItem item = (AgentAddedWorkItem)wi; Agent agent = item.getAgent(); // If this is the gizmo Agent we notify the main thread so processing can continue. if (agent.getProduct().equals("gizmo")) { synchronized(this) { _gizmo = agent; notify(); } } } if (wi.getType() == AGENT_HEARTBEAT) { AgentHeartbeatWorkItem item = (AgentHeartbeatWorkItem)wi; Agent agent = item.getAgent(); System.out.println(agent.getName()); } if (wi.getType() == EVENT_RECEIVED) { EventReceivedWorkItem item = (EventReceivedWorkItem)wi; Agent agent = item.getAgent(); QmfEvent event = item.getEvent(); String className = event.getSchemaClassId().getClassName(); System.out.println("Event: " + className); //event.listValues(); } if (wi.getType() == METHOD_RESPONSE) { MethodResponseWorkItem item = (MethodResponseWorkItem)wi; MethodResult result = item.getMethodResult(); String correlationId = item.getHandle().getCorrelationId(); System.out.println("correlationId = " + correlationId); System.out.println(result.getStringValue("message")); } if (wi.getType() == OBJECT_UPDATE) { ObjectUpdateWorkItem item = (ObjectUpdateWorkItem)wi; QmfConsoleData object = item.getQmfConsoleData(); ObjectId objectId = object.getObjectId(); String correlationId = item.getHandle().getCorrelationId(); System.out.println("correlationId = " + correlationId); System.out.println("objectId = " + objectId); System.out.println("MethodCount = " + object.getLongValue("methodCount")); } } public static void main(String[] args) { //System.out.println ("Setting log level to FATAL"); System.setProperty("amqj.logging.level", "FATAL"); String url = (args.length == 1) ? args[0] : "localhost"; AgentTestConsole test = new AgentTestConsole(url); BufferedReader commandLine = new BufferedReader(new InputStreamReader(System.in)); try { // Blocks here until return is pressed System.out.println("Hit Return to exit"); String s = commandLine.readLine(); System.exit(0); } catch (IOException e) { System.out.println ("AgentTestConsole main(): IOException: " + e.getMessage()); } System.out.println("*** Ending AgentTestConsole ***"); } }