/*
* Copyright (c) 2008-2013 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.db.server.upgrade.impl.negative;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.io.IOException;
import java.lang.Thread;
import java.lang.reflect.Method;
import com.emc.storageos.db.server.upgrade.util.MigrationServer;
import static com.emc.storageos.db.server.upgrade.util.DbSchemaChanger.InjectModeEnum;
/**
* tests services crash and recover in upgrade scenario
*/
public class DbCrashInjectionTestBase {
private static final Logger log = LoggerFactory.getLogger(DbCrashInjectionTestBase.class);
protected void upgradeNegativeTest(Method method, InjectModeEnum mode) throws Exception {
if (method == null) {
throw new IllegalArgumentException("method should not be null");
}
log.info("inject point: {}, mode: {}", method.toString(), mode.toString());
int killResult = startMigrationProcess(method, mode);
if (killResult == 0) {
log.error("Failed to make service crash!");
return;
}
log.info("Begin to remigration...");
startMigrationProcess(null, null);
}
private int startMigrationProcess(Method method, InjectModeEnum mode) throws Exception {
String classPath = System.getProperty("java.class.path");
ProcessBuilder processBuilder = null;
if (method == null) {
processBuilder = new ProcessBuilder("java",
"-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000",
"-cp", classPath, MigrationServer.class.getName());
} else {
processBuilder = new ProcessBuilder("java",
"-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000",
"-cp", classPath, MigrationServer.class.getName(),
method.getDeclaringClass().getName(), method.getName(), mode.toString());
}
processBuilder.redirectErrorStream(true);
processBuilder.directory(new File("."));
final Process pMigration = processBuilder.start();
doWaitFor(pMigration);
return pMigration.exitValue();
}
private void doWaitFor(Process process) {
startReadStreamThread(process.getInputStream());
try {
process.waitFor();
} catch (InterruptedException e) {
log.warn("e=", e);
}
}
private void startReadStreamThread(final InputStream is) {
new Thread() {
public void run() {
BufferedReader br = new BufferedReader(new InputStreamReader(is));
try {
String line = null;
while ((line = br.readLine()) != null) {
log.info("{}", line);
}
} catch (IOException e) {
log.error("e=", e);
} finally {
try {
br.close();
} catch (IOException e) {
log.error("e=", e);
}
}
}
}.start();
}
}