Написание собственных тестов, Пример 2
Следующий исходный код является примером теста проверяющего имена очередей на соответствие заданному соглашению об именах. Если будут найдены очереди с именами, не соответствующими заданному соглашению об именах, на панели Результаты тестов будет показана соответствующая информация.
/*
* Лицензионные материалы - собственность IBM
*
* 5724-H72, 5655-L82, 5724-L26, 5655R3600
*
* (c) Copyright IBM Corp. 2005, 2020
*
* US Government Users Restricted Rights - Use, duplication or
* disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
*/
package com.ibm.mq.explorer.tests.sample;
/**
* Пример теста, используемого для проверки Имен очередей относительно соглашений об именах. Имена очередей проверяются если
* они начинаются с префиксов из заданного в этом классе диапазона. Имена, не начинающиеся с
* одного из этих префиксов будут указаны как ошибка.
*
* Этот пример использует классы PCF, предоставленные MS0B SupportPac. Загрузите SupportPac с
* сайта IBM, затем добавьте файл jar в путь компоновки для проекта.
*/
public class WMQQueueNames extends WMQTest {
/** Подсчитывает сколько администраторов очередей должны дать ответ. */
private static int numberOfQmgrs = 0;
/** Сохраняет принятые префиксы имен очередей. */
private static final String[] ACCEPTED_Q_PREFIXES = {"SALES_", "MARKETING_", "SHIPPING_", //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
"INCOMING_", "OUTGOING_"}; //$NON-NLS-1$//$NON-NLS-2$
/** Сохраняет пользовательские параметры для системных очередей, которые следует добавить. */
boolean includeSystemObjs = false;
/**
* Запускает тест.
*
*
* @param callback управляющий элемент для службы теста, выполняющей тест
* @param guimonitor управляющий элемент для объекта, отслеживающего тест, предоставляется чтобы разрешить тесту
* периодически проверять, пытался ли пользователь отменить выполняющийся тест и предоставить дополнительную обратную
* связь с пользователем
* @param contextObjects контекст, переданный MQExtObjects в службу тестирования
* @param treenodeId ИД узла структуры, использованного для запуска тестов
*/
public void runTest(WMQTestEngine callback, IProgressMonitor guimonitor,
MQExtObject[] contextObjects, TreeNode treenodeId) {
// Запустить с реализацией по умолчанию. При этом комплект сохранится
// в службе тестов, необходимой при отправке
// результатов в конце теста
super.runTest(callback, guimonitor, contextObjects, treenodeId);
// подготовить пространство для хранения результатов, которые могут быть возвращены
ArrayList testResults = new ArrayList();
// узнать в параметрах, следует ли добавить системные очереди
includeSystemObjs = PreferenceStoreManager.getIncludeSysObjsPreference();
// получить список администраторов очередей из Explorer
ArrayList allQmgrs = new ArrayList();
for (int k = 0; k < contextObjects.length; k++) {
if (contextObjects[k] instanceof MQQmgrExtObject) {
// Объект является администраторов очередей, добавить в список
allQmgrs.add(contextObjects[k]);
}
}
// сколько очередей администраторов?
numberOfQmgrs = allQmgrs.size();
// использовать администраторы очередей как ориентир для отслеживания выполнения
guimonitor.beginTask(getTestName(), numberOfQmgrs);
// для каждого администратора очередей отправьте запрос
for (int i = 0; i < numberOfQmgrs; i++) {
// получить следующий администратор очередей
MQQmgrExtObject nextQueueManager = (MQQmgrExtObject) allQmgrs.get(i);
// предоставлять очереди только подключенным администраторам очередей
if (nextQueueManager.isConnected()) {
// получить имя администратора очередей для применения в GUI
String qmgrName = nextQueueManager.getName();
// получить управляющий элемент для объекта Java, представляющего администратор очередей
MQQueueManager qmgr = nextQueueManager.getMQQueueManager();
try {
// получить агента сообщений PCF для обработки отправки запроса PCF
PCFMessageAgent agent = new PCFMessageAgent(qmgr);
// использовать PCF для отправки записи 'имена очереди запросов'
PCFMessage response = submitQueueNamesQuery(qmgrName, agent);
// мы получили ответ на запрос?
if (response != null) {
// получить имена очередей из запроса
String[] qnames = (String[]) response.getParameterValue(CMQCFC.MQCACF_Q_NAMES);
// проверить все имена
for (int j = 0; j < qnames.length; j++) {
boolean qnameOkay = checkQueueName(qnames[j]);
if (!qnameOkay) {
// если в имени найдена ошибка, мы создаем
// сообщение об ошибке и добавляем его к
// возвращаемому набору
testResults.add(generateTestResult(qnames[j], qmgrName));
}
}
}
}
catch (MQException e) {
// записать сведения об ошибках
e.printStackTrace();
}
}
// завершение изучения администратора очередей
guimonitor.worked(1);
}
// возвращает результаты, созданные тестом
WMQTestResult[] finalresults = (WMQTestResult[]) testResults
.toArray(new WMQTestResult[testResults.size()]);
testComplete(finalresults);
}
/**
* Используется внутренне для отправки запроса INQUIRE_Q_NAMES с помощью PCF в заданный администратор очередей.
*
*
* @param qmgrName имя администратора очередей для отправки запроса
* @param agent
* @вернуть ответ PCF из администратора очередей
*/
private PCFMessage submitQueueNamesQuery(String qmgrName, PCFMessageAgent agent) {
// создать сообщение pcf
PCFMessage inquireQNames = new PCFMessage(CMQCFC.MQCMD_INQUIRE_Q_NAMES);
inquireQNames.addParameter(CMQC.MQCA_Q_NAME, "*"); //$NON-NLS-1$
try {
// отправить сообщение
PCFMessage[] responseMsgs = agent.send(inquireQNames);
// проверить, успешно ли получены результаты
if (responseMsgs[0].getCompCode() == 0) {
return responseMsgs[0];
}
}
catch (IOException e) {
// записать сведения об ошибках
e.printStackTrace();
}
catch (MQException e) {
// записать сведения об ошибках
e.printStackTrace();
}
// по какой-то причине мы не получили ответ, возвращаем пустой ответ
return null;
}
/**
* Внутренне используется для проверки данного имени очереди относительно набора допустимых префиксов.
*
*
* @param queueName имя очереди для проверки
* @возвращает true если имя очереди допустимо, иначе возвращает false
*/
private boolean checkQueueName(String queueName) {
// если это системный объект (то есть имеет имя, начинающееся с
// "SYSTEM.") мы проверяем
if ((queueName.startsWith("SYSTEM.")) || (queueName.startsWith("AMQ."))) { //$NON-NLS-1$//$NON-NLS-2$
if (!includeSystemObjs) {
// пользователь запросил, чтобы мы не добавляли системные
// объекты к тесту, поэтому мы возвращаем true чтобы
// избежать сообщений об ошибках для этой очереди
return true;
}
}
// ответ PCF добавит пробелы к имени очереди, поэтому обрезаем ее
queueName = queueName.trim();
// проверить имя очереди относительно всех допустимых префиксов
// и вернуть ее немедленно если это
for (int i = 0; i < ACCEPTED_Q_PREFIXES.length; i++) {
if (queueName.startsWith(ACCEPTED_Q_PREFIXES[i]))
return true;
}
// мы проверили относительно всех допустимых префиксов,
// совпадения не найдены
return false;
}
/**
* Используется внутренне для создания результатов тестов для данного имени очереди.
*
*
* @param queueName имя очереди, не отвечающее требованиям
* @param qmgrName имя администратора очередей, содержащего очередь
* @возвращает созданные результаты тестов
*/
private WMQTestResult generateTestResult(String queueName, String qmgrName) {
String res = "Очередь (" + queueName.trim() + ") начинается с неизвестного префикса"; //$NON-NLS-1$//$NON-NLS-2$
return new WMQTestResult(IMarker.SEVERITY_ERROR, res, qmgrName, getTestSubCategory());
}
}