package com.vistatec.ocelot.tm.okapi; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; import org.jmock.Expectations; import org.jmock.Mockery; import org.junit.AfterClass; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import com.vistatec.ocelot.config.ConfigService; import com.vistatec.ocelot.config.ConfigTransferService; import com.vistatec.ocelot.config.xml.OcelotRootConfig; import com.vistatec.ocelot.config.xml.TmManagement; import com.vistatec.ocelot.segment.model.SegmentAtom; import com.vistatec.ocelot.segment.model.SimpleSegmentVariant; import com.vistatec.ocelot.tm.TmPenalizer; import com.vistatec.ocelot.tm.TmTmxWriter; public class TestOkapiTmManager { private Mockery mockery; private ConfigService cfgService; private OkapiTmManager manager; private OkapiTmService tmService; private TmTmxWriter tmxWriter; private TmPenalizer penalizer; @Rule public ExpectedException thrown = ExpectedException.none(); @Before public void before() throws URISyntaxException, IOException, ConfigTransferService.TransferException { File testTmIndices = OkapiTmTestHelpers.getTestOkapiTmDir(); OkapiTmTestHelpers.deleteDirectory(testTmIndices); testTmIndices.mkdirs(); mockery = new Mockery(); } @Test public void testInitializeNewTm() throws IOException, ConfigTransferService.TransferException, URISyntaxException { tmxWriter = mockery.mock(TmTmxWriter.class); penalizer = mockery.mock(TmPenalizer.class); cfgService = mockery.mock(ConfigService.class); final OcelotRootConfig rootConfig = setupNewForeignDataDir(); final TmManagement.TmConfig tmConfig = rootConfig.getTmManagement().getTms().get(0); final File tmDataDir = new File(tmConfig.getTmDataDir()); assertTrue(tmDataDir.exists()); final String INIT_TM_NAME = "initTM"; final TmManagement.TmConfig initNewConfig = new TmManagement.TmConfig(); initNewConfig.setTmName(INIT_TM_NAME); initNewConfig.setTmDataDir(tmConfig.getTmDataDir()); initNewConfig.setEnabled(true); final List<TmManagement.TmConfig> configTms = new ArrayList(); configTms.add(initNewConfig); mockery.checking(new Expectations() { { allowing(cfgService).getTms(); will(onConsecutiveCalls( returnValue(new ArrayList()), returnValue(configTms))); allowing(cfgService).saveConfig(); allowing(cfgService).getTmConfig(with(INIT_TM_NAME)); will(onConsecutiveCalls( returnValue(null), returnValue(initNewConfig), returnValue(initNewConfig), returnValue(initNewConfig))); allowing(cfgService).getTmConfig(with(tmConfig.getTmName())); will(returnValue(null)); allowing(cfgService).createNewTmConfig(with(INIT_TM_NAME), with(true), with(tmConfig.getTmDataDir())); allowing(cfgService).getFuzzyThreshold(); will(returnValue(1.0)); allowing(cfgService).getMaxResults(); will(returnValue(100)); allowing(penalizer).applyPenalties(with(any(List.class))); will(new OkapiTmTestHelpers.ReturnFirstArgument()); } }); manager = new OkapiTmManager(OkapiTmTestHelpers.getTestOkapiTmDir(), cfgService, tmxWriter); tmService = new OkapiTmService(manager, penalizer, cfgService); manager.initializeNewTm(INIT_TM_NAME, tmDataDir); List<SegmentAtom> appleOrange = new SimpleSegmentVariant("apple orange").getAtoms(); assertEquals(2, tmService.getFuzzyTermMatches(appleOrange).size()); } @Test public void testChangingTmDataDir() throws IOException, ConfigTransferService.TransferException, URISyntaxException { tmxWriter = mockery.mock(TmTmxWriter.class); penalizer = mockery.mock(TmPenalizer.class); final OcelotRootConfig oldRootConfig = setupOldForeignDataDir(); final TmManagement.TmConfig oldTmConfig = oldRootConfig.getTmManagement().getTms().get(0); final File oldDataDir = new File(oldTmConfig.getTmDataDir()); assertTrue(oldDataDir.exists()); final OcelotRootConfig newRootConfig = setupNewForeignDataDir(); final TmManagement.TmConfig newTmConfig = newRootConfig.getTmManagement().getTms().get(0); final File newDataDir = new File(newTmConfig.getTmDataDir()); assertTrue(newDataDir.exists()); cfgService = mockery.mock(ConfigService.class); mockery.checking(new Expectations() { { allowing(cfgService).getTms(); will(onConsecutiveCalls( returnValue(new ArrayList()), returnValue(oldRootConfig.getTmManagement().getTms()), returnValue(oldRootConfig.getTmManagement().getTms()))); allowing(cfgService).saveConfig(); allowing(cfgService).getTmConfig(oldTmConfig.getTmName()); will(onConsecutiveCalls( returnValue(null), returnValue(oldTmConfig), returnValue(oldTmConfig), returnValue(oldTmConfig), returnValue(oldTmConfig), returnValue(oldTmConfig), returnValue(oldTmConfig), returnValue(oldTmConfig))); allowing(cfgService).createNewTmConfig(with(oldTmConfig.getTmName()), with(true), with(oldTmConfig.getTmDataDir())); allowing(cfgService).getTmConfig(with("non-existent")); will(returnValue(null)); oneOf(cfgService).saveTmDataDir(with(oldTmConfig), with(newDataDir.getAbsolutePath())); allowing(cfgService).getFuzzyThreshold(); will(returnValue(1.0)); allowing(cfgService).getMaxResults(); will(returnValue(100)); allowing(penalizer).applyPenalties(with(any(List.class))); will(new OkapiTmTestHelpers.ReturnFirstArgument()); } }); manager = new OkapiTmManager(OkapiTmTestHelpers.getTestOkapiTmDir(), cfgService, tmxWriter); tmService = new OkapiTmService(manager, penalizer, cfgService); // Index existing TM manager.initializeNewTm(oldTmConfig.getTmName(), oldDataDir); List<SegmentAtom> appleOrange = new SimpleSegmentVariant("apple orange").getAtoms(); assertEquals(0, tmService.getFuzzyTermMatches(appleOrange).size()); // Change TM to new data directory manager.changeTmDataDir(oldTmConfig.getTmName(), newDataDir); assertEquals(2, tmService.getFuzzyTermMatches(appleOrange).size()); assertTrue(oldDataDir.exists()); assertTrue(newDataDir.exists()); thrown.expect(IOException.class); manager.changeTmDataDir("non-existent", newDataDir); } static OcelotRootConfig setupOldForeignDataDir() throws IOException, URISyntaxException { File packageDir = new File(TestOkapiTmManager.class.getResource("").toURI()); final String existingTmName = "exists"; File emptyTmx = new File(TestOkapiTmManager.class.getResource("empty.tmx").toURI()); return new TmConfigBuilder(packageDir) .tmName(existingTmName) .testTmFileResource(emptyTmx) .build(); } static OcelotRootConfig setupNewForeignDataDir() throws IOException, URISyntaxException { File packageDir = new File(TestOkapiTmManager.class.getResource("/").toURI()); final String newTmName = "new"; File newTmx = new File(TestOkapiTmManager.class.getResource("simple_tm.tmx").toURI()); return new TmConfigBuilder(packageDir) .tmName(newTmName) .testTmFileResource(newTmx) .fuzzyThreshold(1) .maxResults(100) .build(); } @AfterClass public static void cleanup() throws URISyntaxException { OkapiTmTestHelpers.deleteDirectory(OkapiTmTestHelpers.getTestOkapiTmDir()); File packageDir = new File(TestOkapiTmManager.class.getResource("").toURI()); OkapiTmTestHelpers.deleteDirectory(new File(packageDir, "new")); OkapiTmTestHelpers.deleteDirectory(new File(packageDir, "old")); } }