From b993cd7635d79ba00f28f264772e4a6be7a80a28 Mon Sep 17 00:00:00 2001 From: Robert Gemmell Date: Sun, 16 Mar 2014 11:09:58 +0000 Subject: QPID-5610: move manual test classes from src/test/java -> qpid-qmf2-test/src/main/java git-svn-id: https://svn.apache.org/repos/asf/qpid/branches/QPID-5610-maven3-build-qmf-tools@1578036 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/qpid/qmf2/test/AgentExternalTest.java | 558 +++++++++++++++++++++ .../qmf2/test/AgentSubscriptionTestConsole.java | 224 +++++++++ .../java/org/apache/qpid/qmf2/test/AgentTest.java | 298 +++++++++++ .../apache/qpid/qmf2/test/AgentTestConsole.java | 308 ++++++++++++ .../apache/qpid/qmf2/test/BigPayloadAgentTest.java | 174 +++++++ .../qpid/qmf2/test/BigPayloadAgentTestConsole.java | 155 ++++++ .../qmf2/test/BrokerSubscriptionTestConsole.java | 262 ++++++++++ .../apache/qpid/qmf2/test/InvokeMethodTest.java | 112 +++++ .../qpid/qmf2/test/PartialGetObjectsTest.java | 177 +++++++ .../java/org/apache/qpid/qmf2/test/SchemaTest.java | 126 +++++ .../main/java/org/apache/qpid/qmf2/test/Test1.java | 140 ++++++ .../main/java/org/apache/qpid/qmf2/test/Test2.java | 121 +++++ .../main/java/org/apache/qpid/qmf2/test/Test3.java | 137 +++++ .../main/java/org/apache/qpid/qmf2/test/Test4.java | 339 +++++++++++++ .../java/org/apache/qpid/qmf2/test/URLTest.java | 82 +++ .../apache/qpid/qmf2/test/AgentExternalTest.java | 558 --------------------- .../qmf2/test/AgentSubscriptionTestConsole.java | 224 --------- .../java/org/apache/qpid/qmf2/test/AgentTest.java | 298 ----------- .../apache/qpid/qmf2/test/AgentTestConsole.java | 308 ------------ .../apache/qpid/qmf2/test/BigPayloadAgentTest.java | 174 ------- .../qpid/qmf2/test/BigPayloadAgentTestConsole.java | 155 ------ .../qmf2/test/BrokerSubscriptionTestConsole.java | 262 ---------- .../apache/qpid/qmf2/test/InvokeMethodTest.java | 112 ----- .../qpid/qmf2/test/PartialGetObjectsTest.java | 177 ------- .../java/org/apache/qpid/qmf2/test/SchemaTest.java | 126 ----- .../test/java/org/apache/qpid/qmf2/test/Test1.java | 140 ------ .../test/java/org/apache/qpid/qmf2/test/Test2.java | 121 ----- .../test/java/org/apache/qpid/qmf2/test/Test3.java | 137 ----- .../test/java/org/apache/qpid/qmf2/test/Test4.java | 339 ------------- .../java/org/apache/qpid/qmf2/test/URLTest.java | 82 --- 30 files changed, 3213 insertions(+), 3213 deletions(-) create mode 100644 qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/AgentExternalTest.java create mode 100644 qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/AgentSubscriptionTestConsole.java create mode 100644 qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/AgentTest.java create mode 100644 qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/AgentTestConsole.java create mode 100644 qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/BigPayloadAgentTest.java create mode 100644 qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/BigPayloadAgentTestConsole.java create mode 100644 qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/BrokerSubscriptionTestConsole.java create mode 100644 qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/InvokeMethodTest.java create mode 100644 qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/PartialGetObjectsTest.java create mode 100644 qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/SchemaTest.java create mode 100644 qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/Test1.java create mode 100644 qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/Test2.java create mode 100644 qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/Test3.java create mode 100644 qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/Test4.java create mode 100644 qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/URLTest.java delete mode 100644 qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/AgentExternalTest.java delete mode 100644 qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/AgentSubscriptionTestConsole.java delete mode 100644 qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/AgentTest.java delete mode 100644 qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/AgentTestConsole.java delete mode 100644 qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/BigPayloadAgentTest.java delete mode 100644 qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/BigPayloadAgentTestConsole.java delete mode 100644 qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/BrokerSubscriptionTestConsole.java delete mode 100644 qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/InvokeMethodTest.java delete mode 100644 qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/PartialGetObjectsTest.java delete mode 100644 qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/SchemaTest.java delete mode 100644 qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/Test1.java delete mode 100644 qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/Test2.java delete mode 100644 qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/Test3.java delete mode 100644 qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/Test4.java delete mode 100644 qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/URLTest.java diff --git a/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/AgentExternalTest.java b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/AgentExternalTest.java new file mode 100644 index 0000000000..3094ba406f --- /dev/null +++ b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/AgentExternalTest.java @@ -0,0 +1,558 @@ +/* + * + * 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.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +// QMF2 Imports +import org.apache.qpid.qmf2.agent.AgentExternal; +import org.apache.qpid.qmf2.agent.MethodCallParams; +import org.apache.qpid.qmf2.agent.MethodCallWorkItem; +import org.apache.qpid.qmf2.agent.ResubscribeParams; +import org.apache.qpid.qmf2.agent.ResubscribeRequestWorkItem; +import org.apache.qpid.qmf2.agent.SubscribeRequestWorkItem; +import org.apache.qpid.qmf2.agent.SubscribableAgent; +import org.apache.qpid.qmf2.agent.Subscription; +import org.apache.qpid.qmf2.agent.SubscriptionParams; +import org.apache.qpid.qmf2.agent.UnsubscribeRequestWorkItem; +import org.apache.qpid.qmf2.agent.QueryWorkItem; +import org.apache.qpid.qmf2.agent.QmfAgentData; +import org.apache.qpid.qmf2.common.Handle; +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.QmfQuery; +import org.apache.qpid.qmf2.common.QmfQueryTarget; +import org.apache.qpid.qmf2.common.QmfType; +import org.apache.qpid.qmf2.common.SchemaEventClass; +import org.apache.qpid.qmf2.common.SchemaMethod; +import org.apache.qpid.qmf2.common.SchemaObjectClass; +import org.apache.qpid.qmf2.common.SchemaProperty; +import org.apache.qpid.qmf2.common.WorkItem; +import org.apache.qpid.qmf2.util.ConnectionHelper; +import static org.apache.qpid.qmf2.common.WorkItem.WorkItemType.*; + +/** + * Class used to test the AgentExternal. + * This class provides a demo of all of the features available on the AgentExternal model including Subscriptions. + * It provides essentially the same behaviour as the AgentTest class though requires a lot more code. + * + * The AgentExternal class and this demo are largely provided for completeness (although they do behave correctly) + * as the author isn't convinced that there's a good reason for using AgentExternal rather than Agent. + * + * @author Fraser Adams + */ +public final class AgentExternalTest implements QmfEventListener, SubscribableAgent +{ + /** + * This TimerTask causes the Agent to Reap any objects marked as deleted when it gets scheduled + */ + private final class Reaper extends TimerTask + { + public void run() + { + // Reap any QmfAgentData Objects that have been marked as Deleted + // Use the iterator approach rather than foreach as we may want to call iterator.remove() to zap an entry + Iterator i = _objectIndex.values().iterator(); + while (i.hasNext()) + { + QmfAgentData object = i.next(); + if (object.isDeleted()) + { +System.out.println("****** Removing deleted Object *******"); + i.remove(); + } + } + } + } + + private AgentExternal _agent; + private QmfAgentData _control; + private SchemaObjectClass _exceptionSchema; + private SchemaObjectClass _controlSchema; + private SchemaObjectClass _childSchema; + private SchemaEventClass _eventSchema; + + /** + * objectIndex is the global index of QmfAgentData objects registered with this Agent + */ + private Map _objectIndex = new ConcurrentHashMap(); + + /** + * This Map is used to look up Subscriptions by SubscriptionId + */ + private Map _subscriptions = new ConcurrentHashMap(); + + private Timer _timer; + + public AgentExternalTest(String url) + { + try + { + System.out.println("** Starting AgentExternalTest a test of basic AgentExternal class functions **"); + + Connection connection = ConnectionHelper.createConnection(url, "{reconnect: true}"); + _agent = new AgentExternal(this); + _agent.setVendor("profitron.com"); + _agent.setProduct("gizmo"); + _agent.setValue("attr1", 2000); + + System.out.println("Agent name: " + _agent.getName()); + + // Schedule a Reap every 10 seconds sending the first one immediately + _timer = new Timer(true); + _timer.schedule(new Reaper(), 0, 10000); + + setupSchema(); + populateData(); + + _agent.setConnection(connection); + + for (int i = 0; i < 100; i++) + { + _control.setValue("offset", i); + //control.update(); // Send data indication to the Subscriber on the next Subscription interval + _control.publish(); // Send data indication to the Subscriber immediately + try + { + Thread.sleep(1000); + } + catch (InterruptedException ie) + { + } + } + + _control.destroy(); + + + // A getObjects call seems necessary to enable automatic reconnection when broker restarts + // I've got no idea why this is the case though!!! + //List connections = console.getObjects("broker"); + } + catch (QmfException qmfe) + { + System.err.println("QmfException " + qmfe.getMessage() + " caught: AgentExternalTest failed"); + } + } + + public void onEvent(WorkItem wi) + { + System.out.println("WorkItem type: " + wi.getType()); + + if (wi.getType() == METHOD_CALL) + { + _control.incValue("methodCount", 1); + + MethodCallWorkItem item = (MethodCallWorkItem)wi; + MethodCallParams methodCallParams = item.getMethodCallParams(); + String methodName = methodCallParams.getName(); + ObjectId objectId = methodCallParams.getObjectId(); + String userId = methodCallParams.getUserId(); + QmfData inArgs = methodCallParams.getArgs(); + ObjectId controlAddress = _control.getObjectId(); + + System.out.println("Method Call User ID = " + userId); + + try + { + if (objectId == null) + { + // Method invoked directly on Agent + if (methodName.equals("toString")) + { + QmfData outArgs = new QmfData(); + outArgs.setValue("string", _agent.toString()); + _agent.methodResponse(methodName, item.getHandle(), outArgs, null); + } + } + else if (objectId.equals(controlAddress)) + { + if (methodName.equals("stop")) + { + System.out.println("Invoked stop method"); + String message = inArgs.getStringValue("message"); + System.out.println("Stopping: message = " + message); + _agent.methodResponse(methodName, item.getHandle(), null, null); + _agent.destroy(); + System.exit(1); + } + else if (methodName.equals("echo")) + { + System.out.println("Invoked echo method"); + _agent.methodResponse(methodName, item.getHandle(), inArgs, null); + } + else if (methodName.equals("event")) + { + System.out.println("Invoked event method"); + QmfEvent event = new QmfEvent(_eventSchema); + event.setSeverity((int)inArgs.getLongValue("severity")); + event.setValue("text", inArgs.getStringValue("text")); + _agent.raiseEvent(event); + _agent.methodResponse(methodName, item.getHandle(), null, null); + } + else if (methodName.equals("fail")) + { + System.out.println("Invoked fail method"); + QmfData error = new QmfData(); + if (inArgs.getBooleanValue("useString")) + { + error.setValue("error_text", inArgs.getStringValue("stringVal")); + } + else + { + error.setValue("whatHappened", "It Failed"); + error.setValue("howBad", 75); + error.setValue("details", inArgs.getValue("details")); + } + _agent.methodResponse(methodName, item.getHandle(), null, error); + } + else if (methodName.equals("create_child")) + { + System.out.println("Invoked create_child method"); + String childName = inArgs.getStringValue("name"); + System.out.println("childName = " + childName); + QmfAgentData child = new QmfAgentData(_childSchema); + child.setValue("name", childName); + addObject(child); + QmfData outArgs = new QmfData(); + outArgs.setRefValue("childAddr", child.getObjectId(), "reference"); // Set suptype just to test + _agent.methodResponse(methodName, item.getHandle(), outArgs, null); + } + } + } + catch (QmfException qmfe) + { + System.err.println("QmfException " + qmfe.getMessage() + " caught: AgentExternalTest failed"); + QmfData error = new QmfData(); + error.setValue("error_text", qmfe.getMessage()); + _agent.methodResponse(methodName, item.getHandle(), null, error); + } + } + + if (wi.getType() == QUERY) + { + QueryWorkItem item = (QueryWorkItem)wi; + QmfQuery query = item.getQmfQuery(); + + System.out.println("Query User ID = " + item.getUserId()); + + if (query.getObjectId() != null) + { + // Look up a QmfAgentData object by the ObjectId obtained from the query + ObjectId objectId = query.getObjectId(); + QmfAgentData object = _objectIndex.get(objectId); + if (object != null && !object.isDeleted()) + { + _agent.queryResponse(item.getHandle(), object); + } + _agent.queryComplete(item.getHandle(), 0); + } + else + { + // Look up QmfAgentData objects by the SchemaClassId obtained from the query + // This is implemented by a linear search and allows searches with only the className specified. + // Linear searches clearly don't scale brilliantly, but the number of QmfAgentData objects managed + // by an Agent is generally fairly small, so it should be OK. Note that this is the same approach + // taken by the C++ broker ManagementAgent, so if it's a problem here........ + for (QmfAgentData object : _objectIndex.values()) + { + if (!object.isDeleted() && query.evaluate(object)) + { + _agent.queryResponse(item.getHandle(), object); + } + } + _agent.queryComplete(item.getHandle(), 0); + } + } + + if (wi.getType() == SUBSCRIBE_REQUEST) + { + SubscribeRequestWorkItem item = (SubscribeRequestWorkItem)wi; + SubscriptionParams params = item.getSubscriptionParams(); + Handle handle = item.getHandle(); + + System.out.println("Subscribe Request User ID = " + params.getUserId()); + + try + { + Subscription subscription = new Subscription(this, params); + _subscriptions.put(subscription.getSubscriptionId(), subscription); + _timer.schedule(subscription, 0, params.getPublishInterval()); + + if (subscription == null) + { +System.out.println("Requested Subscription has already expired or been cancelled"); + QmfData error = new QmfData(); + error.setValue("error_text", "Requested Subscription has already expired or been cancelled"); + _agent.subscriptionResponse(handle, subscription.getConsoleHandle(), null, 0, 0, error); + } + else + { + _agent.subscriptionResponse(handle, subscription.getConsoleHandle(), subscription.getSubscriptionId(), + subscription.getDuration(), subscription.getInterval(), null); + } + } + catch (QmfException qmfe) + { + _agent.raiseException(handle, "Subscribe Request failed, invalid Query: " + qmfe.getMessage()); + } + } + + if (wi.getType() == RESUBSCRIBE_REQUEST) + { + ResubscribeRequestWorkItem item = (ResubscribeRequestWorkItem)wi; + ResubscribeParams params = item.getResubscribeParams(); + Handle handle = item.getHandle(); + + System.out.println("Resubscribe Request User ID = " + params.getUserId()); + + String subscriptionId = params.getSubscriptionId(); + Subscription subscription = _subscriptions.get(subscriptionId); + if (subscription != null) + { + subscription.refresh(params); + _agent.subscriptionResponse(handle, subscription.getConsoleHandle(), subscription.getSubscriptionId(), + subscription.getDuration(), subscription.getInterval(), null); + } + else + { +System.out.println("Requested Subscription has already expired or been cancelled"); + QmfData error = new QmfData(); + error.setValue("error_text", "Requested Subscription has already expired or been cancelled"); + _agent.subscriptionResponse(handle, subscription.getConsoleHandle(), null, 0, 0, error); + } + } + + if (wi.getType() == UNSUBSCRIBE_REQUEST) + { + UnsubscribeRequestWorkItem item = (UnsubscribeRequestWorkItem)wi; + String subscriptionId = item.getSubscriptionId(); +System.out.println("Received cancellation request for " + subscriptionId); + Subscription subscription = _subscriptions.get(subscriptionId); + if (subscription != null) + { + subscription.cancel(); + } + } + + } + + public void setupSchema() throws QmfException + { + System.out.println("*** AgentExternalTest initialising the various Schema classes ***"); + + // Create and register schema for this agent. + String packageName = "com.profitron.gizmo"; + + // Declare a schema for a structured exception that can be used in failed method invocations. + _exceptionSchema = new SchemaObjectClass(packageName, "exception"); + _exceptionSchema.addProperty(new SchemaProperty("whatHappened", QmfType.TYPE_STRING)); + _exceptionSchema.addProperty(new SchemaProperty("howBad", QmfType.TYPE_INT)); + _exceptionSchema.addProperty(new SchemaProperty("details", QmfType.TYPE_MAP)); + + // Declare a control object to test methods against. + _controlSchema = new SchemaObjectClass(packageName, "control"); + _controlSchema.addProperty(new SchemaProperty("state", QmfType.TYPE_STRING)); + _controlSchema.addProperty(new SchemaProperty("methodCount", QmfType.TYPE_INT)); + _controlSchema.addProperty(new SchemaProperty("offset", QmfType.TYPE_INT)); + _controlSchema.setIdNames("state"); + + SchemaMethod stopMethod = new SchemaMethod("stop", "Stop Agent"); + stopMethod.addArgument(new SchemaProperty("message", QmfType.TYPE_STRING, "{dir:IN}")); + _controlSchema.addMethod(stopMethod); + + SchemaMethod echoMethod = new SchemaMethod("echo", "Echo Arguments"); + echoMethod.addArgument(new SchemaProperty("message", QmfType.TYPE_STRING, "{dir:INOUT}")); + _controlSchema.addMethod(echoMethod); + + SchemaMethod eventMethod = new SchemaMethod("event", "Raise an Event"); + eventMethod.addArgument(new SchemaProperty("text", QmfType.TYPE_STRING, "{dir:IN}")); + eventMethod.addArgument(new SchemaProperty("severity", QmfType.TYPE_INT, "{dir:IN}")); + _controlSchema.addMethod(eventMethod); + + SchemaMethod failMethod = new SchemaMethod("fail", "Expected to Fail"); + failMethod.addArgument(new SchemaProperty("useString", QmfType.TYPE_BOOL, "{dir:IN}")); + failMethod.addArgument(new SchemaProperty("stringVal", QmfType.TYPE_STRING, "{dir:IN}")); + failMethod.addArgument(new SchemaProperty("details", QmfType.TYPE_MAP, "{dir:IN}")); + _controlSchema.addMethod(failMethod); + + SchemaMethod createMethod = new SchemaMethod("create_child", "Create Child Object"); + createMethod.addArgument(new SchemaProperty("name", QmfType.TYPE_STRING, "{dir:IN}")); + createMethod.addArgument(new SchemaProperty("childAddr", QmfType.TYPE_MAP, "{dir:OUT}")); + _controlSchema.addMethod(createMethod); + + // Declare the child class + _childSchema = new SchemaObjectClass(packageName, "child"); + _childSchema.addProperty(new SchemaProperty("name", QmfType.TYPE_STRING)); + _childSchema.setIdNames("name"); + + // Declare the event class + _eventSchema = new SchemaEventClass(packageName, "event"); + _eventSchema.addProperty(new SchemaProperty("text", QmfType.TYPE_STRING)); + + System.out.println("AgentExternalTest Schema classes initialised OK"); + + _agent.registerObjectClass(_exceptionSchema); + _agent.registerObjectClass(_controlSchema); + _agent.registerObjectClass(_childSchema); + _agent.registerEventClass(_eventSchema); + + System.out.println("AgentExternalTest Schema classes registered OK"); + } + + public void populateData() throws QmfException + { + System.out.println("*** AgentExternalTest creating a control object ***"); + + _control = new QmfAgentData(_controlSchema); + _control.setValue("state", "OPERATIONAL"); + _control.setValue("methodCount", 0); + + addObject(_control); + System.out.println("AgentExternalTest Schema control object added OK"); + } + + public void addObject(QmfAgentData object) throws QmfException + { + ObjectId addr = _agent.allocObjectId(UUID.randomUUID().toString()); + object.setObjectId(addr); + _objectIndex.put(addr, object); + + // Does the new object match any Subscriptions? If so add a reference to the matching Subscription and publish. + for (Subscription subscription : _subscriptions.values()) + { + QmfQuery query = subscription.getQuery(); + if (query.getObjectId() != null) + { + if (query.getObjectId().equals(addr)) + { + object.addSubscription(subscription.getSubscriptionId(), subscription); + object.publish(); + } + } + else if (query.evaluate(object)) + { + object.addSubscription(subscription.getSubscriptionId(), subscription); + object.publish(); + } + } + } + + + + // methods implementing SubscriberProxy interface + // ******************************************************************************************************** + + /** + * Send a list of updated subscribed data to the Console. + * + * @param handle the console reply handle + * @param results a list of subscribed data in Map encoded form + */ + public void sendSubscriptionIndicate(Handle handle, List results) + { + _agent.sendSubscriptionIndicate(handle, results); + } + + /** + * This method evaluates a QmfQuery over the Agent's data on behalf of a Subscription + * + * @param query the QmfQuery that the Subscription wants to be evaluated over the Agent's data + * @return a List of QmfAgentData objects that match the specified QmfQuery + */ + public List evaluateQuery(QmfQuery query) + { + List results = new ArrayList(_objectIndex.size()); + if (query.getTarget() == QmfQueryTarget.OBJECT) + { + if (query.getObjectId() != null) + { + // Look up a QmfAgentData object by the ObjectId obtained from the query + ObjectId objectId = query.getObjectId(); + QmfAgentData object = _objectIndex.get(objectId); + if (object != null && !object.isDeleted()) + { + results.add(object); + } + } + else + { + // Look up QmfAgentData objects evaluating the query + for (QmfAgentData object : _objectIndex.values()) + { + if (!object.isDeleted() && query.evaluate(object)) + { + results.add(object); + } + } + } + } + return results; + } + + /** + * This method is called by the Subscription to tell the SubscriberProxy that the Subscription has been cancelled. + * + * @param subscription the Subscription that has been cancelled and is requesting removal. + */ + public void removeSubscription(Subscription subscription) + { + _subscriptions.remove(subscription.getSubscriptionId()); + } + + + 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"; + AgentExternalTest test1 = new AgentExternalTest(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 ("ConnectionAudit main(): IOException: " + e.getMessage()); + } + + System.out.println("*** Ending AgentExternalTest ***"); + } +} diff --git a/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/AgentSubscriptionTestConsole.java b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/AgentSubscriptionTestConsole.java new file mode 100644 index 0000000000..3bc84e1ee9 --- /dev/null +++ b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/AgentSubscriptionTestConsole.java @@ -0,0 +1,224 @@ +/* + * + * 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.QmfQuery; +import org.apache.qpid.qmf2.common.QmfQueryTarget; +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.console.SubscribeIndication; +import org.apache.qpid.qmf2.console.SubscribeParams; +import org.apache.qpid.qmf2.console.SubscribeResponseWorkItem; +import org.apache.qpid.qmf2.console.SubscriptionIndicationWorkItem; +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 subscription behaviour + * + * N.B. AgentTest needs to be running for this test to behave as expected. + * + * @author Fraser Adams + */ +public final class AgentSubscriptionTestConsole implements QmfEventListener +{ + private Console _console; + private Agent _gizmo; + + public AgentSubscriptionTestConsole(String url) + { + try + { + System.out.println("** Starting AgentSubscriptionTestConsole used to test subscription behaviour **"); + + Connection connection = ConnectionHelper.createConnection(url, "{reconnect: true}"); + _console = new Console(this); + _console.addConnection(connection); + + // Wait until the gizmo Agent has been discovered + _gizmo = _console.findAgent("gizmo"); + if (_gizmo == null) + { + System.out.println("gizmo Agent not found, you probably need to run AgentTest1"); + System.exit(1); + } + + System.out.println("Creating Query for objects whose state property has a value that starts with 'OP'"); + + SubscribeParams params; + QmfQuery query = new QmfQuery(QmfQueryTarget.OBJECT, "['re_match', 'state', ['quote', '^OP']]"); + + // Create a subscription, response returned synchronously + params = _console.createSubscription(_gizmo, query, "consoleHandle1", "{publishInterval:5}"); + System.out.println("duration = " + params.getLifetime()); + System.out.println("interval = " + params.getPublishInterval()); + System.out.println("subscriptionId = " + params.getSubscriptionId()); + System.out.println("consoleHandle = " + params.getConsoleHandle()); + + // Sleep a while, getting query result as they become available + try + { + Thread.sleep(20000); + } + catch (InterruptedException ie) + { + } + + // Refresh the subscription getting results asynchronously, just for variety + System.out.println("Calling refreshSubscription on " + params.getSubscriptionId()); + _console.refreshSubscription(params.getSubscriptionId(), "{replyHandle:ignored}"); + + + // Sleep a bit more + try + { + Thread.sleep(350000); + } + catch (InterruptedException ie) + { + } + + } + catch (QmfException qmfe) + { + System.err.println("QmfException " + qmfe.getMessage() + ": AgentSubscriptionTestConsole failed"); + System.exit(1); + } + } + + public void onEvent(WorkItem wi) + { + System.out.println("WorkItem type: " + wi.getType()); + + 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")); + } + + if (wi.getType() == SUBSCRIBE_RESPONSE) + { + SubscribeResponseWorkItem item = (SubscribeResponseWorkItem)wi; + SubscribeParams params = item.getSubscribeParams(); + System.out.println("duration = " + params.getLifetime()); + System.out.println("interval = " + params.getPublishInterval()); + System.out.println("subscriptionId = " + params.getSubscriptionId()); + System.out.println("consoleHandle = " + params.getConsoleHandle()); + String correlationId = item.getHandle().getCorrelationId(); + System.out.println("correlationId = " + correlationId); + } + + if (wi.getType() == SUBSCRIPTION_INDICATION) + { + SubscriptionIndicationWorkItem item = (SubscriptionIndicationWorkItem)wi; + SubscribeIndication indication = item.getSubscribeIndication(); + String correlationId = indication.getConsoleHandle(); + System.out.println("correlationId = " + correlationId); + + List objects = indication.getData(); + for (QmfConsoleData object : objects) + { + if (object.isDeleted()) + { + System.out.println("object has been deleted"); + } + System.out.println("offset = " + object.getValue("offset")); + } + } + } + + 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"; + AgentSubscriptionTestConsole test = new AgentSubscriptionTestConsole(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 ("AgentSubscriptionTestConsole main(): IOException: " + e.getMessage()); + } + + System.out.println("*** Ending AgentSubscriptionTestConsole ***"); + } +} diff --git a/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/AgentTest.java b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/AgentTest.java new file mode 100644 index 0000000000..8aebe76937 --- /dev/null +++ b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/AgentTest.java @@ -0,0 +1,298 @@ +/* + * + * 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.agent.Agent; +import org.apache.qpid.qmf2.agent.MethodCallParams; +import org.apache.qpid.qmf2.agent.MethodCallWorkItem; +import org.apache.qpid.qmf2.agent.QmfAgentData; +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.QmfType; +import org.apache.qpid.qmf2.common.SchemaEventClass; +import org.apache.qpid.qmf2.common.SchemaMethod; +import org.apache.qpid.qmf2.common.SchemaObjectClass; +import org.apache.qpid.qmf2.common.SchemaProperty; +import org.apache.qpid.qmf2.common.WorkItem; +import org.apache.qpid.qmf2.util.ConnectionHelper; +import static org.apache.qpid.qmf2.common.WorkItem.WorkItemType.*; + +/** + * A class used to test the Agent API functionality. + * + * @author Fraser Adams + */ +public final class AgentTest implements QmfEventListener +{ + private Agent _agent; + private QmfAgentData _control; + private SchemaObjectClass _exceptionSchema; + private SchemaObjectClass _controlSchema; + private SchemaObjectClass _childSchema; + private SchemaEventClass _eventSchema; + + public AgentTest(String url) + { + try + { + System.out.println("** Starting AgentTest a test of basic Agent class functions **"); + + Connection connection = ConnectionHelper.createConnection(url, "{reconnect: true}"); + _agent = new Agent(this); + _agent.setVendor("profitron.com"); + _agent.setProduct("gizmo"); + _agent.setValue("attr1", 2000); + + System.out.println("Agent name: " + _agent.getName()); + + setupSchema(); + populateData(); + + _agent.setConnection(connection); + + for (int i = 0; i < 100; i++) + { + _control.setValue("offset", i); + //control.update(); // Send data indication to the Subscriber on the next Subscription interval + _control.publish(); // Send data indication to the Subscriber immediately + try + { + Thread.sleep(1000); + } + catch (InterruptedException ie) + { + } + } + + _control.destroy(); + + } + catch (QmfException qmfe) + { + System.err.println("QmfException " + qmfe.getMessage() + " caught: AgentTest failed"); + } + } + + public void onEvent(WorkItem wi) + { + System.out.println("WorkItem type: " + wi.getType()); + _control.incValue("methodCount", 1); + + if (wi.getType() == METHOD_CALL) + { + MethodCallWorkItem item = (MethodCallWorkItem)wi; + MethodCallParams methodCallParams = item.getMethodCallParams(); + String methodName = methodCallParams.getName(); + ObjectId objectId = methodCallParams.getObjectId(); + String userId = methodCallParams.getUserId(); + userId = userId.equals("") ? "anonymous" : userId; + QmfData inArgs = methodCallParams.getArgs(); + ObjectId controlAddress = _control.getObjectId(); + + System.out.println("Method Call User ID = " + userId); + + try + { + if (objectId == null) + { + // Method invoked directly on Agent + if (methodName.equals("toString")) + { + QmfData outArgs = new QmfData(); + outArgs.setValue("string", _agent.toString()); + _agent.methodResponse(methodName, item.getHandle(), outArgs, null); + } + } + else if (objectId.equals(controlAddress)) + { + if (methodName.equals("stop")) + { + System.out.println("Invoked stop method"); + String message = inArgs.getStringValue("message"); + System.out.println("Stopping: message = " + message); + _agent.methodResponse(methodName, item.getHandle(), null, null); + _agent.destroy(); + System.exit(1); + } + else if (methodName.equals("echo")) + { + System.out.println("Invoked echo method"); + _agent.methodResponse(methodName, item.getHandle(), inArgs, null); + } + else if (methodName.equals("event")) + { + System.out.println("Invoked event method"); + QmfEvent event = new QmfEvent(_eventSchema); + event.setSeverity((int)inArgs.getLongValue("severity")); + event.setValue("text", inArgs.getStringValue("text")); + _agent.raiseEvent(event); + _agent.methodResponse(methodName, item.getHandle(), null, null); + } + else if (methodName.equals("fail")) + { + System.out.println("Invoked fail method"); + QmfData error = new QmfData(); + if (inArgs.getBooleanValue("useString")) + { + error.setValue("error_text", inArgs.getStringValue("stringVal")); + } + else + { + error.setValue("whatHappened", "It Failed"); + error.setValue("howBad", 75); + error.setValue("details", inArgs.getValue("details")); + } + _agent.methodResponse(methodName, item.getHandle(), null, error); + } + else if (methodName.equals("create_child")) + { + System.out.println("Invoked create_child method"); + String childName = inArgs.getStringValue("name"); + System.out.println("childName = " + childName); + QmfAgentData child = new QmfAgentData(_childSchema); + child.setValue("name", childName); + _agent.addObject(child); + QmfData outArgs = new QmfData(); + outArgs.setRefValue("childAddr", child.getObjectId(), "reference"); // Set subtype just to test + _agent.methodResponse(methodName, item.getHandle(), outArgs, null); + } + } + } + catch (QmfException qmfe) + { + System.err.println("QmfException " + qmfe.getMessage() + " caught: AgentTest failed"); + QmfData error = new QmfData(); + error.setValue("error_text", qmfe.getMessage()); + _agent.methodResponse(methodName, item.getHandle(), null, error); + } + } + } + + public void setupSchema() throws QmfException + { + System.out.println("*** AgentTest initialising the various Schema classes ***"); + + // Create and register schema for this agent. + String packageName = "com.profitron.gizmo"; + + // Declare a schema for a structured exception that can be used in failed method invocations. + _exceptionSchema = new SchemaObjectClass(packageName, "exception"); + _exceptionSchema.addProperty(new SchemaProperty("whatHappened", QmfType.TYPE_STRING)); + _exceptionSchema.addProperty(new SchemaProperty("howBad", QmfType.TYPE_INT)); + _exceptionSchema.addProperty(new SchemaProperty("details", QmfType.TYPE_MAP)); + + // Declare a control object to test methods against. + _controlSchema = new SchemaObjectClass(packageName, "control"); + _controlSchema.addProperty(new SchemaProperty("state", QmfType.TYPE_STRING)); + _controlSchema.addProperty(new SchemaProperty("methodCount", QmfType.TYPE_INT)); + _controlSchema.addProperty(new SchemaProperty("offset", QmfType.TYPE_INT)); + _controlSchema.setIdNames("state"); + + SchemaMethod stopMethod = new SchemaMethod("stop", "Stop Agent"); + stopMethod.addArgument(new SchemaProperty("message", QmfType.TYPE_STRING, "{dir:IN}")); + _controlSchema.addMethod(stopMethod); + + SchemaMethod echoMethod = new SchemaMethod("echo", "Echo Arguments"); + echoMethod.addArgument(new SchemaProperty("message", QmfType.TYPE_STRING, "{dir:INOUT}")); + _controlSchema.addMethod(echoMethod); + + SchemaMethod eventMethod = new SchemaMethod("event", "Raise an Event"); + eventMethod.addArgument(new SchemaProperty("text", QmfType.TYPE_STRING, "{dir:IN}")); + eventMethod.addArgument(new SchemaProperty("severity", QmfType.TYPE_INT, "{dir:IN}")); + _controlSchema.addMethod(eventMethod); + + SchemaMethod failMethod = new SchemaMethod("fail", "Expected to Fail"); + failMethod.addArgument(new SchemaProperty("useString", QmfType.TYPE_BOOL, "{dir:IN}")); + failMethod.addArgument(new SchemaProperty("stringVal", QmfType.TYPE_STRING, "{dir:IN}")); + failMethod.addArgument(new SchemaProperty("details", QmfType.TYPE_MAP, "{dir:IN}")); + _controlSchema.addMethod(failMethod); + + SchemaMethod createMethod = new SchemaMethod("create_child", "Create Child Object"); + createMethod.addArgument(new SchemaProperty("name", QmfType.TYPE_STRING, "{dir:IN}")); + createMethod.addArgument(new SchemaProperty("childAddr", QmfType.TYPE_MAP, "{dir:OUT}")); + _controlSchema.addMethod(createMethod); + + // Declare the child class + _childSchema = new SchemaObjectClass(packageName, "child"); + _childSchema.addProperty(new SchemaProperty("name", QmfType.TYPE_STRING)); + _childSchema.setIdNames("name"); + + // Declare the event class + _eventSchema = new SchemaEventClass(packageName, "event"); + _eventSchema.addProperty(new SchemaProperty("text", QmfType.TYPE_STRING)); + + System.out.println("AgentTest Schema classes initialised OK"); + + _agent.registerObjectClass(_exceptionSchema); + _agent.registerObjectClass(_controlSchema); + _agent.registerObjectClass(_childSchema); + _agent.registerEventClass(_eventSchema); + + System.out.println("AgentTest Schema classes registered OK"); + } + + public void populateData() throws QmfException + { + System.out.println("*** AgentTest creating a control object ***"); + + _control = new QmfAgentData(_controlSchema); + _control.setValue("state", "OPERATIONAL"); + _control.setValue("methodCount", 0); + _agent.addObject(_control); + System.out.println("AgentTest Schema control object added OK"); + } + + + 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"; + AgentTest test1 = new AgentTest(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 ("ConnectionAudit main(): IOException: " + e.getMessage()); + } + + System.out.println("*** Ending AgentTest ***"); + } +} diff --git a/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/AgentTestConsole.java b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/AgentTestConsole.java new file mode 100644 index 0000000000..edae41bcf4 --- /dev/null +++ b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/AgentTestConsole.java @@ -0,0 +1,308 @@ +/* + * + * 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 ***"); + } +} diff --git a/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/BigPayloadAgentTest.java b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/BigPayloadAgentTest.java new file mode 100644 index 0000000000..a6613464b5 --- /dev/null +++ b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/BigPayloadAgentTest.java @@ -0,0 +1,174 @@ +/* + * + * 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.agent.Agent; +import org.apache.qpid.qmf2.agent.MethodCallParams; +import org.apache.qpid.qmf2.agent.MethodCallWorkItem; +import org.apache.qpid.qmf2.agent.QmfAgentData; +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.QmfType; +import org.apache.qpid.qmf2.common.SchemaEventClass; +import org.apache.qpid.qmf2.common.SchemaMethod; +import org.apache.qpid.qmf2.common.SchemaObjectClass; +import org.apache.qpid.qmf2.common.SchemaProperty; +import org.apache.qpid.qmf2.common.WorkItem; +import org.apache.qpid.qmf2.util.ConnectionHelper; +import static org.apache.qpid.qmf2.common.WorkItem.WorkItemType.*; + +/** + * A class used to test the Agent API functionality. This Agent specifies an explicit queue name and a larger than + * default queue size so that it can receive large payloads on its methods. + * + * @author Fraser Adams + */ +public final class BigPayloadAgentTest implements QmfEventListener +{ + private Agent _agent; + private QmfAgentData _control; + private SchemaObjectClass _controlSchema; + + public BigPayloadAgentTest(String url) + { + try + { + System.out.println("** Starting BigPayloadAgentTest a test of basic Agent class functions **"); + + Connection connection = ConnectionHelper.createConnection(url, "{reconnect: true}"); + _agent = new Agent(this); + _agent.setVendor("test.com"); + _agent.setProduct("big-payload-agent"); + + System.out.println("Agent name: " + _agent.getName()); + + setupSchema(); + populateData(); + _agent.setConnection(connection, " ; {link: {name:'big-payload-agent', x-declare: {arguments: {'qpid.policy_type': ring, 'qpid.max_size': 500000000}}}}"); + + } + catch (QmfException qmfe) + { + System.err.println("QmfException " + qmfe.getMessage() + " caught: BigPayloadAgentTest failed"); + } + } + + public void onEvent(WorkItem wi) + { + System.out.println("WorkItem type: " + wi.getType()); + + if (wi.getType() == METHOD_CALL) + { + MethodCallWorkItem item = (MethodCallWorkItem)wi; + MethodCallParams methodCallParams = item.getMethodCallParams(); + String methodName = methodCallParams.getName(); + ObjectId objectId = methodCallParams.getObjectId(); + + QmfData inArgs = methodCallParams.getArgs(); + ObjectId controlAddress = _control.getObjectId(); + + if (objectId.equals(controlAddress)) + { + if (methodName.equals("processPayload")) + { + System.out.println("Invoked processPayload method"); + + byte[] parameter = inArgs.getValue("parameter"); + System.out.println("payload size = " + parameter.length); + + QmfData outArgs = new QmfData(); + outArgs.setValue("return", parameter); + _agent.methodResponse(methodName, item.getHandle(), outArgs, null); + } + } + } + } + + public void setupSchema() throws QmfException + { + System.out.println("*** BigPayloadAgentTest initialising the various Schema classes ***"); + + // Create and register schema for this agent. + String packageName = "com.test.bigagent"; + + // Declare a control object to test methods against. + _controlSchema = new SchemaObjectClass(packageName, "control"); + _controlSchema.addProperty(new SchemaProperty("name", QmfType.TYPE_STRING)); + _controlSchema.setIdNames("name"); + + SchemaMethod createMethod = new SchemaMethod("processPayload", "Process a large payload"); + createMethod.addArgument(new SchemaProperty("parameter", QmfType.TYPE_STRING, "{dir:IN}")); + createMethod.addArgument(new SchemaProperty("return", QmfType.TYPE_STRING, "{dir:OUT}")); + _controlSchema.addMethod(createMethod); + + System.out.println("BigPayloadAgentTest Schema classes initialised OK"); + + _agent.registerObjectClass(_controlSchema); + + System.out.println("BigPayloadAgentTest Schema classes registered OK"); + } + + public void populateData() throws QmfException + { + System.out.println("*** BigPayloadAgentTest creating a control object ***"); + + _control = new QmfAgentData(_controlSchema); + _control.setValue("name", "controller"); + _agent.addObject(_control); + System.out.println("BigPayloadAgentTest Schema control object added OK"); + } + + + 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"; + BigPayloadAgentTest test1 = new BigPayloadAgentTest(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 ("ConnectionAudit main(): IOException: " + e.getMessage()); + } + + System.out.println("*** Ending BigPayloadAgentTest ***"); + } +} diff --git a/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/BigPayloadAgentTestConsole.java b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/BigPayloadAgentTestConsole.java new file mode 100644 index 0000000000..4457dea5e5 --- /dev/null +++ b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/BigPayloadAgentTestConsole.java @@ -0,0 +1,155 @@ +/* + * + * 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 BigPayloadAgentTestConsole implements QmfEventListener +{ + private Console _console; + private Agent _agent; + + public BigPayloadAgentTestConsole(String url) + { + try + { + System.out.println("*** Starting BigPayloadAgentTestConsole used to test basic Console and Agent behaviour ***"); + + Connection connection = ConnectionHelper.createConnection(url, "{reconnect: true}"); + _console = new Console(this); + _console.addConnection(connection, " ; {link: {name:'big-payload-console', x-declare: {arguments: {'qpid.policy_type': ring, 'qpid.max_size': 500000000}}}}"); + + // Wait until the broker Agent has been discovered + _agent = _console.findAgent("big-payload-agent"); + if (_agent == null) + { + System.out.println("Big Payload Agent not found"); + System.exit(1); + } + + List controls = _console.getObjects("com.test.bigagent", "control"); + if (controls.size() > 0) + { + QmfConsoleData control = controls.get(0); + + // ********** Invoke processPayload nethod ********** + System.out.println("Testing invokeMethod(processPayload, args)"); + QmfData inArgs = new QmfData(); + inArgs.setValue("parameter", new byte[150000000]); + + MethodResult results = control.invokeMethod("processPayload", inArgs); + if (!results.succeeded()) + { + System.out.println("processPayload returned an exception object"); + System.exit(1); + } + + if (!results.hasValue("return")) + { + System.out.println("processPayload returned an unexpected value"); + System.exit(1); + } + + byte[] returnVal = results.getValue("return"); + System.out.println("returnVal size = " + returnVal.length); + } + else + { + System.out.println("No control objects returned: BigPayloadAgentTestConsole failed"); + System.exit(1); + } + } + catch (QmfException qmfe) + { + System.err.println("QmfException " + qmfe.getMessage() + ": BigPayloadAgentTestConsole failed"); + System.exit(1); + } + } + + public void onEvent(WorkItem wi) + { + //System.out.println("WorkItem type: " + wi.getType()); + + if (wi.getType() == AGENT_HEARTBEAT) + { + AgentHeartbeatWorkItem item = (AgentHeartbeatWorkItem)wi; + Agent agent = item.getAgent(); + System.out.println(agent.getName()); + } + } + + 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"; + BigPayloadAgentTestConsole test = new BigPayloadAgentTestConsole(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 ("BigPayloadAgentTestConsole main(): IOException: " + e.getMessage()); + } + + System.out.println("*** Ending BigPayloadAgentTestConsole ***"); + } +} diff --git a/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/BrokerSubscriptionTestConsole.java b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/BrokerSubscriptionTestConsole.java new file mode 100644 index 0000000000..27eadbaac8 --- /dev/null +++ b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/BrokerSubscriptionTestConsole.java @@ -0,0 +1,262 @@ +/* + * + * 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.QmfQuery; +import org.apache.qpid.qmf2.common.QmfQueryTarget; +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.console.SubscribeIndication; +import org.apache.qpid.qmf2.console.SubscribeParams; +import org.apache.qpid.qmf2.console.SubscribeResponseWorkItem; +import org.apache.qpid.qmf2.console.SubscriptionIndicationWorkItem; +import org.apache.qpid.qmf2.util.ConnectionHelper; +import static org.apache.qpid.qmf2.common.WorkItem.WorkItemType.*; + +/** + * This class provides a test of broker subscription behaviour. + *

