blob: 3b8d618cba1e402fc4713eca5fbfeedab1d5eb6b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 Red Hat Inc..
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat Incorporated - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.autotools.ui.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
import org.eclipse.swtbot.swt.finder.waits.Conditions;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotCombo;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTable;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotText;
import org.junit.BeforeClass;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.MethodSorters;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
@RunWith(SWTBotJunit4ClassRunner.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class SetConfigurationParameter extends AbstractTest {
@BeforeClass
public static void initClass() throws Exception {
initConfigParm();
}
// Prepare initial settings that will be tested.
private static void initConfigParm() {
// Set the configure parameters to be --enable-jeff via user-defined
// options
SWTBotShell shell = openProperties("Autotools", "Configure Settings");
bot.treeWithLabel("Configure Settings").expandNode("configure")
.select("Advanced");
SWTBotText text = bot.textWithLabel("Additional command-line options");
text.typeText("--enable-jeff");
bot.button("OK").click();
bot.waitUntil(Conditions.shellCloses(shell), 120000);
// Create new build configurations that will be used throughout tests
projectExplorer.bot().tree().select(projectName);
clickContextMenu(projectExplorer.bot().tree().select(projectName),
"Build Configurations", "Manage...");
shell = bot.shell(projectName + ": Manage Configurations");
shell.activate();
bot.button("New...").click();
shell = bot.shell("Create New Configuration");
shell.activate();
SWTBotText t = bot.textWithLabel("Name:");
t.setText("debug");
AbstractTest.clickRadioButtonInGroup("Existing configuration",
"Copy settings from");
bot.button("OK").click();
shell = bot.shell(projectName + ": Manage Configurations");
shell.activate();
bot.button("New...").click();
shell = bot.shell("Create New Configuration");
shell.activate();
t = bot.textWithLabel("Name:");
t.setText("default");
AbstractTest.clickRadioButtonInGroup("Default configuration",
"Copy settings from");
bot.button("OK").click();
shell = bot.shell(projectName + ": Manage Configurations");
shell.activate();
bot.button("OK").click();
bot.waitUntil(Conditions.shellCloses(shell));
}
// Verify we can set a configuration parameter and that it is recorded in
// the .autotools file for the project
@Test
public void t1canSetConfigParm() throws Exception {
IProject project = checkProject();
assertTrue(project != null);
IPath path = project.getLocation();
path = path.append(".autotools");
File f = new File(path.toOSString());
assertTrue(f.exists());
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document d = db.parse(f);
Element e = d.getDocumentElement();
// Get the stored configuration data
NodeList cfgs = e.getElementsByTagName("configuration"); // $NON-NLS-1$
assertTrue(cfgs.getLength() > 0);
Node n = cfgs.item(0);
NodeList l = n.getChildNodes();
// Verify user field in .autotools file is set to --enable-jeff
boolean foundUser = false;
for (int y = 0; y < l.getLength(); ++y) {
Node child = l.item(y);
if (child.getNodeName().equals("option")) { // $NON-NLS-1$
NamedNodeMap optionAttrs = child.getAttributes();
Node idNode = optionAttrs.getNamedItem("id"); // $NON-NLS-1$
Node valueNode = optionAttrs.getNamedItem("value"); // $NON-NLS-1$
assertTrue(idNode != null);
assertTrue(valueNode != null);
String id = idNode.getNodeValue();
String value = valueNode.getNodeValue();
if (id.equals("user")) {
foundUser = true;
assertEquals(value, "--enable-jeff");
}
}
}
assertTrue(foundUser);
}
// Verify we can build the project with a configuration parameter and that
// the configuration parameter can be found in the config.status file.
@Test
public void t2canBuildWithConfigParm() throws Exception {
projectExplorer.bot().tree().select(projectName);
clickContextMenu(projectExplorer.bot().tree().select(projectName),
"Build Project");
// Wait until the project is built
SWTBotShell shell = bot.shell("Build Project");
bot.waitUntil(Conditions.shellCloses(shell), 120000);
IWorkspace workspace = ResourcesPlugin.getWorkspace();
assertTrue(workspace != null);
IWorkspaceRoot root = workspace.getRoot();
assertTrue(root != null);
IProject project = root.getProject(projectName);
assertTrue(project != null);
IPath path = project.getLocation();
File f = new File(path.append("src/a.out").toOSString());
assertTrue(f.exists());
f = new File(path.append("config.status").toOSString());
assertTrue(f.exists());
try (BufferedReader r = new BufferedReader(new FileReader(f))) {
int ch;
boolean optionFound = false;
// Read config.status and look for the string --enable-jeff
// which is a simple verification that the option was used in the
// configure step.
while ((ch = r.read()) != -1) {
if (ch == '-') {
char[] buf = new char[12];
r.mark(100);
int count = r.read(buf);
if (count < 12) {
break;
}
String s = new String(buf);
if (s.equals("-enable-jeff")) {
optionFound = true;
break;
} else {
r.reset();
}
}
}
assertTrue(optionFound);
}
String output = viewConsole("Configure").bot().styledText().getText();
// Verify we got some help output to the console
Pattern p = Pattern.compile(
".*WARNING:.*unrecognized.*--enable-jeff.*", Pattern.DOTALL);
Matcher m = p.matcher(output);
assertTrue(m.matches());
// Verify that if we build again, we don't reconfigure.
// Verifies fix for bug: #308261
long oldDate = f.lastModified();
projectExplorer.bot().tree().select(projectName);
clickContextMenu(projectExplorer.bot().tree().select(projectName),
"Build Project");
path = project.getLocation();
// We need to wait until the a.out file is created so
// sleep a bit and look for it...give up after 120 seconds
for (int i = 0; i < 240; ++i) {
bot.sleep(500);
f = new File(path.append("src/a.out").toOSString());
if (f.exists()) {
break;
}
}
assertTrue(f.exists());
f = new File(path.append("config.status").toOSString());
assertTrue(f.exists());
long newDate = f.lastModified();
assertEquals(newDate, oldDate);
}
// Verify a new configuration will copy the configuration parameters
// of its base configuration.
@Test
public void t3newConfigCopiesParms() throws Exception {
projectExplorer.bot().tree().select(projectName);
clickContextMenu(projectExplorer.bot().tree().select(projectName),
"Build Configurations", "Manage...");
SWTBotShell shell = bot.shell(projectName + ": Manage Configurations");
shell.activate();
shell = bot.shell(projectName + ": Manage Configurations");
shell.activate();
SWTBotTable table = bot.table();
assertTrue(table.containsItem("debug"));
table.getTableItem("debug").select();
bot.button("Set Active").click();
bot.button("OK").click();
// Verify the debug configuration is active and has a user parameter:
// --enable-jeff
openProperties("Autotools", "Configure Settings");
SWTBotCombo configs = bot.comboBoxWithLabel("Configuration: ");
configs.setFocus();
String[] items = configs.items();
for (int i = 0; i < items.length; ++i) {
if (items[i].contains("debug") && items[i].contains("Active")) {
configs.setSelection(i);
}
}
assertTrue(configs.getText().contains("debug"));
bot.treeWithLabel("Configure Settings").expandNode("configure")
.select("Advanced");
SWTBotText text = bot.textWithLabel("Additional command-line options");
String val = text.getText();
assertEquals("--enable-jeff", val);
// Verify that the build directory for the new configuration has been
// switched to build-debug
shell = bot.shell("Properties for " + projectName);
shell.activate();
bot.text().setText("");
bot.tree().select("C/C++ Build");
String buildDir = bot.textWithLabel("Build directory:").getText();
assertTrue(buildDir.endsWith("build-debug"));
// Verify the default configuration has no user setting
bot.tree().expandNode("Autotools").select("Configure Settings");
configs = bot.comboBoxWithLabel("Configuration: ");
configs.setSelection("default");
bot.treeWithLabel("Configure Settings").expandNode("configure")
.select("Advanced");
text = bot.textWithLabel("Additional command-line options");
val = text.getText();
assertEquals("", val);
bot.button("OK").click();
// Build the project again and verify we get a build-debug directory
projectExplorer.bot().tree().select(projectName);
clickContextMenu(projectExplorer.bot().tree().select(projectName),
"Build Project");
IWorkspace workspace = ResourcesPlugin.getWorkspace();
assertTrue(workspace != null);
IWorkspaceRoot root = workspace.getRoot();
assertTrue(root != null);
IProject project = root.getProject(projectName);
assertTrue(project != null);
IPath path = project.getLocation();
// We need to wait until the config.status file is created so
// sleep a bit and look for it...give up after 20 seconds
File f = null;
for (int i = 0; i < 40; ++i) {
bot.sleep(500);
f = new File(path.append("build-debug/src/a.out").toOSString());
if (f.exists()) {
break;
}
}
assertTrue(f.exists());
f = new File(path.append("build-debug/config.status").toOSString());
assertTrue(f.exists());
try (BufferedReader r = new BufferedReader(new FileReader(f))) {
int ch;
boolean optionFound = false;
// Read config.status and look for the string --enable-jeff
// which is a simple verification that the option was used in the
// configure step.
while ((ch = r.read()) != -1) {
if (ch == '-') {
char[] buf = new char[12];
r.mark(100);
int count = r.read(buf);
if (count < 12) {
break;
}
String s = new String(buf);
if (s.equals("-enable-jeff")) {
optionFound = true;
break;
} else {
r.reset();
}
}
}
assertTrue(optionFound);
}
// Verify we cleaned out the top-level build directory (i.e. that there
// is no config.status there anymore).
path = project.getLocation().append("config.status");
f = new File(path.toOSString());
assertTrue(!f.exists());
path = project.getLocation().append(".autotools");
f = new File(path.toOSString());
assertTrue(f.exists());
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document d = db.parse(f);
Element e = d.getDocumentElement();
// Get the stored configuration data
NodeList cfgs = e.getElementsByTagName("configuration"); // $NON-NLS-1$
assertEquals(3, cfgs.getLength());
int foundUser = 0;
for (int x = 0; x < cfgs.getLength(); ++x) {
Node n = cfgs.item(x);
NodeList l = n.getChildNodes();
// Verify two of the user fields in .autotools file are set to
// --enable-jeff
for (int y = 0; y < l.getLength(); ++y) {
Node child = l.item(y);
if (child.getNodeName().equals("option")) { // $NON-NLS-1$
NamedNodeMap optionAttrs = child.getAttributes();
Node idNode = optionAttrs.getNamedItem("id"); // $NON-NLS-1$
Node valueNode = optionAttrs.getNamedItem("value"); // $NON-NLS-1$
assertTrue(idNode != null);
assertTrue(valueNode != null);
String id = idNode.getNodeValue();
String value = valueNode.getNodeValue();
if (id.equals("user")) {
if (value.equals("--enable-jeff")) {
++foundUser;
}
}
}
}
}
assertEquals(2, foundUser);
clickContextMenu(projectExplorer.bot().tree().select(projectName),
"Build Configurations", "Manage...");
shell = bot.shell(projectName + ": Manage Configurations");
shell.activate();
table = bot.table();
assertTrue(table.containsItem("Build (GNU)"));
table.getTableItem("Build (GNU)").select();
bot.button("Set Active").click();
bot.button("OK").click();
bot.waitUntil(Conditions.shellCloses(shell));
}
// Verify we can do a double rename of configurations, renaming one
// configuration to
// another and then cancel without changing configuration settings.
@Test
public void t4doubleRenameCancel() throws Exception {
openProperties("Autotools", "Configure Settings");
SWTBotCombo configs = bot.comboBoxWithLabel("Configuration: ");
bot.button("Manage Configurations...").click();
// Rename "debug" to "release" and rename "default" to "debug".
// The settings should follow the rename operation.
renameConfiguration("debug", "release");
renameConfiguration("default", "debug");
bot.button("OK").click();
// Verify that "release" has --enable-jeff set and that
// the new "debug" configuration has no user setting.
SWTBotShell shell = bot.shell("Properties for " + projectName);
shell.activate();
configs = bot.comboBoxWithLabel("Configuration: ");
bot.treeWithLabel("Configure Settings").expandNode("configure")
.select("Advanced");
SWTBotText text = bot.textWithLabel("Additional command-line options");
String setting = text.getText();
assertEquals("--enable-jeff", setting);
configs.setFocus();
configs.setSelection("debug");
bot.treeWithLabel("Configure Settings").expandNode("configure")
.select("Advanced");
text = bot.textWithLabel("Additional command-line options");
setting = text.getText();
assertEquals("", setting);
bot.button("Cancel").click();
// Cancel and then verify that "debug" is back to normal with
// --enable-jeff set and that "default" is back to normal with
// no user setting.
openProperties("Autotools", "Configure Settings");
configs = bot.comboBoxWithLabel("Configuration: ");
configs.setSelection("debug");
assertTrue(configs.getText().contains("debug"));
bot.treeWithLabel("Configure Settings").expandNode("configure")
.select("Advanced");
text = bot.textWithLabel("Additional command-line options");
setting = text.getText();
assertEquals("--enable-jeff", setting);
configs.setFocus();
configs.setSelection("default");
assertTrue(configs.getText().contains("default"));
bot.treeWithLabel("Configure Settings").expandNode("configure")
.select("Advanced");
text = bot.textWithLabel("Additional command-line options");
setting = text.getText();
assertEquals("", setting);
bot.button("OK").click();
bot.waitUntil(Conditions.shellCloses(shell));
}
// Verify we can do a double rename of configurations, renaming one
// configuration to
// another and inheriting the settings properly.
@Test
public void t5doubleRenameOk() throws Exception {
openProperties("Autotools", "Configure Settings");
SWTBotCombo configs = bot.comboBoxWithLabel("Configuration: ");
bot.button("Manage Configurations...").click();
SWTBotShell shell = bot.shell(projectName + ": Manage Configurations");
shell.activate();
bot.table().select("debug");
bot.button("Set Active").click();
// Rename "debug" to "release" and rename "default" to "debug".
// The settings should follow the rename operation.
renameConfiguration("debug", "release");
renameConfiguration("default", "debug");
bot.button("OK").click();
shell = bot.shell("Properties for " + projectName);
shell.activate();
bot.button("OK").click();
// Verify changes have taken effect permanently
openProperties("Autotools", "Configure Settings");
configs = bot.comboBoxWithLabel("Configuration: ");
assertTrue(configs.getText().contains("release"));
assertTrue(configs.getText().contains("Active"));
bot.treeWithLabel("Configure Settings").expandNode("configure")
.select("Advanced");
SWTBotText text = bot.textWithLabel("Additional command-line options");
String setting = text.getText();
assertEquals("--enable-jeff", setting);
configs.setFocus();
configs.setSelection("debug");
assertTrue(configs.getText().contains("debug"));
bot.treeWithLabel("Configure Settings").expandNode("configure")
.select("Advanced");
text = bot.textWithLabel("Additional command-line options");
setting = text.getText();
assertEquals("", setting);
// Undo the changes made by this test
configs = bot.comboBoxWithLabel("Configuration: ");
bot.button("Manage Configurations...").click();
shell = bot.shell(projectName + ": Manage Configurations");
shell.activate();
bot.table().select("Build (GNU)");
bot.button("Set Active").click();
renameConfiguration("debug", "default");
renameConfiguration("release", "debug");
bot.button("OK").click();
shell = bot.shell("Properties for " + projectName);
shell.activate();
bot.button("OK").click();
bot.waitUntil(Conditions.shellCloses(shell));
}
// Renames a configuration. Assumes the "Manage Configurations" dialog will
// be open.
private void renameConfiguration(String original, String newname) {
SWTBotShell shell = bot.shell(projectName + ": Manage Configurations");
shell.activate();
bot.table().select(original);
bot.button("Rename...").click();
shell = bot.shell("Rename Configuration");
shell.activate();
bot.textWithLabel("Name:").setText(newname);
bot.button("OK").click();
shell = bot.shell(projectName + ": Manage Configurations");
shell.activate();
}
}