Пример автономного теста Junit Apache Qpid (amqp) - PullRequest
10 голосов
/ 01 февраля 2010

Есть ли у кого-нибудь пример использования Apache Qpid в автономном тесте junit.

В идеале я хочу иметь возможность создавать очередь на лету, которую я могу помещать / получать в своем тесте. Так что я не тестирую QPid в своем тесте, я буду использовать интеграционные тесты для этого, однако будет очень полезен для тестирования методов, обрабатывающих сообщения с необходимостью макетировать множество сервисов.

Ответы [ 4 ]

6 голосов
/ 05 ноября 2014

Вот метод установки, который я использую для QPID 0.30 (я использую его в тесте Спока, но должен быть переносимым на Java из Junit без проблем). Это поддерживает соединение SSL, управление HTTP и использует только запуск в памяти. Время запуска составляет менее секунды. Конфигурация для QPID неудобна по сравнению с использованием ActiveMQ для той же цели, но QPID совместим с AMQP и позволяет проводить плавное, нейтральное тестирование для клиентов AMQP (очевидно, что использование обменов не может имитировать реализацию RabbitMQ, но для базовых целей этого достаточно)

Сначала я создал минимальный test-config.json, который я поместил в папку ресурсов:

{
  "name": "${broker.name}",
  "modelVersion": "2.0",
  "defaultVirtualHost" : "default",
  "authenticationproviders" : [ {
    "name" : "passwordFile",
    "type" : "PlainPasswordFile",
    "path" : "${qpid.home_dir}${file.separator}etc${file.separator}passwd",
    "preferencesproviders" : [{
        "name": "fileSystemPreferences",
        "type": "FileSystemPreferences",
        "path" : "${qpid.work_dir}${file.separator}user.preferences.json"
    }]
  } ],
  "ports" : [  {
    "name" : "AMQP",
    "port" : "${qpid.amqp_port}",
    "authenticationProvider" : "passwordFile",
    "keyStore" : "default",
    "protocols": ["AMQP_0_10", "AMQP_0_8", "AMQP_0_9", "AMQP_0_9_1" ],
    "transports" : [ "SSL" ]
  }, {
    "name" : "HTTP",
    "port" : "${qpid.http_port}",
    "authenticationProvider" : "passwordFile",
    "protocols" : [ "HTTP" ]
  }],
  "virtualhostnodes" : [ {
    "name" : "default",
    "type" : "JSON",
    "virtualHostInitialConfiguration" : "{ \"type\" : \"Memory\" }"
  } ],
  "plugins" : [ {
    "type" : "MANAGEMENT-HTTP",
    "name" : "httpManagement"
  }],
  "keystores" : [ {
     "name" : "default",
        "password" : "password",
      "path": "${qpid.home_dir}${file.separator}keystore.jks"

    }]
}

I Мне также нужно было создать файл keystore.jks для localhost, потому что брокер QPID и клиент RabbitMQ не любят общаться по незашифрованному каналу. Я также добавил файл с именем «passwd» в «Integest / resources / etc», который имеет следующее содержимое:

гость: пароль

Вот код из настройки модульного теста:

переменные уровня класса:

def tmpFolder = Files.createTempDir()
Broker broker

def amqpPort = PortFinder.findFreePort()
def httpPort = PortFinder.findFreePort()

def qpidHomeDir = 'src/integTest/resources/'
def configFileName = "/test-config.json"

код для метода setup ():

   def setup() {

    broker = new Broker();
    def brokerOptions = new BrokerOptions()

    File file = new File(qpidHomeDir)
    String homePath = file.getAbsolutePath();
    log.info(' qpid home dir=' + homePath)
    log.info(' qpid work dir=' + tmpFolder.absolutePath)

    brokerOptions.setConfigProperty('qpid.work_dir', tmpFolder.absolutePath);

    brokerOptions.setConfigProperty('qpid.amqp_port',"${amqpPort}")
    brokerOptions.setConfigProperty('qpid.http_port', "${httpPort}")
    brokerOptions.setConfigProperty('qpid.home_dir', homePath);


    brokerOptions.setInitialConfigurationLocation(homePath + configFileName)
    broker.startup(brokerOptions)
    log.info('broker started')
}

код для очистки ()

broker.shutdown()

Чтобы установить соединение AMQP из клиента Rabbit MQ:

        ConnectionFactory factory = new ConnectionFactory();
        factory.setUri("amqp://guest:password@localhost:${amqpPort}");
        factory.useSslProtocol()

        log.info('about to make connection')


        def connection = factory.newConnection();
        //get a channel for sending the "kickoff" message
        def channel = connection.createChannel();
4 голосов
/ 21 мая 2010

В проекте Qpid есть ряд тестов, в которых для тестирования используется встроенный брокер. В то время как мы используем базовый сценарий для обработки закрытия при запуске, вы можете сделать следующее, чтобы просто интегрировать брокера в свои тесты:

