1 /*******************************************************************************
2  *  Copyright (c) 2008, 2017 IBM Corporation and others.
3  *
4  *  This program and the accompanying materials
5  *  are made available under the terms of the Eclipse Public License 2.0
6  *  which accompanies this distribution, and is available at
7  *  https://www.eclipse.org/legal/epl-2.0/
8  *
9  *  SPDX-License-Identifier: EPL-2.0
10  *
11  *  Contributors:
12  *     IBM Corporation - initial API and implementation
13  *******************************************************************************/
14 package org.eclipse.equinox.p2.tests.extensionlocation;
15 
16 import java.io.File;
17 import java.io.IOException;
18 import java.net.*;
19 import org.eclipse.equinox.internal.p2.extensionlocation.Constants;
20 import org.eclipse.equinox.internal.p2.extensionlocation.ExtensionLocationMetadataRepositoryFactory;
21 import org.eclipse.equinox.p2.core.ProvisionException;
22 import org.eclipse.equinox.p2.query.QueryUtil;
23 import org.eclipse.equinox.p2.repository.IRepositoryManager;
24 import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository;
25 import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
26 
27 public class ExtensionLocationMetadataRepositoryFactoryTest extends AbstractProvisioningTest {
28 
29 	private File tempDirectory;
30 	private ExtensionLocationMetadataRepositoryFactory factory;
31 
ExtensionLocationMetadataRepositoryFactoryTest(String name)32 	public ExtensionLocationMetadataRepositoryFactoryTest(String name) {
33 		super(name);
34 	}
35 
36 	@Override
tearDown()37 	protected void tearDown() throws Exception {
38 		delete(tempDirectory);
39 		super.tearDown();
40 	}
41 
42 	@Override
setUp()43 	protected void setUp() throws Exception {
44 		super.setUp();
45 		String tempDir = System.getProperty("java.io.tmpdir");
46 		tempDirectory = new File(tempDir, "extensionlocationtest");
47 		delete(tempDirectory);
48 		tempDirectory.mkdirs();
49 		factory = new ExtensionLocationMetadataRepositoryFactory();
50 		factory.setAgent(getAgent());
51 	}
52 
testNonFileURL()53 	public void testNonFileURL() {
54 		try {
55 			URI nonFileURL = new URI("http://www.eclipse.org");
56 			factory.load(nonFileURL, 0, getMonitor());
57 			fail("0.1");
58 		} catch (ProvisionException e) {
59 			assertEquals("0.2", ProvisionException.REPOSITORY_NOT_FOUND, e.getStatus().getCode());
60 		} catch (URISyntaxException e) {
61 			fail("0.3", e);
62 		}
63 	}
64 
testNonExistentFile()65 	public void testNonExistentFile() {
66 		File directory = new File(tempDirectory, "nonexistent");
67 		delete(directory);
68 		try {
69 			factory.load(directory.toURI(), 0, getMonitor());
70 			fail("0.1");
71 		} catch (ProvisionException e) {
72 			assertEquals("0.2", ProvisionException.REPOSITORY_NOT_FOUND, e.getStatus().getCode());
73 		}
74 	}
75 
testNotDirectory()76 	public void testNotDirectory() {
77 		File file = new File(tempDirectory, "exists.file");
78 		try {
79 			file.createNewFile();
80 			factory.load(file.toURI(), 0, getMonitor());
81 			fail("0.1");
82 		} catch (ProvisionException e) {
83 			assertEquals("0.2", ProvisionException.REPOSITORY_NOT_FOUND, e.getStatus().getCode());
84 		} catch (MalformedURLException e) {
85 			fail("0.3", e);
86 		} catch (IOException e) {
87 			fail("0.4", e);
88 		}
89 	}
90 
testNoFeatureOrPluginsDirectory()91 	public void testNoFeatureOrPluginsDirectory() {
92 		File directory = new File(tempDirectory, "exists");
93 		directory.mkdirs();
94 		try {
95 			factory.load(directory.toURI(), 0, getMonitor());
96 			fail("0.1");
97 		} catch (ProvisionException e) {
98 			assertEquals("0.2", ProvisionException.REPOSITORY_NOT_FOUND, e.getStatus().getCode());
99 		}
100 	}
101 
testEmptyFeatureAndPluginsDirectory()102 	public void testEmptyFeatureAndPluginsDirectory() {
103 		File directory = new File(tempDirectory, "exists");
104 		directory.mkdirs();
105 		new File(directory, "plugins").mkdir();
106 		new File(directory, "features").mkdir();
107 		try {
108 			factory.load(directory.toURI(), 0, getMonitor());
109 		} catch (ProvisionException e) {
110 			fail("0.1");
111 		}
112 	}
113 
testEmptyFeaturesDirectory()114 	public void testEmptyFeaturesDirectory() {
115 		File directory = new File(tempDirectory, "exists");
116 		directory.mkdirs();
117 		new File(directory, "features").mkdir();
118 		try {
119 			factory.load(directory.toURI(), 0, getMonitor());
120 		} catch (ProvisionException e) {
121 			fail("0.1");
122 		}
123 	}
124 
testEmptyPluginsDirectory()125 	public void testEmptyPluginsDirectory() {
126 		File directory = new File(tempDirectory, "exists");
127 		directory.mkdirs();
128 		new File(directory, "plugins").mkdir();
129 		try {
130 			factory.load(directory.toURI(), 0, getMonitor());
131 		} catch (ProvisionException e) {
132 			fail("0.1");
133 		}
134 	}
135 
testEclipseBaseEmptyFeatureAndPluginsDirectory()136 	public void testEclipseBaseEmptyFeatureAndPluginsDirectory() {
137 		File directory = new File(tempDirectory, "exists");
138 		directory.mkdirs();
139 		File eclipseDirectory = new File(directory, "eclipse");
140 		eclipseDirectory.mkdir();
141 		new File(eclipseDirectory, "plugins").mkdir();
142 		new File(eclipseDirectory, "features").mkdir();
143 		try {
144 			factory.load(directory.toURI(), 0, getMonitor());
145 		} catch (ProvisionException e) {
146 			fail("0.1");
147 		}
148 	}
149 
testNotEclipseBaseEmptyFeatureAndPluginsDirectory()150 	public void testNotEclipseBaseEmptyFeatureAndPluginsDirectory() {
151 		File directory = new File(tempDirectory, "exists");
152 		directory.mkdirs();
153 		File eclipseDirectory = new File(directory, "noteclipse");
154 		eclipseDirectory.mkdir();
155 		new File(eclipseDirectory, "plugins").mkdir();
156 		new File(eclipseDirectory, "features").mkdir();
157 		try {
158 			factory.load(directory.toURI(), 0, getMonitor());
159 			fail("0.1");
160 		} catch (ProvisionException e) {
161 			assertEquals("0.2", ProvisionException.REPOSITORY_NOT_FOUND, e.getStatus().getCode());
162 		}
163 	}
164 
testNormalFeaturesandPluginsDirectory()165 	public void testNormalFeaturesandPluginsDirectory() {
166 		File directory = new File(tempDirectory, "exists");
167 		directory.mkdirs();
168 		copy("1.0", getTestData("1.1", "/testData/extensionlocation"), directory);
169 		URI location = directory.toURI();
170 		try {
171 			IMetadataRepository repo = factory.load(location, 0, getMonitor());
172 			if (queryResultSize(repo.query(QueryUtil.createIUAnyQuery(), null)) != 3)
173 				fail("2.99");
174 		} catch (ProvisionException ex) {
175 			fail("2.0");
176 		}
177 	}
178 
testNormalFeaturesDirectory()179 	public void testNormalFeaturesDirectory() {
180 		File directory = new File(tempDirectory, "exists/features");
181 		directory.mkdirs();
182 		File features = new File(directory, "features");
183 		features.mkdir();
184 		copy("1.0", getTestData("1.1", "/testData/extensionlocation/features"), features);
185 		URI location = directory.toURI();
186 		try {
187 			IMetadataRepository repo = factory.load(location, 0, getMonitor());
188 			if (queryResultSize(repo.query(QueryUtil.createIUAnyQuery(), null)) != 2)
189 				fail("3.0");
190 		} catch (ProvisionException ex) {
191 			fail("2.0");
192 		}
193 	}
194 
testNormalPluginsDirectory()195 	public void testNormalPluginsDirectory() {
196 		File directory = new File(tempDirectory, "exists/plugins");
197 		directory.mkdirs();
198 		File plugins = new File(directory, "plugins");
199 		plugins.mkdir();
200 		copy("1.0", getTestData("1.1", "/testData/extensionlocation/plugins"), plugins);
201 		URI location = directory.toURI();
202 		try {
203 			IMetadataRepository repo = factory.load(location, 0, getMonitor());
204 			if (queryResultSize(repo.query(QueryUtil.createIUAnyQuery(), null)) != 1)
205 				fail("3.0");
206 		} catch (ProvisionException ex) {
207 			fail("2.0");
208 		}
209 	}
210 
testEclipseBaseNormalFeaturesandPluginsDirectory()211 	public void testEclipseBaseNormalFeaturesandPluginsDirectory() {
212 		File directory = new File(tempDirectory, "exists");
213 		directory.mkdirs();
214 		File eclipseDirectory = new File(directory, "eclipse");
215 		copy("1.0", getTestData("1.1", "/testData/extensionlocation"), eclipseDirectory);
216 		try {
217 			IMetadataRepository repo = factory.load(directory.toURI(), 0, getMonitor());
218 			if (queryResultSize(repo.query(QueryUtil.createIUAnyQuery(), null)) != 3)
219 				fail("3.0");
220 		} catch (ProvisionException e) {
221 			fail("2.0");
222 		}
223 	}
224 
testEclipseBaseModifiableRepository()225 	public void testEclipseBaseModifiableRepository() {
226 		File directory = new File(tempDirectory, "exists");
227 		directory.mkdirs();
228 		File eclipseDirectory = new File(directory, "eclipse");
229 		copy("1.0", getTestData("1.1", "/testData/extensionlocation"), eclipseDirectory);
230 		try {
231 			IMetadataRepository repo = factory.load(directory.toURI(), IRepositoryManager.REPOSITORY_HINT_MODIFIABLE, getMonitor());
232 			assertNull("3.0", repo);
233 		} catch (ProvisionException e) {
234 			fail("2.0");
235 		}
236 	}
237 
testUpdateSiteXMLURL()238 	public void testUpdateSiteXMLURL() {
239 		File site = getTestData("0.1", "/testData/updatesite/site");
240 		try {
241 			factory.load(site.toURI(), 0, getMonitor());
242 		} catch (ProvisionException e) {
243 			if (e.getStatus().getCode() == ProvisionException.REPOSITORY_NOT_FOUND)
244 				return;
245 		}
246 		fail("1.0");
247 	}
248 
testXXXSiteXXXXMLURL()249 	public void testXXXSiteXXXXMLURL() {
250 		File site = getTestData("0.1", "/testData/updatesite/xxxsitexxx");
251 		try {
252 			factory.load(site.toURI(), 0, getMonitor());
253 		} catch (ProvisionException e) {
254 			if (e.getStatus().getCode() == ProvisionException.REPOSITORY_NOT_FOUND)
255 				return;
256 		}
257 		fail("1.0");
258 	}
259 
testArtifactsXMLFeaturesandPluginsDirectory()260 	public void testArtifactsXMLFeaturesandPluginsDirectory() throws IOException {
261 		File directory = new File(tempDirectory, "exists");
262 		directory.mkdirs();
263 		File artifactsXML = new File(directory, "artifacts.xml");
264 		artifactsXML.createNewFile();
265 
266 		copy("1.0", getTestData("1.1", "/testData/extensionlocation"), directory);
267 		URI location = directory.toURI();
268 		try {
269 			factory.load(location, 0, getMonitor());
270 		} catch (ProvisionException e) {
271 			if (e.getStatus().getCode() == ProvisionException.REPOSITORY_NOT_FOUND)
272 				return;
273 		}
274 		fail("1.0");
275 	}
276 
testArtifactsXMLFeaturesandPluginsDirectoryWithExtensionLocation()277 	public void testArtifactsXMLFeaturesandPluginsDirectoryWithExtensionLocation() throws IOException {
278 		File directory = new File(tempDirectory, "exists");
279 		directory.mkdirs();
280 		File artifactsXML = new File(directory, "artifacts.xml");
281 		artifactsXML.createNewFile();
282 
283 		copy("1.0", getTestData("1.1", "/testData/extensionlocation"), directory);
284 		File extensionLocation = new File(tempDirectory.getAbsolutePath() + Constants.EXTENSION_LOCATION);
285 		URI location = extensionLocation.toURI();
286 		try {
287 			factory.load(location, 0, getMonitor());
288 		} catch (ProvisionException e) {
289 			if (e.getStatus().getCode() == ProvisionException.REPOSITORY_NOT_FOUND)
290 				return;
291 		}
292 		fail("1.0");
293 	}
294 
testContentXMLFeaturesandPluginsDirectory()295 	public void testContentXMLFeaturesandPluginsDirectory() throws IOException {
296 		File directory = new File(tempDirectory, "exists");
297 		directory.mkdirs();
298 		File contentXML = new File(directory, "content.xml");
299 		contentXML.createNewFile();
300 
301 		copy("1.0", getTestData("1.1", "/testData/extensionlocation"), directory);
302 		URI location = directory.toURI();
303 		try {
304 			factory.load(location, 0, getMonitor());
305 		} catch (ProvisionException e) {
306 			if (e.getStatus().getCode() == ProvisionException.REPOSITORY_NOT_FOUND)
307 				return;
308 		}
309 		fail("1.0");
310 	}
311 
testCompositeArtifactsXMLFeaturesandPluginsDirectory()312 	public void testCompositeArtifactsXMLFeaturesandPluginsDirectory() throws IOException {
313 		File directory = new File(tempDirectory, "exists");
314 		directory.mkdirs();
315 		File compositeArtifactsXML = new File(directory, "compositeArtifacts.xml");
316 		compositeArtifactsXML.createNewFile();
317 
318 		copy("1.0", getTestData("1.1", "/testData/extensionlocation"), directory);
319 		URI location = directory.toURI();
320 		try {
321 			factory.load(location, 0, getMonitor());
322 		} catch (ProvisionException e) {
323 			if (e.getStatus().getCode() == ProvisionException.REPOSITORY_NOT_FOUND)
324 				return;
325 		}
326 		fail("1.0");
327 	}
328 
testCompositeContentXMLFeaturesandPluginsDirectory()329 	public void testCompositeContentXMLFeaturesandPluginsDirectory() throws IOException {
330 		File directory = new File(tempDirectory, "exists");
331 		directory.mkdirs();
332 		File compositeContentXML = new File(directory, "compositeContent.xml");
333 		compositeContentXML.createNewFile();
334 
335 		copy("1.0", getTestData("1.1", "/testData/extensionlocation"), directory);
336 		URI location = directory.toURI();
337 		try {
338 			factory.load(location, 0, getMonitor());
339 		} catch (ProvisionException e) {
340 			if (e.getStatus().getCode() == ProvisionException.REPOSITORY_NOT_FOUND)
341 				return;
342 		}
343 		fail("1.0");
344 	}
345 }
346