/**
* Copyright 2016 Yahoo Inc.
*
* Licensed 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 com.yahoo.pulsar;
import static org.testng.Assert.fail;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.testng.Assert;
import org.testng.annotations.Test;
import com.google.common.collect.Sets;
import com.yahoo.pulsar.broker.ServiceConfiguration;
/**
* @version $Revision$<br>
* Created on Sep 6, 2012
*/
public class PulsarBrokerStarterTest {
/**
* Tests the private static <code>loadConfig</code> method of {@link PulsarBrokerStarter} class: verifies (1) if the
* method returns a non-null {@link ServiceConfiguration} instance where all required settings are filled in and (2)
* if the property variables inside the given property file are correctly referred to that returned object.
*/
@Test
public void testLoadConfig() throws SecurityException, NoSuchMethodException, IOException, IllegalArgumentException,
IllegalAccessException, InvocationTargetException {
File testConfigFile = new File("tmp." + System.currentTimeMillis() + ".properties");
if (testConfigFile.exists()) {
testConfigFile.delete();
}
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(testConfigFile)));
printWriter.println("zookeeperServers=z1.example.com,z2.example.com,z3.example.com");
printWriter.println("globalZookeeperServers=gz1.example.com,gz2.example.com,gz3.example.com/foo");
printWriter.println("brokerDeleteInactiveTopicsEnabled=false");
printWriter.println("statusFilePath=/tmp/status.html");
printWriter.println("managedLedgerDefaultEnsembleSize=1");
printWriter.println("managedLedgerDefaultWriteQuorum=1");
printWriter.println("managedLedgerDefaultAckQuorum=1");
printWriter.println("managedLedgerMaxEntriesPerLedger=25");
printWriter.println("managedLedgerCursorMaxEntriesPerLedger=50");
printWriter.println("managedLedgerCursorRolloverTimeInSeconds=3000");
printWriter.println("bookkeeperClientHealthCheckEnabled=true");
printWriter.println("bookkeeperClientHealthCheckErrorThresholdPerInterval=5");
printWriter.println("bookkeeperClientRackawarePolicyEnabled=true");
printWriter.println("bookkeeperClientIsolationGroups=group1,group2");
printWriter.println("backlogQuotaDefaultLimitGB=18");
printWriter.println("clusterName=usc");
printWriter.println("brokerClientAuthenticationPlugin=test.xyz.client.auth.plugin");
printWriter.println("brokerClientAuthenticationParameters=role:my-role");
printWriter.println("superUserRoles=appid1,appid2");
printWriter.println("clientLibraryVersionCheckEnabled=true");
printWriter.println("clientLibraryVersionCheckAllowUnversioned=true");
printWriter.println("managedLedgerMinLedgerRolloverTimeMinutes=34");
printWriter.println("managedLedgerMaxLedgerRolloverTimeMinutes=34");
printWriter.println("brokerServicePort=7777");
printWriter.println("managedLedgerDefaultMarkDeleteRateLimit=5.0");
printWriter.println("replicationProducerQueueSize=50");
printWriter.println("bookkeeperClientTimeoutInSeconds=12345");
printWriter.println("bookkeeperClientSpeculativeReadTimeoutInMillis=3000");
printWriter.close();
testConfigFile.deleteOnExit();
Method targetMethod = PulsarBrokerStarter.class.getDeclaredMethod("loadConfig", String.class);
targetMethod.setAccessible(true);
Object returnValue = targetMethod.invoke(PulsarBrokerStarter.class, testConfigFile.getAbsolutePath());
Assert.assertTrue(ServiceConfiguration.class.isInstance(returnValue));
ServiceConfiguration serviceConfig = (ServiceConfiguration) returnValue;
Assert.assertEquals(serviceConfig.getZookeeperServers(), "z1.example.com,z2.example.com,z3.example.com");
Assert.assertEquals(serviceConfig.getGlobalZookeeperServers(),
"gz1.example.com,gz2.example.com,gz3.example.com/foo");
Assert.assertFalse(serviceConfig.isBrokerDeleteInactiveTopicsEnabled());
Assert.assertEquals(serviceConfig.getStatusFilePath(), "/tmp/status.html");
Assert.assertEquals(serviceConfig.getBacklogQuotaDefaultLimitGB(), 18);
Assert.assertEquals(serviceConfig.getClusterName(), "usc");
Assert.assertEquals(serviceConfig.getBrokerClientAuthenticationPlugin(), "test.xyz.client.auth.plugin");
Assert.assertEquals(serviceConfig.getBrokerClientAuthenticationParameters(), "role:my-role");
Assert.assertEquals(serviceConfig.getSuperUserRoles(), Sets.newHashSet("appid1", "appid2"));
Assert.assertEquals(serviceConfig.getManagedLedgerCursorRolloverTimeInSeconds(), 3000);
Assert.assertEquals(serviceConfig.getManagedLedgerMaxEntriesPerLedger(), 25);
Assert.assertEquals(serviceConfig.getManagedLedgerCursorMaxEntriesPerLedger(), 50);
Assert.assertTrue(serviceConfig.isClientLibraryVersionCheckAllowUnversioned());
Assert.assertTrue(serviceConfig.isClientLibraryVersionCheckEnabled());
Assert.assertEquals(serviceConfig.getManagedLedgerMinLedgerRolloverTimeMinutes(), 34);
Assert.assertEquals(serviceConfig.isBacklogQuotaCheckEnabled(), true);
Assert.assertEquals(serviceConfig.getManagedLedgerDefaultMarkDeleteRateLimit(), 5.0);
Assert.assertEquals(serviceConfig.getReplicationProducerQueueSize(), 50);
Assert.assertEquals(serviceConfig.isReplicationMetricsEnabled(), false);
Assert.assertEquals(serviceConfig.isBookkeeperClientHealthCheckEnabled(), true);
Assert.assertEquals(serviceConfig.getBookkeeperClientHealthCheckErrorThresholdPerInterval(), 5);
Assert.assertEquals(serviceConfig.isBookkeeperClientRackawarePolicyEnabled(), true);
Assert.assertEquals(serviceConfig.getBookkeeperClientIsolationGroups(), "group1,group2");
Assert.assertEquals(serviceConfig.getBookkeeperClientSpeculativeReadTimeoutInMillis(), 3000);
Assert.assertEquals(serviceConfig.getBookkeeperClientTimeoutInSeconds(), 12345);
}
@Test
public void testLoadConfigWithException() throws Exception {
File testConfigFile = new File("tmp." + System.currentTimeMillis() + ".properties");
if (testConfigFile.exists()) {
testConfigFile.delete();
}
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(testConfigFile)));
printWriter.println("brokerDeleteInactiveTopicsEnabled=false");
printWriter.println("statusFilePath=/tmp/pulsar_broker/status.html");
printWriter.println("managedLedgerDefaultEnsembleSize01");
printWriter.println("managedLedgerDefaultWriteQuorum=0");
printWriter.println("managedLedgerDefaultAckQuorum=0");
printWriter.close();
testConfigFile.deleteOnExit();
try {
Method targetMethod = PulsarBrokerStarter.class.getDeclaredMethod("loadConfig", String.class);
targetMethod.setAccessible(true);
targetMethod.invoke(PulsarBrokerStarter.class, testConfigFile.getAbsolutePath());
fail("Should fail w/ illegal argument exception");
} catch (InvocationTargetException e) {
// OK, expected
Assert.assertTrue(e.getTargetException() instanceof IllegalArgumentException);
}
}
/**
* Tests the private static <code>loadConfig</code> method of {@link PulsarBrokerStarter} class: verifies (1) if the
* method returns a non-null {@link ServiceConfiguration} instance where all required settings are filled in and (2)
* if the property variables inside the given property file are correctly referred to that returned object.
*/
@Test
public void testLoadBalancerConfig() throws SecurityException, NoSuchMethodException, IOException,
IllegalArgumentException, IllegalAccessException, InvocationTargetException {
File testConfigFile = new File("tmp." + System.currentTimeMillis() + ".properties");
if (testConfigFile.exists()) {
testConfigFile.delete();
}
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(testConfigFile)));
printWriter.println("zookeeperServers=z1.example.com,z2.example.com,z3.example.com");
printWriter.println("statusFilePath=/usr/share/pulsar_broker/status.html");
printWriter.println("clusterName=test");
printWriter.println("managedLedgerDefaultEnsembleSize=1");
printWriter.println("managedLedgerDefaultWriteQuorum=1");
printWriter.println("managedLedgerDefaultAckQuorum=1");
printWriter.println("loadBalancerEnabled=false");
printWriter.println("loadBalancerHostUsageCheckIntervalMinutes=4");
printWriter.println("loadBalancerReportUpdateThresholdPercentage=15");
printWriter.println("loadBalancerReportUpdateMaxIntervalMinutes=20");
printWriter.println("loadBalancerBrokerOverloadedThresholdPercentage=80");
printWriter.println("loadBalancerBrokerUnderloadedThresholdPercentage=40");
printWriter.println("loadBalancerSheddingIntervalMinutes=8");
printWriter.println("loadBalancerSheddingGracePeriodMinutes=29");
printWriter.close();
testConfigFile.deleteOnExit();
Method targetMethod = PulsarBrokerStarter.class.getDeclaredMethod("loadConfig", String.class);
targetMethod.setAccessible(true);
Object returnValue = targetMethod.invoke(PulsarBrokerStarter.class, testConfigFile.getAbsolutePath());
Assert.assertTrue(ServiceConfiguration.class.isInstance(returnValue));
ServiceConfiguration serviceConfig = (ServiceConfiguration) returnValue;
Assert.assertEquals(serviceConfig.isLoadBalancerEnabled(), false);
Assert.assertEquals(serviceConfig.getLoadBalancerHostUsageCheckIntervalMinutes(), 4);
Assert.assertEquals(serviceConfig.getLoadBalancerReportUpdateThresholdPercentage(), 15);
Assert.assertEquals(serviceConfig.getLoadBalancerReportUpdateMaxIntervalMinutes(), 20);
Assert.assertEquals(serviceConfig.getLoadBalancerBrokerOverloadedThresholdPercentage(), 80);
Assert.assertEquals(serviceConfig.getLoadBalancerBrokerUnderloadedThresholdPercentage(), 40);
Assert.assertEquals(serviceConfig.getLoadBalancerSheddingIntervalMinutes(), 8);
Assert.assertEquals(serviceConfig.getLoadBalancerSheddingGracePeriodMinutes(), 29);
}
/**
* Tests the private static <code>loadConfig</code> method of {@link PulsarBrokerStarter} class: verifies (1) if the
* method returns a non-null {@link ServiceConfiguration} instance where all required settings are filled in and (2)
* if the property variables inside the given property file are correctly referred to that returned object.
*/
@Test
public void testGlobalZooKeeperConfig() throws SecurityException, NoSuchMethodException, IOException,
IllegalArgumentException, IllegalAccessException, InvocationTargetException {
File testConfigFile = new File("tmp." + System.currentTimeMillis() + ".properties");
if (testConfigFile.exists()) {
testConfigFile.delete();
}
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(testConfigFile)));
printWriter.println("zookeeperServers=z1.example.com,z2.example.com,z3.example.com");
printWriter.println("globalZookeeperServers=");
printWriter.println("brokerDeleteInactiveTopicsEnabled=false");
printWriter.println("statusFilePath=/tmp/status.html");
printWriter.println("managedLedgerDefaultEnsembleSize=1");
printWriter.println("managedLedgerDefaultWriteQuorum=1");
printWriter.println("managedLedgerDefaultAckQuorum=1");
printWriter.println("managedLedgerMaxEntriesPerLedger=25");
printWriter.println("managedLedgerCursorMaxEntriesPerLedger=50");
printWriter.println("managedLedgerCursorRolloverTimeInSeconds=3000");
printWriter.println("backlogQuotaDefaultLimitGB=18");
printWriter.println("clusterName=usc");
printWriter.println("brokerClientAuthenticationPlugin=test.xyz.client.auth.plugin");
printWriter.println("brokerClientAuthenticationParameters=role:my-role");
printWriter.println("superUserRoles=appid1,appid2");
printWriter.println("pulsar.broker.enableClientVersionCheck=true");
printWriter.println("pulsar.broker.allowUnversionedClients=true");
printWriter.println("clientLibraryVersionCheckEnabled=true");
printWriter.println("clientLibraryVersionCheckAllowUnversioned=true");
printWriter.println("replicationConnectionsPerBroker=12");
printWriter.close();
testConfigFile.deleteOnExit();
Method targetMethod = PulsarBrokerStarter.class.getDeclaredMethod("loadConfig", String.class);
targetMethod.setAccessible(true);
Object returnValue = targetMethod.invoke(PulsarBrokerStarter.class, testConfigFile.getAbsolutePath());
Assert.assertTrue(ServiceConfiguration.class.isInstance(returnValue));
ServiceConfiguration serviceConfig = (ServiceConfiguration) returnValue;
Assert.assertEquals(serviceConfig.getZookeeperServers(), "z1.example.com,z2.example.com,z3.example.com");
Assert.assertEquals(serviceConfig.getGlobalZookeeperServers(), "z1.example.com,z2.example.com,z3.example.com");
Assert.assertFalse(serviceConfig.isBrokerDeleteInactiveTopicsEnabled());
Assert.assertEquals(serviceConfig.getStatusFilePath(), "/tmp/status.html");
Assert.assertEquals(serviceConfig.getBacklogQuotaDefaultLimitGB(), 18);
Assert.assertEquals(serviceConfig.getClusterName(), "usc");
Assert.assertEquals(serviceConfig.getBrokerClientAuthenticationPlugin(), "test.xyz.client.auth.plugin");
Assert.assertEquals(serviceConfig.getBrokerClientAuthenticationParameters(), "role:my-role");
Assert.assertEquals(serviceConfig.getSuperUserRoles(), Sets.newHashSet("appid1", "appid2"));
Assert.assertEquals(serviceConfig.getManagedLedgerCursorRolloverTimeInSeconds(), 3000);
Assert.assertEquals(serviceConfig.getManagedLedgerMaxEntriesPerLedger(), 25);
Assert.assertEquals(serviceConfig.getManagedLedgerCursorMaxEntriesPerLedger(), 50);
Assert.assertTrue(serviceConfig.isClientLibraryVersionCheckAllowUnversioned());
Assert.assertTrue(serviceConfig.isClientLibraryVersionCheckEnabled());
Assert.assertEquals(serviceConfig.getReplicationConnectionsPerBroker(), 12);
}
/**
* Verifies that the main throws {@link IllegalArgumentException} when no argument is given.
*/
@Test
public void testMainWithNoArgument() throws Exception {
try {
PulsarBrokerStarter.main(new String[0]);
Assert.fail("No argument to main should've raised IllegalArgumentException!");
} catch (IllegalArgumentException e) {
// code should reach here.
}
}
}