HDFS-5907. Add test cases missed in previous checkin
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/HDFS-5535@1568529 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
9830ef0d32
commit
8741c3b951
|
@ -0,0 +1,150 @@
|
|||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.apache.hadoop.hdfs.server.datanode;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.apache.hadoop.hdfs.server.common.Storage;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Random;
|
||||
import java.util.UUID;
|
||||
|
||||
import static org.hamcrest.core.Is.is;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
/**
|
||||
* Test that BlockPoolSliceStorage can correctly generate trash and
|
||||
* restore directories for a given block file path.
|
||||
*/
|
||||
public class TestBlockPoolSliceStorage {
|
||||
public static final Log LOG = LogFactory.getLog(TestBlockPoolSliceStorage.class);
|
||||
|
||||
Random rand = new Random();
|
||||
BlockPoolSliceStorage storage;
|
||||
|
||||
/**
|
||||
* BlockPoolSliceStorage with a dummy storage directory. The directory
|
||||
* need not exist. We need to extend BlockPoolSliceStorage so we can
|
||||
* call {@link Storage#addStorageDir}.
|
||||
*/
|
||||
private static class StubBlockPoolSliceStorage extends BlockPoolSliceStorage {
|
||||
StubBlockPoolSliceStorage(int namespaceID, String bpID, long cTime,
|
||||
String clusterId) {
|
||||
super(namespaceID, bpID, cTime, clusterId);
|
||||
addStorageDir(new StorageDirectory(new File("/tmp/dontcare/" + bpID)));
|
||||
assertThat(storageDirs.size(), is(1));
|
||||
}
|
||||
}
|
||||
|
||||
private String makeRandomIpAddress() {
|
||||
return rand.nextInt(256) + "." +
|
||||
rand.nextInt(256) + "." +
|
||||
rand.nextInt(256) + "." +
|
||||
rand.nextInt(256);
|
||||
}
|
||||
|
||||
private String makeRandomBlockpoolId() {
|
||||
return "BP-" + rand.nextInt(Integer.MAX_VALUE) +
|
||||
"-" + makeRandomIpAddress() +
|
||||
"-" + rand.nextInt(Integer.MAX_VALUE);
|
||||
}
|
||||
|
||||
private BlockPoolSliceStorage makeBlockPoolStorage() {
|
||||
return new StubBlockPoolSliceStorage(
|
||||
rand.nextInt(Integer.MAX_VALUE),
|
||||
makeRandomBlockpoolId(),
|
||||
rand.nextInt(Integer.MAX_VALUE),
|
||||
UUID.randomUUID().toString());
|
||||
}
|
||||
|
||||
private String makeRandomBlockFileSubdir(int nestingLevel) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
sb.append("/");
|
||||
|
||||
for (int i = 0; i < nestingLevel; ++i) {
|
||||
sb.append("subdir" + rand.nextInt(64) + "/");
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test conversion from a block file path to its target trash
|
||||
* directory.
|
||||
*/
|
||||
public void getTrashDirectoryForBlockFile(String fileName, int nestingLevel) {
|
||||
final String blockFileSubdir = makeRandomBlockFileSubdir(nestingLevel);
|
||||
final String blockFileName = fileName;
|
||||
|
||||
String testFilePath =
|
||||
storage.getSingularStorageDir().getRoot() + "/" +
|
||||
Storage.STORAGE_DIR_CURRENT +
|
||||
blockFileSubdir + blockFileName;
|
||||
|
||||
String expectedTrashPath =
|
||||
storage.getSingularStorageDir().getRoot() + "/" +
|
||||
BlockPoolSliceStorage.TRASH_ROOT_DIR +
|
||||
blockFileSubdir.substring(0, blockFileSubdir.length() - 1);
|
||||
|
||||
LOG.info("Got subdir " + blockFileSubdir);
|
||||
LOG.info("Generated file path " + testFilePath);
|
||||
assertThat(storage.getTrashDirectory(new File(testFilePath)), is(expectedTrashPath));
|
||||
}
|
||||
|
||||
/*
|
||||
* Test conversion from a block file in a trash directory to its
|
||||
* target directory for restore.
|
||||
*/
|
||||
public void getRestoreDirectoryForBlockFile(String fileName, int nestingLevel) {
|
||||
BlockPoolSliceStorage storage = makeBlockPoolStorage();
|
||||
final String blockFileSubdir = makeRandomBlockFileSubdir(nestingLevel);
|
||||
final String blockFileName = fileName;
|
||||
|
||||
String deletedFilePath =
|
||||
storage.getSingularStorageDir().getRoot() + "/" +
|
||||
BlockPoolSliceStorage.TRASH_ROOT_DIR +
|
||||
blockFileSubdir + blockFileName;
|
||||
|
||||
String expectedRestorePath =
|
||||
storage.getSingularStorageDir().getRoot() + "/" +
|
||||
Storage.STORAGE_DIR_CURRENT +
|
||||
blockFileSubdir.substring(0, blockFileSubdir.length() - 1);
|
||||
|
||||
LOG.info("Generated deleted file path " + deletedFilePath);
|
||||
assertThat(storage.getRestoreDirectory(new File(deletedFilePath)),
|
||||
is(expectedRestorePath));
|
||||
|
||||
}
|
||||
|
||||
@Test (timeout=300000)
|
||||
public void testGetTrashAndRestoreDirectories() {
|
||||
storage = makeBlockPoolStorage();
|
||||
|
||||
// Test a few different nesting levels since block files
|
||||
// could be nested such as subdir1/subdir5/blk_...
|
||||
// Make sure all nesting levels are handled correctly.
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
getTrashDirectoryForBlockFile("blk_myblockfile", i);
|
||||
getTrashDirectoryForBlockFile("blk_myblockfile.meta", i);
|
||||
getRestoreDirectoryForBlockFile("blk_myblockfile", i);
|
||||
getRestoreDirectoryForBlockFile("blk_myblockfile.meta", i);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,177 @@
|
|||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hadoop.hdfs.server.datanode;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.apache.commons.logging.impl.Log4JLogger;
|
||||
import org.apache.hadoop.conf.Configuration;
|
||||
import org.apache.hadoop.fs.Path;
|
||||
import org.apache.hadoop.hdfs.DFSTestUtil;
|
||||
import org.apache.hadoop.hdfs.DistributedFileSystem;
|
||||
import org.apache.hadoop.hdfs.HdfsConfiguration;
|
||||
import org.apache.hadoop.hdfs.MiniDFSCluster;
|
||||
import org.apache.hadoop.hdfs.MiniDFSCluster.DataNodeProperties;
|
||||
import org.apache.hadoop.hdfs.tools.DFSAdmin;
|
||||
import org.apache.log4j.Level;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import static org.hamcrest.core.Is.is;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
/**
|
||||
* Ensure that the DataNode correctly handles rolling upgrade
|
||||
* finalize and rollback.
|
||||
*/
|
||||
public class TestDataNodeRollingUpgrade {
|
||||
private static final Log LOG = LogFactory.getLog(TestDataNodeRollingUpgrade.class);
|
||||
|
||||
private static final short REPL_FACTOR = 1;
|
||||
private static final long FILE_SIZE = 1024L;
|
||||
private static final long SEED = 0x1BADF00DL;
|
||||
|
||||
Configuration conf;
|
||||
MiniDFSCluster cluster = null;
|
||||
DistributedFileSystem fs;
|
||||
|
||||
private void runCmd(DFSAdmin dfsadmin, String... args) throws Exception {
|
||||
assertThat(dfsadmin.run(args), is(0));
|
||||
}
|
||||
|
||||
private void startRollingUpgrade() throws Exception {
|
||||
LOG.info("Starting rolling upgrade");
|
||||
final DFSAdmin dfsadmin = new DFSAdmin(conf);
|
||||
runCmd(dfsadmin, "-rollingUpgrade", "start");
|
||||
}
|
||||
|
||||
private void finalizeRollingUpgrade() throws Exception {
|
||||
LOG.info("Finalizing rolling upgrade");
|
||||
final DFSAdmin dfsadmin = new DFSAdmin(conf);
|
||||
runCmd(dfsadmin, "-rollingUpgrade", "finalize");
|
||||
}
|
||||
|
||||
private void rollbackRollingUpgrade() throws Exception {
|
||||
LOG.info("Starting rollback of the rolling upgrade");
|
||||
|
||||
// Shutdown the DN and the NN in preparation for rollback.
|
||||
DataNodeProperties dnprop = cluster.stopDataNode(0);
|
||||
cluster.shutdownNameNodes();
|
||||
|
||||
// Restart the daemons with rollback flags.
|
||||
cluster.restartNameNode("-rollingupgrade", "rollback");
|
||||
dnprop.setDnArgs("-rollingupgrade", "rollback");
|
||||
cluster.restartDataNode(dnprop);
|
||||
cluster.waitActive();
|
||||
}
|
||||
|
||||
@Test (timeout=600000)
|
||||
public void testDatanodeRollingUpgradeWithFinalize() throws Exception {
|
||||
// start a cluster
|
||||
try {
|
||||
// Start a cluster.
|
||||
conf = new HdfsConfiguration();
|
||||
cluster = new MiniDFSCluster.Builder(conf).numDataNodes(REPL_FACTOR).build();
|
||||
cluster.waitActive();
|
||||
fs = cluster.getFileSystem();
|
||||
Path testFile1 = new Path("/TestDataNodeRollingUpgrade1.dat");
|
||||
Path testFile2 = new Path("/TestDataNodeRollingUpgrade2.dat");
|
||||
|
||||
// Create files in DFS.
|
||||
DFSTestUtil.createFile(fs, testFile1, FILE_SIZE, REPL_FACTOR, SEED);
|
||||
DFSTestUtil.createFile(fs, testFile2, FILE_SIZE, REPL_FACTOR, SEED);
|
||||
|
||||
startRollingUpgrade();
|
||||
|
||||
// Sleep briefly so that DN learns of the rolling upgrade
|
||||
// from heartbeats.
|
||||
cluster.triggerHeartbeats();
|
||||
Thread.sleep(5000);
|
||||
|
||||
fs.delete(testFile2, false);
|
||||
|
||||
// Sleep briefly so that block files can be moved to trash
|
||||
// (this is scheduled for asynchronous execution).
|
||||
cluster.triggerBlockReports();
|
||||
Thread.sleep(5000);
|
||||
|
||||
finalizeRollingUpgrade();
|
||||
|
||||
// Ensure that testFile2 stays deleted.
|
||||
assert(!fs.exists(testFile2));
|
||||
assert(fs.exists(testFile1));
|
||||
|
||||
} finally {
|
||||
if (cluster != null) {
|
||||
cluster.shutdown();
|
||||
cluster = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test (timeout=600000)
|
||||
public void testDatanodeRollingUpgradeWithRollback() throws Exception {
|
||||
// start a cluster
|
||||
try {
|
||||
// Start a cluster.
|
||||
conf = new HdfsConfiguration();
|
||||
cluster = new MiniDFSCluster.Builder(conf).numDataNodes(REPL_FACTOR).build();
|
||||
cluster.waitActive();
|
||||
fs = cluster.getFileSystem();
|
||||
Path testFile1 = new Path("/TestDataNodeRollingUpgrade1.dat");
|
||||
|
||||
// Create files in DFS.
|
||||
DFSTestUtil.createFile(fs, testFile1, FILE_SIZE, REPL_FACTOR, SEED);
|
||||
String fileContents1 = DFSTestUtil.readFile(fs, testFile1);
|
||||
|
||||
startRollingUpgrade();
|
||||
|
||||
// Sleep briefly so that DN learns of the rolling upgrade
|
||||
// from heartbeats.
|
||||
cluster.triggerHeartbeats();
|
||||
Thread.sleep(5000);
|
||||
|
||||
LOG.info("Deleting file during rolling upgrade");
|
||||
fs.delete(testFile1, false);
|
||||
|
||||
// Sleep briefly so that block files can be moved to trash
|
||||
// (this is scheduled for asynchronous execution).
|
||||
cluster.triggerBlockReports();
|
||||
Thread.sleep(5000);
|
||||
assert(!fs.exists(testFile1));
|
||||
|
||||
// Now perform a rollback to restore DFS to the pre-rollback state.
|
||||
rollbackRollingUpgrade();
|
||||
|
||||
// Ensure that testFile1 was restored after the rollback.
|
||||
assert(fs.exists(testFile1));
|
||||
String fileContents2 = DFSTestUtil.readFile(fs, testFile1);
|
||||
|
||||
// Ensure that file contents are the same.
|
||||
assertThat(fileContents1, is(fileContents2));
|
||||
} finally {
|
||||
if (cluster != null) {
|
||||
cluster.shutdown();
|
||||
cluster = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,100 @@
|
|||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.apache.hadoop.hdfs.server.datanode;
|
||||
|
||||
import org.apache.hadoop.conf.Configuration;
|
||||
import org.apache.hadoop.hdfs.HdfsConfiguration;
|
||||
import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.StartupOption;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.hamcrest.core.Is.is;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
/**
|
||||
* This test verifies DataNode command line processing.
|
||||
*/
|
||||
public class TestDatanodeStartupOptions {
|
||||
|
||||
private Configuration conf = null;
|
||||
|
||||
/**
|
||||
* Process the given arg list as command line arguments to the DataNode
|
||||
* to make sure we get the expected result. If the expected result is
|
||||
* success then further validate that the parsed startup option is the
|
||||
* same as what was expected.
|
||||
*
|
||||
* @param expectSuccess
|
||||
* @param expectedOption
|
||||
* @param conf
|
||||
* @param arg
|
||||
*/
|
||||
private static void checkExpected(boolean expectSuccess,
|
||||
StartupOption expectedOption,
|
||||
Configuration conf,
|
||||
String ... arg) {
|
||||
|
||||
String[] args = new String[arg.length];
|
||||
int i = 0;
|
||||
for (String currentArg : arg) {
|
||||
args[i++] = currentArg;
|
||||
}
|
||||
|
||||
boolean returnValue = DataNode.parseArguments(args, conf);
|
||||
StartupOption option = DataNode.getStartupOption(conf);
|
||||
assertThat(returnValue, is(expectSuccess));
|
||||
|
||||
if (expectSuccess) {
|
||||
assertThat(option, is(expectedOption));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reinitialize configuration before every test since DN stores the
|
||||
* parsed StartupOption in the configuration.
|
||||
*/
|
||||
@Before
|
||||
public void initConfiguration() {
|
||||
conf = new HdfsConfiguration();
|
||||
}
|
||||
|
||||
/**
|
||||
* A few options that should all parse successfully.
|
||||
*/
|
||||
@Test (timeout=60000)
|
||||
public void testStartupSuccess() {
|
||||
checkExpected(true, StartupOption.REGULAR, conf);
|
||||
checkExpected(true, StartupOption.REGULAR, conf, "-regular");
|
||||
checkExpected(true, StartupOption.REGULAR, conf, "-REGULAR");
|
||||
checkExpected(true, StartupOption.ROLLBACK, conf, "-rollback");
|
||||
checkExpected(true, StartupOption.ROLLINGUPGRADE, conf, "-rollingupgrade", "rollback");
|
||||
checkExpected(true, StartupOption.ROLLINGUPGRADE, conf, "-rollingupgraDE", "ROLLBack");
|
||||
}
|
||||
|
||||
/**
|
||||
* A few options that should all fail to parse.
|
||||
*/
|
||||
@Test (timeout=60000)
|
||||
public void testStartupFailure() {
|
||||
checkExpected(false, StartupOption.REGULAR, conf, "unknownoption");
|
||||
checkExpected(false, StartupOption.REGULAR, conf, "-regular -rollback");
|
||||
checkExpected(false, StartupOption.REGULAR, conf, "-rollingupgrade", "downgrade");
|
||||
checkExpected(false, StartupOption.REGULAR, conf, "-rollingupgrade", "unknownoption");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,100 @@
|
|||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.apache.hadoop.hdfs.server.datanode;
|
||||
|
||||
import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.*;
|
||||
import org.junit.Test;
|
||||
|
||||
import static junit.framework.Assert.fail;
|
||||
import static org.hamcrest.core.Is.is;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
|
||||
/**
|
||||
* Test enumerations in TestHdfsServerConstants.
|
||||
*/
|
||||
public class TestHdfsServerConstants {
|
||||
|
||||
/**
|
||||
* Verify that parsing a StartupOption string gives the expected results.
|
||||
* If a RollingUpgradeStartupOption is specified than it is also checked.
|
||||
*
|
||||
* @param value
|
||||
* @param expectedOption
|
||||
* @param expectedRollupOption optional, may be null.
|
||||
*/
|
||||
private static void verifyStartupOptionResult(String value,
|
||||
StartupOption expectedOption,
|
||||
RollingUpgradeStartupOption expectedRollupOption) {
|
||||
|
||||
StartupOption option = StartupOption.getEnum(value);
|
||||
assertThat(option, is(expectedOption));
|
||||
|
||||
if (expectedRollupOption != null) {
|
||||
assertThat(option.getRollingUpgradeStartupOption(), is(expectedRollupOption));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that we can parse a StartupOption string without the optional
|
||||
* RollingUpgradeStartupOption.
|
||||
*/
|
||||
@Test
|
||||
public void testStartupOptionParsing() {
|
||||
verifyStartupOptionResult("FORMAT", StartupOption.FORMAT, null);
|
||||
verifyStartupOptionResult("REGULAR", StartupOption.REGULAR, null);
|
||||
verifyStartupOptionResult("CHECKPOINT", StartupOption.CHECKPOINT, null);
|
||||
verifyStartupOptionResult("UPGRADE", StartupOption.UPGRADE, null);
|
||||
verifyStartupOptionResult("ROLLBACK", StartupOption.ROLLBACK, null);
|
||||
verifyStartupOptionResult("FINALIZE", StartupOption.FINALIZE, null);
|
||||
verifyStartupOptionResult("ROLLINGUPGRADE", StartupOption.ROLLINGUPGRADE, null);
|
||||
verifyStartupOptionResult("IMPORT", StartupOption.IMPORT, null);
|
||||
verifyStartupOptionResult("INITIALIZESHAREDEDITS", StartupOption.INITIALIZESHAREDEDITS, null);
|
||||
|
||||
try {
|
||||
verifyStartupOptionResult("UNKNOWN(UNKNOWNOPTION)", StartupOption.FORMAT, null);
|
||||
fail("Failed to get expected IllegalArgumentException");
|
||||
} catch(IllegalArgumentException iae) {
|
||||
// Expected!
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that we can parse a StartupOption string with a
|
||||
* RollingUpgradeStartupOption.
|
||||
*/
|
||||
@Test
|
||||
public void testRollingUpgradeStartupOptionParsing() {
|
||||
verifyStartupOptionResult("ROLLINGUPGRADE(ROLLBACK)",
|
||||
StartupOption.ROLLINGUPGRADE,
|
||||
RollingUpgradeStartupOption.ROLLBACK);
|
||||
verifyStartupOptionResult("ROLLINGUPGRADE(DOWNGRADE)",
|
||||
StartupOption.ROLLINGUPGRADE,
|
||||
RollingUpgradeStartupOption.DOWNGRADE);
|
||||
verifyStartupOptionResult("ROLLINGUPGRADE(STARTED)",
|
||||
StartupOption.ROLLINGUPGRADE,
|
||||
RollingUpgradeStartupOption.STARTED);
|
||||
|
||||
try {
|
||||
verifyStartupOptionResult("ROLLINGUPGRADE(UNKNOWNOPTION)", StartupOption.ROLLINGUPGRADE, null);
|
||||
fail("Failed to get expected IllegalArgumentException");
|
||||
} catch(IllegalArgumentException iae) {
|
||||
// Expected!
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue