Пример автономного теста Apache Qpid (amqp) Junit

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

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

Ответ 1

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

Сначала я создал минимальный 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"

    }]
}

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

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

Вот код из unit test setup:

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

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 с клиентом MQ Rabbit:

        ConnectionFactory factory = new ConnectionFactory();
        factory.setUri("amqp://guest:[email protected]:${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();

Ответ 2

В проекте 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'

Ответ 3

Лучшее, что я мог понять:

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:[email protected]/test?brokerlist='vm://:1?sasl_mechs='PLAIN''

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

Ответ 4

Мое решение на 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 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();

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

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, удалите ненужный идентификатор и используйте его для встроенного сервера, как указано выше.

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

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