blob: 6fb9872fee117af456e19ef5aa8136f735893a0b [file] [log] [blame]
/*
* 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.ignite.internal.util;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteSystemProperties;
import org.apache.ignite.internal.util.typedef.X;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static java.lang.String.join;
import static java.lang.System.clearProperty;
import static java.lang.System.getProperty;
import static java.lang.System.setProperty;
import static org.apache.ignite.internal.util.IgniteUtils.workDirectory;
import static org.apache.ignite.internal.util.typedef.internal.U.getIgniteHome;
import static org.apache.ignite.internal.util.typedef.internal.U.nullifyHomeDirectory;
import static org.apache.ignite.testframework.GridTestUtils.assertThrows;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
/** */
public class IgniteUtilsWorkDirectoryTest {
/** */
private static final String USER_WORK_DIR = join(File.separator,
getIgniteHome(), "userWorkDirTest");
/** */
private static final String USER_IGNITE_HOME = join(File.separator,
getIgniteHome(), "userIgniteHomeTest");
/** */
private static final String USER_DIR_PROPERTY_VALUE = join(File.separator,
new File(getIgniteHome()).getParent(), "userDirPropertyTest");
/** */
private static String dfltIgniteHome;
/** */
private static String dfltUserDir;
/** */
@Before
public void setup() {
dfltIgniteHome = getProperty(IgniteSystemProperties.IGNITE_HOME);
dfltUserDir = getProperty("user.dir");
clearProperty(IgniteSystemProperties.IGNITE_HOME);
clearProperty("user.dir");
}
/** */
@After
public void tearDown() {
if (dfltIgniteHome != null)
setProperty(IgniteSystemProperties.IGNITE_HOME, dfltIgniteHome);
if (dfltUserDir != null)
setProperty("user.dir", dfltUserDir);
}
/**
* The work directory specified by the user has the highest priority
*/
@Test
public void testWorkDirectory1() {
executeGenericTest(true, false, false,
USER_WORK_DIR);
}
/**
* The work directory specified by the user has the highest priority
*/
@Test
public void testWorkDirectory2() {
executeGenericTest(true, false, true,
USER_WORK_DIR);
}
/**
* The work directory specified by the user has the highest priority
*/
@Test
public void testWorkDirectory3() {
executeGenericTest(true, true, false,
USER_WORK_DIR);
}
/**
* The work directory specified by the user has the highest priority
*/
@Test
public void testWorkDirectory4() {
executeGenericTest(true, true, true,
USER_WORK_DIR);
}
/**
* The method set/clear "user.dir" system property and invoke
* {@link IgniteUtils#workDirectory(java.lang.String, java.lang.String)}
* with ignite work directory and ignite home directory provided by user
*
* @param userWorkDirFlag need or not to pass userWorkDir to {@link IgniteUtils#workDirectory(java.lang.String, java.lang.String)}
* @param userIgniteHomeFlag need or not to pass userIgniteHome to {@link IgniteUtils#workDirectory(java.lang.String, java.lang.String)}
* @param userDirPropFlag need to set or clear "user.dir" system property
* @param expWorkDir expected Ignite work directory that will be returned by
* {@link IgniteUtils#workDirectory(java.lang.String, java.lang.String)}
*/
private void executeGenericTest(boolean userWorkDirFlag, boolean userIgniteHomeFlag,
boolean userDirPropFlag, String expWorkDir) {
if (userDirPropFlag)
setProperty("user.dir", USER_DIR_PROPERTY_VALUE);
else
clearProperty("user.dir");
String userWorkDir = "";
if (userWorkDirFlag)
userWorkDir = USER_WORK_DIR;
nullifyHomeDirectory();
clearProperty(IgniteSystemProperties.IGNITE_HOME);
String userIgniteHome = "";
if (userIgniteHomeFlag)
userIgniteHome = USER_IGNITE_HOME;
String actualWorkDir = null;
try {
actualWorkDir = workDirectory(userWorkDir, userIgniteHome);
}
catch (Throwable e) {
fail();
}
assertEquals(expWorkDir, actualWorkDir);
}
/** */
@Test
public void testNonAbsolutePathWorkDir() {
genericPathExceptionTest("nonAbsolutePathTestDirectory",
"Work directory path must be absolute: nonAbsolutePathTestDirectory");
}
/**
* This test only makes sense on Linux platform.
*/
@Test
public void testDisabledWriteToWorkDir() {
String strDir = join(File.separator, USER_WORK_DIR, "CannotWriteTestDirectory");
File dir = new File(strDir);
if (dir.exists()) {
resetPermission(strDir);
boolean deleted = U.delete(dir);
assertTrue("cannot delete file", deleted);
}
dir.mkdirs();
try {
executeCommand("chmod 444 " + strDir);
executeCommand("chattr +i " + strDir);
genericPathExceptionTest(strDir, "Cannot write to work directory: " + strDir);
}
finally {
resetPermission(strDir);
}
}
/**
* This test only makes sense on Linux platform.
*/
@Test
public void testDisabledWorkDirCreation() {
String strDirParent = join(File.separator, USER_WORK_DIR, "CannotWriteTestDirectory");
File dirParent = new File(strDirParent);
if (dirParent.exists()) {
resetPermission(strDirParent);
boolean deleted = U.delete(dirParent);
assertTrue("cannot delete file", deleted);
}
dirParent.mkdirs();
try {
executeCommand("chmod 444 " + strDirParent);
executeCommand("chattr +i " + strDirParent);
String strDir = join(File.separator, strDirParent, "newDirectory");
genericPathExceptionTest(strDir, "Work directory does not exist and cannot be created: " + strDir);
}
finally {
resetPermission(strDirParent);
}
}
/** */
private static void resetPermission(String dir) {
executeCommand("chattr -i " + dir);
executeCommand("chmod 777 " + dir);
}
/** */
private static void executeCommand(String cmd) {
X.println("Command to execute: " + cmd);
try {
Process proc = Runtime.getRuntime().exec(cmd);
BufferedReader stdInput = new BufferedReader(new
InputStreamReader(proc.getInputStream()));
BufferedReader stdError = new BufferedReader(new
InputStreamReader(proc.getErrorStream()));
String s;
while ((s = stdInput.readLine()) != null)
X.println("stdInput: " + s);
while ((s = stdError.readLine()) != null)
X.println("stdError:" + s);
}
catch (Exception e) {
fail();
}
}
/** */
private void genericPathExceptionTest(String userWorkDir, String expMsg) {
assertThrows(null,
() -> workDirectory(userWorkDir, null),
IgniteCheckedException.class,
expMsg
);
}
}