Написание собственных тестов, Пример 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());
  }
}