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