Pisanie własnych testów: przykład 2

Poniższy kod źródłowy jest przykładem testu sprawdzającego nazwy kolejek względem zdefiniowanej konwencji nazewnictwa. Szczegółowe informacje o wszystkich odnalezionych kolejkach, których nazwy nie są zgodne ze zdefiniowaną konwencją nazewnictwa, są wyświetlane w widoku Wyniki testu.


/*                                                    
 * Materiały licencjonowane - własność IBM
 *  
 * 5724-H72, 5655-L82, 5724-L26, 5655R3600
 * 
 * (c) Copyright IBM Corp. 2005, 2020
 * 
 * Zastrzeżone prawa instytucji rządowych USA - Korzystanie, powielanie lub
 * ujawnianie zastrzeżone kontraktem GSA ADP Schedule Contract z firmą IBM Corp.
 */
package com.ibm.mq.explorer.tests.sample;

/**
 * Test przykładowy sprawdzający nazwy kolejek względem konwencji nazewnictwa. Sprawdzane są nazwy kolejek
 * rozpoczynające się jednym z zestawów przedrostków zdefiniowanym w klasie. Wszystkie nazwy, które
 * nie rozpoczynają się jednym z tych przedrostków, są kierowane na wyjście w postaci błędu.
 *
 * W przykładzie używane są klasy PCF udostępniane w pakiecie serwisowym MS0B. Pobierz pakiet serwisowy z
 * serwisu WWW IBM, a następnie włącz do ścieżki budowy projektu plik jar.
 */
public class WMQQueueNames extends WMQTest {

  /** Obsługa licznika menedżerów kolejek, od których oczekiwana jest odpowiedź. */
  private static int numberOfQmgrs = 0;

  /** Przechowanie zaakceptowanych przedrostków nazw kolejek. */
  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$

  /** Przechowanie preferencji użytkownika odnośnie włączania kolejek systemowych. */
  boolean includeSystemObjs = false;

  /**
   * Uruchamia test.
   * 
   * 
   * @param callback - uchwyt do mechanizmu testów wykonującego test
   * @param guimonitor - uchwyt do obiektu monitorującego test, umożliwiającego testowi
   * okresowe sprawdzanie, czy użytkownik próbował anulować działający test i udostępniający dodatkową opinię
   * użytkownika
   * @param contextObjects - kontekstowe obiekty MQExtObjects przekazane do mechanizmu testów
   * @param treenodeId - id węzła drzewa używany do uruchamiania testów
   */
  public void runTest(WMQTestEngine callback, IProgressMonitor guimonitor,
      MQExtObject[] contextObjects, TreeNode treenodeId) {

    // Zacznij od domyślnej implementacji. Spowoduje to zapisanie uchwytu
    // do mechanizmu testów, który będzie potrzebny do wprowadzenia
    // wszelkich wyników na końcu testu
    super.runTest(callback, guimonitor, contextObjects, treenodeId);

    // Przygotuj przestrzeń do przechowania wyników, które będą mogły zostać zwrócone
    ArrayList testResults = new ArrayList();

    // Pobierz z Preferencji informację o tym, czy włączyć kolejki systemowe
    includeSystemObjs = PreferenceStoreManager.getIncludeSysObjsPreference();

    // Pobierz listę menedżerów kolejek z programu Explorer
    ArrayList allQmgrs = new ArrayList();

    for (int k = 0; k < contextObjects.length; k++) {
      if (contextObjects[k] instanceof MQQmgrExtObject) {
        // Obiekt jest menedżerem kolejek; dodaj do listy
        allQmgrs.add(contextObjects[k]);
      }
    }

    // Ile menedżerów kolejek tam się znajduje?
    numberOfQmgrs = allQmgrs.size();

    // Użyj liczby menedżerów kolejek jako wskazówki do śledzenia postępu
    guimonitor.beginTask(getTestName(), numberOfQmgrs);

    // Wprowadź zapytanie dla poszczególnych menedżerów kolejek
    for (int i = 0; i < numberOfQmgrs; i++) {

      // Pobierz następnego menedżera kolejek
      MQQmgrExtObject nextQueueManager = (MQQmgrExtObject) allQmgrs.get(i);

      // Wprowadź zapytania jedynie dla podłączonych menedżerów kolejek
      if (nextQueueManager.isConnected()) {

        // Pobierz nazwę menedżera kolejek do użycia w interfejsie GUI
        String qmgrName = nextQueueManager.getName();

        // Pobierz uchwyt do obiektu Java reprezentującego menedżera kolejek
        MQQueueManager qmgr = nextQueueManager.getMQQueueManager();

        try {
          // Pobierz agenta komunikatów PCF w celu obsługi wysyłania zapytania PCF do
          PCFMessageAgent agent = new PCFMessageAgent(qmgr);

          // Za pomocą PCF wprowadź zapytanie 'zapytanie o nazwy kolejek'
          PCFMessage response = submitQueueNamesQuery(qmgrName, agent);

          // Czy otrzymano odpowiedź na zapytanie?
          if (response != null) {
            // Pobierz nazwy kolejek spoza odpowiedzi
            String[] qnames = (String[]) response.getParameterValue(CMQCFC.MQCACF_Q_NAMES);

            // Sprawdź poszczególne nazwy
            for (int j = 0; j < qnames.length; j++) {
              boolean qnameOkay = checkQueueName(qnames[j]);

              if (!qnameOkay) {
                // jeśli wykryto problem z nazwą, jest generowany
                //  komunikat o błędzie i dodawany do kolekcji,
                //  która ma zostać zwrócona
                testResults.add(generateTestResult(qnames[j], qmgrName));
              }
            }
          }
        }
        catch (MQException e) {
          // rejestrowanie szczegółów błędu
          e.printStackTrace();
        }
      }

      // Zakończono badanie menedżera kolejek
      guimonitor.worked(1);
    }

    // Zwróć wyniki wygenerowane podczas wykonywania testu
    WMQTestResult[] finalresults = (WMQTestResult[]) testResults
        .toArray(new WMQTestResult[testResults.size()]);
    testComplete(finalresults);
  }

