blob: 3d6e7342e7bafe032730efb2e71e156021a0a3ff [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.netbeans.nbbuild;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.URL;
import java.security.Permission;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.jar.Manifest;
import junit.framework.AssertionFailedError;
import org.netbeans.junit.NbTestCase;
/**
* Predefines commonly used utilities.
*/
abstract class TestBase extends NbTestCase {
protected TestBase(String name) {
super(name);
}
protected @Override void setUp() throws Exception {
clearWorkDir();
}
// XXX look for other copy-pasted utility methods, like createNewJarFile
protected final String readFile(java.io.File f) throws java.io.IOException {
int s = (int) f.length();
byte[] data = new byte[s];
assertEquals("Read all data", s, new java.io.FileInputStream(f).read(data));
return new String(data);
}
protected final Manifest createManifest() {
Manifest m = new Manifest();
m.getMainAttributes().putValue(java.util.jar.Attributes.Name.MANIFEST_VERSION.toString(), "1.0");
return m;
}
protected final File extractString(String res) throws Exception {
File f = File.createTempFile("res", ".xml", getWorkDir());
try (FileOutputStream os = new FileOutputStream(f)) {
InputStream is = new ByteArrayInputStream(res.getBytes("UTF-8"));
for (;;) {
int ch = is.read();
if (ch == -1) {
break;
}
os.write(ch);
}
}
return f;
}
protected final File extractResource(String res) throws Exception {
File f = File.createTempFile("res", ".xml", getWorkDir());
extractResource(f, res);
return f;
}
protected final void extractResource(File f, String res) throws Exception {
URL u = getClass().getResource(res);
assertNotNull("Resource should be found " + res, u);
try (FileOutputStream os = new FileOutputStream(f)) {
InputStream is = u.openStream();
for (;;) {
int ch = is.read();
if (ch == -1) {
break;
}
os.write(ch);
}
}
}
protected final void execute(String res, String... args) throws Exception {
execute(extractResource(res), args);
}
private static ByteArrayOutputStream out, err;
protected final String getStdOut() {
return out.toString();
}
protected final String getStdErr() {
return err.toString();
}
protected final void execute(File f, String[] args) throws Exception {
// we need security manager to prevent System.exit
if (!(System.getSecurityManager() instanceof MySecMan)) {
out = new java.io.ByteArrayOutputStream();
err = new java.io.ByteArrayOutputStream();
System.setOut(new java.io.PrintStream(out));
System.setErr(new java.io.PrintStream(err));
System.setSecurityManager(new MySecMan());
}
MySecMan sec = (MySecMan) System.getSecurityManager();
// Jesse claims that this is not the right way how the execution
// of an ant script should be invoked:
//
// better IMHO to just run the task directly
// (setProject() and similar, configure its bean properties, and call
// execute()), or just make a new Project and initialize it.
// ant.Main.main is not intended for embedded use. Then you could get rid
// of the SecurityManager stuff, would be cleaner I think.
//
// If I had to write this once again, I would try to follow the
// "just make a new Project and initialize it", but as this works
// for me now, I leave it for the time when somebody really
// needs that...
List<String> arr = new ArrayList<>();
arr.add("-f");
arr.add(f.toString());
arr.addAll(Arrays.asList(args));
out.reset();
err.reset();
try {
sec.setActive(true);
org.apache.tools.ant.Main.main(arr.toArray(new String[0]));
} catch (MySecExc ex) {
assertNotNull("The only one to throw security exception is MySecMan and should set exitCode", sec.exitCode);
ExecutionError.assertExitCode(
"Execution has to finish without problems",
sec.exitCode.intValue());
} finally {
sec.setActive(false);
}
}
protected static final class ExecutionError extends AssertionFailedError {
public final int exitCode;
public ExecutionError(String msg, int e) {
super(msg);
this.exitCode = e;
}
private static void assertExitCode(String msg, int e) {
if (e != 0) {
throw new ExecutionError(
msg + " was: " + e + "\nOutput: " + out.toString()
+ "\nError: " + err.toString(),
e);
}
}
}
private static class MySecExc extends SecurityException {
@Override
public void printStackTrace() {
}
@Override
public void printStackTrace(PrintStream ps) {
}
@Override
public void printStackTrace(PrintWriter ps) {
}
}
private static class MySecMan extends SecurityManager {
public Integer exitCode;
private boolean active;
@Override
public void checkExit(int status) {
if (active) {
exitCode = new Integer(status);
throw new MySecExc();
}
}
@Override
public void checkPermission(Permission perm, Object context) {
}
@Override
public void checkPermission(Permission perm) {
/*
if (perm instanceof RuntimePermission) {
if (perm.getName ().equals ("setIO")) {
throw new MySecExc ();
}
}
*/
}
@Override
public void checkMulticast(InetAddress maddr) {
}
@Override
public void checkAccess(ThreadGroup g) {
}
@Override
public void checkWrite(String file) {
}
@Override
public void checkLink(String lib) {
}
@Override
public void checkExec(String cmd) {
}
@Override
public void checkDelete(String file) {
}
@Override
public void checkPackageAccess(String pkg) {
}
@Override
public void checkPackageDefinition(String pkg) {
}
@Override
public void checkPropertyAccess(String key) {
}
@Override
public void checkRead(String file) {
}
@Override
public void checkSecurityAccess(String target) {
}
@Override
public void checkWrite(FileDescriptor fd) {
}
@Override
public void checkListen(int port) {
}
@Override
public void checkRead(FileDescriptor fd) {
}
@SuppressWarnings("deprecation")
@Override
public void checkMulticast(InetAddress maddr, byte ttl) {
}
@Override
public void checkAccess(Thread t) {
}
@Override
public void checkConnect(String host, int port, Object context) {
}
@Override
public void checkRead(String file, Object context) {
}
@Override
public void checkConnect(String host, int port) {
}
@Override
public void checkAccept(String host, int port) {
}
@Override
public void checkSetFactory() {
}
@Override
public void checkCreateClassLoader() {
}
@Override
public void checkPrintJobAccess() {
}
@Override
public void checkPropertiesAccess() {
}
void setActive(boolean b) {
active = b;
}
} // end of MySecMan
}