Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: 0d859ae7e8f7bb0115153e3dbcb496ce5affe245 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
/*******************************************************************************
 * Copyright (c) 2009, 2012 Andrew Gvozdev and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Andrew Gvozdev - Initial API and implementation
 *******************************************************************************/

package org.eclipse.cdt.core.language.settings.providers;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import junit.framework.TestSuite;

import org.eclipse.cdt.core.settings.model.CIncludeFileEntry;
import org.eclipse.cdt.core.settings.model.CIncludePathEntry;
import org.eclipse.cdt.core.settings.model.CLibraryFileEntry;
import org.eclipse.cdt.core.settings.model.CLibraryPathEntry;
import org.eclipse.cdt.core.settings.model.CMacroEntry;
import org.eclipse.cdt.core.settings.model.CMacroFileEntry;
import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry;
import org.eclipse.cdt.core.settings.model.ICSettingEntry;
import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsExtensionManager;
import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsProvidersSerializer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Path;

/**
 * Test cases testing LanguageSettingsProvider extensions
 */
public class LanguageSettingsExtensionsTests extends BaseTestCase {
	// These should match corresponding entries defined in plugin.xml
	/*package*/ static final String EXTENSION_BASE_PROVIDER_ID = "org.eclipse.cdt.core.tests.language.settings.base.provider";
	/*package*/ static final String EXTENSION_BASE_PROVIDER_NAME = "Test Plugin Mock Language Settings Base Provider";
	/*package*/ static final String EXTENSION_BASE_PROVIDER_LANG_ID = "org.eclipse.cdt.core.tests.language.id";
	/*package*/ static final String EXTENSION_BASE_PROVIDER_PARAMETER = "custom parameter";
	/*package*/ static final String EXTENSION_BASE_PROVIDER_ATTR_PARAMETER = "parameter";
	/*package*/ static final String EXTENSION_CUSTOM_PROVIDER_ID = "org.eclipse.cdt.core.tests.custom.language.settings.provider";
	/*package*/ static final String EXTENSION_CUSTOM_PROVIDER_NAME = "Test Plugin Mock Language Settings Provider";
	/*package*/ static final String EXTENSION_BASE_SUBCLASS_PROVIDER_ID = "org.eclipse.cdt.core.tests.language.settings.base.provider.subclass";
	/*package*/ static final String EXTENSION_BASE_SUBCLASS_PROVIDER_PARAMETER = "custom parameter subclass";
	/*package*/ static final String EXTENSION_SERIALIZABLE_PROVIDER_ID = "org.eclipse.cdt.core.tests.custom.serializable.language.settings.provider";
	/*package*/ static final String EXTENSION_SERIALIZABLE_PROVIDER_NAME = "Test Plugin Mock Serializable Language Settings Provider";
	/*package*/ static final String EXTENSION_SERIALIZABLE_PROVIDER_MISSING_PARAMETER = "parameter";
	/*package*/ static final String EXTENSION_EDITABLE_PROVIDER_ID = "org.eclipse.cdt.core.tests.custom.editable.language.settings.provider";
	/*package*/ static final String EXTENSION_EDITABLE_PROVIDER_NAME = "Test Plugin Mock Editable Language Settings Provider";
	/*package*/ static final ICLanguageSettingEntry EXTENSION_SERIALIZABLE_PROVIDER_ENTRY = new CMacroEntry("MACRO", "value", 0);
	/*package*/ static final ICLanguageSettingEntry EXTENSION_EDITABLE_PROVIDER_ENTRY = new CMacroEntry("MACRO", "value", 0);
	/*package*/ static final String EXTENSION_REGISTERER_PROVIDER_ID = "org.eclipse.cdt.core.tests.language.settings.listener.registerer.provider";

