/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.activemq.pool;

import javax.jms.Connection;

import org.junit.Test;

import static junit.framework.Assert.assertNotNull;

public class ConfigFromPropsTest {

    XaPooledConnectionFactory underTest;

    @Test
    public void testBrokerUrlForRarAdminObject() throws Exception {
        underTest = new XaPooledConnectionFactory();
        underTest.setBrokerUrl("vm://localhost?broker.persistent=false");
        Connection connection = underTest.createConnection();
        assertNotNull(connection);
        connection.close();
        assertNotNull(underTest.getBrokerUrl());
    }
}
