package com.opower.updater;
import com.opower.updater.admin.KijiLayoutUpdateTable;
import com.opower.updater.admin.KijiLayoutUpdateTableUtils;
import com.opower.updater.admin.LayoutUpdateTable;
import com.opower.updater.admin.loader.DDLTokenReplacer;
import com.opower.updater.ddl.KijiDDLRunner;
import com.opower.updater.operation.TableCreator;
import org.junit.Test;
import org.kiji.schema.shell.api.Client;
import org.kiji.schema.tools.BaseTool;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertTrue;
/**
* Tests for {@link com.opower.updater.UpdaterUpdateTool}.
*
* @author felix.trepanier
*/
public class TestUpdaterUpdateTool extends UpdaterToolTest {
@Test
public void testUpdateFailsItTableDoesNotExists() throws Exception {
assertEquals(BaseTool.FAILURE, runTool(updateTool(), "--table=" + tableURI));
checkLastPrintedLineIsAnError();
}
@Test
public void testUpdateFailsIfTableDoesNotExistInLayoutUpdateAndBootstrapIsFalse() throws Exception {
Client client = Client.newInstance(getKiji().getURI());
client.executeUpdate(loader.loadCreateTable(TABLE_NAME)
.getDDL()
.replaceAll(DDLTokenReplacer.TOKEN_DELIMITER
+ UpdaterCreateTool.NUM_REGIONS_TOKEN
+ DDLTokenReplacer.TOKEN_DELIMITER,
"1"));
assertEquals(BaseTool.FAILURE, runTool(updateTool(), "--table=" + tableURI));
checkLastPrintedLineIsAnError();
client.close();
}
@Test
public void testUpdateInsertInitialLayoutIfTableAlreadyExistInKijiInstanceButNotInLayoutUpdateTable()
throws Exception {
String createDDL = loader.loadCreateTable("test")
.getDDL()
.replaceAll(DDLTokenReplacer.TOKEN_DELIMITER
+ UpdaterCreateTool.NUM_REGIONS_TOKEN
+ DDLTokenReplacer.TOKEN_DELIMITER,
"1");
Client client = Client.newInstance(getKiji().getURI());
client.executeUpdate(createDDL);
assertEquals(BaseTool.SUCCESS, runTool(updateTool(), "--table=" + tableURI, "--bootstrap=true"));
client.close();
assertTestTableComplete();
Collection<LayoutUpdate> history =
KijiLayoutUpdateTable.newInstance(getKiji()).getTableHistory(tableURI.getTable(), null);
// history should contain the bootstrapped DDL and the 2 updates
assertEquals(3, history.size());
// the first update should be the create table statement
assertTrue(new ArrayList<LayoutUpdate>(history).get(2).getAppliedDDL().contains("CREATE TABLE"));
}
@Test
public void testUpdate() throws Exception {
createTestTable();
assertEquals(BaseTool.SUCCESS, runTool(updateTool(), "--table=" + tableURI));
assertTestTableComplete();
}
private void createTestTable() throws IOException {
KijiLayoutUpdateTableUtils.ensureLayoutUpdateTableExists(getKiji());
LayoutUpdateTable updateTable = KijiLayoutUpdateTable.newInstance(getKiji());
Client client = Client.newInstance(getKiji().getURI());
Map<String, String> tokenMap = new HashMap<String, String>(1);
tokenMap.put(UpdaterCreateTool.NUM_REGIONS_TOKEN, "1");
DDLTokenReplacer tokenReplacer = new DDLTokenReplacer(tokenMap);
TableCreator creator;
try {
creator = new TableCreator(new KijiDDLRunner(client), updateTable, getKiji().getMetaTable());
creator.createTable("test", tokenReplacer.processUpdate(loader.loadCreateTable(TABLE_NAME)));
}
finally {
updateTable.close();
client.close();
}
}
private UpdaterUpdateTool updateTool() {
return new UpdaterUpdateTool(fakeUpdaterLocker);
}
}