	// Arbitrary sample parameters used by the test
	private static final String PROVIDER_0 = "test.provider.0.id";
	private static final String PROVIDER_NAME_0 = "test.provider.0.name";
	private static final String LANG_ID = "test.lang.id";
	private static final IFile FILE_0 = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path("/project/path0"));

	// Constants used in LanguageSettingsSerializableProvider
	private static final String ATTR_ID = LanguageSettingsProvidersSerializer.ATTR_ID;
	private static final String ATTR_NAME = LanguageSettingsProvidersSerializer.ATTR_NAME;
	private static final String ATTR_CLASS = LanguageSettingsProvidersSerializer.ATTR_CLASS;

	/**
	 * Constructor.
	 * @param name - name of the test.
	 */
	public LanguageSettingsExtensionsTests(String name) {
		super(name);

	}

	@Override
	protected void setUp() throws Exception {
		super.setUp();
	}

	@Override
	protected void tearDown() throws Exception {
		super.tearDown();
	}

	/**
	 * @return - new TestSuite.
	 */
	public static TestSuite suite() {
		return new TestSuite(LanguageSettingsExtensionsTests.class);
	}

	/**
	 * main function of the class.
	 *
	 * @param args - arguments
	 */
	public static void main(String[] args) {
		junit.textui.TestRunner.run(suite());
	}

	/**
	 * Check that regular {@link ICLanguageSettingsProvider} extension defined in plugin.xml is accessible.
	 */
	public void testExtension() throws Exception {
		{
			// test provider defined as an extension
			List<ILanguageSettingsProvider> providers = LanguageSettingsManager.getWorkspaceProviders();
			List<String> ids = new ArrayList<String>();
			for (ILanguageSettingsProvider provider : providers) {
				ids.add(provider.getId());
			}
			assertTrue("extension " + EXTENSION_BASE_PROVIDER_ID + " not found", ids.contains(EXTENSION_BASE_PROVIDER_ID));
		}

		{
			// test provider that is not in the list
			ILanguageSettingsProvider providerExt = LanguageSettingsManager.getExtensionProviderCopy("missing.povider", true);
			assertNull(providerExt);
		}

		// this extension provider is not copyable
		ILanguageSettingsProvider providerExtCopy = LanguageSettingsManager.getExtensionProviderCopy(EXTENSION_BASE_PROVIDER_ID, true);
		assertNull(providerExtCopy);

		// test raw workspace provider defined as an extension
		ILanguageSettingsProvider providerExt = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_BASE_PROVIDER_ID);
		assertTrue(LanguageSettingsManager.isWorkspaceProvider(providerExt));
		ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(providerExt);
		assertTrue(rawProvider instanceof LanguageSettingsBaseProvider);
		LanguageSettingsBaseProvider provider = (LanguageSettingsBaseProvider)rawProvider;
		assertEquals(EXTENSION_BASE_PROVIDER_ID, provider.getId());
		assertEquals(EXTENSION_BASE_PROVIDER_NAME, provider.getName());
		assertEquals(EXTENSION_BASE_PROVIDER_PARAMETER, provider.getProperty(EXTENSION_BASE_PROVIDER_ATTR_PARAMETER));
		// these attributes are not exposed as properties
		assertEquals("", provider.getProperty(ATTR_ID));
		assertEquals("", provider.getProperty(ATTR_NAME));
		assertEquals("", provider.getProperty(ATTR_CLASS));

		// attempt to get entries for wrong language
		assertNull(provider.getSettingEntries(null, FILE_0, LANG_ID));

		// benchmarks matching extension point definition
		List<ICLanguageSettingEntry> entriesExt = new ArrayList<ICLanguageSettingEntry>();
		entriesExt.add(new CIncludePathEntry("/usr/include/",
				ICSettingEntry.BUILTIN
				| ICSettingEntry.LOCAL
				| ICSettingEntry.RESOLVED
				| ICSettingEntry.VALUE_WORKSPACE_PATH
				| ICSettingEntry.UNDEFINED
		));
		entriesExt.add(new CMacroEntry("TEST_DEFINE", "100", 0));
		entriesExt.add(new CIncludeFileEntry("/include/file.inc", 0));
		entriesExt.add(new CLibraryPathEntry("/usr/lib/", 0));
		entriesExt.add(new CLibraryFileEntry("libdomain.a", 0));
		entriesExt.add(new CMacroFileEntry("/macro/file.mac", 0));

		// retrieve entries from extension point
		List<ICLanguageSettingEntry> actual = provider.getSettingEntries(null, FILE_0, EXTENSION_BASE_PROVIDER_LANG_ID);
		for (int i=0;i<entriesExt.size();i++) {
			assertEquals("i="+i, entriesExt.get(i), actual.get(i));
		}
		assertEquals(entriesExt.size(), actual.size());
	}

	/**
	 * Check that subclassed {@link LanguageSettingsBaseProvider} extension defined in plugin.xml is accessible.
	 */
	public void testExtensionBaseProviderSubclass() throws Exception {
		// get test plugin extension provider
		ILanguageSettingsProvider providerExtCopy = LanguageSettingsManager.getExtensionProviderCopy(EXTENSION_BASE_SUBCLASS_PROVIDER_ID, true);
		assertNull(providerExtCopy);
		ILanguageSettingsProvider providerExt = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_BASE_SUBCLASS_PROVIDER_ID);
		assertTrue(LanguageSettingsManager.isWorkspaceProvider(providerExt));

		// get raw extension provider
		ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(providerExt);
		assertTrue(rawProvider instanceof MockLanguageSettingsBaseProvider);
		MockLanguageSettingsBaseProvider provider = (MockLanguageSettingsBaseProvider)rawProvider;
		assertEquals(EXTENSION_BASE_SUBCLASS_PROVIDER_ID, provider.getId());
		assertEquals(EXTENSION_BASE_SUBCLASS_PROVIDER_PARAMETER, provider.getCustomParameter());

		// Test for null languages
		assertNull(provider.getLanguageScope());

		// benchmarks matching extension point definition
		List<ICLanguageSettingEntry> entriesExt = new ArrayList<ICLanguageSettingEntry>();
		entriesExt.add(new CIncludePathEntry("/usr/include/", ICSettingEntry.BUILTIN));

		// retrieve entries from extension point
		List<ICLanguageSettingEntry> actual = provider.getSettingEntries(null, FILE_0, LANG_ID);
		for (int i=0;i<entriesExt.size();i++) {
			assertEquals("i="+i, entriesExt.get(i), actual.get(i));
		}
		assertEquals(entriesExt.size(), actual.size());
	}

	/**
	 * Make sure extensions contributed through extension point created with proper ID/name.
	 */
	public void testExtensionCustomProvider() throws Exception {
		// get test plugin extension non-default provider
		ILanguageSettingsProvider providerExtCopy = LanguageSettingsManager.getExtensionProviderCopy(EXTENSION_CUSTOM_PROVIDER_ID, true);
		assertNull(providerExtCopy);
		ILanguageSettingsProvider providerExt = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_CUSTOM_PROVIDER_ID);
		assertTrue(LanguageSettingsManager.isWorkspaceProvider(providerExt));

		// get raw extension provider
		ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(providerExt);
		assertTrue(rawProvider instanceof MockLanguageSettingsProvider);

		assertEquals(EXTENSION_CUSTOM_PROVIDER_ID, rawProvider.getId());
		assertEquals(EXTENSION_CUSTOM_PROVIDER_NAME, rawProvider.getName());
	}

	/**
	 * Basic test for {@link LanguageSettingsBaseProvider}.
	 */
	public void testBaseProvider() throws Exception {
		// define benchmarks
		List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
		entries.add(new CIncludePathEntry("path0", 0));
		List<String> languages = new ArrayList<String>(2);
		languages.add("bogus.language.id");
		languages.add(LANG_ID);

		// create base provider
		LanguageSettingsBaseProvider provider = new LanguageSettingsBaseProvider(PROVIDER_0, PROVIDER_NAME_0, languages, entries);

		{
			// attempt to get entries for wrong language
			List<ICLanguageSettingEntry> actual = provider.getSettingEntries(null, FILE_0, "wrong.lang.id");
			assertNull(actual);
		}

		{
			// retrieve the entries
			List<ICLanguageSettingEntry> actual = provider.getSettingEntries(null, FILE_0, LANG_ID);
			assertEquals(entries.get(0), actual.get(0));
			assertNotSame(entries, actual);
			// retrieve languages
			List<String> actualLanguageIds = provider.getLanguageScope();
			for (String languageId: languages) {
				assertTrue(actualLanguageIds.contains(languageId));
			}
			assertEquals(languages.size(), actualLanguageIds.size());
		}
	}

	/**
	 * Test ability to configure {@link LanguageSettingsBaseProvider}.
	 */
	public void testBaseProviderConfigure() throws Exception {
		// sample entries
		List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
		entries.add(new CIncludePathEntry("/usr/include/", 0));
		List<String> languages = new ArrayList<String>();
		languages.add(LANG_ID);
		// create LanguageSettingsBaseProvider
		LanguageSettingsBaseProvider provider1 = new LanguageSettingsBaseProvider();
		LanguageSettingsBaseProvider provider2 = new LanguageSettingsBaseProvider();
		{
			// configure provider1
			Map<String, String> properties = new HashMap<String, String>();
			properties.put("key1", "value1");
			properties.put("key2", null);
			properties.put("key3", "");
			properties.put("key4", "false");
			provider1.configureProvider(PROVIDER_0, PROVIDER_NAME_0, languages, entries, properties);
			assertEquals(PROVIDER_0, provider1.getId());
			assertEquals(PROVIDER_NAME_0, provider1.getName());
			assertEquals(languages, provider1.getLanguageScope());
			assertEquals(entries, provider1.getSettingEntries(null, null, LANG_ID));
			assertEquals("value1", provider1.getProperty("key1"));
			assertEquals("", provider1.getProperty("key2"));
			assertEquals("", provider1.getProperty("key3"));
			assertEquals("false", provider1.getProperty("key4"));
			assertEquals(false, provider1.getPropertyBool("key4"));
			assertEquals("", provider1.getProperty("keyX"));
			assertEquals(false, provider1.getPropertyBool("keyX"));
		}
		{
			// configure provider2
			Map<String, String> properties = new HashMap<String, String>();
			properties.put("key1", "value1");
			provider2.configureProvider(PROVIDER_0, PROVIDER_NAME_0, languages, entries, properties);
			assertEquals(PROVIDER_0, provider2.getId());
			assertEquals(PROVIDER_NAME_0, provider2.getName());
			assertEquals(languages, provider2.getLanguageScope());
			assertEquals(entries, provider2.getSettingEntries(null, null, LANG_ID));
			assertEquals("value1", provider2.getProperty("key1"));
			assertEquals("", provider2.getProperty("keyX"));
			assertEquals(false, provider2.getPropertyBool("keyX"));
		}
		// test equality
		assertTrue(provider1.equals(provider2));
	}

	/**
	 * {@link LanguageSettingsBaseProvider} is not allowed to be configured twice.
	 */
	public void testBaseProviderCantReconfigure() throws Exception {
		// create LanguageSettingsBaseProvider
		LanguageSettingsBaseProvider provider = new LanguageSettingsBaseProvider();
		List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
		entries.add(new CIncludePathEntry("/usr/include/", 0));
		// configure it
		provider.configureProvider("test.id", "test.name", null, entries, null);

		try {
			// attempt to configure it twice should fail
			provider.configureProvider("test.id", "test.name", null, entries, null);
			fail("LanguageSettingsBaseProvider is not allowed to be configured twice");
		} catch (UnsupportedOperationException e) {
		}
	}

	/**
	 * Test {@link LanguageSettingsSerializableProvider} defined via extension point.
	 */
	public void testSerializableProvider() throws Exception {
		// get test plugin extension for serializable provider
		ILanguageSettingsProvider providerExtCopy = LanguageSettingsManager.getExtensionProviderCopy(EXTENSION_SERIALIZABLE_PROVIDER_ID, true);
		assertNull(providerExtCopy);
		ILanguageSettingsProvider providerExt = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_SERIALIZABLE_PROVIDER_ID);
		assertTrue(LanguageSettingsManager.isWorkspaceProvider(providerExt));

		// get raw extension provider
		ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(providerExt);
		assertTrue(rawProvider instanceof LanguageSettingsSerializableProvider);
		LanguageSettingsSerializableProvider provider = (LanguageSettingsSerializableProvider) rawProvider;

		assertEquals(null, provider.getLanguageScope());
		assertEquals("", provider.getProperty(EXTENSION_SERIALIZABLE_PROVIDER_MISSING_PARAMETER));

		List<ICLanguageSettingEntry> expected = new ArrayList<ICLanguageSettingEntry>();
		expected.add(EXTENSION_EDITABLE_PROVIDER_ENTRY);
		assertEquals(expected, provider.getSettingEntries(null, null, null));
	}

	/**
	 * Test {@link ILanguageSettingsEditableProvider} defined via extension point.
	 */
	public void testEditableProvider() throws Exception {
		// Non-editable providers cannot be copied so they are singletons
		{
			// get test plugin extension for serializable provider
			ILanguageSettingsProvider providerExtCopy = LanguageSettingsManager.getExtensionProviderCopy(EXTENSION_SERIALIZABLE_PROVIDER_ID, true);
			assertNull(providerExtCopy);
			ILanguageSettingsProvider providerExt = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_SERIALIZABLE_PROVIDER_ID);
			assertTrue(LanguageSettingsManager.isWorkspaceProvider(providerExt));

			// get raw extension provider
			ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(providerExt);
			assertTrue(rawProvider instanceof LanguageSettingsSerializableProvider);
			assertTrue(LanguageSettingsManager.isEqualExtensionProvider(rawProvider, true));
			assertEquals(true, LanguageSettingsExtensionManager.isPreferShared(EXTENSION_SERIALIZABLE_PROVIDER_ID));
		}

		// Editable providers are retrieved by copy
		{
			// get extension provider
			ILanguageSettingsProvider providerExt = LanguageSettingsManager.getExtensionProviderCopy(EXTENSION_EDITABLE_PROVIDER_ID, true);
			assertFalse(LanguageSettingsManager.isWorkspaceProvider(providerExt));
			assertTrue(providerExt instanceof ILanguageSettingsEditableProvider);
			assertTrue(LanguageSettingsManager.isEqualExtensionProvider(providerExt, true));
			assertEquals(LanguageSettingsExtensionManager.isPreferShared(EXTENSION_EDITABLE_PROVIDER_ID), false);

			// test that different copies are not same
			ILanguageSettingsProvider providerExt2 = LanguageSettingsManager.getExtensionProviderCopy(EXTENSION_EDITABLE_PROVIDER_ID, true);
			assertNotSame(providerExt, providerExt2);
			assertEquals(providerExt, providerExt2);

			// test that workspace provider is not the same as extension provider
			ILanguageSettingsProvider providerWsp = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_EDITABLE_PROVIDER_ID);
			ILanguageSettingsProvider providerWspRaw = LanguageSettingsManager.getRawProvider(providerWsp);
			assertNotSame(providerExt, providerWspRaw);
			assertEquals(providerExt, providerWspRaw);
			assertTrue(LanguageSettingsManager.isEqualExtensionProvider(providerWspRaw, true));
		}

		// Test shallow copy
		{
			ILanguageSettingsProvider provider = LanguageSettingsManager.getExtensionProviderCopy(EXTENSION_EDITABLE_PROVIDER_ID, true);
			assertNotNull(provider);
			assertTrue(provider instanceof ILanguageSettingsEditableProvider);

			ILanguageSettingsProvider providerShallow = LanguageSettingsManager.getExtensionProviderCopy(EXTENSION_EDITABLE_PROVIDER_ID, false);
			assertNotNull(providerShallow);
			assertTrue(providerShallow instanceof ILanguageSettingsEditableProvider);
			assertFalse(provider.equals(providerShallow));

			assertFalse(LanguageSettingsManager.isEqualExtensionProvider(providerShallow, true));
			assertTrue(LanguageSettingsManager.isEqualExtensionProvider(providerShallow, false));
		}
	}

}

Back to the top