blob: ec6c09b517af6e8042e6981bf235e6894fda1e68 [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 libcore.java.lang;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.Permission;
import java.util.Arrays;
import libcore.junit.junit3.TestCaseWithRules;
import libcore.junit.util.SwitchTargetSdkVersionRule;
import libcore.junit.util.SwitchTargetSdkVersionRule.TargetSdkVersion;
import org.junit.Rule;
import org.junit.rules.TestRule;
import tests.support.resource.Support_Resources;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
public class OldRuntimeTest extends TestCaseWithRules {
@Rule
public TestRule switchTargetSdkVersionRule = SwitchTargetSdkVersionRule.getInstance();
Runtime r = Runtime.getRuntime();
InputStream is;
public void test_getRuntime() {
// Test for method java.lang.Runtime java.lang.Runtime.getRuntime()
assertNotNull(Runtime.getRuntime());
}
public void test_addShutdownHook() {
Thread thrException = new Thread () {
public void run() {
try {
Runtime.getRuntime().addShutdownHook(this);
fail("IllegalStateException was not thrown.");
} catch(IllegalStateException ise) {
//expected
}
}
};
try {
Runtime.getRuntime().addShutdownHook(thrException);
} catch (Throwable t) {
fail(t.getMessage());
}
try {
Runtime.getRuntime().addShutdownHook(thrException);
fail("IllegalArgumentException was not thrown.");
} catch(IllegalArgumentException iae) {
// expected
}
SecurityManager sm = new SecurityManager() {
public void checkPermission(Permission perm) {
if (perm.getName().equals("shutdownHooks")) {
throw new SecurityException();
}
}
};
// remove previously added hook so we're not depending on the priority
// of the Exceptions to be thrown.
Runtime.getRuntime().removeShutdownHook(thrException);
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException ie) {
}
}
public void test_availableProcessors() {
assertTrue(Runtime.getRuntime().availableProcessors() > 0);
}
public void test_execLjava_lang_StringLjava_lang_StringArray() {
String [] envp = getEnv();
checkExec(0, envp, null);
checkExec(0, null, null);
try {
Runtime.getRuntime().exec((String)null, null);
fail("NullPointerException should be thrown.");
} catch(IOException ioe) {
fail("IOException was thrown.");
} catch(NullPointerException npe) {
//expected
}
SecurityManager sm = new SecurityManager() {
public void checkPermission(Permission perm) {
if (perm.getName().equals("checkExec")) {
throw new SecurityException();
}
}
public void checkExec(String cmd) {
throw new SecurityException();
}
};
try {
Runtime.getRuntime().exec("", envp);
fail("IllegalArgumentException should be thrown.");
} catch(IllegalArgumentException iae) {
//expected
} catch (IOException e) {
fail("IOException was thrown.");
}
}
public void test_execLjava_lang_StringArrayLjava_lang_StringArray() {
String [] envp = getEnv();
checkExec(4, envp, null);
checkExec(4, null, null);
try {
Runtime.getRuntime().exec((String[])null, null);
fail("NullPointerException should be thrown.");
} catch(IOException ioe) {
fail("IOException was thrown.");
} catch(NullPointerException npe) {
//expected
}
try {
Runtime.getRuntime().exec(new String[]{"ls", null}, null);
fail("NullPointerException should be thrown.");
} catch(IOException ioe) {
fail("IOException was thrown.");
} catch(NullPointerException npe) {
//expected
}
SecurityManager sm = new SecurityManager() {
public void checkPermission(Permission perm) {
if (perm.getName().equals("checkExec")) {
throw new SecurityException();
}
}
public void checkExec(String cmd) {
throw new SecurityException();
}
};
try {
Runtime.getRuntime().exec(new String[]{}, envp);
fail("IndexOutOfBoundsException should be thrown.");
} catch(IndexOutOfBoundsException ioob) {
//expected
} catch (IOException e) {
fail("IOException was thrown.");
}
try {
Runtime.getRuntime().exec(new String[]{""}, envp);
fail("IOException should be thrown.");
} catch (IOException e) { /* expected */ }
}
public void test_execLjava_lang_StringLjava_lang_StringArrayLjava_io_File() {
String [] envp = getEnv();
File workFolder = Support_Resources.createTempFolder();
checkExec(2, envp, workFolder);
checkExec(2, null, null);
try {
Runtime.getRuntime().exec((String)null, null, workFolder);
fail("NullPointerException should be thrown.");
} catch(IOException ioe) {
fail("IOException was thrown.");
} catch(NullPointerException npe) {
//expected
}
SecurityManager sm = new SecurityManager() {
public void checkPermission(Permission perm) {
if (perm.getName().equals("checkExec")) {
throw new SecurityException();
}
}
public void checkExec(String cmd) {
throw new SecurityException();
}
};
try {
Runtime.getRuntime().exec("", envp, workFolder);
fail("SecurityException should be thrown.");
} catch(IllegalArgumentException iae) {
//expected
} catch (IOException e) {
fail("IOException was thrown.");
}
}
public void test_execLjava_lang_StringArrayLjava_lang_StringArrayLjava_io_File() {
String [] envp = getEnv();
File workFolder = Support_Resources.createTempFolder();
checkExec(5, envp, workFolder);
checkExec(5, null, null);
try {
Runtime.getRuntime().exec((String[])null, null, workFolder);
fail("NullPointerException should be thrown.");
} catch(IOException ioe) {
fail("IOException was thrown.");
} catch(NullPointerException npe) {
//expected
}
try {
Runtime.getRuntime().exec(new String[]{"ls", null}, null, workFolder);
fail("NullPointerException should be thrown.");
} catch(IOException ioe) {
fail("IOException was thrown.");
} catch(NullPointerException npe) {
//expected
}
SecurityManager sm = new SecurityManager() {
public void checkPermission(Permission perm) {
if (perm.getName().equals("checkExec")) {
throw new SecurityException();
}
}
public void checkExec(String cmd) {
throw new SecurityException();
}
};
try {
Runtime.getRuntime().exec(new String[]{""}, envp, workFolder);
fail("IOException should be thrown.");
} catch (IOException e) {
//expected
}
}
String [] getEnv() {
Object [] valueSet = System.getenv().values().toArray();
Object [] keySet = System.getenv().keySet().toArray();
String [] envp = new String[valueSet.length];
for(int i = 0; i < envp.length; i++) {
envp[i] = keySet[i] + "=" + valueSet[i];
}
return envp;
}
void checkExec(int testCase, String [] envp, File file) {
String dirName = "Test_Directory";
String dirParentName = "Parent_Directory";
File resources = Support_Resources.createTempFolder();
String folder = resources.getAbsolutePath() + "/" + dirName;
String folderWithParent = resources.getAbsolutePath() + "/" +
dirParentName + "/" + dirName;
String command = "mkdir " + folder;
String [] commandArguments = {"mkdir", folder};
try {
Process proc = null;
switch(testCase) {
case 0:
proc = Runtime.getRuntime().exec(command, envp);
break;
case 1:
proc = Runtime.getRuntime().exec(command);
break;
case 2:
proc = Runtime.getRuntime().exec(command, envp, file);
break;
case 3:
proc = Runtime.getRuntime().exec(commandArguments);
break;
case 4:
proc = Runtime.getRuntime().exec(commandArguments, envp);
break;
case 5:
proc = Runtime.getRuntime().exec(commandArguments, envp, file);
break;
}
assertNotNull(proc);
try {
Thread.sleep(3000);
} catch(InterruptedException ie) {
fail("InterruptedException was thrown.");
}
File f = new File(folder);
assertTrue(f.exists());
if(f.exists()) {
f.delete();
}
} catch(IOException io) {
fail("IOException was thrown.");
}
}
public void test_execLjava_lang_String() {
checkExec(1, null, null);
try {
Runtime.getRuntime().exec((String) null);
fail("NullPointerException was not thrown.");
} catch(NullPointerException npe) {
//expected
} catch (IOException e) {
fail("IOException was thrown.");
}
try {
Runtime.getRuntime().exec("");
fail("IllegalArgumentException was not thrown.");
} catch(IllegalArgumentException iae) {
//expected
} catch (IOException e) {
fail("IOException was thrown.");
}
}
public void test_execLjava_lang_StringArray() {
checkExec(3, null, null);
try {
Runtime.getRuntime().exec((String[]) null);
fail("NullPointerException was not thrown.");
} catch(NullPointerException npe) {
//expected
} catch (IOException e) {
fail("IOException was thrown.");
}
try {
Runtime.getRuntime().exec(new String[]{"ls", null});
fail("NullPointerException was not thrown.");
} catch(NullPointerException npe) {
//expected
} catch (IOException e) {
fail("IOException was thrown.");
}
try {
Runtime.getRuntime().exec(new String[]{});
fail("IndexOutOfBoundsException was not thrown.");
} catch(IndexOutOfBoundsException iobe) {
//expected
} catch (IOException e) {
fail("IOException was thrown.");
}
try {
Runtime.getRuntime().exec(new String[]{""});
fail("IOException should be thrown.");
} catch (IOException e) {
//expected
}
}
public void test_runFinalizersOnExit() {
Runtime.getRuntime().runFinalizersOnExit(true);
}
public void test_removeShutdownHookLjava_lang_Thread() {
Thread thr1 = new Thread () {
public void run() {
try {
Runtime.getRuntime().addShutdownHook(this);
} catch(IllegalStateException ise) {
fail("IllegalStateException shouldn't be thrown.");
}
}
};
try {
Runtime.getRuntime().addShutdownHook(thr1);
Runtime.getRuntime().removeShutdownHook(thr1);
} catch (Throwable t) {
fail(t.getMessage());
}
Thread thr2 = new Thread () {
public void run() {
try {
Runtime.getRuntime().removeShutdownHook(this);
fail("IllegalStateException wasn't thrown.");
} catch(IllegalStateException ise) {
//expected
}
}
};
try {
Runtime.getRuntime().addShutdownHook(thr2);
} catch (Throwable t) {
fail(t.getMessage());
}
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException ie) {
}
}
public void test_traceInstructions() {
Runtime.getRuntime().traceInstructions(false);
Runtime.getRuntime().traceInstructions(true);
Runtime.getRuntime().traceInstructions(false);
}
public void test_traceMethodCalls() {
Runtime.getRuntime().traceMethodCalls(false);
try {
Runtime.getRuntime().traceMethodCalls(true);
fail();
} catch (UnsupportedOperationException expected) {}
}
@SuppressWarnings("deprecation")
public void test_getLocalizedInputStream() throws Exception {
String simpleString = "Heart \u2f3c";
byte[] expected = simpleString.getBytes("UTF-8");
byte[] returned = new byte[expected.length];
ByteArrayInputStream bais = new ByteArrayInputStream(
simpleString.getBytes("UTF-8"));
InputStream lcIn =
Runtime.getRuntime().getLocalizedInputStream(bais);
lcIn.read(returned);
assertTrue("wrong result for String: " + simpleString,
Arrays.equals(expected, returned));
}
@SuppressWarnings("deprecation")
public void test_getLocalizedOutputStream() throws IOException {
String simpleString = "Heart \u2f3c";
byte[] expected = simpleString.getBytes("UTF-8");
ByteArrayOutputStream out = new ByteArrayOutputStream();
OutputStream lcOut =
Runtime.getRuntime().getLocalizedOutputStream(out);
lcOut.write(simpleString.getBytes("UTF-8"));
lcOut.flush();
lcOut.close();
byte[] returned = out.toByteArray();
assertTrue("wrong result for String: " + returned.toString() +
" expected string: " + expected.toString(),
Arrays.equals(expected, returned));
}
public void test_load() {
try {
Runtime.getRuntime().load("nonExistentLibrary");
fail("UnsatisfiedLinkError was not thrown.");
} catch(UnsatisfiedLinkError ule) {
//expected
}
try {
Runtime.getRuntime().load(null);
fail("NullPointerException was not thrown.");
} catch(NullPointerException npe) {
//expected
}
}
public void test_loadLibrary() {
try {
Runtime.getRuntime().loadLibrary("nonExistentLibrary");
fail("UnsatisfiedLinkError was not thrown.");
} catch(UnsatisfiedLinkError ule) {
//expected
}
try {
Runtime.getRuntime().loadLibrary(null);
fail("NullPointerException was not thrown.");
} catch(NullPointerException npe) {
//expected
}
}
// b/25859957
@TargetSdkVersion(24)
public void test_loadDeprecated_targetSdkVersion_24() throws Exception {
try {
// Call Runtime#load(String, ClassLoader) at API level 24 (N). It will fail
// with an UnsatisfiedLinkError because requested library doesn't exist.
Method loadMethod =
Runtime.class.getDeclaredMethod("load", String.class, ClassLoader.class);
loadMethod.setAccessible(true);
loadMethod.invoke(Runtime.getRuntime(), "nonExistentLibrary", null);
fail();
} catch(InvocationTargetException expected) {
assertTrue(expected.getCause() instanceof UnsatisfiedLinkError);
}
}
// b/25859957
@TargetSdkVersion(25)
public void test_loadDeprecated_targetSdkVersion_25() throws Exception {
try {
// Call Runtime#load(String, ClassLoader) at API level 25. It will fail
// with an IllegalStateException because it's deprecated.
Method loadMethod =
Runtime.class.getDeclaredMethod("load", String.class, ClassLoader.class);
loadMethod.setAccessible(true);
loadMethod.invoke(Runtime.getRuntime(), "nonExistentLibrary", null);
fail();
} catch(InvocationTargetException expected) {
assertTrue(expected.getCause() instanceof UnsupportedOperationException);
}
}
// b/25859957
@TargetSdkVersion(24)
public void test_loadLibraryDeprecated_targetSdkVersion_24() throws Exception {
try {
// Call Runtime#loadLibrary(String, ClassLoader) at API level 24 (N). It will fail
// with a UnsatisfiedLinkError because requested library doesn't exits.
Method loadMethod =
Runtime.class.getDeclaredMethod("loadLibrary", String.class, ClassLoader.class);
loadMethod.setAccessible(true);
loadMethod.invoke(Runtime.getRuntime(), "nonExistentLibrary", null);
fail();
} catch(InvocationTargetException expected) {
assertTrue(expected.getCause() instanceof UnsatisfiedLinkError);
}
}
// b/25859957
@TargetSdkVersion(25)
public void test_loadLibraryDeprecated_targetSdkVersion_25() throws Exception {
try {
// Call Runtime#load(String, ClassLoader) at API level 25. It will fail
// with a IllegalStateException because it's deprecated.
Method loadMethod =
Runtime.class.getDeclaredMethod("loadLibrary", String.class, ClassLoader.class);
loadMethod.setAccessible(true);
loadMethod.invoke(Runtime.getRuntime(), "nonExistentLibrary", null);
fail();
} catch(InvocationTargetException expected) {
assertTrue(expected.getCause() instanceof UnsupportedOperationException);
}
}
}