  /**
   * Używany wewnętrznie do wprowadzenia za pomocą PCF zapytania INQUIRE_Q_NAMES do danego menedżera kolejek.
   * 
   * 
   * @param qmgrName - nazwa menedżera kolejek, do którego ma zostać wysłane zapytanie
   * @param agent
   * @return - odpowiedź PCF z menedżera kolejek
   */
  private PCFMessage submitQueueNamesQuery(String qmgrName, PCFMessageAgent agent) {

    // budowanie komunikatu pcf
    PCFMessage inquireQNames = new PCFMessage(CMQCFC.MQCMD_INQUIRE_Q_NAMES);
    inquireQNames.addParameter(CMQC.MQCA_Q_NAME, "*"); //$NON-NLS-1$

    try {
      // wyślij komunikat
      PCFMessage[] responseMsgs = agent.send(inquireQNames);

      // sprawdzanie, czy wyniki odebrano pomyślnie
      if (responseMsgs[0].getCompCode() == 0) {
        return responseMsgs[0];
      }
    }
    catch (IOException e) {
      // rejestrowanie szczegółów błędu
      e.printStackTrace();

    }
    catch (MQException e) {
      // rejestrowanie szczegółów błędu
      e.printStackTrace();
    }

    // Z jakiegoś powodu nie otrzymano odpowiedzi, zatem należy zwrócić wartość null
    return null;
  }

  /**
   * Używany wewnętrznie do sprawdzania danej nazwy kolejki względem kolekcji akceptowalnych przedrostków.
   * 
   * 
   * @param queueName - nazwa kolejki do sprawdzenia
   * @return true, jeśli nazwa kolejki jest poprawna, w przeciwnym razie false
   */
  private boolean checkQueueName(String queueName) {

    // jeśli to jest obiekt systemowy (tzn. jego nazwa zaczyna się przedrostkiem
    //   "SYSTEM."), sprawdź
    if ((queueName.startsWith("SYSTEM.")) || (queueName.startsWith("AMQ."))) { //$NON-NLS-1$//$NON-NLS-2$
      if (!includeSystemObjs) {
        // czy użytkownik zażądał wykluczenia obiektów
        //  systemowych z testu, dlatego zostanie zwrócona wartość true,
        //  aby uniknąć zgłaszania problemów dla tej kolejki
        return true;
      }
    }

    // Odpowiedź PCF spowoduje wymazanie nazwy kolejki, więc jest usuwana
    queueName = queueName.trim();

    // sprawdź nazwę kolejki względem poszczególnych akceptowalnych
przedrostków,
    // zwracając wartość true, jeśli występuje zgodność
    for (int i = 0; i < ACCEPTED_Q_PREFIXES.length; i++) {
      if (queueName.startsWith(ACCEPTED_Q_PREFIXES[i]))
        return true;
    }

    // Sprawdzono względem wszystkich akceptowalnych przedrostków,
    //  ale nie uzyskano zgodności
    return false;
  }

  /**
   * Używany wewnętrznie w celu wygenerowania wyniku testu dla danej nazwy kolejki.
   *
   * 
   * @param queueName - nazwa kolejki, która nie spełnia wymagań
   * @param qmgrName - nazwa menedżera kolejek, który udostępnia kolejkę
   * @return wygenerowany wynik testu
   */
  private WMQTestResult generateTestResult(String queueName, String qmgrName) {
    String res = "Queue (" + queueName.trim() + ") does not begin with a known prefix"; //$NON-NLS-1$//$NON-NLS-2$

    return new WMQTestResult(IMarker.SEVERITY_ERROR, res, qmgrName, getTestSubCategory());
  }
}