package org.dayatang.datasource4saas.dsregistry;
import org.dayatang.datasource4saas.DataSourceRegistry;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import javax.sql.DataSource;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;
public abstract class AbstractDataSourceRegistryTest {
private DataSourceRegistry instance;
protected DataSource dataSource = mock(DataSource.class);
protected DataSource dataSource2 = mock(DataSource.class);
protected String tenant = "abc";
protected String tenant2 = "xyz";
@Before
public void setUp() throws Exception {
instance = getInstanceToBeTested();
}
protected abstract DataSourceRegistry getInstanceToBeTested() throws Exception;
@After
public void tearDown() throws Exception {
instance.releaseAllDataSources();
}
@Test
public void getDataSourceOfTenant() {
assertSame(dataSource, instance.getDataSourceOfTenant(tenant));
assertSame(dataSource2, instance.getDataSourceOfTenant(tenant2));
}
@Test
public void registerDataSourceForTenant() {
assertFalse(instance.existsDataSourceOfTenant(tenant));
instance.registerDataSourceForTenant(tenant, dataSource);
assertTrue(instance.existsDataSourceOfTenant(tenant));
assertSame(dataSource, instance.getDataSourceOfTenant(tenant));
}
@Test
public void registerDataSources() {
assertFalse(instance.existsDataSourceOfTenant(tenant));
assertFalse(instance.existsDataSourceOfTenant(tenant2));
Map<String, DataSource> dataSources = new HashMap<String, DataSource>();
dataSources.put(tenant, dataSource);
dataSources.put(tenant2, dataSource2);
instance.registerDataSources(dataSources);
assertSame(dataSource, instance.getDataSourceOfTenant(tenant));
assertSame(dataSource2, instance.getDataSourceOfTenant(tenant2));
}
@Test
public void releaseDataSourceOfTenant() {
assertSame(dataSource, instance.getDataSourceOfTenant(tenant));
assertTrue(instance.existsDataSourceOfTenant(tenant));
instance.unregisterDataSourceOfTenant(tenant);
assertFalse(instance.existsDataSourceOfTenant(tenant));
}
@Test
public void releaseAllDataSources() {
instance.registerDataSourceForTenant("abc", mock(DataSource.class));
instance.registerDataSourceForTenant("xyz", mock(DataSource.class));
assertEquals(2, instance.size());
instance.releaseAllDataSources();
assertTrue(instance.size() == 0);
}
@Test
public void getLastAccessTimeOfTenant() throws InterruptedException {
assertNull(instance.getLastAccessTimeOfTenant(tenant));
assertSame(dataSource, instance.getDataSourceOfTenant(tenant));
Date lastAccess = instance.getLastAccessTimeOfTenant(tenant);
assertTrue(System.currentTimeMillis() - lastAccess.getTime() < 100);
TimeUnit.SECONDS.sleep(2);
assertTrue(System.currentTimeMillis() - lastAccess.getTime() > 1000);
}
}