public void setUp()
{
        int port=1;

// Config is actually a Configuaration File App Registry object, or Configuration Application Registry.

        ApplicationRegistry.initialise(config, port);

        TransportConnection.createVMBroker(port);        
}

public void test()
{...}

public void tearDown()
{
            TransportConnection.killVMBroker(port);
            ApplicationRegistry.remove(port);
}

Затем для соединения необходимо указать conectionURL для брокера. т.е. borkerlist = 'vm: // 1'

2 голосов
/ 17 ноября 2017

Мое решение на qpid-broker @ 6.1.1, добавьте ниже в pom.xml

<dependency>
    <groupId>org.apache.qpid</groupId>
    <artifactId>qpid-broker</artifactId>
    <version>6.1.1</version>
    <scope>test</scope>
</dependency>

Файл конфигурации qpid как:

{
  "name" : "${broker.name}",
  "modelVersion" : "6.1",
  "defaultVirtualHost" : "default",
  "authenticationproviders" : [ {
    "name" : "anonymous",
    "type" : "Anonymous"
  } ],
  "ports" : [ {
    "name" : "AMQP",
    "port" : "${qpid.amqp_port}",
    "authenticationProvider" : "anonymous",
    "virtualhostaliases" : [ {
      "name" : "defaultAlias",
      "type" : "defaultAlias"
    } ]
  } ],
  "virtualhostnodes" : [ {
    "name" : "default",
    "type" : "JSON",
    "defaultVirtualHostNode" : "true",
    "virtualHostInitialConfiguration" : "{ \"type\" : \"Memory\" }"
  } ]
}

код для запуска сервера qpid

Broker broker = new Broker();
BrokerOptions brokerOptions = new BrokerOptions();
// I use fix port number
brokerOptions.setConfigProperty("qpid.amqp_port", "20179");
brokerOptions.setConfigurationStoreType("Memory");
// work_dir for qpid's log, configs, persist data
System.setProperty("qpid.work_dir", "/tmp/qpidworktmp");
// init config of qpid. Relative path for classloader resource or absolute path for non-resource
System.setProperty("qpid.initialConfigurationLocation", "qpid/qpid-config.json");
brokerOptions.setStartupLoggedToSystemOut(false);
broker.startup(brokerOptions);

код для остановки сервера qpid

broker.shutdown();

Так как я использую режим анонимного доступа, клиент должен сделать следующее:

SaslConfig saslConfig = new SaslConfig() {
    public SaslMechanism getSaslMechanism(String[] mechanisms) {
        return new SaslMechanism() {
            public String getName() {
                return "ANONYMOUS";
            }

            public LongString handleChallenge(LongString challenge, String username, String password) {
                return LongStringHelper.asLongString("");
            }
        };
    }
};
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(20179);
factory.setSaslConfig(saslConfig);

Connection connection = factory.newConnection();
Channel channel = connection.createChannel();

Вот и все. Еще немного о том, как это сделать на другой версии.

Вы можете скачать двоичный пакет qpid-broker с официального сайта. После загрузки и распаковки вы можете запустить его для проверки в качестве сервера для вашего случая. После того, как ваш случай хорошо подключился к серверу, с помощью командной строки создайте или просто скопируйте исходный файл конфигурации в QPID_WORK, удалите бесполезный файл id и используйте его для встроенного сервера, как указано выше.

Самое сложное - это аутентификация. Вы можете выбрать режим PLAIN, но вы должны добавить имя пользователя и пароль в начальной конфигурации. Я выбираю анонимный режим, который требует небольшого кода при подключении. Для другого режима аутентификации вы должны указать файл паролей или хранилище ключей / сертификатов, которое я не пробовал.

Если он все еще не работает, вы можете прочитать документ qpid-borker и код основного класса в артефакте qpid-broker, который показывает, как работает командная строка для каждой настройки.

1 голос
/ 02 ноября 2011

Лучшее, что я смог выяснить, было:

PropertiesConfiguration properties = new PropertiesConfiguration();
properties.addProperty("virtualhosts.virtualhost.name", "test");
properties.addProperty("security.principal-databases.principal-database.name", "testPasswordFile");
properties.addProperty("security.principal-databases.principal-database.class", "org.apache.qpid.server.security.auth.database.PropertiesPrincipalDatabase");
ServerConfiguration config = new ServerConfiguration(properties);
ApplicationRegistry.initialise(new ApplicationRegistry(config) {
    @Override
    protected void createDatabaseManager(ServerConfiguration configuration) throws Exception {
        Properties users = new Properties();
        users.put("guest","guest");
        users.put("admin","admin");
        _databaseManager = new PropertiesPrincipalDatabaseManager("testPasswordFile", users);
    }
});
TransportConnection.createVMBroker(ApplicationRegistry.DEFAULT_INSTANCE);

С URL-адресом:

amqp://admin:admin@/test?brokerlist='vm://:1?sasl_mechs='PLAIN''

Большая проблема с настройкой и авторизацией.Milage может варьироваться.

...