/*
* Copyright (c) 2017 OBiBa. All rights reserved.
*
* This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.obiba.magma;
import org.easymock.EasyMock;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.fest.assertions.api.Assertions.assertThat;
public class MagmaEngineTest {
private MagmaEngine magmaEngine;
@Before
public void setUp() throws Exception {
new MagmaEngine();
magmaEngine = MagmaEngine.get();
}
@After
public void stopMagmaEngine() {
MagmaEngine.get().shutdown();
}
@Test
public void testAddingTwoUniqueDatasources() throws Exception {
Datasource datasourceOne = createMock(Datasource.class);
Datasource datasourceTwo = createMock(Datasource.class);
datasourceOne.initialise();
expect(datasourceOne.getName()).andReturn("one").anyTimes();
datasourceTwo.initialise();
expect(datasourceTwo.getName()).andReturn("two").anyTimes();
datasourceOne.dispose();
datasourceTwo.dispose();
replay(datasourceOne, datasourceTwo);
magmaEngine.addDatasource(datasourceOne);
magmaEngine.addDatasource(datasourceTwo);
assertThat(magmaEngine.getDatasources()).hasSize(2);
magmaEngine.shutdown();
verify(datasourceOne, datasourceTwo);
}
/**
* Subsequent requests to add a Datasource are ignored. The Datasource is already present in the MagmaEngine.
*/
@Test
public void testAddingNonUniqueDatasources() throws Exception {
Datasource datasourceOne = createMock(Datasource.class);
expect(datasourceOne.getName()).andReturn("one").anyTimes();
datasourceOne.initialise();
expectLastCall().times(1);
datasourceOne.dispose();
replay(datasourceOne);
magmaEngine.addDatasource(datasourceOne);
magmaEngine.addDatasource(datasourceOne);
assertThat(magmaEngine.getDatasources()).hasSize(1);
magmaEngine.shutdown();
verify(datasourceOne);
}
@Test(expected = DuplicateDatasourceNameException.class)
public void testAddingUniqueDatasourcesWithNonUniqueNames() throws Exception {
Datasource datasourceOne = createMock(Datasource.class);
Datasource datasourceTwo = createMock(Datasource.class);
datasourceOne.initialise();
expect(datasourceOne.getName()).andReturn("fireball").anyTimes();
expect(datasourceTwo.getName()).andReturn("fireball").anyTimes();
datasourceOne.dispose();
replay(datasourceOne, datasourceTwo);
magmaEngine.addDatasource(datasourceOne);
try {
magmaEngine.addDatasource(datasourceTwo);
} finally {
assertThat(magmaEngine.getDatasources()).hasSize(1);
magmaEngine.shutdown();
verify(datasourceOne, datasourceTwo);
}
}
@Test
public void testHasTransientDatasourceIsTrue() throws Exception {
DatasourceFactory factory = createMock(DatasourceFactory.class);
expect(factory.getName()).andReturn("uid").atLeastOnce();
factory.setName((String) EasyMock.anyObject());
replay(factory);
String uid = magmaEngine.addTransientDatasource(factory);
assertThat(magmaEngine.hasTransientDatasource(uid)).isTrue();
assertThat(magmaEngine.hasTransientDatasource("foo")).isFalse();
magmaEngine.removeTransientDatasource(uid);
assertThat(magmaEngine.hasTransientDatasource(uid)).isFalse();
magmaEngine.shutdown();
verify(factory);
}
@Test
public void testGetTransientDatasourceInstanceIsInitialised() throws Exception {
DatasourceFactory factory = createMock(DatasourceFactory.class);
Datasource datasource = createMock(Datasource.class);
expect(factory.getName()).andReturn("uid").atLeastOnce();
expect(factory.create()).andReturn(datasource).once();
expect(datasource.getName()).andReturn("uid").once();
factory.setName((String) EasyMock.anyObject());
datasource.initialise();
replay(factory, datasource);
String uid = magmaEngine.addTransientDatasource(factory);
Datasource created = magmaEngine.getTransientDatasourceInstance(uid);
assertThat(created).isNotNull();
assertThat(created.getName()).isEqualTo(uid);
magmaEngine.shutdown();
verify(factory, datasource);
}
@Test(expected = NoSuchDatasourceException.class)
public void testGetNonExistingTransientDatasourceInstance() throws Exception {
try {
magmaEngine.getTransientDatasourceInstance("foo");
magmaEngine.shutdown();
Assert.fail();
} finally {
magmaEngine.shutdown();
}
}
@Test(expected = NoSuchDatasourceException.class)
public void testGetNonExistingDatasource() throws Exception {
try {
magmaEngine.getDatasource("pwel");
magmaEngine.shutdown();
Assert.fail();
} finally {
magmaEngine.shutdown();
}
}
@Test
public void testRemoveNonExistingTransientDatasourceIsSilent() throws Exception {
magmaEngine.removeTransientDatasource("foo");
magmaEngine.shutdown();
}
@Test(expected = IllegalArgumentException.class)
public void testGetTransientDatasourceWithNullName() throws Exception {
try {
magmaEngine.getTransientDatasourceInstance(null);
Assert.fail();
} finally {
magmaEngine.shutdown();
}
}
@Test(expected = IllegalArgumentException.class)
public void testGetDatasourceWithNullName() throws Exception {
try {
magmaEngine.getDatasource(null);
magmaEngine.shutdown();
Assert.fail();
} finally {
magmaEngine.shutdown();
}
}
}