+ * N.B. That the 0.12 C++ broker does not *actually* support subscriptions however it does periodically "push" + * QmfConsoleData Object updates as _data indications. The Console class uses these to provide client side + * emulation of broker subscriptions. One slightly subtle thing to bear in mind however is that the broker + * ManagementAgent separates "properties" and "statistics" so for example a subscription query on say a queue's + * name property will only evaluate true for a properties push and not a statistics push. The most useful usage + * pattern is likely to be a getObjects() call to return all queues, followed by a search for the queue of interest + * then a subscription with a query using the ObjectId of the wanted queue. + * + * @author Fraser Adams + */ +public final class BrokerSubscriptionTestConsole implements QmfEventListener +{ + private Console _console; + private Agent _broker; + private ObjectId _objectId; // Used to test ObjectId Query + + public BrokerSubscriptionTestConsole(String url) + { + try + { + System.out.println("** Starting BrokerSubscriptionTestConsole used to test subscription behaviour **"); + + Connection connection = ConnectionHelper.createConnection(url, "{reconnect: true}"); + _console = new Console(this); + _console.addConnection(connection); + + // Wait until the broker Agent has been discovered + _broker = _console.findAgent("broker"); + if (_broker == null) + { + System.out.println("broker Agent not found"); + System.exit(1); + } + + System.out.println("Creating Query for objects whose name property has a value that starts with 'a'"); + + SubscribeParams params; + QmfQuery query = new QmfQuery(QmfQueryTarget.OBJECT, "['re_match', 'name', ['quote', '^a']]"); + + // Create a subscription, response returned synchronously + params = _console.createSubscription(_broker, query, "consoleHandle1", "{publishInterval:5}"); + System.out.println("duration = " + params.getLifetime()); + System.out.println("interval = " + params.getPublishInterval()); + System.out.println("subscriptionId = " + params.getSubscriptionId()); + System.out.println("consoleHandle = " + params.getConsoleHandle()); + + // Sleep a while, getting query result as they become available + try + { + Thread.sleep(20000); + } + catch (InterruptedException ie) + { + } + + // Refresh the subscription getting results asynchronously, just for variety + System.out.println("Calling refreshSubscription on " + params.getSubscriptionId()); + _console.refreshSubscription(params.getSubscriptionId(), "{replyHandle:ignoredReplyHandle}"); + + + // Create a subscription for _class_name = queue + System.out.println("Creating Query for all queue objects"); + query = new QmfQuery(QmfQueryTarget.OBJECT, "['eq', '_class_name', ['quote', 'queue']]"); + params = _console.createSubscription(_broker, query, "queues"); + + while (_objectId == null) + { + System.out.println("Waiting for ObjectId to be set"); + try + { + Thread.sleep(1000); + } + catch (InterruptedException ie) + { + } + } + + // Cancel the query for all queue objects + System.out.println("Cancelling Query for all queue objects"); + _console.cancelSubscription(params.getSubscriptionId()); + + // Create a subscription for _object_id + System.out.println("Creating Query for _object_id = " + _objectId); + query = new QmfQuery(QmfQueryTarget.OBJECT, _objectId); + params = _console.createSubscription(_broker, query, "queues"); + + } + catch (QmfException qmfe) + { + System.err.println("QmfException " + qmfe.getMessage() + ": BrokerSubscriptionTestConsole failed"); + System.exit(1); + } + } + + public void onEvent(WorkItem wi) + { + System.out.println("WorkItem type: " + wi.getType()); + + 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")); + } + + if (wi.getType() == SUBSCRIBE_RESPONSE) + { + SubscribeResponseWorkItem item = (SubscribeResponseWorkItem)wi; + SubscribeParams params = item.getSubscribeParams(); + System.out.println("duration = " + params.getLifetime()); + System.out.println("interval = " + params.getPublishInterval()); + System.out.println("subscriptionId = " + params.getSubscriptionId()); + System.out.println("consoleHandle = " + params.getConsoleHandle()); + String correlationId = item.getHandle().getCorrelationId(); + System.out.println("correlationId = " + correlationId); + } + + if (wi.getType() == SUBSCRIPTION_INDICATION) + { + SubscriptionIndicationWorkItem item = (SubscriptionIndicationWorkItem)wi; + SubscribeIndication indication = item.getSubscribeIndication(); + String correlationId = indication.getConsoleHandle(); + System.out.println("correlationId = " + correlationId); + + List objects = indication.getData(); + for (QmfConsoleData object : objects) + { + if (object.isDeleted()) + { + System.out.println("object has been deleted"); + } + String className = object.getSchemaClassId().getClassName(); + System.out.println("object class = " + className); + if (className.equals("queue") || className.equals("exchange")) + { + if (object.hasValue("name")) + { + System.out.println("property update, name = " + object.getStringValue("name")); + } + else + { + _objectId = object.getObjectId(); + System.out.println("statistic update, oid = " + _objectId); + } + } + } + } + } + + 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"; + BrokerSubscriptionTestConsole test = new BrokerSubscriptionTestConsole(url); + + BufferedReader commandLine = new BufferedReader(new InputStreamReader(System.in)); + // Blocks here until return is pressed + 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 ("BrokerSubscriptionTestConsole main(): IOException: " + e.getMessage()); + } + + System.out.println("*** Ending BrokerSubscriptionTestConsole ***"); + } +} diff --git a/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/InvokeMethodTest.java b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/InvokeMethodTest.java new file mode 100644 index 0000000000..8b175e3ca6 --- /dev/null +++ b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/InvokeMethodTest.java @@ -0,0 +1,112 @@ +/* + * + * 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.SchemaClass; +import org.apache.qpid.qmf2.common.SchemaClassId; +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.Console; +import org.apache.qpid.qmf2.console.MethodResult; +import org.apache.qpid.qmf2.console.QmfConsoleData; +import org.apache.qpid.qmf2.util.ConnectionHelper; + +/** + * This class tests invoking a method lots of times. + * + * @author Fraser Adams + */ +public final class InvokeMethodTest implements QmfEventListener +{ + private Console _console; + + public InvokeMethodTest(String url) + { + try + { + System.out.println("*** Starting InvokeMethodTest ctrl^C to exit ***"); + System.out.println("This is intended to soak test QMF2 invokeMethod, it doesn't do anything obvious"); + System.out.println("but attaching jconsole shows memory consumption. It *looks* like it's leaking"); + System.out.println("memory, but it turns out to be due to the use of a SoftReference in Qpid's"); + System.out.println("setReplyTo() method on JMSMessage. Consumption *eventually* flattens out..."); + + Connection connection = ConnectionHelper.createConnection(url, "{reconnect: true}"); + _console = new Console(this); + _console.addConnection(connection); + + // First we create a large number of queues using the QMF2 create method on the broker object + List brokers = _console.getObjects("org.apache.qpid.broker", "broker"); + if (brokers.isEmpty()) + { + System.out.println("No broker QmfConsoleData returned"); + System.exit(1); + } + + QmfConsoleData broker = brokers.get(0); + QmfData arguments = new QmfData(); + + while (true) + { + try + { + MethodResult results = broker.invokeMethod("getLogLevel", arguments); +//System.out.println(results.getStringValue("level")); + } + catch (QmfException e) + { // This may be throw if we've already added the queues, we just catch and ignore for this test. + //System.out.println(e.getMessage()); + } + } + } + catch (QmfException qmfe) + { + System.err.println("QmfException " + qmfe.getMessage() + ": InvokeMethodTest failed"); + System.exit(1); + } + } + + public void onEvent(WorkItem wi) + { + } + + public static void main(String[] args) + { + System.setProperty("amqj.logging.level", "FATAL"); + + String url = (args.length == 1) ? args[0] : "localhost"; + InvokeMethodTest test = new InvokeMethodTest(url); + } +} diff --git a/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/PartialGetObjectsTest.java b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/PartialGetObjectsTest.java new file mode 100644 index 0000000000..e42879947b --- /dev/null +++ b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/PartialGetObjectsTest.java @@ -0,0 +1,177 @@ +/* + * + * 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.SchemaClass; +import org.apache.qpid.qmf2.common.SchemaClassId; +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.Console; +import org.apache.qpid.qmf2.console.QmfConsoleData; +import org.apache.qpid.qmf2.util.ConnectionHelper; + +/** + * This class tests the case where getObjects() returns "a lot" of objects. The broker ManagementAgent actually + * sends multiple messages in this case with the initial messages marked with a "partial" header. The Console + * getObjects() method needs to be able to support receiving multiple response messages when the "partial" + * header is set. + * + * @author Fraser Adams + */ +public final class PartialGetObjectsTest implements QmfEventListener +{ + private Console _console; + + public PartialGetObjectsTest(String url) + { + try + { + System.out.println("*** Starting PartialGetObjectsTest used to test schema retrieval ***"); + + Connection connection = ConnectionHelper.createConnection(url, "{reconnect: true}"); + _console = new Console(this); + _console.addConnection(connection); + + // First we create a large number of queues using the QMF2 create method on the broker object + List brokers = _console.getObjects("org.apache.qpid.broker", "broker"); + if (brokers.isEmpty()) + { + System.out.println("No broker QmfConsoleData returned"); + System.exit(1); + } + + QmfConsoleData broker = brokers.get(0); + QmfData arguments = new QmfData(); + arguments.setValue("type", "queue"); + + for (int i = 0; i < 300; i++) + { + arguments.setValue("name", "test " + i); + + try + { + broker.invokeMethod("create", arguments); + } + catch (QmfException e) + { // This may be throw if we've already added the queues, we just catch and ignore for this test. + //System.out.println(e.getMessage()); + } + } + + // After we've created lots of queues we attempt to list them. This list should include all the queues + // we've added irrespective of the number. + List queues = _console.getObjects("org.apache.qpid.broker", "queue"); + System.out.println("Call 1 Returned " + queues.size() + " objects"); + for (QmfConsoleData queue : queues) + { + String name = queue.getStringValue("name"); + System.out.println("Queue: " + name); + } + + // We get the queue objects a second time. If getObjects() correctly handles partial responses then + // this should return the complete list of queue objects, if not it will only return the subset that + // corresponds to the additional partial responses. Not handling these messages is likely to be a very + // bad thing as subsequent QMF requests will then start to receive the wrong responses. + queues = _console.getObjects("org.apache.qpid.broker", "queue"); + System.out.println("Call 2 Returned " + queues.size() + " objects"); + for (QmfConsoleData queue : queues) + { + String name = queue.getStringValue("name"); + System.out.println("Queue: " + name); + } + + } + catch (QmfException qmfe) + { + System.err.println("QmfException " + qmfe.getMessage() + ": PartialGetObjectsTest failed"); + System.exit(1); + } + } + + public void onEvent(WorkItem wi) + { + /* if (wi instanceof AgentAddedWorkItem) + { + AgentAddedWorkItem item = (AgentAddedWorkItem)wi; + Agent agent = item.getAgent(); + System.out.println("\nAgent " + agent.getName() + " added "); + + // Retrieve the List of SchemaClassIds from the Agent, these will be used to retrieve the Schema. + List schemaClassIds = _console.getClasses(agent); + + if (schemaClassIds.size() > 0) + { + // For each retrieved Class retrieve and display the Schema. + for (SchemaClassId schemaClassId : schemaClassIds) + { + List schema = _console.getSchema(schemaClassId, agent); + if (schema.size() == 1) + { + schema.get(0).listValues(); + } + } + } + else + { + System.out.println("No schema information is available for this Agent"); + } + }*/ + + } + + 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"; + PartialGetObjectsTest test = new PartialGetObjectsTest(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 ("PartialGetObjectsTest main(): IOException: " + e.getMessage()); + } + + System.out.println("*** Ending PartialGetObjectsTest ***"); + } +} diff --git a/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/SchemaTest.java b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/SchemaTest.java new file mode 100644 index 0000000000..f510bb201c --- /dev/null +++ b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/SchemaTest.java @@ -0,0 +1,126 @@ +/* + * + * 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.SchemaClass; +import org.apache.qpid.qmf2.common.SchemaClassId; +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.Console; +import org.apache.qpid.qmf2.console.QmfConsoleData; +import org.apache.qpid.qmf2.util.ConnectionHelper; + +/** + * This class retrieves schema information when it detects that Agents have been added. + * + * @author Fraser Adams + */ +public final class SchemaTest implements QmfEventListener +{ + private Console _console; + + public SchemaTest(String url) + { + try + { + System.out.println("*** Starting SchemaTest used to test schema retrieval ***"); + + Connection connection = ConnectionHelper.createConnection(url, "{reconnect: true}"); + _console = new Console(this); + _console.addConnection(connection); + + } + catch (QmfException qmfe) + { + System.err.println("QmfException " + qmfe.getMessage() + ": SchemaTest failed"); + System.exit(1); + } + } + + public void onEvent(WorkItem wi) + { + if (wi instanceof AgentAddedWorkItem) + { + AgentAddedWorkItem item = (AgentAddedWorkItem)wi; + Agent agent = item.getAgent(); + System.out.println("\nAgent " + agent.getName() + " added "); + + // Retrieve the List of SchemaClassIds from the Agent, these will be used to retrieve the Schema. + List schemaClassIds = _console.getClasses(agent); + + if (schemaClassIds.size() > 0) + { + // For each retrieved Class retrieve and display the Schema. + for (SchemaClassId schemaClassId : schemaClassIds) + { + List schema = _console.getSchema(schemaClassId, agent); + if (schema.size() == 1) + { + schema.get(0).listValues(); + } + } + } + else + { + System.out.println("No schema information is available for this Agent"); + } + } + + } + + 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"; + SchemaTest test = new SchemaTest(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 ("SchemaTest main(): IOException: " + e.getMessage()); + } + + System.out.println("*** Ending SchemaTest ***"); + } +} diff --git a/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/Test1.java b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/Test1.java new file mode 100644 index 0000000000..f71f4cdf32 --- /dev/null +++ b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/Test1.java @@ -0,0 +1,140 @@ +/* + * + * 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.Date; +import java.util.List; +import java.util.Map; +import java.util.HashMap; + +// QMF2 Imports +import org.apache.qpid.qmf2.common.BlockingNotifier; +import org.apache.qpid.qmf2.common.Notifier; +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.Console; +import org.apache.qpid.qmf2.console.QmfConsoleData; +import org.apache.qpid.qmf2.util.ConnectionHelper; + +/** + * A class used to test the basic Console Agent discovery behaviour + * + * @author Fraser Adams + */ + +public final class Test1 +{ + private Console _console; + + public Test1(String url) + { + try + { + System.out.println("*** Starting Test1 synchronous Agent discovery ***"); + Connection connection = ConnectionHelper.createConnection(url, "{reconnect: true}"); + _console = new Console(); + _console.addConnection(connection); + + System.out.println("*** Test1 testing _console.getAgents(): ***"); + List agents = _console.getAgents(); + + if (agents.size() == 0) + { + System.out.println("*** Test1 failed, _console.getAgents() should return at least Broker Agent ***"); + System.exit(1); + } + + for (Agent agent : agents) + { + agent.listValues(); + } + + System.out.println("*** Test1 testing _console.getAgent(\"broker\"): ***"); + Agent agent = _console.getAgent("broker"); + agent.listValues(); + + System.out.println("*** Test1 testing _console.findAgent(\"broker\"): ***"); + agent = _console.findAgent("broker"); + if (agent == null) + { + System.out.println("*** Test1 _console.findAgent(\"broker\") returned null : Test1 failed ***"); + System.exit(1); + } + else + { + agent.listValues(); + } + + + System.out.println("*** Test1 testing _console.findAgent(\"monkey\"): ***"); + agent = _console.findAgent("monkey"); + if (agent == null) + { + System.out.println("*** Test1 _console.findAgent(\"monkey\") correctly returned null ***"); + } + else + { + agent.listValues(); + } + + + System.out.println("*** Test1 testing _console.getObjects(\"broker\"): ***"); + List brokers = _console.getObjects("broker"); + if (brokers.size() == 0) + { + System.out.println("*** Test1 _console.getObjects(\"broker\") should return at least one object : Test1 failed ***"); + System.exit(1); + } + else + { + for (QmfConsoleData broker : brokers) + { + broker.listValues(); + } + } + + System.out.println("*** Ending Test1 ***"); + } + catch (QmfException qmfe) + { + System.err.println("QmfException " + qmfe.getMessage() + " caught: Test1 failed"); + } + } + + public static void main(String[] args) + { + //System.out.println ("Setting log level to FATAL"); + System.setProperty("amqj.logging.level", "FATAL"); + + // As of Qpid 0.16 the Session Dispatcher Thread is non-Daemon so the JVM gets prevented from exiting. + // Setting the following property to true makes it a Daemon Thread. + System.setProperty("qpid.jms.daemon.dispatcher", "true"); + + String url = (args.length == 1) ? args[0] : "localhost"; + Test1 test1 = new Test1(url); + } +} diff --git a/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/Test2.java b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/Test2.java new file mode 100644 index 0000000000..11924f824d --- /dev/null +++ b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/Test2.java @@ -0,0 +1,121 @@ +/* + * + * 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.Date; +import java.util.List; +import java.util.Map; +import java.util.HashMap; + +// QMF2 Imports +import org.apache.qpid.qmf2.common.BlockingNotifier; +import org.apache.qpid.qmf2.common.Notifier; +import org.apache.qpid.qmf2.common.QmfEventListener; +import org.apache.qpid.qmf2.common.QmfException; +import org.apache.qpid.qmf2.common.QmfQuery; +import org.apache.qpid.qmf2.common.QmfQueryTarget; +import org.apache.qpid.qmf2.common.WorkItem; +import org.apache.qpid.qmf2.console.Agent; +import org.apache.qpid.qmf2.console.Console; +import org.apache.qpid.qmf2.console.QmfConsoleData; +import org.apache.qpid.qmf2.util.ConnectionHelper; +import static org.apache.qpid.qmf2.common.WorkItem.WorkItemType.*; + +/** + * A class used to test a non-blocking query for all Agents using the Notifier/WorkItem Event API. As most of + * the tests and samples use the alternative QmfEventListener API (because the author prefers that) rather than + * the official QMF2 WorkQueue API it seems sensible to include at least one test illustrating that. + * + * Note that in practice the WorkQueue API can also be used without an explicit notifier as one of the + * overloaded Console getNextWorkitem() methods is a blocking call to the WorkQueue that blocks until a WorkItem + * is available. The approach used in this class is for API illustration purposes and the author is unlikely to + * use it for anything useful. + * + * @author Fraser Adams + */ + +public final class Test2 +{ + private Console _console; + + public Test2(String url) + { + try + { + System.out.println("*** Starting Test2 asynchronous Agent discovery using WorkQueue API ***"); + + BlockingNotifier notifier = new BlockingNotifier(); + + Connection connection = ConnectionHelper.createConnection(url, "{reconnect: true}"); + _console = new Console(notifier); +//console.disableAgentDiscovery(); // To miss all notifications this needs done before addConnection() + _console.addConnection(connection); + + int count = 0; + while (true) + { + notifier.waitForWorkItem(); + System.out.println("WorkItem available, WorkItem count = " + _console.getWorkitemCount()); + + WorkItem wi; + while ((wi = _console.getNextWorkitem(0)) != null) + { + System.out.println("WorkItem type: " + wi.getType()); + if (wi.getType() == AGENT_HEARTBEAT || wi.getType() == AGENT_ADDED || + wi.getType() == AGENT_DELETED || wi.getType() == AGENT_RESTARTED || + wi.getType() == EVENT_RECEIVED) + { + Map p = wi.>getParams(); + Agent agent = (Agent)p.get("agent"); + System.out.println(agent.getName()); + } + } + + count++; + if (count == 10) + { + System.out.println("Applying Agent Discovery Query ['eq', '_product', ['quote', 'gizmo']]"); + System.out.println("This should disable broker Agent events but allow gizmo Agent events"); + System.out.println("Run AgentTest to prove this"); + QmfQuery query = new QmfQuery(QmfQueryTarget.OBJECT, "['eq', '_product', ['quote', 'gizmo']]"); + _console.enableAgentDiscovery(query); + } + } + } + catch (QmfException qmfe) + { + System.err.println("QmfException " + qmfe.getMessage() + " caught: Test2 failed"); + } + } + + 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"; + Test2 test2 = new Test2(url); + } +} diff --git a/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/Test3.java b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/Test3.java new file mode 100644 index 0000000000..fdb9180d36 --- /dev/null +++ b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/Test3.java @@ -0,0 +1,137 @@ +/* + * + * 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; + +// Misc Imports +import java.io.*; +import java.util.List; + +// QMF2 Imports +import org.apache.qpid.qmf2.common.QmfException; +import org.apache.qpid.qmf2.common.QmfType; +import org.apache.qpid.qmf2.common.SchemaEventClass; +import org.apache.qpid.qmf2.common.SchemaMethod; +import org.apache.qpid.qmf2.common.SchemaObjectClass; +import org.apache.qpid.qmf2.common.SchemaProperty; + +/** + * A class used to test the Schema classes + * + * @author Fraser Adams + */ +public final class Test3 +{ + public Test3() + { + try + { + System.out.println("*** Starting Test3 testing the various Schema classes ***"); + + // Create and register schema for this agent. + String packageName = "com.profitron.gizmo"; + + // Declare a schema for a structured exception that can be used in failed method invocations. + SchemaObjectClass exception = new SchemaObjectClass(packageName, "exception"); + + exception.addProperty(new SchemaProperty("whatHappened", QmfType.TYPE_STRING)); + exception.addProperty(new SchemaProperty("howBad", QmfType.TYPE_INT)); + exception.addProperty(new SchemaProperty("details", QmfType.TYPE_MAP)); + + // Declare a control object to test methods against. + SchemaObjectClass control = new SchemaObjectClass(packageName, "control"); + control.addProperty(new SchemaProperty("state", QmfType.TYPE_STRING)); + control.addProperty(new SchemaProperty("methodCount", QmfType.TYPE_INT)); + + SchemaMethod stopMethod = new SchemaMethod("stop", "Stop Agent"); + stopMethod.addArgument(new SchemaProperty("message", QmfType.TYPE_STRING)); + control.addMethod(stopMethod); + + SchemaMethod echoMethod = new SchemaMethod("echo", "Echo Arguments"); + echoMethod.addArgument(new SchemaProperty("sequence", QmfType.TYPE_INT, "{dir:INOUT}")); + echoMethod.addArgument(new SchemaProperty("map", QmfType.TYPE_MAP, "{dir:INOUT}")); + control.addMethod(echoMethod); + + SchemaMethod eventMethod = new SchemaMethod("event", "Raise an Event"); + eventMethod.addArgument(new SchemaProperty("text", QmfType.TYPE_STRING, "{dir:IN}")); + eventMethod.addArgument(new SchemaProperty("severity", QmfType.TYPE_INT, "{dir:IN}")); + control.addMethod(eventMethod); + + SchemaMethod failMethod = new SchemaMethod("fail", "Expected to Fail"); + failMethod.addArgument(new SchemaProperty("useString", QmfType.TYPE_BOOL, "{dir:IN}")); + failMethod.addArgument(new SchemaProperty("stringVal", QmfType.TYPE_STRING, "{dir:IN}")); + failMethod.addArgument(new SchemaProperty("details", QmfType.TYPE_MAP, "{dir:IN}")); + control.addMethod(failMethod); + + SchemaMethod createMethod = new SchemaMethod("create_child", "Create Child Object"); + createMethod.addArgument(new SchemaProperty("name", QmfType.TYPE_STRING, "{dir:IN}")); + createMethod.addArgument(new SchemaProperty("childAddr", QmfType.TYPE_MAP, "{dir:OUT}")); + control.addMethod(createMethod); + + // Declare the child class + SchemaObjectClass child = new SchemaObjectClass(packageName, "child"); + child.addProperty(new SchemaProperty("name", QmfType.TYPE_STRING)); + + // Declare the event class + SchemaEventClass event = new SchemaEventClass(packageName, "event"); + event.addProperty(new SchemaProperty("text", QmfType.TYPE_STRING)); + + System.out.println("Test3 Schema classes initialised OK"); + + // Now we create new instance of each class from the map encodings and list the values + // to check everything looks OK. + + System.out.println("Test3 testing serialisation of exception schema"); + SchemaObjectClass exceptionFromMap = new SchemaObjectClass(exception.mapEncode()); + exceptionFromMap.listValues(); + System.out.println(); + + System.out.println("Test3 testing serialisation of control schema"); + SchemaObjectClass controlFromMap = new SchemaObjectClass(control.mapEncode()); + controlFromMap.listValues(); + System.out.println(); + + System.out.println("Test3 testing serialisation of child schema"); + SchemaObjectClass childFromMap = new SchemaObjectClass(child.mapEncode()); + childFromMap.listValues(); + System.out.println(); + + System.out.println("Test3 testing serialisation of event schema"); + SchemaEventClass eventFromMap = new SchemaEventClass(event.mapEncode()); + eventFromMap.listValues(); + System.out.println(); + + } + catch (QmfException qmfe) + { + System.err.println("QmfException " + qmfe.getMessage() + " caught: Test3 failed"); + } + } + + public static void main(String[] args) + { + //System.out.println ("Setting log level to FATAL"); + System.setProperty("amqj.logging.level", "FATAL"); + + Test3 Test3 = new Test3(); + + System.out.println("*** Ending Test3 ***"); + } +} diff --git a/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/Test4.java b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/Test4.java new file mode 100644 index 0000000000..29a8ba8f88 --- /dev/null +++ b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/Test4.java @@ -0,0 +1,339 @@ +/* + * + * 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; + +// Misc Imports +import java.io.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +// QMF2 Imports +import org.apache.qpid.qmf2.common.ObjectId; +import org.apache.qpid.qmf2.common.QmfException; +import org.apache.qpid.qmf2.common.QmfQuery; +import org.apache.qpid.qmf2.common.QmfQueryTarget; +import org.apache.qpid.qmf2.common.QmfType; +import org.apache.qpid.qmf2.common.SchemaClass; +import org.apache.qpid.qmf2.common.SchemaClassId; +import org.apache.qpid.qmf2.common.SchemaEventClass; +import org.apache.qpid.qmf2.common.SchemaMethod; +import org.apache.qpid.qmf2.common.SchemaObjectClass; +import org.apache.qpid.qmf2.common.SchemaProperty; + +import org.apache.qpid.qmf2.console.QmfConsoleData; +import org.apache.qpid.qmf2.agent.QmfAgentData; + + +/** + * A class used to test the QmfQuery classes + * + * @author Fraser Adams + */ +public final class Test4 +{ + + private Map _schemaCache = new ConcurrentHashMap(); + private Map _objectIndex = new ConcurrentHashMap(); + + public Test4() + { + try + { + System.out.println("*** Starting Test4 testing the QmfQuery class ***"); + + // Create and register schema for this agent. + String packageName = "com.fadams.qmf2"; + + // Declare a mammal class to test against. + SchemaObjectClass mammal = new SchemaObjectClass(packageName, "mammal"); + mammal.addProperty(new SchemaProperty("name", QmfType.TYPE_STRING)); + mammal.addProperty(new SchemaProperty("legs", QmfType.TYPE_INT)); + mammal.setIdNames("name"); + + // Declare an insect class to test against. + SchemaObjectClass insect = new SchemaObjectClass(packageName, "insect"); + insect.addProperty(new SchemaProperty("name", QmfType.TYPE_STRING)); + insect.addProperty(new SchemaProperty("legs", QmfType.TYPE_INT)); + insect.setIdNames("name"); + + // Declare a reptile class to test against. + SchemaObjectClass reptile = new SchemaObjectClass(packageName, "reptile"); + reptile.addProperty(new SchemaProperty("name", QmfType.TYPE_STRING)); + reptile.addProperty(new SchemaProperty("legs", QmfType.TYPE_INT)); + reptile.setIdNames("name"); + + // Declare a bird class to test against. + SchemaObjectClass bird = new SchemaObjectClass(packageName, "bird"); + bird.addProperty(new SchemaProperty("name", QmfType.TYPE_STRING)); + bird.addProperty(new SchemaProperty("legs", QmfType.TYPE_INT)); + bird.setIdNames("name"); + + + registerObjectClass(mammal); + registerObjectClass(insect); + registerObjectClass(reptile); + registerObjectClass(bird); + + QmfAgentData cat = new QmfAgentData(mammal); + cat.setValue("name", "cat"); + cat.setValue("legs", 4l); + addObject(cat); + + QmfAgentData dog = new QmfAgentData(mammal); + dog.setValue("name", "dog"); + dog.setValue("legs", 4l); + addObject(dog); + + QmfAgentData rabbit = new QmfAgentData(mammal); + rabbit.setValue("name", "rabbit"); + rabbit.setValue("legs", 4); + addObject(rabbit); + + QmfAgentData horse = new QmfAgentData(mammal); + horse.setValue("name", "horse"); + horse.setValue("legs", 4); + addObject(horse); + + QmfAgentData human = new QmfAgentData(mammal); + human.setValue("name", "human"); + human.setValue("legs", 2); + addObject(human); + + + QmfAgentData wasp = new QmfAgentData(insect); + wasp.setValue("name", "wasp"); + wasp.setValue("legs", 6); + addObject(wasp); + + QmfAgentData ant = new QmfAgentData(insect); + ant.setValue("name", "ant"); + ant.setValue("legs", 6); + addObject(ant); + + QmfAgentData crocodile = new QmfAgentData(reptile); + crocodile.setValue("name", "crocodile"); + crocodile.setValue("legs", 4); + addObject(crocodile); + + QmfAgentData gecko = new QmfAgentData(reptile); + gecko.setValue("name", "gecko"); + gecko.setValue("legs", 4); + addObject(gecko); + + QmfAgentData python = new QmfAgentData(reptile); + python.setValue("name", "python"); + python.setValue("legs", 0); + addObject(python); + + QmfAgentData hawk = new QmfAgentData(bird); + hawk.setValue("name", "hawk"); + hawk.setValue("legs", 2); + addObject(hawk); + + QmfAgentData ostrich = new QmfAgentData(bird); + ostrich.setValue("name", "ostrich"); + ostrich.setValue("legs", 2); + addObject(ostrich); + + + System.out.println("total number of objects registered: " + _objectIndex.size()); + + QmfQuery query; + List results; + + System.out.println("looking up wasp object by ID"); + query = new QmfQuery(QmfQueryTarget.OBJECT, wasp.getObjectId()); + results = evaluateDataQuery(query); + displayResults(results); + + System.out.println("\nlooking up mammal objects"); + query = new QmfQuery(QmfQueryTarget.OBJECT, new SchemaClassId("mammal")); + results = evaluateDataQuery(query); + displayResults(results); + + System.out.println("\nlooking up everything in package com.fadams.qmf2"); + query = new QmfQuery(QmfQueryTarget.OBJECT, new SchemaClassId("com.fadams.qmf2", null)); + results = evaluateDataQuery(query); + displayResults(results); + + + System.out.println("\nQuery for all mammals with more than two legs"); + String predicate = "['and', ['eq', '_package_name', ['quote', 'com.fadams.qmf2']], " + + "['eq', '_class_name', ['quote', 'mammal']], " + + "['gt', 'legs', 2]]"; + + //predicate = "['eq', '_package_name', ['quote', 'com.fadams.qmf2']]"; + + //predicate = "[]"; + + query = new QmfQuery(QmfQueryTarget.OBJECT, predicate); + System.out.println(query.getPredicate()); + + results = evaluateDataQuery(query); + displayResults(results); + + + System.out.println("\nQuery for everything with less than four legs"); + predicate = "['lt', 'legs', 4]"; + + query = new QmfQuery(QmfQueryTarget.OBJECT, predicate); + System.out.println(query.getPredicate()); + + results = evaluateDataQuery(query); + displayResults(results); + + + System.out.println("\nQuery for everything with between two and four legs"); + predicate = "['and', ['ge', 'legs', 2], " + + "['le', 'legs', 4]]"; + + query = new QmfQuery(QmfQueryTarget.OBJECT, predicate); + System.out.println(query.getPredicate()); + + results = evaluateDataQuery(query); + displayResults(results); + + + System.out.println("\nQuery for all reptiles or birds"); + predicate = "['or', ['eq', '_class_name', ['quote', 'reptile']], " + + "['eq', '_class_name', ['quote', 'bird']]]"; + + query = new QmfQuery(QmfQueryTarget.OBJECT, predicate); + System.out.println(query.getPredicate()); + + results = evaluateDataQuery(query); + displayResults(results); + + + System.out.println("\nQuery for everything whose name matches the regex ^h"); + predicate = "['re_match', 'name', ['quote', '^h']]"; + + query = new QmfQuery(QmfQueryTarget.OBJECT, predicate); + System.out.println(query.getPredicate()); + + results = evaluateDataQuery(query); + displayResults(results); + + + } + catch (QmfException qmfe) + { + System.err.println("QmfException " + qmfe.getMessage() + " caught: Test4 failed"); + } + } + + public void registerObjectClass(SchemaObjectClass schema) + { + SchemaClassId classId = schema.getClassId(); + _schemaCache.put(classId, schema); + } + + public void addObject(QmfAgentData object) throws QmfException + { + SchemaClassId classId = object.getSchemaClassId(); + SchemaClass schema = _schemaCache.get(classId); + + // Try to create an objectName using the set of property names that have been specified as idNames in the schema + StringBuilder buf = new StringBuilder(); + if (schema != null && schema instanceof SchemaObjectClass) + { + String[] idNames = ((SchemaObjectClass)schema).getIdNames(); + for (String name : idNames) + { + buf.append(object.getStringValue(name)); + } + } + String objectName = buf.toString(); + + // If the schema hasn't given any help we use a UUID + if (objectName.length() == 0) objectName = UUID.randomUUID().toString(); + + // Finish up the name by incorporating package and class names + objectName = classId.getPackageName() + ":" + classId.getClassName() + ":" + objectName; + + // Now we've got a good name for the object we create it's ObjectId and add that to the object + ObjectId addr = new ObjectId("test"/*name*/, objectName, 0/*epoch*/); + object.setObjectId(addr); + + if (_objectIndex.get(addr) != null) + { + throw new QmfException("Duplicate QmfAgentData Address"); + } + + _objectIndex.put(addr, object); + } + + + public List evaluateDataQuery(QmfQuery query) + { + List results = new ArrayList(); + + if (query.getObjectId() != null) + { + // Look up a QmfAgentData object by the ObjectId obtained from the query + ObjectId objectId = query.getObjectId(); + QmfAgentData object = _objectIndex.get(objectId); + if (object != null && !object.isDeleted()) + { + results.add(new QmfConsoleData(object.mapEncode(), null)); + } + } + else + { + for (QmfAgentData object : _objectIndex.values()) + { + if (!object.isDeleted() && query.evaluate(object)) + { + results.add(new QmfConsoleData(object.mapEncode(), null)); + } + } + } + + return results; + } + + public List evaluateSchemaQuery(QmfQuery query) + { + return null; + } + + + public void displayResults(List values) + { + for (QmfConsoleData object : values) + { + System.out.println("name = " + object.getStringValue("name") + ", legs = " + object.getLongValue("legs")); + } + } + + public static void main(String[] args) + { + //System.out.println ("Setting log level to FATAL"); + System.setProperty("amqj.logging.level", "FATAL"); + + Test4 Test4 = new Test4(); + + System.out.println("*** Ending Test4 ***"); + } +} diff --git a/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/URLTest.java b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/URLTest.java new file mode 100644 index 0000000000..35bd9f537b --- /dev/null +++ b/qpid/tools/src/java/qpid-qmf2-test/src/main/java/org/apache/qpid/qmf2/test/URLTest.java @@ -0,0 +1,82 @@ +/* + * + * 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.*; + +// QMF2 Imports +import org.apache.qpid.qmf2.util.ConnectionHelper; + +/** + * A class used to test the ConnectionHelper utility, which provides support for a range of AMQP URL formats + * and a basic wrapper for Connection creation. + * + * @author Fraser Adams + */ + +public final class URLTest +{ + public static void main(String[] args) + { + //System.out.println ("Setting log level to FATAL"); + System.setProperty("amqj.logging.level", "FATAL"); + + System.out.println("Running URLTest, this tests ConnectionHelper.createConnectionURL() for various URL formats."); + System.out.println("It doesn't actually create a connection, it just displays the resulting ConnectionURL"); + + String url; + url = ConnectionHelper.createConnectionURL("localhost"); + System.out.println(url); + + url = ConnectionHelper.createConnectionURL("localhost:5672", "{username: foo, password: bar, reconnect: true, reconnect_timeout: 5, reconnect_limit: 5000, tcp-nodelay: true, heartbeat: 10, protocol: ssl}"); + System.out.println(url); + + url = ConnectionHelper.createConnectionURL("guest/guest@localhost:5672", "{reconnect: true, tcp-nodelay: true}"); + System.out.println(url); + + url = ConnectionHelper.createConnectionURL("amqp:localhost:5672, tcp:localhost:5673", "{reconnect: true, tcp-nodelay: true, failover: roundrobin, cyclecount: 20}"); + System.out.println(url); + + url = ConnectionHelper.createConnectionURL("amqp://foo:bar@host1:1234/vhost?clientid=baz"); + System.out.println(url); + + url = ConnectionHelper.createConnectionURL("amqp://localhost"); + System.out.println(url); + + url = ConnectionHelper.createConnectionURL("amqp://vm:foo:1234,tcp:foo:5678/"); + System.out.println(url); + + url = ConnectionHelper.createConnectionURL("amqp://host1,host2,host3/?retry=2"); + System.out.println(url); + + url = ConnectionHelper.createConnectionURL("amqp://host1,host2?retry=2,host3"); + System.out.println(url); + + url = ConnectionHelper.createConnectionURL("amqp://grok:hostname?flavour=strawberry;frobnication=on/vhost"); + System.out.println(url); + + url = ConnectionHelper.createConnectionURL("amqp://host?ssl=true"); + System.out.println(url); + } +} diff --git a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/AgentExternalTest.java b/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/AgentExternalTest.java deleted file mode 100644 index 3094ba406f..0000000000 --- a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/AgentExternalTest.java +++ /dev/null @@ -1,558 +0,0 @@ -/* - * - * 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.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Timer; -import java.util.TimerTask; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; - -// QMF2 Imports -import org.apache.qpid.qmf2.agent.AgentExternal; -import org.apache.qpid.qmf2.agent.MethodCallParams; -import org.apache.qpid.qmf2.agent.MethodCallWorkItem; -import org.apache.qpid.qmf2.agent.ResubscribeParams; -import org.apache.qpid.qmf2.agent.ResubscribeRequestWorkItem; -import org.apache.qpid.qmf2.agent.SubscribeRequestWorkItem; -import org.apache.qpid.qmf2.agent.SubscribableAgent; -import org.apache.qpid.qmf2.agent.Subscription; -import org.apache.qpid.qmf2.agent.SubscriptionParams; -import org.apache.qpid.qmf2.agent.UnsubscribeRequestWorkItem; -import org.apache.qpid.qmf2.agent.QueryWorkItem; -import org.apache.qpid.qmf2.agent.QmfAgentData; -import org.apache.qpid.qmf2.common.Handle; -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.QmfQuery; -import org.apache.qpid.qmf2.common.QmfQueryTarget; -import org.apache.qpid.qmf2.common.QmfType; -import org.apache.qpid.qmf2.common.SchemaEventClass; -import org.apache.qpid.qmf2.common.SchemaMethod; -import org.apache.qpid.qmf2.common.SchemaObjectClass; -import org.apache.qpid.qmf2.common.SchemaProperty; -import org.apache.qpid.qmf2.common.WorkItem; -import org.apache.qpid.qmf2.util.ConnectionHelper; -import static org.apache.qpid.qmf2.common.WorkItem.WorkItemType.*; - -/** - * Class used to test the AgentExternal. - * This class provides a demo of all of the features available on the AgentExternal model including Subscriptions. - * It provides essentially the same behaviour as the AgentTest class though requires a lot more code. - * - * The AgentExternal class and this demo are largely provided for completeness (although they do behave correctly) - * as the author isn't convinced that there's a good reason for using AgentExternal rather than Agent. - * - * @author Fraser Adams - */ -public final class AgentExternalTest implements QmfEventListener, SubscribableAgent -{ - /** - * This TimerTask causes the Agent to Reap any objects marked as deleted when it gets scheduled - */ - private final class Reaper extends TimerTask - { - public void run() - { - // Reap any QmfAgentData Objects that have been marked as Deleted - // Use the iterator approach rather than foreach as we may want to call iterator.remove() to zap an entry - Iterator i = _objectIndex.values().iterator(); - while (i.hasNext()) - { - QmfAgentData object = i.next(); - if (object.isDeleted()) - { -System.out.println("****** Removing deleted Object *******"); - i.remove(); - } - } - } - } - - private AgentExternal _agent; - private QmfAgentData _control; - private SchemaObjectClass _exceptionSchema; - private SchemaObjectClass _controlSchema; - private SchemaObjectClass _childSchema; - private SchemaEventClass _eventSchema; - - /** - * objectIndex is the global index of QmfAgentData objects registered with this Agent - */ - private Map _objectIndex = new ConcurrentHashMap(); - - /** - * This Map is used to look up Subscriptions by SubscriptionId - */ - private Map _subscriptions = new ConcurrentHashMap(); - - private Timer _timer; - - public AgentExternalTest(String url) - { - try - { - System.out.println("** Starting AgentExternalTest a test of basic AgentExternal class functions **"); - - Connection connection = ConnectionHelper.createConnection(url, "{reconnect: true}"); - _agent = new AgentExternal(this); - _agent.setVendor("profitron.com"); - _agent.setProduct("gizmo"); - _agent.setValue("attr1", 2000); - - System.out.println("Agent name: " + _agent.getName()); - - // Schedule a Reap every 10 seconds sending the first one immediately - _timer = new Timer(true); - _timer.schedule(new Reaper(), 0, 10000); - - setupSchema(); - populateData(); - - _agent.setConnection(connection); - - for (int i = 0; i < 100; i++) - { - _control.setValue("offset", i); - //control.update(); // Send data indication to the Subscriber on the next Subscription interval - _control.publish(); // Send data indication to the Subscriber immediately - try - { - Thread.sleep(1000); - } - catch (InterruptedException ie) - { - } - } - - _control.destroy(); - - - // A getObjects call seems necessary to enable automatic reconnection when broker restarts - // I've got no idea why this is the case though!!! - //List connections = console.getObjects("broker"); - } - catch (QmfException qmfe) - { - System.err.println("QmfException " + qmfe.getMessage() + " caught: AgentExternalTest failed"); - } - } - - public void onEvent(WorkItem wi) - { - System.out.println("WorkItem type: " + wi.getType()); - - if (wi.getType() == METHOD_CALL) - { - _control.incValue("methodCount", 1); - - MethodCallWorkItem item = (MethodCallWorkItem)wi; - MethodCallParams methodCallParams = item.getMethodCallParams(); - String methodName = methodCallParams.getName(); - ObjectId objectId = methodCallParams.getObjectId(); - String userId = methodCallParams.getUserId(); - QmfData inArgs = methodCallParams.getArgs(); - ObjectId controlAddress = _control.getObjectId(); - - System.out.println("Method Call User ID = " + userId); - - try - { - if (objectId == null) - { - // Method invoked directly on Agent - if (methodName.equals("toString")) - { - QmfData outArgs = new QmfData(); - outArgs.setValue("string", _agent.toString()); - _agent.methodResponse(methodName, item.getHandle(), outArgs, null); - } - } - else if (objectId.equals(controlAddress)) - { - if (methodName.equals("stop")) - { - System.out.println("Invoked stop method"); - String message = inArgs.getStringValue("message"); - System.out.println("Stopping: message = " + message); - _agent.methodResponse(methodName, item.getHandle(), null, null); - _agent.destroy(); - System.exit(1); - } - else if (methodName.equals("echo")) - { - System.out.println("Invoked echo method"); - _agent.methodResponse(methodName, item.getHandle(), inArgs, null); - } - else if (methodName.equals("event")) - { - System.out.println("Invoked event method"); - QmfEvent event = new QmfEvent(_eventSchema); - event.setSeverity((int)inArgs.getLongValue("severity")); - event.setValue("text", inArgs.getStringValue("text")); - _agent.raiseEvent(event); - _agent.methodResponse(methodName, item.getHandle(), null, null); - } - else if (methodName.equals("fail")) - { - System.out.println("Invoked fail method"); - QmfData error = new QmfData(); - if (inArgs.getBooleanValue("useString")) - { - error.setValue("error_text", inArgs.getStringValue("stringVal")); - } - else - { - error.setValue("whatHappened", "It Failed"); - error.setValue("howBad", 75); - error.setValue("details", inArgs.getValue("details")); - } - _agent.methodResponse(methodName, item.getHandle(), null, error); - } - else if (methodName.equals("create_child")) - { - System.out.println("Invoked create_child method"); - String childName = inArgs.getStringValue("name"); - System.out.println("childName = " + childName); - QmfAgentData child = new QmfAgentData(_childSchema); - child.setValue("name", childName); - addObject(child); - QmfData outArgs = new QmfData(); - outArgs.setRefValue("childAddr", child.getObjectId(), "reference"); // Set suptype just to test - _agent.methodResponse(methodName, item.getHandle(), outArgs, null); - } - } - } - catch (QmfException qmfe) - { - System.err.println("QmfException " + qmfe.getMessage() + " caught: AgentExternalTest failed"); - QmfData error = new QmfData(); - error.setValue("error_text", qmfe.getMessage()); - _agent.methodResponse(methodName, item.getHandle(), null, error); - } - } - - if (wi.getType() == QUERY) - { - QueryWorkItem item = (QueryWorkItem)wi; - QmfQuery query = item.getQmfQuery(); - - System.out.println("Query User ID = " + item.getUserId()); - - if (query.getObjectId() != null) - { - // Look up a QmfAgentData object by the ObjectId obtained from the query - ObjectId objectId = query.getObjectId(); - QmfAgentData object = _objectIndex.get(objectId); - if (object != null && !object.isDeleted()) - { - _agent.queryResponse(item.getHandle(), object); - } - _agent.queryComplete(item.getHandle(), 0); - } - else - { - // Look up QmfAgentData objects by the SchemaClassId obtained from the query - // This is implemented by a linear search and allows searches with only the className specified. - // Linear searches clearly don't scale brilliantly, but the number of QmfAgentData objects managed - // by an Agent is generally fairly small, so it should be OK. Note that this is the same approach - // taken by the C++ broker ManagementAgent, so if it's a problem here........ - for (QmfAgentData object : _objectIndex.values()) - { - if (!object.isDeleted() && query.evaluate(object)) - { - _agent.queryResponse(item.getHandle(), object); - } - } - _agent.queryComplete(item.getHandle(), 0); - } - } - - if (wi.getType() == SUBSCRIBE_REQUEST) - { - SubscribeRequestWorkItem item = (SubscribeRequestWorkItem)wi; - SubscriptionParams params = item.getSubscriptionParams(); - Handle handle = item.getHandle(); - - System.out.println("Subscribe Request User ID = " + params.getUserId()); - - try - { - Subscription subscription = new Subscription(this, params); - _subscriptions.put(subscription.getSubscriptionId(), subscription); - _timer.schedule(subscription, 0, params.getPublishInterval()); - - if (subscription == null) - { -System.out.println("Requested Subscription has already expired or been cancelled"); - QmfData error = new QmfData(); - error.setValue("error_text", "Requested Subscription has already expired or been cancelled"); - _agent.subscriptionResponse(handle, subscription.getConsoleHandle(), null, 0, 0, error); - } - else - { - _agent.subscriptionResponse(handle, subscription.getConsoleHandle(), subscription.getSubscriptionId(), - subscription.getDuration(), subscription.getInterval(), null); - } - } - catch (QmfException qmfe) - { - _agent.raiseException(handle, "Subscribe Request failed, invalid Query: " + qmfe.getMessage()); - } - } - - if (wi.getType() == RESUBSCRIBE_REQUEST) - { - ResubscribeRequestWorkItem item = (ResubscribeRequestWorkItem)wi; - ResubscribeParams params = item.getResubscribeParams(); - Handle handle = item.getHandle(); - - System.out.println("Resubscribe Request User ID = " + params.getUserId()); - - String subscriptionId = params.getSubscriptionId(); - Subscription subscription = _subscriptions.get(subscriptionId); - if (subscription != null) - { - subscription.refresh(params); - _agent.subscriptionResponse(handle, subscription.getConsoleHandle(), subscription.getSubscriptionId(), - subscription.getDuration(), subscription.getInterval(), null); - } - else - { -System.out.println("Requested Subscription has already expired or been cancelled"); - QmfData error = new QmfData(); - error.setValue("error_text", "Requested Subscription has already expired or been cancelled"); - _agent.subscriptionResponse(handle, subscription.getConsoleHandle(), null, 0, 0, error); - } - } - - if (wi.getType() == UNSUBSCRIBE_REQUEST) - { - UnsubscribeRequestWorkItem item = (UnsubscribeRequestWorkItem)wi; - String subscriptionId = item.getSubscriptionId(); -System.out.println("Received cancellation request for " + subscriptionId); - Subscription subscription = _subscriptions.get(subscriptionId); - if (subscription != null) - { - subscription.cancel(); - } - } - - } - - public void setupSchema() throws QmfException - { - System.out.println("*** AgentExternalTest initialising the various Schema classes ***"); - - // Create and register schema for this agent. - String packageName = "com.profitron.gizmo"; - - // Declare a schema for a structured exception that can be used in failed method invocations. - _exceptionSchema = new SchemaObjectClass(packageName, "exception"); - _exceptionSchema.addProperty(new SchemaProperty("whatHappened", QmfType.TYPE_STRING)); - _exceptionSchema.addProperty(new SchemaProperty("howBad", QmfType.TYPE_INT)); - _exceptionSchema.addProperty(new SchemaProperty("details", QmfType.TYPE_MAP)); - - // Declare a control object to test methods against. - _controlSchema = new SchemaObjectClass(packageName, "control"); - _controlSchema.addProperty(new SchemaProperty("state", QmfType.TYPE_STRING)); - _controlSchema.addProperty(new SchemaProperty("methodCount", QmfType.TYPE_INT)); - _controlSchema.addProperty(new SchemaProperty("offset", QmfType.TYPE_INT)); - _controlSchema.setIdNames("state"); - - SchemaMethod stopMethod = new SchemaMethod("stop", "Stop Agent"); - stopMethod.addArgument(new SchemaProperty("message", QmfType.TYPE_STRING, "{dir:IN}")); - _controlSchema.addMethod(stopMethod); - - SchemaMethod echoMethod = new SchemaMethod("echo", "Echo Arguments"); - echoMethod.addArgument(new SchemaProperty("message", QmfType.TYPE_STRING, "{dir:INOUT}")); - _controlSchema.addMethod(echoMethod); - - SchemaMethod eventMethod = new SchemaMethod("event", "Raise an Event"); - eventMethod.addArgument(new SchemaProperty("text", QmfType.TYPE_STRING, "{dir:IN}")); - eventMethod.addArgument(new SchemaProperty("severity", QmfType.TYPE_INT, "{dir:IN}")); - _controlSchema.addMethod(eventMethod); - - SchemaMethod failMethod = new SchemaMethod("fail", "Expected to Fail"); - failMethod.addArgument(new SchemaProperty("useString", QmfType.TYPE_BOOL, "{dir:IN}")); - failMethod.addArgument(new SchemaProperty("stringVal", QmfType.TYPE_STRING, "{dir:IN}")); - failMethod.addArgument(new SchemaProperty("details", QmfType.TYPE_MAP, "{dir:IN}")); - _controlSchema.addMethod(failMethod); - - SchemaMethod createMethod = new SchemaMethod("create_child", "Create Child Object"); - createMethod.addArgument(new SchemaProperty("name", QmfType.TYPE_STRING, "{dir:IN}")); - createMethod.addArgument(new SchemaProperty("childAddr", QmfType.TYPE_MAP, "{dir:OUT}")); - _controlSchema.addMethod(createMethod); - - // Declare the child class - _childSchema = new SchemaObjectClass(packageName, "child"); - _childSchema.addProperty(new SchemaProperty("name", QmfType.TYPE_STRING)); - _childSchema.setIdNames("name"); - - // Declare the event class - _eventSchema = new SchemaEventClass(packageName, "event"); - _eventSchema.addProperty(new SchemaProperty("text", QmfType.TYPE_STRING)); - - System.out.println("AgentExternalTest Schema classes initialised OK"); - - _agent.registerObjectClass(_exceptionSchema); - _agent.registerObjectClass(_controlSchema); - _agent.registerObjectClass(_childSchema); - _agent.registerEventClass(_eventSchema); - - System.out.println("AgentExternalTest Schema classes registered OK"); - } - - public void populateData() throws QmfException - { - System.out.println("*** AgentExternalTest creating a control object ***"); - - _control = new QmfAgentData(_controlSchema); - _control.setValue("state", "OPERATIONAL"); - _control.setValue("methodCount", 0); - - addObject(_control); - System.out.println("AgentExternalTest Schema control object added OK"); - } - - public void addObject(QmfAgentData object) throws QmfException - { - ObjectId addr = _agent.allocObjectId(UUID.randomUUID().toString()); - object.setObjectId(addr); - _objectIndex.put(addr, object); - - // Does the new object match any Subscriptions? If so add a reference to the matching Subscription and publish. - for (Subscription subscription : _subscriptions.values()) - { - QmfQuery query = subscription.getQuery(); - if (query.getObjectId() != null) - { - if (query.getObjectId().equals(addr)) - { - object.addSubscription(subscription.getSubscriptionId(), subscription); - object.publish(); - } - } - else if (query.evaluate(object)) - { - object.addSubscription(subscription.getSubscriptionId(), subscription); - object.publish(); - } - } - } - - - - // methods implementing SubscriberProxy interface - // ******************************************************************************************************** - - /** - * Send a list of updated subscribed data to the Console. - * - * @param handle the console reply handle - * @param results a list of subscribed data in Map encoded form - */ - public void sendSubscriptionIndicate(Handle handle, List results) - { - _agent.sendSubscriptionIndicate(handle, results); - } - - /** - * This method evaluates a QmfQuery over the Agent's data on behalf of a Subscription - * - * @param query the QmfQuery that the Subscription wants to be evaluated over the Agent's data - * @return a List of QmfAgentData objects that match the specified QmfQuery - */ - public List evaluateQuery(QmfQuery query) - { - List results = new ArrayList(_objectIndex.size()); - if (query.getTarget() == QmfQueryTarget.OBJECT) - { - if (query.getObjectId() != null) - { - // Look up a QmfAgentData object by the ObjectId obtained from the query - ObjectId objectId = query.getObjectId(); - QmfAgentData object = _objectIndex.get(objectId); - if (object != null && !object.isDeleted()) - { - results.add(object); - } - } - else - { - // Look up QmfAgentData objects evaluating the query - for (QmfAgentData object : _objectIndex.values()) - { - if (!object.isDeleted() && query.evaluate(object)) - { - results.add(object); - } - } - } - } - return results; - } - - /** - * This method is called by the Subscription to tell the SubscriberProxy that the Subscription has been cancelled. - * - * @param subscription the Subscription that has been cancelled and is requesting removal. - */ - public void removeSubscription(Subscription subscription) - { - _subscriptions.remove(subscription.getSubscriptionId()); - } - - - 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"; - AgentExternalTest test1 = new AgentExternalTest(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 ("ConnectionAudit main(): IOException: " + e.getMessage()); - } - - System.out.println("*** Ending AgentExternalTest ***"); - } -} diff --git a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/AgentSubscriptionTestConsole.java b/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/AgentSubscriptionTestConsole.java deleted file mode 100644 index 3bc84e1ee9..0000000000 --- a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/AgentSubscriptionTestConsole.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * - * 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.QmfQuery; -import org.apache.qpid.qmf2.common.QmfQueryTarget; -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.console.SubscribeIndication; -import org.apache.qpid.qmf2.console.SubscribeParams; -import org.apache.qpid.qmf2.console.SubscribeResponseWorkItem; -import org.apache.qpid.qmf2.console.SubscriptionIndicationWorkItem; -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 subscription behaviour - * - * N.B. AgentTest needs to be running for this test to behave as expected. - * - * @author Fraser Adams - */ -public final class AgentSubscriptionTestConsole implements QmfEventListener -{ - private Console _console; - private Agent _gizmo; - - public AgentSubscriptionTestConsole(String url) - { - try - { - System.out.println("** Starting AgentSubscriptionTestConsole used to test subscription behaviour **"); - - Connection connection = ConnectionHelper.createConnection(url, "{reconnect: true}"); - _console = new Console(this); - _console.addConnection(connection); - - // Wait until the gizmo Agent has been discovered - _gizmo = _console.findAgent("gizmo"); - if (_gizmo == null) - { - System.out.println("gizmo Agent not found, you probably need to run AgentTest1"); - System.exit(1); - } - - System.out.println("Creating Query for objects whose state property has a value that starts with 'OP'"); - - SubscribeParams params; - QmfQuery query = new QmfQuery(QmfQueryTarget.OBJECT, "['re_match', 'state', ['quote', '^OP']]"); - - // Create a subscription, response returned synchronously - params = _console.createSubscription(_gizmo, query, "consoleHandle1", "{publishInterval:5}"); - System.out.println("duration = " + params.getLifetime()); - System.out.println("interval = " + params.getPublishInterval()); - System.out.println("subscriptionId = " + params.getSubscriptionId()); - System.out.println("consoleHandle = " + params.getConsoleHandle()); - - // Sleep a while, getting query result as they become available - try - { - Thread.sleep(20000); - } - catch (InterruptedException ie) - { - } - - // Refresh the subscription getting results asynchronously, just for variety - System.out.println("Calling refreshSubscription on " + params.getSubscriptionId()); - _console.refreshSubscription(params.getSubscriptionId(), "{replyHandle:ignored}"); - - - // Sleep a bit more - try - { - Thread.sleep(350000); - } - catch (InterruptedException ie) - { - } - - } - catch (QmfException qmfe) - { - System.err.println("QmfException " + qmfe.getMessage() + ": AgentSubscriptionTestConsole failed"); - System.exit(1); - } - } - - public void onEvent(WorkItem wi) - { - System.out.println("WorkItem type: " + wi.getType()); - - 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")); - } - - if (wi.getType() == SUBSCRIBE_RESPONSE) - { - SubscribeResponseWorkItem item = (SubscribeResponseWorkItem)wi; - SubscribeParams params = item.getSubscribeParams(); - System.out.println("duration = " + params.getLifetime()); - System.out.println("interval = " + params.getPublishInterval()); - System.out.println("subscriptionId = " + params.getSubscriptionId()); - System.out.println("consoleHandle = " + params.getConsoleHandle()); - String correlationId = item.getHandle().getCorrelationId(); - System.out.println("correlationId = " + correlationId); - } - - if (wi.getType() == SUBSCRIPTION_INDICATION) - { - SubscriptionIndicationWorkItem item = (SubscriptionIndicationWorkItem)wi; - SubscribeIndication indication = item.getSubscribeIndication(); - String correlationId = indication.getConsoleHandle(); - System.out.println("correlationId = " + correlationId); - - List objects = indication.getData(); - for (QmfConsoleData object : objects) - { - if (object.isDeleted()) - { - System.out.println("object has been deleted"); - } - System.out.println("offset = " + object.getValue("offset")); - } - } - } - - 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"; - AgentSubscriptionTestConsole test = new AgentSubscriptionTestConsole(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 ("AgentSubscriptionTestConsole main(): IOException: " + e.getMessage()); - } - - System.out.println("*** Ending AgentSubscriptionTestConsole ***"); - } -} diff --git a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/AgentTest.java b/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/AgentTest.java deleted file mode 100644 index 8aebe76937..0000000000 --- a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/AgentTest.java +++ /dev/null @@ -1,298 +0,0 @@ -/* - * - * 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.agent.Agent; -import org.apache.qpid.qmf2.agent.MethodCallParams; -import org.apache.qpid.qmf2.agent.MethodCallWorkItem; -import org.apache.qpid.qmf2.agent.QmfAgentData; -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.QmfType; -import org.apache.qpid.qmf2.common.SchemaEventClass; -import org.apache.qpid.qmf2.common.SchemaMethod; -import org.apache.qpid.qmf2.common.SchemaObjectClass; -import org.apache.qpid.qmf2.common.SchemaProperty; -import org.apache.qpid.qmf2.common.WorkItem; -import org.apache.qpid.qmf2.util.ConnectionHelper; -import static org.apache.qpid.qmf2.common.WorkItem.WorkItemType.*; - -/** - * A class used to test the Agent API functionality. - * - * @author Fraser Adams - */ -public final class AgentTest implements QmfEventListener -{ - private Agent _agent; - private QmfAgentData _control; - private SchemaObjectClass _exceptionSchema; - private SchemaObjectClass _controlSchema; - private SchemaObjectClass _childSchema; - private SchemaEventClass _eventSchema; - - public AgentTest(String url) - { - try - { - System.out.println("** Starting AgentTest a test of basic Agent class functions **"); - - Connection connection = ConnectionHelper.createConnection(url, "{reconnect: true}"); - _agent = new Agent(this); - _agent.setVendor("profitron.com"); - _agent.setProduct("gizmo"); - _agent.setValue("attr1", 2000); - - System.out.println("Agent name: " + _agent.getName()); - - setupSchema(); - populateData(); - - _agent.setConnection(connection); - - for (int i = 0; i < 100; i++) - { - _control.setValue("offset", i); - //control.update(); // Send data indication to the Subscriber on the next Subscription interval - _control.publish(); // Send data indication to the Subscriber immediately - try - { - Thread.sleep(1000); - } - catch (InterruptedException ie) - { - } - } - - _control.destroy(); - - } - catch (QmfException qmfe) - { - System.err.println("QmfException " + qmfe.getMessage() + " caught: AgentTest failed"); - } - } - - public void onEvent(WorkItem wi) - { - System.out.println("WorkItem type: " + wi.getType()); - _control.incValue("methodCount", 1); - - if (wi.getType() == METHOD_CALL) - { - MethodCallWorkItem item = (MethodCallWorkItem)wi; - MethodCallParams methodCallParams = item.getMethodCallParams(); - String methodName = methodCallParams.getName(); - ObjectId objectId = methodCallParams.getObjectId(); - String userId = methodCallParams.getUserId(); - userId = userId.equals("") ? "anonymous" : userId; - QmfData inArgs = methodCallParams.getArgs(); - ObjectId controlAddress = _control.getObjectId(); - - System.out.println("Method Call User ID = " + userId); - - try - { - if (objectId == null) - { - // Method invoked directly on Agent - if (methodName.equals("toString")) - { - QmfData outArgs = new QmfData(); - outArgs.setValue("string", _agent.toString()); - _agent.methodResponse(methodName, item.getHandle(), outArgs, null); - } - } - else if (objectId.equals(controlAddress)) - { - if (methodName.equals("stop")) - { - System.out.println("Invoked stop method"); - String message = inArgs.getStringValue("message"); - System.out.println("Stopping: message = " + message); - _agent.methodResponse(methodName, item.getHandle(), null, null); - _agent.destroy(); - System.exit(1); - } - else if (methodName.equals("echo")) - { - System.out.println("Invoked echo method"); - _agent.methodResponse(methodName, item.getHandle(), inArgs, null); - } - else if (methodName.equals("event")) - { - System.out.println("Invoked event method"); - QmfEvent event = new QmfEvent(_eventSchema); - event.setSeverity((int)inArgs.getLongValue("severity")); - event.setValue("text", inArgs.getStringValue("text")); - _agent.raiseEvent(event); - _agent.methodResponse(methodName, item.getHandle(), null, null); - } - else if (methodName.equals("fail")) - { - System.out.println("Invoked fail method"); - QmfData error = new QmfData(); - if (inArgs.getBooleanValue("useString")) - { - error.setValue("error_text", inArgs.getStringValue("stringVal")); - } - else - { - error.setValue("whatHappened", "It Failed"); - error.setValue("howBad", 75); - error.setValue("details", inArgs.getValue("details")); - } - _agent.methodResponse(methodName, item.getHandle(), null, error); - } - else if (methodName.equals("create_child")) - { - System.out.println("Invoked create_child method"); - String childName = inArgs.getStringValue("name"); - System.out.println("childName = " + childName); - QmfAgentData child = new QmfAgentData(_childSchema); - child.setValue("name", childName); - _agent.addObject(child); - QmfData outArgs = new QmfData(); - outArgs.setRefValue("childAddr", child.getObjectId(), "reference"); // Set subtype just to test - _agent.methodResponse(methodName, item.getHandle(), outArgs, null); - } - } - } - catch (QmfException qmfe) - { - System.err.println("QmfException " + qmfe.getMessage() + " caught: AgentTest failed"); - QmfData error = new QmfData(); - error.setValue("error_text", qmfe.getMessage()); - _agent.methodResponse(methodName, item.getHandle(), null, error); - } - } - } - - public void setupSchema() throws QmfException - { - System.out.println("*** AgentTest initialising the various Schema classes ***"); - - // Create and register schema for this agent. - String packageName = "com.profitron.gizmo"; - - // Declare a schema for a structured exception that can be used in failed method invocations. - _exceptionSchema = new SchemaObjectClass(packageName, "exception"); - _exceptionSchema.addProperty(new SchemaProperty("whatHappened", QmfType.TYPE_STRING)); - _exceptionSchema.addProperty(new SchemaProperty("howBad", QmfType.TYPE_INT)); - _exceptionSchema.addProperty(new SchemaProperty("details", QmfType.TYPE_MAP)); - - // Declare a control object to test methods against. - _controlSchema = new SchemaObjectClass(packageName, "control"); - _controlSchema.addProperty(new SchemaProperty("state", QmfType.TYPE_STRING)); - _controlSchema.addProperty(new SchemaProperty("methodCount", QmfType.TYPE_INT)); - _controlSchema.addProperty(new SchemaProperty("offset", QmfType.TYPE_INT)); - _controlSchema.setIdNames("state"); - - SchemaMethod stopMethod = new SchemaMethod("stop", "Stop Agent"); - stopMethod.addArgument(new SchemaProperty("message", QmfType.TYPE_STRING, "{dir:IN}")); - _controlSchema.addMethod(stopMethod); - - SchemaMethod echoMethod = new SchemaMethod("echo", "Echo Arguments"); - echoMethod.addArgument(new SchemaProperty("message", QmfType.TYPE_STRING, "{dir:INOUT}")); - _controlSchema.addMethod(echoMethod); - - SchemaMethod eventMethod = new SchemaMethod("event", "Raise an Event"); - eventMethod.addArgument(new SchemaProperty("text", QmfType.TYPE_STRING, "{dir:IN}")); - eventMethod.addArgument(new SchemaProperty("severity", QmfType.TYPE_INT, "{dir:IN}")); - _controlSchema.addMethod(eventMethod); - - SchemaMethod failMethod = new SchemaMethod("fail", "Expected to Fail"); - failMethod.addArgument(new SchemaProperty("useString", QmfType.TYPE_BOOL, "{dir:IN}")); - failMethod.addArgument(new SchemaProperty("stringVal", QmfType.TYPE_STRING, "{dir:IN}")); - failMethod.addArgument(new SchemaProperty("details", QmfType.TYPE_MAP, "{dir:IN}")); - _controlSchema.addMethod(failMethod); - - SchemaMethod createMethod = new SchemaMethod("create_child", "Create Child Object"); - createMethod.addArgument(new SchemaProperty("name", QmfType.TYPE_STRING, "{dir:IN}")); - createMethod.addArgument(new SchemaProperty("childAddr", QmfType.TYPE_MAP, "{dir:OUT}")); - _controlSchema.addMethod(createMethod); - - // Declare the child class - _childSchema = new SchemaObjectClass(packageName, "child"); - _childSchema.addProperty(new SchemaProperty("name", QmfType.TYPE_STRING)); - _childSchema.setIdNames("name"); - - // Declare the event class - _eventSchema = new SchemaEventClass(packageName, "event"); - _eventSchema.addProperty(new SchemaProperty("text", QmfType.TYPE_STRING)); - - System.out.println("AgentTest Schema classes initialised OK"); - - _agent.registerObjectClass(_exceptionSchema); - _agent.registerObjectClass(_controlSchema); - _agent.registerObjectClass(_childSchema); - _agent.registerEventClass(_eventSchema); - - System.out.println("AgentTest Schema classes registered OK"); - } - - public void populateData() throws QmfException - { - System.out.println("*** AgentTest creating a control object ***"); - - _control = new QmfAgentData(_controlSchema); - _control.setValue("state", "OPERATIONAL"); - _control.setValue("methodCount", 0); - _agent.addObject(_control); - System.out.println("AgentTest Schema control object added OK"); - } - - - 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"; - AgentTest test1 = new AgentTest(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 ("ConnectionAudit main(): IOException: " + e.getMessage()); - } - - System.out.println("*** Ending AgentTest ***"); - } -} diff --git a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/AgentTestConsole.java b/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/AgentTestConsole.java deleted file mode 100644 index edae41bcf4..0000000000 --- a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/AgentTestConsole.java +++ /dev/null @@ -1,308 +0,0 @@ -/* - * - * 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 ***"); - } -} diff --git a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/BigPayloadAgentTest.java b/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/BigPayloadAgentTest.java deleted file mode 100644 index a6613464b5..0000000000 --- a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/BigPayloadAgentTest.java +++ /dev/null @@ -1,174 +0,0 @@ -/* - * - * 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.agent.Agent; -import org.apache.qpid.qmf2.agent.MethodCallParams; -import org.apache.qpid.qmf2.agent.MethodCallWorkItem; -import org.apache.qpid.qmf2.agent.QmfAgentData; -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.QmfType; -import org.apache.qpid.qmf2.common.SchemaEventClass; -import org.apache.qpid.qmf2.common.SchemaMethod; -import org.apache.qpid.qmf2.common.SchemaObjectClass; -import org.apache.qpid.qmf2.common.SchemaProperty; -import org.apache.qpid.qmf2.common.WorkItem; -import org.apache.qpid.qmf2.util.ConnectionHelper; -import static org.apache.qpid.qmf2.common.WorkItem.WorkItemType.*; - -/** - * A class used to test the Agent API functionality. This Agent specifies an explicit queue name and a larger than - * default queue size so that it can receive large payloads on its methods. - * - * @author Fraser Adams - */ -public final class BigPayloadAgentTest implements QmfEventListener -{ - private Agent _agent; - private QmfAgentData _control; - private SchemaObjectClass _controlSchema; - - public BigPayloadAgentTest(String url) - { - try - { - System.out.println("** Starting BigPayloadAgentTest a test of basic Agent class functions **"); - - Connection connection = ConnectionHelper.createConnection(url, "{reconnect: true}"); - _agent = new Agent(this); - _agent.setVendor("test.com"); - _agent.setProduct("big-payload-agent"); - - System.out.println("Agent name: " + _agent.getName()); - - setupSchema(); - populateData(); - _agent.setConnection(connection, " ; {link: {name:'big-payload-agent', x-declare: {arguments: {'qpid.policy_type': ring, 'qpid.max_size': 500000000}}}}"); - - } - catch (QmfException qmfe) - { - System.err.println("QmfException " + qmfe.getMessage() + " caught: BigPayloadAgentTest failed"); - } - } - - public void onEvent(WorkItem wi) - { - System.out.println("WorkItem type: " + wi.getType()); - - if (wi.getType() == METHOD_CALL) - { - MethodCallWorkItem item = (MethodCallWorkItem)wi; - MethodCallParams methodCallParams = item.getMethodCallParams(); - String methodName = methodCallParams.getName(); - ObjectId objectId = methodCallParams.getObjectId(); - - QmfData inArgs = methodCallParams.getArgs(); - ObjectId controlAddress = _control.getObjectId(); - - if (objectId.equals(controlAddress)) - { - if (methodName.equals("processPayload")) - { - System.out.println("Invoked processPayload method"); - - byte[] parameter = inArgs.getValue("parameter"); - System.out.println("payload size = " + parameter.length); - - QmfData outArgs = new QmfData(); - outArgs.setValue("return", parameter); - _agent.methodResponse(methodName, item.getHandle(), outArgs, null); - } - } - } - } - - public void setupSchema() throws QmfException - { - System.out.println("*** BigPayloadAgentTest initialising the various Schema classes ***"); - - // Create and register schema for this agent. - String packageName = "com.test.bigagent"; - - // Declare a control object to test methods against. - _controlSchema = new SchemaObjectClass(packageName, "control"); - _controlSchema.addProperty(new SchemaProperty("name", QmfType.TYPE_STRING)); - _controlSchema.setIdNames("name"); - - SchemaMethod createMethod = new SchemaMethod("processPayload", "Process a large payload"); - createMethod.addArgument(new SchemaProperty("parameter", QmfType.TYPE_STRING, "{dir:IN}")); - createMethod.addArgument(new SchemaProperty("return", QmfType.TYPE_STRING, "{dir:OUT}")); - _controlSchema.addMethod(createMethod); - - System.out.println("BigPayloadAgentTest Schema classes initialised OK"); - - _agent.registerObjectClass(_controlSchema); - - System.out.println("BigPayloadAgentTest Schema classes registered OK"); - } - - public void populateData() throws QmfException - { - System.out.println("*** BigPayloadAgentTest creating a control object ***"); - - _control = new QmfAgentData(_controlSchema); - _control.setValue("name", "controller"); - _agent.addObject(_control); - System.out.println("BigPayloadAgentTest Schema control object added OK"); - } - - - 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"; - BigPayloadAgentTest test1 = new BigPayloadAgentTest(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 ("ConnectionAudit main(): IOException: " + e.getMessage()); - } - - System.out.println("*** Ending BigPayloadAgentTest ***"); - } -} diff --git a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/BigPayloadAgentTestConsole.java b/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/BigPayloadAgentTestConsole.java deleted file mode 100644 index 4457dea5e5..0000000000 --- a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/BigPayloadAgentTestConsole.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * - * 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 BigPayloadAgentTestConsole implements QmfEventListener -{ - private Console _console; - private Agent _agent; - - public BigPayloadAgentTestConsole(String url) - { - try - { - System.out.println("*** Starting BigPayloadAgentTestConsole used to test basic Console and Agent behaviour ***"); - - Connection connection = ConnectionHelper.createConnection(url, "{reconnect: true}"); - _console = new Console(this); - _console.addConnection(connection, " ; {link: {name:'big-payload-console', x-declare: {arguments: {'qpid.policy_type': ring, 'qpid.max_size': 500000000}}}}"); - - // Wait until the broker Agent has been discovered - _agent = _console.findAgent("big-payload-agent"); - if (_agent == null) - { - System.out.println("Big Payload Agent not found"); - System.exit(1); - } - - List controls = _console.getObjects("com.test.bigagent", "control"); - if (controls.size() > 0) - { - QmfConsoleData control = controls.get(0); - - // ********** Invoke processPayload nethod ********** - System.out.println("Testing invokeMethod(processPayload, args)"); - QmfData inArgs = new QmfData(); - inArgs.setValue("parameter", new byte[150000000]); - - MethodResult results = control.invokeMethod("processPayload", inArgs); - if (!results.succeeded()) - { - System.out.println("processPayload returned an exception object"); - System.exit(1); - } - - if (!results.hasValue("return")) - { - System.out.println("processPayload returned an unexpected value"); - System.exit(1); - } - - byte[] returnVal = results.getValue("return"); - System.out.println("returnVal size = " + returnVal.length); - } - else - { - System.out.println("No control objects returned: BigPayloadAgentTestConsole failed"); - System.exit(1); - } - } - catch (QmfException qmfe) - { - System.err.println("QmfException " + qmfe.getMessage() + ": BigPayloadAgentTestConsole failed"); - System.exit(1); - } - } - - public void onEvent(WorkItem wi) - { - //System.out.println("WorkItem type: " + wi.getType()); - - if (wi.getType() == AGENT_HEARTBEAT) - { - AgentHeartbeatWorkItem item = (AgentHeartbeatWorkItem)wi; - Agent agent = item.getAgent(); - System.out.println(agent.getName()); - } - } - - 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"; - BigPayloadAgentTestConsole test = new BigPayloadAgentTestConsole(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 ("BigPayloadAgentTestConsole main(): IOException: " + e.getMessage()); - } - - System.out.println("*** Ending BigPayloadAgentTestConsole ***"); - } -} diff --git a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/BrokerSubscriptionTestConsole.java b/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/BrokerSubscriptionTestConsole.java deleted file mode 100644 index 27eadbaac8..0000000000 --- a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/BrokerSubscriptionTestConsole.java +++ /dev/null @@ -1,262 +0,0 @@ -/* - * - * 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.QmfQuery; -import org.apache.qpid.qmf2.common.QmfQueryTarget; -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.console.SubscribeIndication; -import org.apache.qpid.qmf2.console.SubscribeParams; -import org.apache.qpid.qmf2.console.SubscribeResponseWorkItem; -import org.apache.qpid.qmf2.console.SubscriptionIndicationWorkItem; -import org.apache.qpid.qmf2.util.ConnectionHelper; -import static org.apache.qpid.qmf2.common.WorkItem.WorkItemType.*; - -/** - * This class provides a test of broker subscription behaviour. - *

- * N.B. That the 0.12 C++ broker does not *actually* support subscriptions however it does periodically "push" - * QmfConsoleData Object updates as _data indications. The Console class uses these to provide client side - * emulation of broker subscriptions. One slightly subtle thing to bear in mind however is that the broker - * ManagementAgent separates "properties" and "statistics" so for example a subscription query on say a queue's - * name property will only evaluate true for a properties push and not a statistics push. The most useful usage - * pattern is likely to be a getObjects() call to return all queues, followed by a search for the queue of interest - * then a subscription with a query using the ObjectId of the wanted queue. - * - * @author Fraser Adams - */ -public final class BrokerSubscriptionTestConsole implements QmfEventListener -{ - private Console _console; - private Agent _broker; - private ObjectId _objectId; // Used to test ObjectId Query - - public BrokerSubscriptionTestConsole(String url) - { - try - { - System.out.println("** Starting BrokerSubscriptionTestConsole used to test subscription behaviour **"); - - Connection connection = ConnectionHelper.createConnection(url, "{reconnect: true}"); - _console = new Console(this); - _console.addConnection(connection); - - // Wait until the broker Agent has been discovered - _broker = _console.findAgent("broker"); - if (_broker == null) - { - System.out.println("broker Agent not found"); - System.exit(1); - } - - System.out.println("Creating Query for objects whose name property has a value that starts with 'a'"); - - SubscribeParams params; - QmfQuery query = new QmfQuery(QmfQueryTarget.OBJECT, "['re_match', 'name', ['quote', '^a']]"); - - // Create a subscription, response returned synchronously - params = _console.createSubscription(_broker, query, "consoleHandle1", "{publishInterval:5}"); - System.out.println("duration = " + params.getLifetime()); - System.out.println("interval = " + params.getPublishInterval()); - System.out.println("subscriptionId = " + params.getSubscriptionId()); - System.out.println("consoleHandle = " + params.getConsoleHandle()); - - // Sleep a while, getting query result as they become available - try - { - Thread.sleep(20000); - } - catch (InterruptedException ie) - { - } - - // Refresh the subscription getting results asynchronously, just for variety - System.out.println("Calling refreshSubscription on " + params.getSubscriptionId()); - _console.refreshSubscription(params.getSubscriptionId(), "{replyHandle:ignoredReplyHandle}"); - - - // Create a subscription for _class_name = queue - System.out.println("Creating Query for all queue objects"); - query = new QmfQuery(QmfQueryTarget.OBJECT, "['eq', '_class_name', ['quote', 'queue']]"); - params = _console.createSubscription(_broker, query, "queues"); - - while (_objectId == null) - { - System.out.println("Waiting for ObjectId to be set"); - try - { - Thread.sleep(1000); - } - catch (InterruptedException ie) - { - } - } - - // Cancel the query for all queue objects - System.out.println("Cancelling Query for all queue objects"); - _console.cancelSubscription(params.getSubscriptionId()); - - // Create a subscription for _object_id - System.out.println("Creating Query for _object_id = " + _objectId); - query = new QmfQuery(QmfQueryTarget.OBJECT, _objectId); - params = _console.createSubscription(_broker, query, "queues"); - - } - catch (QmfException qmfe) - { - System.err.println("QmfException " + qmfe.getMessage() + ": BrokerSubscriptionTestConsole failed"); - System.exit(1); - } - } - - public void onEvent(WorkItem wi) - { - System.out.println("WorkItem type: " + wi.getType()); - - 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")); - } - - if (wi.getType() == SUBSCRIBE_RESPONSE) - { - SubscribeResponseWorkItem item = (SubscribeResponseWorkItem)wi; - SubscribeParams params = item.getSubscribeParams(); - System.out.println("duration = " + params.getLifetime()); - System.out.println("interval = " + params.getPublishInterval()); - System.out.println("subscriptionId = " + params.getSubscriptionId()); - System.out.println("consoleHandle = " + params.getConsoleHandle()); - String correlationId = item.getHandle().getCorrelationId(); - System.out.println("correlationId = " + correlationId); - } - - if (wi.getType() == SUBSCRIPTION_INDICATION) - { - SubscriptionIndicationWorkItem item = (SubscriptionIndicationWorkItem)wi; - SubscribeIndication indication = item.getSubscribeIndication(); - String correlationId = indication.getConsoleHandle(); - System.out.println("correlationId = " + correlationId); - - List objects = indication.getData(); - for (QmfConsoleData object : objects) - { - if (object.isDeleted()) - { - System.out.println("object has been deleted"); - } - String className = object.getSchemaClassId().getClassName(); - System.out.println("object class = " + className); - if (className.equals("queue") || className.equals("exchange")) - { - if (object.hasValue("name")) - { - System.out.println("property update, name = " + object.getStringValue("name")); - } - else - { - _objectId = object.getObjectId(); - System.out.println("statistic update, oid = " + _objectId); - } - } - } - } - } - - 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"; - BrokerSubscriptionTestConsole test = new BrokerSubscriptionTestConsole(url); - - BufferedReader commandLine = new BufferedReader(new InputStreamReader(System.in)); - // Blocks here until return is pressed - 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 ("BrokerSubscriptionTestConsole main(): IOException: " + e.getMessage()); - } - - System.out.println("*** Ending BrokerSubscriptionTestConsole ***"); - } -} diff --git a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/InvokeMethodTest.java b/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/InvokeMethodTest.java deleted file mode 100644 index 8b175e3ca6..0000000000 --- a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/InvokeMethodTest.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * - * 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.SchemaClass; -import org.apache.qpid.qmf2.common.SchemaClassId; -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.Console; -import org.apache.qpid.qmf2.console.MethodResult; -import org.apache.qpid.qmf2.console.QmfConsoleData; -import org.apache.qpid.qmf2.util.ConnectionHelper; - -/** - * This class tests invoking a method lots of times. - * - * @author Fraser Adams - */ -public final class InvokeMethodTest implements QmfEventListener -{ - private Console _console; - - public InvokeMethodTest(String url) - { - try - { - System.out.println("*** Starting InvokeMethodTest ctrl^C to exit ***"); - System.out.println("This is intended to soak test QMF2 invokeMethod, it doesn't do anything obvious"); - System.out.println("but attaching jconsole shows memory consumption. It *looks* like it's leaking"); - System.out.println("memory, but it turns out to be due to the use of a SoftReference in Qpid's"); - System.out.println("setReplyTo() method on JMSMessage. Consumption *eventually* flattens out..."); - - Connection connection = ConnectionHelper.createConnection(url, "{reconnect: true}"); - _console = new Console(this); - _console.addConnection(connection); - - // First we create a large number of queues using the QMF2 create method on the broker object - List brokers = _console.getObjects("org.apache.qpid.broker", "broker"); - if (brokers.isEmpty()) - { - System.out.println("No broker QmfConsoleData returned"); - System.exit(1); - } - - QmfConsoleData broker = brokers.get(0); - QmfData arguments = new QmfData(); - - while (true) - { - try - { - MethodResult results = broker.invokeMethod("getLogLevel", arguments); -//System.out.println(results.getStringValue("level")); - } - catch (QmfException e) - { // This may be throw if we've already added the queues, we just catch and ignore for this test. - //System.out.println(e.getMessage()); - } - } - } - catch (QmfException qmfe) - { - System.err.println("QmfException " + qmfe.getMessage() + ": InvokeMethodTest failed"); - System.exit(1); - } - } - - public void onEvent(WorkItem wi) - { - } - - public static void main(String[] args) - { - System.setProperty("amqj.logging.level", "FATAL"); - - String url = (args.length == 1) ? args[0] : "localhost"; - InvokeMethodTest test = new InvokeMethodTest(url); - } -} diff --git a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/PartialGetObjectsTest.java b/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/PartialGetObjectsTest.java deleted file mode 100644 index e42879947b..0000000000 --- a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/PartialGetObjectsTest.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * - * 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.SchemaClass; -import org.apache.qpid.qmf2.common.SchemaClassId; -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.Console; -import org.apache.qpid.qmf2.console.QmfConsoleData; -import org.apache.qpid.qmf2.util.ConnectionHelper; - -/** - * This class tests the case where getObjects() returns "a lot" of objects. The broker ManagementAgent actually - * sends multiple messages in this case with the initial messages marked with a "partial" header. The Console - * getObjects() method needs to be able to support receiving multiple response messages when the "partial" - * header is set. - * - * @author Fraser Adams - */ -public final class PartialGetObjectsTest implements QmfEventListener -{ - private Console _console; - - public PartialGetObjectsTest(String url) - { - try - { - System.out.println("*** Starting PartialGetObjectsTest used to test schema retrieval ***"); - - Connection connection = ConnectionHelper.createConnection(url, "{reconnect: true}"); - _console = new Console(this); - _console.addConnection(connection); - - // First we create a large number of queues using the QMF2 create method on the broker object - List brokers = _console.getObjects("org.apache.qpid.broker", "broker"); - if (brokers.isEmpty()) - { - System.out.println("No broker QmfConsoleData returned"); - System.exit(1); - } - - QmfConsoleData broker = brokers.get(0); - QmfData arguments = new QmfData(); - arguments.setValue("type", "queue"); - - for (int i = 0; i < 300; i++) - { - arguments.setValue("name", "test " + i); - - try - { - broker.invokeMethod("create", arguments); - } - catch (QmfException e) - { // This may be throw if we've already added the queues, we just catch and ignore for this test. - //System.out.println(e.getMessage()); - } - } - - // After we've created lots of queues we attempt to list them. This list should include all the queues - // we've added irrespective of the number. - List queues = _console.getObjects("org.apache.qpid.broker", "queue"); - System.out.println("Call 1 Returned " + queues.size() + " objects"); - for (QmfConsoleData queue : queues) - { - String name = queue.getStringValue("name"); - System.out.println("Queue: " + name); - } - - // We get the queue objects a second time. If getObjects() correctly handles partial responses then - // this should return the complete list of queue objects, if not it will only return the subset that - // corresponds to the additional partial responses. Not handling these messages is likely to be a very - // bad thing as subsequent QMF requests will then start to receive the wrong responses. - queues = _console.getObjects("org.apache.qpid.broker", "queue"); - System.out.println("Call 2 Returned " + queues.size() + " objects"); - for (QmfConsoleData queue : queues) - { - String name = queue.getStringValue("name"); - System.out.println("Queue: " + name); - } - - } - catch (QmfException qmfe) - { - System.err.println("QmfException " + qmfe.getMessage() + ": PartialGetObjectsTest failed"); - System.exit(1); - } - } - - public void onEvent(WorkItem wi) - { - /* if (wi instanceof AgentAddedWorkItem) - { - AgentAddedWorkItem item = (AgentAddedWorkItem)wi; - Agent agent = item.getAgent(); - System.out.println("\nAgent " + agent.getName() + " added "); - - // Retrieve the List of SchemaClassIds from the Agent, these will be used to retrieve the Schema. - List schemaClassIds = _console.getClasses(agent); - - if (schemaClassIds.size() > 0) - { - // For each retrieved Class retrieve and display the Schema. - for (SchemaClassId schemaClassId : schemaClassIds) - { - List schema = _console.getSchema(schemaClassId, agent); - if (schema.size() == 1) - { - schema.get(0).listValues(); - } - } - } - else - { - System.out.println("No schema information is available for this Agent"); - } - }*/ - - } - - 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"; - PartialGetObjectsTest test = new PartialGetObjectsTest(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 ("PartialGetObjectsTest main(): IOException: " + e.getMessage()); - } - - System.out.println("*** Ending PartialGetObjectsTest ***"); - } -} diff --git a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/SchemaTest.java b/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/SchemaTest.java deleted file mode 100644 index f510bb201c..0000000000 --- a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/SchemaTest.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * - * 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.SchemaClass; -import org.apache.qpid.qmf2.common.SchemaClassId; -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.Console; -import org.apache.qpid.qmf2.console.QmfConsoleData; -import org.apache.qpid.qmf2.util.ConnectionHelper; - -/** - * This class retrieves schema information when it detects that Agents have been added. - * - * @author Fraser Adams - */ -public final class SchemaTest implements QmfEventListener -{ - private Console _console; - - public SchemaTest(String url) - { - try - { - System.out.println("*** Starting SchemaTest used to test schema retrieval ***"); - - Connection connection = ConnectionHelper.createConnection(url, "{reconnect: true}"); - _console = new Console(this); - _console.addConnection(connection); - - } - catch (QmfException qmfe) - { - System.err.println("QmfException " + qmfe.getMessage() + ": SchemaTest failed"); - System.exit(1); - } - } - - public void onEvent(WorkItem wi) - { - if (wi instanceof AgentAddedWorkItem) - { - AgentAddedWorkItem item = (AgentAddedWorkItem)wi; - Agent agent = item.getAgent(); - System.out.println("\nAgent " + agent.getName() + " added "); - - // Retrieve the List of SchemaClassIds from the Agent, these will be used to retrieve the Schema. - List schemaClassIds = _console.getClasses(agent); - - if (schemaClassIds.size() > 0) - { - // For each retrieved Class retrieve and display the Schema. - for (SchemaClassId schemaClassId : schemaClassIds) - { - List schema = _console.getSchema(schemaClassId, agent); - if (schema.size() == 1) - { - schema.get(0).listValues(); - } - } - } - else - { - System.out.println("No schema information is available for this Agent"); - } - } - - } - - 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"; - SchemaTest test = new SchemaTest(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 ("SchemaTest main(): IOException: " + e.getMessage()); - } - - System.out.println("*** Ending SchemaTest ***"); - } -} diff --git a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/Test1.java b/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/Test1.java deleted file mode 100644 index f71f4cdf32..0000000000 --- a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/Test1.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * - * 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.Date; -import java.util.List; -import java.util.Map; -import java.util.HashMap; - -// QMF2 Imports -import org.apache.qpid.qmf2.common.BlockingNotifier; -import org.apache.qpid.qmf2.common.Notifier; -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.Console; -import org.apache.qpid.qmf2.console.QmfConsoleData; -import org.apache.qpid.qmf2.util.ConnectionHelper; - -/** - * A class used to test the basic Console Agent discovery behaviour - * - * @author Fraser Adams - */ - -public final class Test1 -{ - private Console _console; - - public Test1(String url) - { - try - { - System.out.println("*** Starting Test1 synchronous Agent discovery ***"); - Connection connection = ConnectionHelper.createConnection(url, "{reconnect: true}"); - _console = new Console(); - _console.addConnection(connection); - - System.out.println("*** Test1 testing _console.getAgents(): ***"); - List agents = _console.getAgents(); - - if (agents.size() == 0) - { - System.out.println("*** Test1 failed, _console.getAgents() should return at least Broker Agent ***"); - System.exit(1); - } - - for (Agent agent : agents) - { - agent.listValues(); - } - - System.out.println("*** Test1 testing _console.getAgent(\"broker\"): ***"); - Agent agent = _console.getAgent("broker"); - agent.listValues(); - - System.out.println("*** Test1 testing _console.findAgent(\"broker\"): ***"); - agent = _console.findAgent("broker"); - if (agent == null) - { - System.out.println("*** Test1 _console.findAgent(\"broker\") returned null : Test1 failed ***"); - System.exit(1); - } - else - { - agent.listValues(); - } - - - System.out.println("*** Test1 testing _console.findAgent(\"monkey\"): ***"); - agent = _console.findAgent("monkey"); - if (agent == null) - { - System.out.println("*** Test1 _console.findAgent(\"monkey\") correctly returned null ***"); - } - else - { - agent.listValues(); - } - - - System.out.println("*** Test1 testing _console.getObjects(\"broker\"): ***"); - List brokers = _console.getObjects("broker"); - if (brokers.size() == 0) - { - System.out.println("*** Test1 _console.getObjects(\"broker\") should return at least one object : Test1 failed ***"); - System.exit(1); - } - else - { - for (QmfConsoleData broker : brokers) - { - broker.listValues(); - } - } - - System.out.println("*** Ending Test1 ***"); - } - catch (QmfException qmfe) - { - System.err.println("QmfException " + qmfe.getMessage() + " caught: Test1 failed"); - } - } - - public static void main(String[] args) - { - //System.out.println ("Setting log level to FATAL"); - System.setProperty("amqj.logging.level", "FATAL"); - - // As of Qpid 0.16 the Session Dispatcher Thread is non-Daemon so the JVM gets prevented from exiting. - // Setting the following property to true makes it a Daemon Thread. - System.setProperty("qpid.jms.daemon.dispatcher", "true"); - - String url = (args.length == 1) ? args[0] : "localhost"; - Test1 test1 = new Test1(url); - } -} diff --git a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/Test2.java b/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/Test2.java deleted file mode 100644 index 11924f824d..0000000000 --- a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/Test2.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * - * 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.Date; -import java.util.List; -import java.util.Map; -import java.util.HashMap; - -// QMF2 Imports -import org.apache.qpid.qmf2.common.BlockingNotifier; -import org.apache.qpid.qmf2.common.Notifier; -import org.apache.qpid.qmf2.common.QmfEventListener; -import org.apache.qpid.qmf2.common.QmfException; -import org.apache.qpid.qmf2.common.QmfQuery; -import org.apache.qpid.qmf2.common.QmfQueryTarget; -import org.apache.qpid.qmf2.common.WorkItem; -import org.apache.qpid.qmf2.console.Agent; -import org.apache.qpid.qmf2.console.Console; -import org.apache.qpid.qmf2.console.QmfConsoleData; -import org.apache.qpid.qmf2.util.ConnectionHelper; -import static org.apache.qpid.qmf2.common.WorkItem.WorkItemType.*; - -/** - * A class used to test a non-blocking query for all Agents using the Notifier/WorkItem Event API. As most of - * the tests and samples use the alternative QmfEventListener API (because the author prefers that) rather than - * the official QMF2 WorkQueue API it seems sensible to include at least one test illustrating that. - * - * Note that in practice the WorkQueue API can also be used without an explicit notifier as one of the - * overloaded Console getNextWorkitem() methods is a blocking call to the WorkQueue that blocks until a WorkItem - * is available. The approach used in this class is for API illustration purposes and the author is unlikely to - * use it for anything useful. - * - * @author Fraser Adams - */ - -public final class Test2 -{ - private Console _console; - - public Test2(String url) - { - try - { - System.out.println("*** Starting Test2 asynchronous Agent discovery using WorkQueue API ***"); - - BlockingNotifier notifier = new BlockingNotifier(); - - Connection connection = ConnectionHelper.createConnection(url, "{reconnect: true}"); - _console = new Console(notifier); -//console.disableAgentDiscovery(); // To miss all notifications this needs done before addConnection() - _console.addConnection(connection); - - int count = 0; - while (true) - { - notifier.waitForWorkItem(); - System.out.println("WorkItem available, WorkItem count = " + _console.getWorkitemCount()); - - WorkItem wi; - while ((wi = _console.getNextWorkitem(0)) != null) - { - System.out.println("WorkItem type: " + wi.getType()); - if (wi.getType() == AGENT_HEARTBEAT || wi.getType() == AGENT_ADDED || - wi.getType() == AGENT_DELETED || wi.getType() == AGENT_RESTARTED || - wi.getType() == EVENT_RECEIVED) - { - Map p = wi.>getParams(); - Agent agent = (Agent)p.get("agent"); - System.out.println(agent.getName()); - } - } - - count++; - if (count == 10) - { - System.out.println("Applying Agent Discovery Query ['eq', '_product', ['quote', 'gizmo']]"); - System.out.println("This should disable broker Agent events but allow gizmo Agent events"); - System.out.println("Run AgentTest to prove this"); - QmfQuery query = new QmfQuery(QmfQueryTarget.OBJECT, "['eq', '_product', ['quote', 'gizmo']]"); - _console.enableAgentDiscovery(query); - } - } - } - catch (QmfException qmfe) - { - System.err.println("QmfException " + qmfe.getMessage() + " caught: Test2 failed"); - } - } - - 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"; - Test2 test2 = new Test2(url); - } -} diff --git a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/Test3.java b/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/Test3.java deleted file mode 100644 index fdb9180d36..0000000000 --- a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/Test3.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * - * 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; - -// Misc Imports -import java.io.*; -import java.util.List; - -// QMF2 Imports -import org.apache.qpid.qmf2.common.QmfException; -import org.apache.qpid.qmf2.common.QmfType; -import org.apache.qpid.qmf2.common.SchemaEventClass; -import org.apache.qpid.qmf2.common.SchemaMethod; -import org.apache.qpid.qmf2.common.SchemaObjectClass; -import org.apache.qpid.qmf2.common.SchemaProperty; - -/** - * A class used to test the Schema classes - * - * @author Fraser Adams - */ -public final class Test3 -{ - public Test3() - { - try - { - System.out.println("*** Starting Test3 testing the various Schema classes ***"); - - // Create and register schema for this agent. - String packageName = "com.profitron.gizmo"; - - // Declare a schema for a structured exception that can be used in failed method invocations. - SchemaObjectClass exception = new SchemaObjectClass(packageName, "exception"); - - exception.addProperty(new SchemaProperty("whatHappened", QmfType.TYPE_STRING)); - exception.addProperty(new SchemaProperty("howBad", QmfType.TYPE_INT)); - exception.addProperty(new SchemaProperty("details", QmfType.TYPE_MAP)); - - // Declare a control object to test methods against. - SchemaObjectClass control = new SchemaObjectClass(packageName, "control"); - control.addProperty(new SchemaProperty("state", QmfType.TYPE_STRING)); - control.addProperty(new SchemaProperty("methodCount", QmfType.TYPE_INT)); - - SchemaMethod stopMethod = new SchemaMethod("stop", "Stop Agent"); - stopMethod.addArgument(new SchemaProperty("message", QmfType.TYPE_STRING)); - control.addMethod(stopMethod); - - SchemaMethod echoMethod = new SchemaMethod("echo", "Echo Arguments"); - echoMethod.addArgument(new SchemaProperty("sequence", QmfType.TYPE_INT, "{dir:INOUT}")); - echoMethod.addArgument(new SchemaProperty("map", QmfType.TYPE_MAP, "{dir:INOUT}")); - control.addMethod(echoMethod); - - SchemaMethod eventMethod = new SchemaMethod("event", "Raise an Event"); - eventMethod.addArgument(new SchemaProperty("text", QmfType.TYPE_STRING, "{dir:IN}")); - eventMethod.addArgument(new SchemaProperty("severity", QmfType.TYPE_INT, "{dir:IN}")); - control.addMethod(eventMethod); - - SchemaMethod failMethod = new SchemaMethod("fail", "Expected to Fail"); - failMethod.addArgument(new SchemaProperty("useString", QmfType.TYPE_BOOL, "{dir:IN}")); - failMethod.addArgument(new SchemaProperty("stringVal", QmfType.TYPE_STRING, "{dir:IN}")); - failMethod.addArgument(new SchemaProperty("details", QmfType.TYPE_MAP, "{dir:IN}")); - control.addMethod(failMethod); - - SchemaMethod createMethod = new SchemaMethod("create_child", "Create Child Object"); - createMethod.addArgument(new SchemaProperty("name", QmfType.TYPE_STRING, "{dir:IN}")); - createMethod.addArgument(new SchemaProperty("childAddr", QmfType.TYPE_MAP, "{dir:OUT}")); - control.addMethod(createMethod); - - // Declare the child class - SchemaObjectClass child = new SchemaObjectClass(packageName, "child"); - child.addProperty(new SchemaProperty("name", QmfType.TYPE_STRING)); - - // Declare the event class - SchemaEventClass event = new SchemaEventClass(packageName, "event"); - event.addProperty(new SchemaProperty("text", QmfType.TYPE_STRING)); - - System.out.println("Test3 Schema classes initialised OK"); - - // Now we create new instance of each class from the map encodings and list the values - // to check everything looks OK. - - System.out.println("Test3 testing serialisation of exception schema"); - SchemaObjectClass exceptionFromMap = new SchemaObjectClass(exception.mapEncode()); - exceptionFromMap.listValues(); - System.out.println(); - - System.out.println("Test3 testing serialisation of control schema"); - SchemaObjectClass controlFromMap = new SchemaObjectClass(control.mapEncode()); - controlFromMap.listValues(); - System.out.println(); - - System.out.println("Test3 testing serialisation of child schema"); - SchemaObjectClass childFromMap = new SchemaObjectClass(child.mapEncode()); - childFromMap.listValues(); - System.out.println(); - - System.out.println("Test3 testing serialisation of event schema"); - SchemaEventClass eventFromMap = new SchemaEventClass(event.mapEncode()); - eventFromMap.listValues(); - System.out.println(); - - } - catch (QmfException qmfe) - { - System.err.println("QmfException " + qmfe.getMessage() + " caught: Test3 failed"); - } - } - - public static void main(String[] args) - { - //System.out.println ("Setting log level to FATAL"); - System.setProperty("amqj.logging.level", "FATAL"); - - Test3 Test3 = new Test3(); - - System.out.println("*** Ending Test3 ***"); - } -} diff --git a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/Test4.java b/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/Test4.java deleted file mode 100644 index 29a8ba8f88..0000000000 --- a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/Test4.java +++ /dev/null @@ -1,339 +0,0 @@ -/* - * - * 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; - -// Misc Imports -import java.io.*; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; - -// QMF2 Imports -import org.apache.qpid.qmf2.common.ObjectId; -import org.apache.qpid.qmf2.common.QmfException; -import org.apache.qpid.qmf2.common.QmfQuery; -import org.apache.qpid.qmf2.common.QmfQueryTarget; -import org.apache.qpid.qmf2.common.QmfType; -import org.apache.qpid.qmf2.common.SchemaClass; -import org.apache.qpid.qmf2.common.SchemaClassId; -import org.apache.qpid.qmf2.common.SchemaEventClass; -import org.apache.qpid.qmf2.common.SchemaMethod; -import org.apache.qpid.qmf2.common.SchemaObjectClass; -import org.apache.qpid.qmf2.common.SchemaProperty; - -import org.apache.qpid.qmf2.console.QmfConsoleData; -import org.apache.qpid.qmf2.agent.QmfAgentData; - - -/** - * A class used to test the QmfQuery classes - * - * @author Fraser Adams - */ -public final class Test4 -{ - - private Map _schemaCache = new ConcurrentHashMap(); - private Map _objectIndex = new ConcurrentHashMap(); - - public Test4() - { - try - { - System.out.println("*** Starting Test4 testing the QmfQuery class ***"); - - // Create and register schema for this agent. - String packageName = "com.fadams.qmf2"; - - // Declare a mammal class to test against. - SchemaObjectClass mammal = new SchemaObjectClass(packageName, "mammal"); - mammal.addProperty(new SchemaProperty("name", QmfType.TYPE_STRING)); - mammal.addProperty(new SchemaProperty("legs", QmfType.TYPE_INT)); - mammal.setIdNames("name"); - - // Declare an insect class to test against. - SchemaObjectClass insect = new SchemaObjectClass(packageName, "insect"); - insect.addProperty(new SchemaProperty("name", QmfType.TYPE_STRING)); - insect.addProperty(new SchemaProperty("legs", QmfType.TYPE_INT)); - insect.setIdNames("name"); - - // Declare a reptile class to test against. - SchemaObjectClass reptile = new SchemaObjectClass(packageName, "reptile"); - reptile.addProperty(new SchemaProperty("name", QmfType.TYPE_STRING)); - reptile.addProperty(new SchemaProperty("legs", QmfType.TYPE_INT)); - reptile.setIdNames("name"); - - // Declare a bird class to test against. - SchemaObjectClass bird = new SchemaObjectClass(packageName, "bird"); - bird.addProperty(new SchemaProperty("name", QmfType.TYPE_STRING)); - bird.addProperty(new SchemaProperty("legs", QmfType.TYPE_INT)); - bird.setIdNames("name"); - - - registerObjectClass(mammal); - registerObjectClass(insect); - registerObjectClass(reptile); - registerObjectClass(bird); - - QmfAgentData cat = new QmfAgentData(mammal); - cat.setValue("name", "cat"); - cat.setValue("legs", 4l); - addObject(cat); - - QmfAgentData dog = new QmfAgentData(mammal); - dog.setValue("name", "dog"); - dog.setValue("legs", 4l); - addObject(dog); - - QmfAgentData rabbit = new QmfAgentData(mammal); - rabbit.setValue("name", "rabbit"); - rabbit.setValue("legs", 4); - addObject(rabbit); - - QmfAgentData horse = new QmfAgentData(mammal); - horse.setValue("name", "horse"); - horse.setValue("legs", 4); - addObject(horse); - - QmfAgentData human = new QmfAgentData(mammal); - human.setValue("name", "human"); - human.setValue("legs", 2); - addObject(human); - - - QmfAgentData wasp = new QmfAgentData(insect); - wasp.setValue("name", "wasp"); - wasp.setValue("legs", 6); - addObject(wasp); - - QmfAgentData ant = new QmfAgentData(insect); - ant.setValue("name", "ant"); - ant.setValue("legs", 6); - addObject(ant); - - QmfAgentData crocodile = new QmfAgentData(reptile); - crocodile.setValue("name", "crocodile"); - crocodile.setValue("legs", 4); - addObject(crocodile); - - QmfAgentData gecko = new QmfAgentData(reptile); - gecko.setValue("name", "gecko"); - gecko.setValue("legs", 4); - addObject(gecko); - - QmfAgentData python = new QmfAgentData(reptile); - python.setValue("name", "python"); - python.setValue("legs", 0); - addObject(python); - - QmfAgentData hawk = new QmfAgentData(bird); - hawk.setValue("name", "hawk"); - hawk.setValue("legs", 2); - addObject(hawk); - - QmfAgentData ostrich = new QmfAgentData(bird); - ostrich.setValue("name", "ostrich"); - ostrich.setValue("legs", 2); - addObject(ostrich); - - - System.out.println("total number of objects registered: " + _objectIndex.size()); - - QmfQuery query; - List results; - - System.out.println("looking up wasp object by ID"); - query = new QmfQuery(QmfQueryTarget.OBJECT, wasp.getObjectId()); - results = evaluateDataQuery(query); - displayResults(results); - - System.out.println("\nlooking up mammal objects"); - query = new QmfQuery(QmfQueryTarget.OBJECT, new SchemaClassId("mammal")); - results = evaluateDataQuery(query); - displayResults(results); - - System.out.println("\nlooking up everything in package com.fadams.qmf2"); - query = new QmfQuery(QmfQueryTarget.OBJECT, new SchemaClassId("com.fadams.qmf2", null)); - results = evaluateDataQuery(query); - displayResults(results); - - - System.out.println("\nQuery for all mammals with more than two legs"); - String predicate = "['and', ['eq', '_package_name', ['quote', 'com.fadams.qmf2']], " + - "['eq', '_class_name', ['quote', 'mammal']], " + - "['gt', 'legs', 2]]"; - - //predicate = "['eq', '_package_name', ['quote', 'com.fadams.qmf2']]"; - - //predicate = "[]"; - - query = new QmfQuery(QmfQueryTarget.OBJECT, predicate); - System.out.println(query.getPredicate()); - - results = evaluateDataQuery(query); - displayResults(results); - - - System.out.println("\nQuery for everything with less than four legs"); - predicate = "['lt', 'legs', 4]"; - - query = new QmfQuery(QmfQueryTarget.OBJECT, predicate); - System.out.println(query.getPredicate()); - - results = evaluateDataQuery(query); - displayResults(results); - - - System.out.println("\nQuery for everything with between two and four legs"); - predicate = "['and', ['ge', 'legs', 2], " + - "['le', 'legs', 4]]"; - - query = new QmfQuery(QmfQueryTarget.OBJECT, predicate); - System.out.println(query.getPredicate()); - - results = evaluateDataQuery(query); - displayResults(results); - - - System.out.println("\nQuery for all reptiles or birds"); - predicate = "['or', ['eq', '_class_name', ['quote', 'reptile']], " + - "['eq', '_class_name', ['quote', 'bird']]]"; - - query = new QmfQuery(QmfQueryTarget.OBJECT, predicate); - System.out.println(query.getPredicate()); - - results = evaluateDataQuery(query); - displayResults(results); - - - System.out.println("\nQuery for everything whose name matches the regex ^h"); - predicate = "['re_match', 'name', ['quote', '^h']]"; - - query = new QmfQuery(QmfQueryTarget.OBJECT, predicate); - System.out.println(query.getPredicate()); - - results = evaluateDataQuery(query); - displayResults(results); - - - } - catch (QmfException qmfe) - { - System.err.println("QmfException " + qmfe.getMessage() + " caught: Test4 failed"); - } - } - - public void registerObjectClass(SchemaObjectClass schema) - { - SchemaClassId classId = schema.getClassId(); - _schemaCache.put(classId, schema); - } - - public void addObject(QmfAgentData object) throws QmfException - { - SchemaClassId classId = object.getSchemaClassId(); - SchemaClass schema = _schemaCache.get(classId); - - // Try to create an objectName using the set of property names that have been specified as idNames in the schema - StringBuilder buf = new StringBuilder(); - if (schema != null && schema instanceof SchemaObjectClass) - { - String[] idNames = ((SchemaObjectClass)schema).getIdNames(); - for (String name : idNames) - { - buf.append(object.getStringValue(name)); - } - } - String objectName = buf.toString(); - - // If the schema hasn't given any help we use a UUID - if (objectName.length() == 0) objectName = UUID.randomUUID().toString(); - - // Finish up the name by incorporating package and class names - objectName = classId.getPackageName() + ":" + classId.getClassName() + ":" + objectName; - - // Now we've got a good name for the object we create it's ObjectId and add that to the object - ObjectId addr = new ObjectId("test"/*name*/, objectName, 0/*epoch*/); - object.setObjectId(addr); - - if (_objectIndex.get(addr) != null) - { - throw new QmfException("Duplicate QmfAgentData Address"); - } - - _objectIndex.put(addr, object); - } - - - public List evaluateDataQuery(QmfQuery query) - { - List results = new ArrayList(); - - if (query.getObjectId() != null) - { - // Look up a QmfAgentData object by the ObjectId obtained from the query - ObjectId objectId = query.getObjectId(); - QmfAgentData object = _objectIndex.get(objectId); - if (object != null && !object.isDeleted()) - { - results.add(new QmfConsoleData(object.mapEncode(), null)); - } - } - else - { - for (QmfAgentData object : _objectIndex.values()) - { - if (!object.isDeleted() && query.evaluate(object)) - { - results.add(new QmfConsoleData(object.mapEncode(), null)); - } - } - } - - return results; - } - - public List evaluateSchemaQuery(QmfQuery query) - { - return null; - } - - - public void displayResults(List values) - { - for (QmfConsoleData object : values) - { - System.out.println("name = " + object.getStringValue("name") + ", legs = " + object.getLongValue("legs")); - } - } - - public static void main(String[] args) - { - //System.out.println ("Setting log level to FATAL"); - System.setProperty("amqj.logging.level", "FATAL"); - - Test4 Test4 = new Test4(); - - System.out.println("*** Ending Test4 ***"); - } -} diff --git a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/URLTest.java b/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/URLTest.java deleted file mode 100644 index 35bd9f537b..0000000000 --- a/qpid/tools/src/java/src/test/java/org/apache/qpid/qmf2/test/URLTest.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * - * 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.*; - -// QMF2 Imports -import org.apache.qpid.qmf2.util.ConnectionHelper; - -/** - * A class used to test the ConnectionHelper utility, which provides support for a range of AMQP URL formats - * and a basic wrapper for Connection creation. - * - * @author Fraser Adams - */ - -public final class URLTest -{ - public static void main(String[] args) - { - //System.out.println ("Setting log level to FATAL"); - System.setProperty("amqj.logging.level", "FATAL"); - - System.out.println("Running URLTest, this tests ConnectionHelper.createConnectionURL() for various URL formats."); - System.out.println("It doesn't actually create a connection, it just displays the resulting ConnectionURL"); - - String url; - url = ConnectionHelper.createConnectionURL("localhost"); - System.out.println(url); - - url = ConnectionHelper.createConnectionURL("localhost:5672", "{username: foo, password: bar, reconnect: true, reconnect_timeout: 5, reconnect_limit: 5000, tcp-nodelay: true, heartbeat: 10, protocol: ssl}"); - System.out.println(url); - - url = ConnectionHelper.createConnectionURL("guest/guest@localhost:5672", "{reconnect: true, tcp-nodelay: true}"); - System.out.println(url); - - url = ConnectionHelper.createConnectionURL("amqp:localhost:5672, tcp:localhost:5673", "{reconnect: true, tcp-nodelay: true, failover: roundrobin, cyclecount: 20}"); - System.out.println(url); - - url = ConnectionHelper.createConnectionURL("amqp://foo:bar@host1:1234/vhost?clientid=baz"); - System.out.println(url); - - url = ConnectionHelper.createConnectionURL("amqp://localhost"); - System.out.println(url); - - url = ConnectionHelper.createConnectionURL("amqp://vm:foo:1234,tcp:foo:5678/"); - System.out.println(url); - - url = ConnectionHelper.createConnectionURL("amqp://host1,host2,host3/?retry=2"); - System.out.println(url); - - url = ConnectionHelper.createConnectionURL("amqp://host1,host2?retry=2,host3"); - System.out.println(url); - - url = ConnectionHelper.createConnectionURL("amqp://grok:hostname?flavour=strawberry;frobnication=on/vhost"); - System.out.println(url); - - url = ConnectionHelper.createConnectionURL("amqp://host?ssl=true"); - System.out.println(url); - } -} -- cgit v1.2.1