| /* |
| * 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.bookkeeper.meta; |
| |
| import static org.apache.bookkeeper.meta.MetadataDrivers.BK_METADATA_BOOKIE_DRIVERS_PROPERTY; |
| import static org.apache.bookkeeper.meta.MetadataDrivers.BK_METADATA_CLIENT_DRIVERS_PROPERTY; |
| import static org.apache.bookkeeper.meta.MetadataDrivers.ZK_BOOKIE_DRIVER_CLASS; |
| import static org.apache.bookkeeper.meta.MetadataDrivers.ZK_CLIENT_DRIVER_CLASS; |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.fail; |
| import static org.mockito.Mockito.mock; |
| import static org.mockito.Mockito.when; |
| |
| import com.google.common.collect.Maps; |
| import java.net.URI; |
| import java.util.Map; |
| import java.util.Optional; |
| import java.util.concurrent.ScheduledExecutorService; |
| import org.apache.bookkeeper.conf.ClientConfiguration; |
| import org.apache.bookkeeper.conf.ServerConfiguration; |
| import org.apache.bookkeeper.discover.RegistrationClient; |
| import org.apache.bookkeeper.discover.RegistrationManager; |
| import org.apache.bookkeeper.meta.MetadataDrivers.MetadataBookieDriverInfo; |
| import org.apache.bookkeeper.meta.MetadataDrivers.MetadataClientDriverInfo; |
| import org.apache.bookkeeper.meta.exceptions.MetadataException; |
| import org.apache.bookkeeper.stats.StatsLogger; |
| import org.apache.commons.lang3.StringUtils; |
| import org.junit.After; |
| import org.junit.Before; |
| import org.junit.Test; |
| |
| /** |
| * Unit test of {@link MetadataDrivers}. |
| */ |
| public class MetadataDriversTest { |
| |
| abstract static class TestClientDriver implements MetadataClientDriver { |
| |
| @Override |
| public MetadataClientDriver initialize(ClientConfiguration conf, |
| ScheduledExecutorService scheduler, |
| StatsLogger statsLogger, |
| Optional<Object> ctx) throws MetadataException { |
| return this; |
| } |
| |
| @Override |
| public RegistrationClient getRegistrationClient() { |
| return mock(RegistrationClient.class); |
| } |
| |
| @Override |
| public LedgerManagerFactory getLedgerManagerFactory() throws MetadataException { |
| return mock(LedgerManagerFactory.class); |
| } |
| |
| @Override |
| public LayoutManager getLayoutManager() { |
| return mock(LayoutManager.class); |
| } |
| |
| @Override |
| public void close() { |
| } |
| |
| @Override |
| public void setSessionStateListener(SessionStateListener sessionStateListener) { |
| } |
| } |
| |
| static class ClientDriver1 extends TestClientDriver { |
| |
| @Override |
| public String getScheme() { |
| return "driver1"; |
| } |
| |
| |
| } |
| |
| static class ClientDriver2 extends TestClientDriver { |
| |
| @Override |
| public String getScheme() { |
| return "driver2"; |
| } |
| |
| } |
| |
| abstract static class TestBookieDriver implements MetadataBookieDriver { |
| @Override |
| public MetadataBookieDriver initialize(ServerConfiguration conf, |
| StatsLogger statsLogger) throws MetadataException { |
| return this; |
| } |
| |
| @Override |
| public RegistrationManager createRegistrationManager() { |
| return mock(RegistrationManager.class); |
| } |
| |
| @Override |
| public LedgerManagerFactory getLedgerManagerFactory() throws MetadataException { |
| return mock(LedgerManagerFactory.class); |
| } |
| |
| @Override |
| public LayoutManager getLayoutManager() { |
| return mock(LayoutManager.class); |
| } |
| |
| @Override |
| public void close() { |
| |
| } |
| } |
| |
| static class BookieDriver1 extends TestBookieDriver { |
| |
| @Override |
| public String getScheme() { |
| return "driver1"; |
| } |
| |
| } |
| |
| static class BookieDriver2 extends TestBookieDriver { |
| |
| @Override |
| public String getScheme() { |
| return "driver2"; |
| } |
| |
| } |
| |
| private Map<String, MetadataClientDriverInfo> savedClientDrivers; |
| private Map<String, MetadataBookieDriverInfo> savedBookieDrivers; |
| |
| @Before |
| public void setup() { |
| savedClientDrivers = Maps.newHashMap(MetadataDrivers.getClientDrivers()); |
| savedBookieDrivers = Maps.newHashMap(MetadataDrivers.getBookieDrivers()); |
| } |
| |
| @After |
| public void teardown() { |
| MetadataDrivers.getClientDrivers().clear(); |
| MetadataDrivers.getClientDrivers().putAll(savedClientDrivers); |
| MetadataDrivers.getBookieDrivers().clear(); |
| MetadataDrivers.getBookieDrivers().putAll(savedBookieDrivers); |
| } |
| |
| @Test |
| public void testDefaultDrivers() { |
| MetadataClientDriver clientDriver = MetadataDrivers.getClientDriver("zk"); |
| assertEquals( |
| ZK_CLIENT_DRIVER_CLASS, |
| clientDriver.getClass().getName()); |
| clientDriver = MetadataDrivers.getClientDriver(URI.create("zk+hierarchical://127.0.0.1/ledgers")); |
| assertEquals( |
| ZK_CLIENT_DRIVER_CLASS, |
| clientDriver.getClass().getName()); |
| |
| MetadataBookieDriver bookieDriver = MetadataDrivers.getBookieDriver("zk"); |
| assertEquals( |
| ZK_BOOKIE_DRIVER_CLASS, |
| bookieDriver.getClass().getName()); |
| bookieDriver = MetadataDrivers.getBookieDriver(URI.create("zk+hierarchical://127.0.0.1/ledgers")); |
| assertEquals( |
| ZK_BOOKIE_DRIVER_CLASS, |
| bookieDriver.getClass().getName()); |
| } |
| |
| @Test(expected = NullPointerException.class) |
| public void testClientDriverNullScheme() { |
| MetadataDrivers.getClientDriver((String) null); |
| } |
| |
| @Test(expected = NullPointerException.class) |
| public void testBookieDriverNullScheme() { |
| MetadataDrivers.getBookieDriver((String) null); |
| } |
| |
| @Test(expected = NullPointerException.class) |
| public void testClientDriverNullURI() { |
| MetadataDrivers.getClientDriver((URI) null); |
| } |
| |
| @Test(expected = NullPointerException.class) |
| public void testBookieDriverNullURI() { |
| MetadataDrivers.getBookieDriver((URI) null); |
| } |
| |
| @Test(expected = IllegalArgumentException.class) |
| public void testClientDriverUnknownScheme() { |
| MetadataDrivers.getClientDriver("unknown"); |
| } |
| |
| @Test(expected = IllegalArgumentException.class) |
| public void testBookieDriverUnknownScheme() { |
| MetadataDrivers.getBookieDriver("unknown"); |
| } |
| |
| @Test(expected = IllegalArgumentException.class) |
| public void testClientDriverUnknownSchemeURI() { |
| MetadataDrivers.getClientDriver(URI.create("unknown://")); |
| } |
| |
| @Test(expected = IllegalArgumentException.class) |
| public void testBookieDriverUnknownSchemeURI() { |
| MetadataDrivers.getBookieDriver(URI.create("unknown://")); |
| } |
| |
| @Test(expected = NullPointerException.class) |
| public void testClientDriverNullSchemeURI() { |
| MetadataDrivers.getClientDriver(URI.create("//127.0.0.1/ledgers")); |
| } |
| |
| @Test(expected = NullPointerException.class) |
| public void testBookieDriverNullSchemeURI() { |
| MetadataDrivers.getBookieDriver(URI.create("//127.0.0.1/ledgers")); |
| } |
| |
| @Test |
| public void testClientDriverLowerUpperCasedSchemes() { |
| String[] schemes = new String[] { |
| "zk", "Zk", "zK", "ZK" |
| }; |
| for (String scheme : schemes) { |
| MetadataClientDriver clientDriver = MetadataDrivers.getClientDriver(scheme); |
| assertEquals( |
| ZK_CLIENT_DRIVER_CLASS, |
| clientDriver.getClass().getName()); |
| } |
| } |
| |
| @Test |
| public void testBookieDriverLowerUpperCasedSchemes() { |
| String[] schemes = new String[] { |
| "zk", "Zk", "zK", "ZK" |
| }; |
| for (String scheme : schemes) { |
| MetadataBookieDriver bookieDriver = MetadataDrivers.getBookieDriver(scheme); |
| assertEquals( |
| ZK_BOOKIE_DRIVER_CLASS, |
| bookieDriver.getClass().getName()); |
| } |
| } |
| |
| @Test |
| public void testRegisterClientDriver() throws Exception { |
| MetadataClientDriver clientDriver = mock(MetadataClientDriver.class); |
| when(clientDriver.getScheme()).thenReturn("testdriver"); |
| |
| try { |
| MetadataDrivers.getClientDriver(clientDriver.getScheme()); |
| fail("Should fail to get client driver if it is not registered"); |
| } catch (IllegalArgumentException iae) { |
| // expected |
| } |
| |
| MetadataDrivers.registerClientDriver(clientDriver.getScheme(), clientDriver.getClass()); |
| MetadataClientDriver driver = MetadataDrivers.getClientDriver(clientDriver.getScheme()); |
| assertEquals(clientDriver.getClass(), driver.getClass()); |
| } |
| |
| @Test |
| public void testRegisterBookieDriver() throws Exception { |
| MetadataBookieDriver bookieDriver = mock(MetadataBookieDriver.class); |
| when(bookieDriver.getScheme()).thenReturn("testdriver"); |
| |
| try { |
| MetadataDrivers.getBookieDriver(bookieDriver.getScheme()); |
| fail("Should fail to get bookie driver if it is not registered"); |
| } catch (IllegalArgumentException iae) { |
| // expected |
| } |
| |
| MetadataDrivers.registerBookieDriver(bookieDriver.getScheme(), bookieDriver.getClass()); |
| MetadataBookieDriver driver = MetadataDrivers.getBookieDriver(bookieDriver.getScheme()); |
| assertEquals(bookieDriver.getClass(), driver.getClass()); |
| } |
| |
| @Test |
| public void testLoadClientDriverFromSystemProperty() throws Exception { |
| String saveDriversStr = System.getProperty(BK_METADATA_CLIENT_DRIVERS_PROPERTY); |
| try { |
| System.setProperty( |
| BK_METADATA_CLIENT_DRIVERS_PROPERTY, |
| StringUtils.join(new String[] { |
| ClientDriver1.class.getName(), |
| ClientDriver2.class.getName() |
| }, ':')); |
| |
| MetadataDrivers.loadInitialDrivers(); |
| |
| MetadataClientDriver loadedDriver1 = MetadataDrivers.getClientDriver("driver1"); |
| assertEquals(ClientDriver1.class, loadedDriver1.getClass()); |
| MetadataClientDriver loadedDriver2 = MetadataDrivers.getClientDriver("driver2"); |
| assertEquals(ClientDriver2.class, loadedDriver2.getClass()); |
| } finally { |
| if (null != saveDriversStr) { |
| System.setProperty(BK_METADATA_CLIENT_DRIVERS_PROPERTY, saveDriversStr); |
| } else { |
| System.clearProperty(BK_METADATA_CLIENT_DRIVERS_PROPERTY); |
| } |
| } |
| } |
| |
| @Test |
| public void testLoadBookieDriverFromSystemProperty() throws Exception { |
| String saveDriversStr = System.getProperty(BK_METADATA_BOOKIE_DRIVERS_PROPERTY); |
| try { |
| System.setProperty( |
| BK_METADATA_BOOKIE_DRIVERS_PROPERTY, |
| StringUtils.join(new String[] { |
| BookieDriver1.class.getName(), |
| BookieDriver2.class.getName() |
| }, ':')); |
| |
| MetadataDrivers.loadInitialDrivers(); |
| |
| MetadataBookieDriver loadedDriver1 = MetadataDrivers.getBookieDriver("driver1"); |
| assertEquals(BookieDriver1.class, loadedDriver1.getClass()); |
| MetadataBookieDriver loadedDriver2 = MetadataDrivers.getBookieDriver("driver2"); |
| assertEquals(BookieDriver2.class, loadedDriver2.getClass()); |
| } finally { |
| if (null != saveDriversStr) { |
| System.setProperty(BK_METADATA_BOOKIE_DRIVERS_PROPERTY, saveDriversStr); |
| } else { |
| System.clearProperty(BK_METADATA_BOOKIE_DRIVERS_PROPERTY); |
| } |
| } |
| } |
| |
| } |