1
/*******************************************************************************
2
* Copyright (c) 2005, 2007 Intel Corporation and others.
3
* All rights reserved. This program and the accompanying materials
4
* are made available under the terms of the Eclipse Public License v1.0
5
* which accompanies this distribution, and is available at
6
* http://www.eclipse.org/legal/epl-v10.html
9
* Intel Corporation - Initial API and implementation
10
*******************************************************************************/
12
package org.eclipse.cdt.managedbuilder.core.tests;
14
import java.io.ByteArrayInputStream;
15
import java.util.ArrayList;
17
import junit.framework.Test;
18
import junit.framework.TestCase;
19
import junit.framework.TestSuite;
21
import org.eclipse.cdt.core.CCorePlugin;
22
import org.eclipse.cdt.core.ICDescriptor;
23
import org.eclipse.cdt.managedbuilder.core.BuildException;
24
import org.eclipse.cdt.managedbuilder.core.IConfiguration;
25
import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo;
26
import org.eclipse.cdt.managedbuilder.core.IManagedProject;
27
import org.eclipse.cdt.managedbuilder.core.IOption;
28
import org.eclipse.cdt.managedbuilder.core.IProjectType;
29
import org.eclipse.cdt.managedbuilder.core.ITool;
30
import org.eclipse.cdt.managedbuilder.core.IToolChain;
31
import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
32
import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin;
33
import org.eclipse.cdt.managedbuilder.core.ManagedCProjectNature;
34
import org.eclipse.cdt.managedbuilder.internal.macros.OptionContextData;
35
import org.eclipse.cdt.managedbuilder.macros.BuildMacroException;
36
import org.eclipse.cdt.managedbuilder.macros.IBuildMacro;
37
import org.eclipse.cdt.managedbuilder.macros.IBuildMacroProvider;
38
import org.eclipse.cdt.managedbuilder.macros.IBuildMacroSupplier;
39
import org.eclipse.core.resources.IFile;
40
import org.eclipse.core.resources.IProject;
41
import org.eclipse.core.resources.IWorkspace;
42
import org.eclipse.core.resources.IWorkspaceDescription;
43
import org.eclipse.core.resources.IWorkspaceRoot;
44
import org.eclipse.core.resources.ResourcesPlugin;
45
import org.eclipse.core.runtime.CoreException;
46
import org.eclipse.core.runtime.NullProgressMonitor;
49
public class ManagedBuildMacrosTests extends TestCase {
50
static IProject proj = null;
51
static IManagedProject mproj = null;
53
IConfiguration[] cfgs = null;
54
IBuildMacroProvider mp = null;
55
IWorkspace worksp = null;
56
boolean windows = false;
58
boolean print = false; // allows to print most of macros on console
59
boolean flag = false; // uplevel flag for getMacro/getMacros methods
60
IBuildMacroSupplier[] ms = null;
61
public static int functionCalled = 0;
62
public static final int GET_ONE_PROJECT = 1;
63
public static final int GET_MANY_PROJECT = 2;
64
public static final int GET_ONE_CONFIG = 4;
65
public static final int GET_MANY_CONFIG = 8;
66
public static final int RESERVED_NAME = 16;
68
static final String UNKNOWN = "<HZ>"; //$NON-NLS-1$
69
static final String LISTSEP = "|"; //$NON-NLS-1$
70
static final String TEST = "TEST"; //$NON-NLS-1$
71
static final String[] TST = {"DUMMY", "FILETEST", //$NON-NLS-1$ //$NON-NLS-2$
72
"OPTTEST", "CFGTEST", "PRJTEST", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
73
"WSPTEST", "INSTEST", "ENVTEST"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
74
// used for options testing
75
final String OPT_IDS = "macro.test.string"; //$NON-NLS-1$
76
final String OPT_IDL = "macro.test.list"; //$NON-NLS-1$
77
final String INC_DEF = "${IncludeDefaults}";//$NON-NLS-1$
79
public ManagedBuildMacrosTests() { super(); }
80
public ManagedBuildMacrosTests(String name) { super(name); }
82
public static Test suite() {
83
TestSuite suite = new TestSuite(ManagedBuildMacrosTests.class);
85
// suite.addTest(new ManagedBuildMacrosTests("testMacroConf"));//$NON-NLS-1$
86
// suite.addTest(new ManagedBuildMacrosTests("testMacroEEnv"));//$NON-NLS-1$
87
// suite.addTest(new ManagedBuildMacrosTests("testMacroInst"));//$NON-NLS-1$
88
// suite.addTest(new ManagedBuildMacrosTests("testMacroProj"));//$NON-NLS-1$
89
// suite.addTest(new ManagedBuildMacrosTests("testMacroWrks"));//$NON-NLS-1$
90
// suite.addTest(new ManagedBuildMacrosTests("testMacroOptS"));//$NON-NLS-1$
91
// suite.addTest(new ManagedBuildMacrosTests("testMacroOptL"));//$NON-NLS-1$
92
// suite.addTest(new ManagedBuildMacrosTests("testMacroFile"));//$NON-NLS-1$
93
// suite.addTest(new ManagedBuildMacrosTests("testMacroContext"));//$NON-NLS-1$
95
// suite.addTest(new ManagedBuildMacrosTests("testMacroResolve"));//$NON-NLS-1$
96
// suite.addTest(new ManagedBuildMacrosTests("testMacroResolveExceptions"));//$NON-NLS-1$
97
// suite.addTest(new ManagedBuildMacrosTests("testMacroResolveLoop"));//$NON-NLS-1$
98
// suite.addTest(new ManagedBuildMacrosTests("testMacroResolveMake"));//$NON-NLS-1$
99
// suite.addTest(new ManagedBuildMacrosTests("testMacroResolveCase"));//$NON-NLS-1$
100
// suite.addTest(new ManagedBuildMacrosTests("testMacroSave"));//$NON-NLS-1$
108
/* public void testMacroConf(){
110
ms = mp.getSuppliers(IBuildMacroProvider.CONTEXT_CONFIGURATION, cfgs[0]);
112
assertEquals(ms.length, 4);
113
assertTrue(addMacro(TEST, IBuildMacro.VALUE_TEXT, TST[IBuildMacroProvider.CONTEXT_CONFIGURATION],
114
IBuildMacroProvider.CONTEXT_CONFIGURATION, cfgs[0]));
116
String[] a = printMacros(mp.getMacros(IBuildMacroProvider.CONTEXT_CONFIGURATION, cfgs[0], flag), "Configuration"); //$NON-NLS-1$
117
assertEquals(GET_MANY_CONFIG, functionCalled);
118
String[] b = {"ConfigName", "BuildArtifactFileExt", //$NON-NLS-1$ //$NON-NLS-2$
119
"BuildArtifactFileBaseName", "TargetArchList", //$NON-NLS-1$ //$NON-NLS-2$
120
"TargetOsList", "BuildArtifactFileName", //$NON-NLS-1$ //$NON-NLS-2$
121
"PWD", "CWD", "ConfigDescription", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
122
TEST, "NEW_FOR_CFG" }; //$NON-NLS-1$
123
assertTrue(arrayContains(b, a));
129
/* public void testMacroEEnv(){
131
ms = mp.getSuppliers(IBuildMacroProvider.CONTEXT_ECLIPSEENV, null);
133
assertEquals(ms.length, 1);
134
assertFalse(addMacro(TEST, IBuildMacro.VALUE_TEXT, TST[IBuildMacroProvider.CONTEXT_ECLIPSEENV],
135
IBuildMacroProvider.CONTEXT_ECLIPSEENV, null));
136
String[] a = printMacros(mp.getMacros(IBuildMacroProvider.CONTEXT_ECLIPSEENV, null, flag), "EclipseEnv"); //$NON-NLS-1$
137
// String[] b = {"PATH", "USERNAME"}; //$NON-NLS-1$ //$NON-NLS-2$
138
// assertTrue(arrayContains(b, a));
144
/* public void testMacroInst(){
146
ms = mp.getSuppliers(IBuildMacroProvider.CONTEXT_INSTALLATIONS, null);
148
assertEquals(ms.length, 1);
149
assertFalse(addMacro(TEST, IBuildMacro.VALUE_TEXT, TST[IBuildMacroProvider.CONTEXT_INSTALLATIONS],
150
IBuildMacroProvider.CONTEXT_INSTALLATIONS, null));
151
String[] a = printMacros(mp.getMacros(IBuildMacroProvider.CONTEXT_INSTALLATIONS, null, flag), "Installations "); //$NON-NLS-1$
152
String[] b = {"HostArchName", "MBSVersion", //$NON-NLS-1$ //$NON-NLS-2$
153
"EclipseVersion", "HostOsName", "CDTVersion"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
154
assertTrue(arrayContains(b, a));
160
// public void testMacroProj(){
162
// ms = mp.getSuppliers(IBuildMacroProvider.CONTEXT_PROJECT, mproj);
163
// assertNotNull(ms);
164
// assertEquals(ms.length, 4);
165
// assertTrue(addMacro(TEST, IBuildMacro.VALUE_TEXT, TST[IBuildMacroProvider.CONTEXT_PROJECT],
166
// IBuildMacroProvider.CONTEXT_PROJECT, mproj));
167
// functionCalled = 0;
168
// String[] a = printMacros(mp.getMacros(IBuildMacroProvider.CONTEXT_PROJECT, mproj, flag), "Project "); //$NON-NLS-1$
169
// assertEquals(GET_MANY_PROJECT, functionCalled);
170
// String[] b = {"ProjDirPath", "ProjName", //$NON-NLS-1$ //$NON-NLS-2$
171
// TEST, "NEW_FOR_PRJ"}; //$NON-NLS-1$
172
// assertTrue(arrayContains(b, a));
178
// public void testMacroWrks(){
180
// ms = mp.getSuppliers(IBuildMacroProvider.CONTEXT_WORKSPACE, worksp);
181
// assertNotNull(ms);
182
// assertEquals(ms.length, 5);
183
// assertTrue(addMacro(TEST, IBuildMacro.VALUE_TEXT, TST[IBuildMacroProvider.CONTEXT_WORKSPACE],
184
// IBuildMacroProvider.CONTEXT_WORKSPACE, worksp));
185
// String[] a = printMacros(mp.getMacros(IBuildMacroProvider.CONTEXT_WORKSPACE, worksp, flag), "Workspace "); //$NON-NLS-1$
186
// String[] b = {"DirectoryDelimiter", "WorkspaceDirPath", //$NON-NLS-1$ //$NON-NLS-2$
187
// "PathDelimiter", TEST}; //$NON-NLS-1$
188
// assertTrue(arrayContains(b, a));
194
// public void testMacroOptS(){
196
// IToolChain tc = cfgs[0].getToolChain();
197
// ITool t = cfgs[0].getTools()[0];
198
// IOption opt = t.getOptionById(OPT_IDS);
199
// assertNotNull(opt);
201
// // standard check of suppliers # and attempt to add macro (should fail)
202
// ms = mp.getSuppliers(IBuildMacroProvider.CONTEXT_OPTION, new OptionContextData(opt,t));
203
// assertNotNull(ms);
204
// assertEquals(ms.length, 1);
205
// assertFalse(addMacro(TEST, IBuildMacro.VALUE_TEXT, TST[IBuildMacroProvider.CONTEXT_OPTION], IBuildMacroProvider.CONTEXT_OPTION, new OptionContextData(opt,t)));
207
// // modify value and check that macros is resolved
209
// opt = cfgs[0].setOption(t, opt, "222 " + INC_DEF); //$NON-NLS-1$
210
// String a = mp.resolveValue(opt.getStringValue(), UNKNOWN, LISTSEP, IBuildMacroProvider.CONTEXT_OPTION, new OptionContextData(opt,t));
211
// assertEquals(a, "222 111"); //$NON-NLS-1$
212
// } catch (BuildMacroException e) { fail(e.getLocalizedMessage()); }
213
// catch (BuildException e) { fail(e.getLocalizedMessage()); }
215
// // Create resource configuration
216
// IResourceConfiguration rc = cfgs[0].createResourceConfiguration(getFile());
217
// assertNotNull(rc);
218
// IOption ropt = rc.getTools()[0].getOptionById(OPT_IDS);
220
// ropt = rc.setOption(rc.getTools()[0], ropt, "333 " + INC_DEF); //$NON-NLS-1$
221
// String a = mp.resolveValue(ropt.getStringValue(), UNKNOWN, LISTSEP, IBuildMacroProvider.CONTEXT_OPTION, new OptionContextData(opt,t));
222
// assertEquals(a, "333 111"); //$NON-NLS-1$
223
// } catch (Exception e) { fail(e.getLocalizedMessage()); }
227
public void testMacroOptL(){
229
IToolChain tc = cfgs[0].getToolChain();
230
ITool t = cfgs[0].getTools()[0];
231
IOption opt = t.getOptionById(OPT_IDL);
232
OptionContextData ocd = new OptionContextData(opt,t);
234
ms = mp.getSuppliers(IBuildMacroProvider.CONTEXT_OPTION, ocd);
236
assertEquals(ms.length, 1);
239
String[] set0 = opt.getStringListValue();
241
final String[] set1 = {"new a", /*"test=${TEST}",*/ INC_DEF, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
242
"${PATH}", "PRJ=${NEW_FOR_PRJ}", "LIST=" + INC_DEF};//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
243
String[] res1 = {"new a", /*"test=CFGTEST",*/ "x", "y", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
244
"z", ":", "PRJ=NewMacrosForProjectContext", "LIST=x|y|z"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
246
res1[4] = mp.resolveValue("${PATH}",UNKNOWN,LISTSEP,IBuildMacroProvider.CONTEXT_OPTION, ocd); //$NON-NLS-1$
247
} catch (BuildMacroException e) { fail(e.getLocalizedMessage()); }
249
opt = cfgs[0].setOption(t, opt, set1);
252
ArrayList ar = new ArrayList(1);
253
for (int i=0; i<set1.length; i++) {
255
String[] aus = mp.resolveStringListValue(set1[i], UNKNOWN, LISTSEP, IBuildMacroProvider.CONTEXT_OPTION, new OptionContextData(opt,t));
256
if (aus == null) continue;
257
for (int j=0; j<aus.length; j++) ar.add(aus[j]);
258
} catch (BuildMacroException e) { fail(e.getLocalizedMessage()); }
260
String[] res = (String[])ar.toArray(new String[0]);
261
assertEquals(res.length, res1.length);
262
for (int i=0; i<res.length; i++) assertEquals(res[i], res1[i]);
263
} catch (BuildException e) { fail(e.getLocalizedMessage()); }
269
// public void testMacroFile(){
270
// final String EIN = "ein.c"; //$NON-NLS-1$
271
// final String AUS = "aus.o"; //$NON-NLS-1$
272
// final String UP2W = "..\\..\\"; //$NON-NLS-1$
273
// final String UP2U = "../../"; //$NON-NLS-1$
274
// final String KLMN = "\\k\\l\\m\\n\\o\\p\\"; //$NON-NLS-1$
275
// final String[] names =
276
// {"InputFileName", "InputFileExt", "InputFileBaseName", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
277
// "InputFileRelPath", "InputDirRelPath", //$NON-NLS-1$ //$NON-NLS-2$
278
// "OutputFileName", "OutputFileExt", "OutputFileBaseName",//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
279
// "OutputFileRelPath", "OutputDirRelPath"}; //$NON-NLS-1$ //$NON-NLS-2$
280
// String[] values0wAbs =
281
// {"a.f77", "f77", "a", "\\xz\\a.f77", "\\xz\\", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
282
// "b.exe", "exe", "b", "\\tmp\\b.exe", "\\tmp\\"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
283
// final String[] values0wRel =
284
// {EIN, "c", "ein", UP2W+EIN, UP2W, //$NON-NLS-1$ //$NON-NLS-2$
285
// AUS, "o", "aus", UP2W+AUS, UP2W}; //$NON-NLS-1$ //$NON-NLS-2$
287
// final String[] values0u =
288
// {EIN, "c", "ein", UP2U+EIN, UP2U, //$NON-NLS-1$ //$NON-NLS-2$
289
// AUS, "o", "aus", UP2U+AUS, UP2U}; //$NON-NLS-1$ //$NON-NLS-2$
291
// final String[] values1 =
292
// {"$(notdir $<)", "$(suffix $(notdir $<))", //$NON-NLS-1$ //$NON-NLS-2$
293
// "$(basename $(notdir $<))", "$<", "$(dir $<)", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
294
// "$(notdir $@)", "$(suffix $(notdir $@))", //$NON-NLS-1$ //$NON-NLS-2$
295
// "$(basename $(notdir $@))", "$@", "$(dir $@)"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
297
// FileContextData fd = null;
300
// ITool t = cfgs[0].getTools()[0];
302
// IOption opt = t.getOptionById(OPT_IDS);
306
// dir = mp.getMacro("WorkspaceDirPath", IBuildMacroProvider.CONTEXT_WORKSPACE, worksp, flag).getStringValue(); //$NON-NLS-1$
307
// } catch (BuildMacroException e) { fail(e.getLocalizedMessage()); }
308
// IPath p = (new Path(dir)).addTrailingSeparator();
311
// // check behaviour in case of different disks usage
313
// // config #4 has changed BuilderMakeFileGenerator, #0 has standard one
314
// IBuildEnvironmentVariable cwdvar = ManagedBuildManager.getEnvironmentVariableProvider().getVariable("CWD", cfgs[0], false, true); //$NON-NLS-1$
315
// String dev0 = Path.fromOSString(cwdvar.getValue()).getDevice().toUpperCase();
316
// String dev1 = (dev0.startsWith("C")) ? "D:" : "C:"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
317
// values0wAbs[3] = dev1 + values0wAbs[3];
318
// values0wAbs[4] = dev1 + values0wAbs[4];
319
// values0wAbs[8] = dev1 + values0wAbs[8];
320
// values0wAbs[9] = dev1 + values0wAbs[9];
322
// fd = new FileContextData(new Path(values0wAbs[3]), new Path(values0wAbs[8]),opt,t);
323
// for (int i=0; i<names.length; i++)
325
// assertEquals(values0wAbs[i], mp.getMacro(names[i], IBuildMacroProvider.CONTEXT_FILE, fd, flag).getStringValue());
326
// } catch (BuildMacroException e) { fail(e.getLocalizedMessage()); }
328
// // check that relative path are reported OK
329
// fd = new FileContextData(p.append(EIN), p.append(AUS),opt,t);
330
// for (int i=0; i<names.length; i++)
332
// assertEquals(values0wRel[i], mp.getMacro(names[i], IBuildMacroProvider.CONTEXT_FILE, fd, flag).getStringValue());
333
// } catch (BuildMacroException e) { fail(e.getLocalizedMessage()); }
336
//// // check paths using changed BuilderMakeFileGenerator in cfg "Five"
339
//// ManagedBuildManager.setDefaultConfiguration(proj, cfgs[index]);
340
//// OptionContextData op = new OptionContextData(cfgs[index].getTools()[0].getOptions()[0], cfgs[index].getToolChain());
341
//// String p0 = dev0 + KLMN;
342
//// fd = new FileContextData(new Path(p0+EIN), new Path(p0+AUS), op);
343
//// assertNotNull(fd);
344
//// //TODO: the same dir, upper dir, lower dir
346
//// TestMacro.topBuildDir = Path.fromOSString(p0);
347
//// assertEquals(p0+EIN, mp.getMacro(names[3], IBuildMacroProvider.CONTEXT_FILE, fd, flag).getStringValue());
348
//// assertEquals(p0, mp.getMacro(names[4], IBuildMacroProvider.CONTEXT_FILE, fd, flag).getStringValue());
349
//// assertEquals(p0+AUS, mp.getMacro(names[8], IBuildMacroProvider.CONTEXT_FILE, fd, flag).getStringValue());
350
//// assertEquals(p0, mp.getMacro(names[9], IBuildMacroProvider.CONTEXT_FILE, fd, flag).getStringValue());
351
////// p0 = Path.fromOSString(p0).removeLastSegments(2).addTrailingSeparator().toOSString();
352
////// p0 = dev0+KLMN+"x\\";
353
////// TestMacro.topBuildDir = Path.fromOSString(p0);
354
//// assertEquals(p0+EIN, mp.getMacro(names[3], IBuildMacroProvider.CONTEXT_FILE, fd, flag).getStringValue());
355
//// assertEquals(p0, mp.getMacro(names[4], IBuildMacroProvider.CONTEXT_FILE, fd, flag).getStringValue());
356
//// assertEquals(p0+AUS, mp.getMacro(names[8], IBuildMacroProvider.CONTEXT_FILE, fd, flag).getStringValue());
357
//// assertEquals(p0, mp.getMacro(names[9], IBuildMacroProvider.CONTEXT_FILE, fd, flag).getStringValue());
358
//// } catch (BuildMacroException e) { fail(e.getLocalizedMessage()); }
363
// // check relative path only
364
// fd = new FileContextData(p.append(EIN), p.append(AUS),opt,t);
365
// for (int i=0; i<names.length; i++)
367
// assertEquals(values0u[i], mp.getMacro(names[i], IBuildMacroProvider.CONTEXT_FILE, fd, flag).getStringValue());
368
// } catch (BuildMacroException e) { fail(e.getLocalizedMessage()); }
371
// // check supplier's parameters
372
// assertNotNull(fd);
373
// ms = mp.getSuppliers(IBuildMacroProvider.CONTEXT_FILE, fd);
374
// assertNotNull(ms);
375
// assertEquals(ms.length, 1);
376
// assertFalse(addMacro(TEST, IBuildMacro.VALUE_TEXT,
377
// TST[IBuildMacroProvider.CONTEXT_FILE], IBuildMacroProvider.CONTEXT_FILE, fd));
379
// // For config #3, macros should contain lines specified in plugin.xml
380
// opt = cfgs[1].getTools()[0].getOptions()[0];
381
// fd = new FileContextData(p.append(EIN), p.append(AUS),opt,cfgs[1].getTools()[0]);
382
// for (int i=0; i<names.length; i++)
384
// assertEquals(values1[i], mp.getMacro(names[i], IBuildMacroProvider.CONTEXT_FILE, fd, flag).getStringValue());
385
// } catch (BuildMacroException e) { fail(e.getLocalizedMessage()); }
394
public void rm_testMacroContext(){
396
IBuildMacro mcfg = mp.getMacro(TEST, IBuildMacroProvider.CONTEXT_CONFIGURATION, cfgs[0], true);
397
IBuildMacro mprj = mp.getMacro(TEST, IBuildMacroProvider.CONTEXT_PROJECT, mproj, true);
398
IBuildMacro mwsp = mp.getMacro(TEST, IBuildMacroProvider.CONTEXT_WORKSPACE, worksp, true);
403
assertEquals(mcfg.getStringValue(), TST[IBuildMacroProvider.CONTEXT_CONFIGURATION]);
404
assertEquals(mprj.getStringValue(), TST[IBuildMacroProvider.CONTEXT_PROJECT]);
405
assertEquals(mwsp.getStringValue(), TST[IBuildMacroProvider.CONTEXT_WORKSPACE]);
406
} catch (BuildMacroException e) {
407
fail(e.getLocalizedMessage());
414
// public void testMacroResolve(){
416
// ms = mp.getSuppliers(IBuildMacroProvider.CONTEXT_WORKSPACE, worksp);
417
// assertNotNull(ms);
418
// String[] lst = {"AAA", "BBB", "CCC"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
419
// assertTrue(addMacro("LST", IBuildMacro.VALUE_TEXT_LIST, lst, //$NON-NLS-1$
420
// IBuildMacroProvider.CONTEXT_WORKSPACE, worksp));
421
// assertTrue(addMacro("ONE", IBuildMacro.VALUE_TEXT, "EIN", //$NON-NLS-1$ //$NON-NLS-2$
422
// IBuildMacroProvider.CONTEXT_WORKSPACE, worksp));
424
// assertTrue(addMacro("L1", IBuildMacro.VALUE_TEXT, "nested L1-${L2}-L1", //$NON-NLS-1$ //$NON-NLS-2$
425
// IBuildMacroProvider.CONTEXT_WORKSPACE, worksp));
426
// assertTrue(addMacro("L2", IBuildMacro.VALUE_TEXT, "L2-${L3}-L2", //$NON-NLS-1$ //$NON-NLS-2$
427
// IBuildMacroProvider.CONTEXT_WORKSPACE, worksp));
428
// assertTrue(addMacro("L3", IBuildMacro.VALUE_TEXT, "L3-${L4}-L3", //$NON-NLS-1$ //$NON-NLS-2$
429
// IBuildMacroProvider.CONTEXT_WORKSPACE, worksp));
430
// assertTrue(addMacro("L4", IBuildMacro.VALUE_TEXT, "L4", //$NON-NLS-1$ //$NON-NLS-2$
431
// IBuildMacroProvider.CONTEXT_WORKSPACE, worksp));
433
// ms = mp.getSuppliers(IBuildMacroProvider.CONTEXT_PROJECT, mproj);
434
// assertNotNull(ms);
435
// assertTrue(addMacro("TWO", IBuildMacro.VALUE_TEXT, "ZWEI", //$NON-NLS-1$ //$NON-NLS-2$
436
// IBuildMacroProvider.CONTEXT_PROJECT, mproj));
437
// ms = mp.getSuppliers(IBuildMacroProvider.CONTEXT_CONFIGURATION, cfgs[0]);
438
// assertNotNull(ms);
439
// assertTrue(addMacro("three", IBuildMacro.VALUE_TEXT, "DREI", //$NON-NLS-1$ //$NON-NLS-2$
440
// IBuildMacroProvider.CONTEXT_CONFIGURATION, cfgs[0]));
443
// // check normal workflow
445
// final String pattern = "${ONE} - ${TWO} - ${three} -> ${LST}"; //$NON-NLS-1$
446
// String a = mp.resolveValue(pattern, UNKNOWN, LISTSEP,
447
// IBuildMacroProvider.CONTEXT_CONFIGURATION, cfgs[0]);
448
// String b = mp.resolveValue(pattern, UNKNOWN, LISTSEP,
449
// IBuildMacroProvider.CONTEXT_PROJECT, mproj);
450
// String c = mp.resolveValue(pattern, UNKNOWN, LISTSEP,
451
// IBuildMacroProvider.CONTEXT_WORKSPACE, worksp);
452
// String d = mp.resolveValue("${L1}", UNKNOWN, LISTSEP, //$NON-NLS-1$
453
// IBuildMacroProvider.CONTEXT_WORKSPACE, worksp);
454
// String e = mp.resolveValue("${one} - ${Two} - ${THREE} -> ${lst}", UNKNOWN, LISTSEP, //$NON-NLS-1$
455
// IBuildMacroProvider.CONTEXT_CONFIGURATION, cfgs[0]);
457
// assertEquals(a, "EIN - ZWEI - DREI -> AAA|BBB|CCC"); //$NON-NLS-1$
458
// assertEquals(b, "EIN - ZWEI - <HZ> -> AAA|BBB|CCC"); //$NON-NLS-1$
459
// assertEquals(c, "EIN - <HZ> - <HZ> -> AAA|BBB|CCC"); //$NON-NLS-1$
460
// assertEquals(d, "nested L1-L2-L3-L4-L3-L2-L1"); //$NON-NLS-1$
461
// assertEquals(e, "<HZ> - <HZ> - <HZ> -> <HZ>"); //$NON-NLS-1$
462
// } catch (BuildMacroException e) {
463
// fail("Exception while resolving: " + e.getLocalizedMessage()); //$NON-NLS-1$
468
* testMacroResolveExceptions()
470
public void testMacroResolveExceptions () {
473
boolean exceptionRaised = false;
474
try { // ZERO is undefined macro
475
String a = mp.resolveValue("${ONE} - ${ZERO}", null, null, //$NON-NLS-1$
476
IBuildMacroProvider.CONTEXT_CONFIGURATION, cfgs[0]);
477
} catch (BuildMacroException e) {
478
exceptionRaised = true;
480
assertTrue("Exception not raised for undefined macro", exceptionRaised); //$NON-NLS-1$
482
exceptionRaised = false;
483
try { // delimiter is undefined for list
484
String a = mp.resolveValue("${LST}", null, null, //$NON-NLS-1$
485
IBuildMacroProvider.CONTEXT_CONFIGURATION, cfgs[0]);
486
} catch (BuildMacroException e) {
487
exceptionRaised = true;
489
assertTrue("Exception not raised for undefined delimiter", exceptionRaised); //$NON-NLS-1$
493
* testMacroResolveLoop()
495
// public void testMacroResolveLoop() {
497
// int ctx = IBuildMacroProvider.CONTEXT_WORKSPACE;
498
// Object obj = worksp;
499
// ms = mp.getSuppliers(ctx, obj);
500
// assertNotNull(ms);
502
// // check state before macros added (should be OK)
504
// mp.checkIntegrity(ctx, obj);
505
// } catch (BuildMacroException e) {
506
// fail("Macros integrity check is failed"); //$NON-NLS-1$
509
// // create macro which references to undefined macro
510
// assertTrue(addMacro("B1", IBuildMacro.VALUE_TEXT, "B1-${B2}", ctx, obj)); //$NON-NLS-1$ //$NON-NLS-2$
511
// rmMacro("B2", ctx, obj); // usually it does not exist, but to be sure... //$NON-NLS-1$
513
// // check state after macro added (should be exception)
515
// mp.checkIntegrity(ctx, obj);
516
// fail("Macros misintegrity (ref to undefined) is not detected"); //$NON-NLS-1$
517
// } catch (BuildMacroException e) {}
519
// // create "dead loop" of nested macros
520
// assertTrue(addMacro("B2", IBuildMacro.VALUE_TEXT, "B2-${B3}", ctx, obj)); //$NON-NLS-1$ //$NON-NLS-2$
521
// assertTrue(addMacro("B3", IBuildMacro.VALUE_TEXT, "B3-${B1}", ctx, obj)); //$NON-NLS-1$ //$NON-NLS-2$
523
// // check state after macros added (should be exception)
525
// mp.checkIntegrity(ctx, obj);
526
// fail("Macros misintegrity (dead loop) is not detected"); //$NON-NLS-1$
527
// } catch (BuildMacroException e) {}
529
// // remove "dead loop" of nested macros
530
// assertTrue(rmMacro("B1", ctx, obj)); //$NON-NLS-1$
531
// assertTrue(rmMacro("B2", ctx, obj)); //$NON-NLS-1$
532
// assertTrue(rmMacro("B3", ctx, obj)); //$NON-NLS-1$
534
// // check state after macros removed (should be OK)
536
// mp.checkIntegrity(ctx, obj);
537
// } catch (BuildMacroException e) {
538
// fail("Macros integrity check is failed " + e.getLocalizedMessage()); //$NON-NLS-1$
542
* testMacroResolveMake()
545
public void testMacroResolveMake(){
546
final String p1 = "USERNAME: "; //$NON-NLS-1$
547
final String p2 = "${USERNAME} "; //$NON-NLS-1$
548
final String p3 = "PATH: "; //$NON-NLS-1$
549
final String p4 = "${PATH} "; //$NON-NLS-1$
550
final String p5 = "HostOsName: ${HostOsName} WorkspaceDirPath: ${WorkspaceDirPath}"; //$NON-NLS-1$
551
final String ein1 = p1 + p2 + p3;
552
final String ein2 = p4 + p5;
553
final String ein = ein1 + ein2;
554
final String aus1 = "@USERNAME "; //$NON-NLS-1$
555
final String aus2 = "@PATH "; //$NON-NLS-1$
557
// Config #0 contains "variableFormat" macro = "@=". Result: 2 first macros NOT resolved
559
UserDefinedEnvironmentSupplier env = EnvironmentVariableProvider.fUserSupplier;
560
env.createVariable("PATH","",IBuildEnvironmentVariable.ENVVAR_PREPEND,null,worksp);
561
env.createVariable("USERNAME","",IBuildEnvironmentVariable.ENVVAR_PREPEND,null,worksp);
563
String a = mp.resolveValueToMakefileFormat(ein, UNKNOWN, LISTSEP, IBuildMacroProvider.CONTEXT_CONFIGURATION, cfgs[0]);
564
String b = p1 + aus1 + p3 + mp.resolveValue(ein2, UNKNOWN, LISTSEP, IBuildMacroProvider.CONTEXT_CONFIGURATION, cfgs[0]);
565
assertEquals(a, b); // Env var names should not be resolved but converted to Makefile format
566
a = mp.resolveValueToMakefileFormat(ein, UNKNOWN, LISTSEP, IBuildMacroProvider.CONTEXT_PROJECT, mproj);
567
assertEquals(a, b); // Project context should return the same as default configuration
568
} catch (BuildMacroException e) {
569
fail(e.getLocalizedMessage());
571
// Config #1 does not contain "variableFormat" macro. Result: all macros resolved.
573
String a = mp.resolveValue(ein, UNKNOWN, LISTSEP, IBuildMacroProvider.CONTEXT_CONFIGURATION, cfgs[1]);
574
String b = mp.resolveValueToMakefileFormat(ein, UNKNOWN, LISTSEP, IBuildMacroProvider.CONTEXT_CONFIGURATION, cfgs[1]);
576
} catch (BuildMacroException e) {
577
fail(e.getLocalizedMessage());
579
// check that "isReservedName" was not called before
580
assertEquals(functionCalled & RESERVED_NAME, 0);
582
// Config #2 contains "...Supplier" macro. Result: PATH unresolved, USERNAME resolved.
584
String a = mp.resolveValue(p1 + p2, UNKNOWN, LISTSEP, IBuildMacroProvider.CONTEXT_CONFIGURATION, cfgs[2]);
585
String b = mp.resolveValue(p5, UNKNOWN, LISTSEP, IBuildMacroProvider.CONTEXT_CONFIGURATION, cfgs[2]);
586
a = a + p3 + aus2 + b; // USERNAME: xxx PATH: @PATH HostOsName: xxx ...
587
b = mp.resolveValueToMakefileFormat(ein, UNKNOWN, LISTSEP, IBuildMacroProvider.CONTEXT_CONFIGURATION, cfgs[2]);
589
// check that "isReservedName" has been called
590
assertEquals(functionCalled & RESERVED_NAME, RESERVED_NAME);
591
} catch (BuildMacroException e) {
592
fail(e.getLocalizedMessage());
598
* testMacroResolveCase()
600
// public void testMacroResolveCase(){
603
// final String winOut1 = "@CASETEST uppercase uppercase uppercase"; //$NON-NLS-1$
604
// final String winOut2 = "@CASETEST @CASETEST @CASETEST @CASETEST"; //$NON-NLS-1$
606
// final String unixOut1 = "@CASETEST capitalize lowercase upper2low"; //$NON-NLS-1$
607
// final String unixOut2 = "@CASETEST @CaseTest @casetest @CaSeTeSt"; //$NON-NLS-1$
609
// final String ein = "${CASETEST} ${CaseTest} ${casetest} ${CaSeTeSt}"; //$NON-NLS-1$
610
// final int ctx = IBuildMacroProvider.CONTEXT_CONFIGURATION;
611
// String a=null, b=null;
613
// // Config #0 contains isVariableCaseSensitive = false
614
// a = mp.resolveValueToMakefileFormat(ein, UNKNOWN, LISTSEP, ctx, cfgs[0]);
615
// // Config #3 contains isVariableCaseSensitive = true
616
// b = mp.resolveValueToMakefileFormat(ein, UNKNOWN, LISTSEP, ctx, cfgs[3]);
617
// } catch (BuildMacroException e) {
618
// fail(e.getLocalizedMessage());
621
// assertEquals(a, winOut1);
622
// assertEquals(b, winOut2);
624
// assertEquals(a, unixOut1);
625
// assertEquals(b, unixOut2);
633
// public void testMacroSave(){
634
// final String TO_SAVE_P = "TO_SAVE_P"; //$NON-NLS-1$
635
// final String TO_SAVE_W = "TO_SAVE_W"; //$NON-NLS-1$
637
// ms = mp.getSuppliers(IBuildMacroProvider.CONTEXT_PROJECT, mproj);
638
// assertNotNull(ms);
639
// assertTrue(addMacro(TO_SAVE_P, IBuildMacro.VALUE_TEXT, TO_SAVE_P,
640
// IBuildMacroProvider.CONTEXT_PROJECT, mproj));
641
// ms = mp.getSuppliers(IBuildMacroProvider.CONTEXT_WORKSPACE, worksp);
642
// assertNotNull(ms);
643
// assertTrue(addMacro(TO_SAVE_W, IBuildMacro.VALUE_TEXT, TO_SAVE_W,
644
// IBuildMacroProvider.CONTEXT_WORKSPACE, worksp));
646
// // Save the buildinfo, and then remove it, to be complete
647
// ManagedBuildManager.saveBuildInfo(proj, true);
648
// ManagedBuildManager.removeBuildInfo(proj);
651
// } catch (CoreException e) {
652
// fail("Failed on project close/open: " + e.getLocalizedMessage()); //$NON-NLS-1$
654
// ms = mp.getSuppliers(IBuildMacroProvider.CONTEXT_PROJECT, mproj);
655
// assertNotNull(ms);
656
// String[] a = printMacros(mp.getMacros(IBuildMacroProvider.CONTEXT_PROJECT, mproj, flag), TO_SAVE_P);
657
// String[] b1 = {TO_SAVE_P};
658
// assertTrue(arrayContains(b1, a));
660
// ms = mp.getSuppliers(IBuildMacroProvider.CONTEXT_WORKSPACE, worksp);
661
// assertNotNull(ms);
662
// a = printMacros(mp.getMacros(IBuildMacroProvider.CONTEXT_WORKSPACE, worksp, flag), TO_SAVE_W);
663
// String[] b2 = {TO_SAVE_W};
664
// assertTrue(arrayContains(b2, a));
668
* Below are service methods
670
//TODO: comments for all methods
672
// returns a list of macro's NAMES (not values).
673
private String[] printMacros(IBuildMacro[] vars, String head) {
674
ArrayList ar = new ArrayList(0);
676
if (vars.length > 0) {
677
for (int i=0; i < vars.length; i++) {
679
ar.add(vars[i].getName());
680
if (!print) continue;
681
if ((vars[i].getMacroValueType() % 2) == 1) // not-list
682
//if (vars[i] instanceof EclipseVarMacro) {
683
if (vars[i].getName().endsWith("prompt")) { //$NON-NLS-1$
684
System.out.println(head + "[" + i + "] " + //$NON-NLS-1$ //$NON-NLS-2$
685
vars[i].getName() + " = <UNREACHABLE>"); //$NON-NLS-1$
687
System.out.println(head + "[" + i + "] " + //$NON-NLS-1$ //$NON-NLS-2$
688
vars[i].getName() + " = " + vars[i].getStringValue()); //$NON-NLS-1$
691
System.out.println(head + "[" + i + "] " + //$NON-NLS-1$ //$NON-NLS-2$
692
vars[i].getName() + ":"); //$NON-NLS-1$
693
String[] m = vars[i].getStringListValue();
694
printStrings(m, " "); //$NON-NLS-1$
696
} catch (Exception e) {}
698
} else { if (print) System.out.println(head + ": array is empty"); } //$NON-NLS-1$
699
} else { if (print) System.out.println(head + ": array is null"); } //$NON-NLS-1$
700
return (String[])ar.toArray(new String[0]);
703
private void printStrings(String[] vars, String head) {
706
if (vars.length > 0) {
707
for (int j=0; j<vars.length; j++) System.out.println(head + vars[j]);
708
} else { System.out.println(head + ": array is empty"); } //$NON-NLS-1$
709
} else { System.out.println(head + ": array is null"); } //$NON-NLS-1$
712
/* Create new project or get existing one
714
* Sets "proj" "mproj" class variables
718
static void createManagedProject(String name) {
719
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
720
proj = root.getProject(name);
722
mproj = ManagedBuildManager.getBuildInfo(proj).getManagedProject();
724
IWorkspace workspace = ResourcesPlugin.getWorkspace();
725
IWorkspaceDescription workspaceDesc = workspace.getDescription();
726
workspaceDesc.setAutoBuilding(false);
728
workspace.setDescription(workspaceDesc);
729
proj = CCorePlugin.getDefault().createCProject(workspace.newProjectDescription(proj.getName()),
730
proj, new NullProgressMonitor(), ManagedBuilderCorePlugin.MANAGED_MAKE_PROJECT_ID);
732
// add ManagedBuildNature
733
IManagedBuildInfo info = ManagedBuildManager.createBuildInfo(proj);
735
ManagedCProjectNature.addManagedNature(proj, null);
736
ManagedCProjectNature.addManagedBuilder(proj, null);
738
ICDescriptor desc = CCorePlugin.getDefault().getCProjectDescription(proj, true);
739
desc.remove(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID);
740
desc.create(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID, ManagedBuildManager.INTERFACE_IDENTITY);
741
desc.saveProjectData();
742
} catch (CoreException e) {
743
fail("Cannot create project: " + e.getLocalizedMessage()); //$NON-NLS-1$
746
// Call this function just to avoid init problems in getProjectType();
747
IProjectType[] projTypes = ManagedBuildManager.getDefinedProjectTypes();
748
IProjectType projType = ManagedBuildManager.getProjectType("cdt.managedbuild.target.testenv.exe"); //$NON-NLS-1$
749
assertNotNull(projType);
751
mproj = ManagedBuildManager.createManagedProject(proj, projType);
752
} catch (BuildException e) {}
753
ManagedBuildManager.setNewProjectVersion(proj);
754
IConfiguration[] cfgs = projType.getConfigurations();
755
IConfiguration defcfg = cfgs.length > 0 ? mproj.createConfiguration(cfgs[0], projType.getId() + ".0") : null; //$NON-NLS-1$
756
for (int i = 1; i < cfgs.length; ++i) { // sic ! from 1
757
mproj.createConfiguration(cfgs[i], projType.getId() + "." + i); //$NON-NLS-1$
759
ManagedBuildManager.setDefaultConfiguration(proj, defcfg);
761
// open project w/o progress monitor; no action performed if it's opened
764
} catch (CoreException e) {}
767
* doInit() - call it at the beginning of every test
770
private void doInit() {
771
createManagedProject("Test"); //$NON-NLS-1$
773
assertNotNull(mproj);
774
worksp = proj.getWorkspace();
775
assertNotNull(worksp);
776
mp = ManagedBuildManager.getBuildMacroProvider();
778
cfgs = mproj.getConfigurations();
780
windows = System.getProperty("os.name").toLowerCase().startsWith("windows"); //$NON-NLS-1$ //$NON-NLS-2$
785
* check that ALL variables from list a have correspondence in list b
790
private boolean arrayContains(String[] a, String[] b) {
793
for (int i=0; i<a.length; i++) {
794
boolean found = false;
795
for (int j=0; j<b.length; j++) {
796
if (a[i].equals(b[j])) {
801
if (!found) return false;
814
/*private boolean addMacro(String name, int type, String value, int context, Object obj) {
816
for(int i=0; i<ms.length; i++) {
817
if (ms[i] instanceof UserDefinedMacroSupplier) {
818
return (((UserDefinedMacroSupplier)ms[i]).createMacro(name,type,value,context,obj) != null);
832
/* private boolean addMacro(String name, int type, String[] value, int context, Object obj) {
834
for(int i=0; i<ms.length; i++) {
835
if (ms[i] instanceof UserDefinedMacroSupplier) {
836
return (((UserDefinedMacroSupplier)ms[i]).createMacro(name,type,value,context,obj) != null);
843
* @param name - name of macro
848
/* private boolean rmMacro(String name, int context, Object obj) {
850
for(int i=0; i<ms.length; i++) {
851
if (ms[i] instanceof UserDefinedMacroSupplier) {
852
return (((UserDefinedMacroSupplier)ms[i]).deleteMacro(name,context,obj) != null);
859
* addVars() - adds macros for testMacroResolveCase
861
// private void addVars() {
862
// int app = IBuildEnvironmentVariable.ENVVAR_APPEND;
863
// String del = ""; //$NON-NLS-1$
864
// UserDefinedEnvironmentSupplier usup = null;
865
// usup = ManagedBuildEnvironmentTests.getSupplier(worksp, "Workspace"); //$NON-NLS-1$
866
// if (usup != null) {
868
// usup.createVariable("casetest","lowercase", app, del, worksp ); //$NON-NLS-1$ //$NON-NLS-2$
869
// usup.createVariable("CaseTest","capitalize", app, del, worksp ); //$NON-NLS-1$ //$NON-NLS-2$
870
// usup.createVariable("CaSeTeSt","upper2low", app, del, worksp ); //$NON-NLS-1$ //$NON-NLS-2$
871
// usup.createVariable("CASETEST","uppercase", app, del, worksp ); //$NON-NLS-1$ //$NON-NLS-2$
872
// } catch (Exception e) {
873
// fail("Failed to create workspace vars " + e.getLocalizedMessage()); //$NON-NLS-1$
878
* getFile() - open or creates sample file in current project
880
private IFile getFile() {
881
final String FILENAME = "main.c"; //$NON-NLS-1$
882
final String FILETEXT = "int main(){\n return 0;\n}"; //$NON-NLS-1$
884
IFile f = proj.getProject().getFile(FILENAME);
887
f.create( new ByteArrayInputStream(FILETEXT.getBytes() ), false, null );
888
} catch (CoreException e) { fail(e.getLocalizedMessage()); }