blob: ffdfd06b5386a08b7f16ae9e8dc586304f4cb5f9 [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.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.Properties;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
import org.apache.tools.ant.Project;
import org.netbeans.junit.RandomlyFails;
/**
* @author Jaroslav Tulach
*/
public class MakeNBMTest extends TestBase {
public MakeNBMTest (String name) {
super (name);
}
@RandomlyFails // NB-Core-Build #2570
public void testGenerateNBMForSimpleModule() throws Exception {
Manifest m;
m = createManifest ();
m.getMainAttributes ().putValue ("OpenIDE-Module", "org.my.module/3");
File simpleJar = generateJar (new String[0], m);
File parent = simpleJar.getParentFile ();
File output = new File(parent, "output");
File ks = generateKeystore("nbm", "netbeans-test");
if (ks == null) {
return;
}
File ut = new File (new File(getWorkDir(), "update_tracking"), "org-my-module.xml");
ut.getParentFile().mkdirs();
try (FileWriter w = new FileWriter(ut)) {
String UTfile =
"<?xml version='1.0' encoding='UTF-8'?>" +
"<module codename='org.netbeans.modules.autoupdate/1'>" +
" <module_version install_time='1136503038669' last='true' origin='installer' specification_version='2.16.1'>" +
" <file crc='3405032071' name='modules/" + simpleJar.getName() + "'/>" +
" </module_version>" +
"</module>";
w.write(UTfile);
}
java.io.File f = extractString (
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<project name=\"Test Arch\" basedir=\".\" default=\"all\" >" +
" <taskdef name=\"makenbm\" classname=\"org.netbeans.nbbuild.MakeNBM\" classpath=\"${nbantext.jar}\"/>" +
"<target name=\"all\" >" +
" <mkdir dir='" + output + "' />" +
" <makenbm file='" + output + "/x.nbm'" +
" productdir='" + getWorkDir() + "'" +
" module='modules/" + simpleJar.getName() + "'" +
" homepage='http://www.homepage.org'" +
" distribution='distro'" +
" needsrestart='false'" +
" global='false'" +
" releasedate='today'" +
" moduleauthor='test'>" +
" <license file='" + simpleJar + "'/>" +
" <signature keystore='" + ks + "' storepass='netbeans-test' alias='nbm'/>" +
" </makenbm>" +
// " <fail if='do.fail'/>" +
"</target>" +
"</project>"
);
execute (f, new String[] { "-verbose" });
assertTrue ("Output exists", output.exists ());
assertTrue ("Output directory created", output.isDirectory());
String[] files = output.list();
assertEquals("It has the nbm file", 1, files.length);
if (!files[0].endsWith("x.nbm")) {
fail("Not the right one: " + files[0]);
}
long time = output.listFiles()[0].lastModified();
// wait a while so the NBM file has different timestamp
// if recreated
Thread.sleep(1300);
// execute once again
execute (f, new String[] { "-debug", "-Ddo.fail=true"});
long newTime = output.listFiles()[0].lastModified();
assertEquals("The file has not been modified:\n" + getStdOut(), time, newTime);
CHECK_SIGNED: {
File jar = output.listFiles()[0];
JarFile signed = new JarFile(jar);
Enumeration<JarEntry> it = signed.entries();
while (it.hasMoreElements()) {
JarEntry entry = it.nextElement();
if (entry.getName().endsWith(".SF")) {
break CHECK_SIGNED;
}
}
fail ("File does not seem to be signed: " + jar);
}
}
private File createNewJarFile(String prefix) throws IOException {
if (prefix == null) {
prefix = "modules";
}
String ss = prefix.substring(prefix.length()-1, prefix.length());
File dir = new File(this.getWorkDir(), prefix);
dir.mkdirs();
int i = 0;
for (;;) {
File f = new File (dir, ss + i++ + ".jar");
if (!f.exists ()) {
return f;
}
}
}
protected final File generateJar (String[] content, Manifest manifest) throws IOException {
return generateJar(null, content, manifest, null);
}
protected final File generateJar (String prefix, String[] content, Manifest manifest, Properties props) throws IOException {
File f = createNewJarFile (prefix);
if (props != null) {
manifest.getMainAttributes().putValue("OpenIDE-Module-Localizing-Bundle", "some/fake/prop/name/Bundle.properties");
}
try (JarOutputStream os = new JarOutputStream (new FileOutputStream (f), manifest)) {
if (props != null) {
os.putNextEntry(new JarEntry("some/fake/prop/name/Bundle.properties"));
props.store(os, "# properties for the module");
os.closeEntry();
}
for (int i = 0; i < content.length; i++) {
os.putNextEntry(new JarEntry (content[i]));
os.closeEntry();
}
os.closeEntry ();
}
return f;
}
private File generateKeystore(String alias, String password) throws Exception {
File where = new File(getWorkDir(), "key.ks");
String script =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<project name=\"Generate Keystore\" basedir=\".\" default=\"all\" >" +
"<target name=\"all\" >" +
"<genkey \n" +
"alias='" + alias + "' \n" +
"keystore='" + where + "' \n" +
"storepass='" + password + "' \n" +
"dname='CN=A NetBeans Friend, OU=NetBeans, O=netbeans.org, C=US' \n" +
"/>\n" +
"</target></project>\n";
java.io.File f = extractString (script);
try {
execute (f, new String[] { });
} catch (ExecutionError err) {
if (err.getMessage().indexOf("java.security.ProviderException") != -1) {
// common error on Sun OS:
// org.netbeans.nbbuild.PublicPackagesInProjectizedXMLTest$ExecutionError: Execution has to finish without problems was: 1
// Output: Buildfile: /space/test4u2/testrun/work/tmpdir/res310.xml
//
// all:
// [genkey] Generating Key for nbm
// [genkey] keytool error: java.security.ProviderException: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_KEY_SIZE_RANGE
return null;
}
}
return where;
}
public void testOmitExternalFiles() throws Exception { // #195041
Project p = new Project();
p.init();
MakeNBM task = new MakeNBM();
task.setProject(p);
clearWorkDir();
File w = getWorkDir();
File cluster = new File(w, "cluster");
task.setProductDir(cluster);
File modules = new File(cluster, "modules");
if (!modules.mkdirs()) {
throw new IOException();
}
Manifest mani = new Manifest();
mani.getMainAttributes().putValue("Manifest-Version", "1.0");
mani.getMainAttributes().putValue("OpenIDE-Module", "mod");
OutputStream os = new FileOutputStream(new File(modules, "mod.jar"));
try {
try (JarOutputStream jos = new JarOutputStream(os, mani)) {
jos.finish();
}
} finally {
os.close();
}
task.setModule("modules/mod.jar");
File nbm = new File(w, "mod.nbm");
task.setFile(nbm);
File stuff = new File(cluster, "stuff");
if (!stuff.mkdir()) {
throw new IOException();
}
os = new FileOutputStream(new File(stuff, "illegal"));
try {
os.write("actual content".getBytes());
} finally {
os.close();
}
os = new FileOutputStream(new File(stuff, "illegal.external"));
try {
os.write("URL:http://nowhere.net/illegal\n".getBytes());
} finally {
os.close();
}
File tracking = new File(cluster, "update_tracking");
if (!tracking.mkdir()) {
throw new IOException();
}
os = new FileOutputStream(new File(tracking, "mod.xml"));
try {
os.write("<module codename='mod'><module_version><file name='modules/mod.jar'/><file name='stuff/illegal'/><file name='stuff/illegal.external'/></module_version></module>".getBytes());
} finally {
os.close();
}
task.execute();
assertTrue(nbm.isFile());
JarFile jf = new JarFile(nbm);
try {
JarEntry entry = jf.getJarEntry("netbeans/stuff/illegal.external");
assertNotNull(entry);
assertEquals(31, entry.getSize());
assertNull(jf.getEntry("netbeans/stuff/illegal"));
} finally {
jf.close();
}
}
}