/* * Copyright 2010 Proofpoint, 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 io.airlift.discovery.server; import com.google.common.base.Supplier; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import org.joda.time.DateTime; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.util.Set; import static io.airlift.testing.Assertions.assertEqualsIgnoreOrder; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; public abstract class TestStaticStore { private static final Service BLUE = new Service(Id.<Service>random(), null, "storage", "poolA", "/US/West/SC4/rack1/host1/vm1/slot1", ImmutableMap.of("http", "http://localhost:1111")); private static final Service RED = new Service(Id.<Service>random(), null, "storage", "poolB", "/US/West/SC4/rack1/host1/vm1/slot2", ImmutableMap.of("http", "http://localhost:2222")); private static final Service GREEN = new Service(Id.<Service>random(), null, "monitoring", "poolA", "/US/West/SC4/rack1/host1/vm1/slot3", ImmutableMap.of("http", "http://localhost:3333")); private static final Service YELLOW = new Service(Id.<Service>random(), null, "storage", "poolB", "/US/West/SC4/rack1/host1/vm1/slot3", ImmutableMap.of("http", "http://localhost:4444")); protected StaticStore store; protected TestingTimeSupplier currentTime; protected abstract StaticStore initializeStore(Supplier<DateTime> timeSupplier); @BeforeMethod public void setup() { currentTime = new TestingTimeSupplier(); store = initializeStore(currentTime); } @Test public void testEmpty() { assertTrue(store.getAll().isEmpty(), "store should be empty"); } @Test public void testPutSingle() { store.put(BLUE); assertEquals(store.getAll(), ImmutableSet.of(BLUE)); } @Test public void testPutMultiple() { store.put(BLUE); store.put(RED); store.put(GREEN); assertEqualsIgnoreOrder(store.getAll(), ImmutableSet.of(BLUE, RED, GREEN)); } @Test public void testGetByType() { store.put(BLUE); store.put(RED); store.put(GREEN); assertEqualsIgnoreOrder(store.get("storage"), ImmutableSet.of(BLUE, RED)); assertEqualsIgnoreOrder(store.get("monitoring"), ImmutableSet.of(GREEN)); } @Test public void testGetByTypeAndPool() { store.put(BLUE); store.put(RED); store.put(GREEN); store.put(YELLOW); assertEqualsIgnoreOrder(store.get("storage", "poolA"), ImmutableSet.of(BLUE)); assertEqualsIgnoreOrder(store.get("monitoring", "poolA"), ImmutableSet.of(GREEN)); assertEqualsIgnoreOrder(store.get("storage", "poolB"), ImmutableSet.of(RED, YELLOW)); } @Test public void testDelete() { store.put(BLUE); store.put(RED); store.put(GREEN); assertEqualsIgnoreOrder(store.getAll(), ImmutableSet.of(BLUE, RED, GREEN)); currentTime.increment(); store.delete(GREEN.getId()); assertEqualsIgnoreOrder(store.getAll(), ImmutableSet.of(BLUE, RED)); assertTrue(store.get("web").isEmpty()); assertTrue(store.get("web", "poolA").isEmpty()); } @Test public void testCanHandleLotsOfServices() { ImmutableSet.Builder<Service> builder = ImmutableSet.builder(); for (int i = 0; i < 5000; ++i) { builder.add(new Service(Id.<Service>random(), null, "storage", "poolA", "/US/West/SC4/rack1/host1/vm1/slot1", ImmutableMap.of("http", "http://localhost:1111"))); } Set<Service> services = builder.build(); for (Service service : services) { store.put(service); } assertEquals(store.getAll(), services); } }