View Javadoc
1   /*
2    * Copyright (C) 2019 Nail Samatov <sanail@yandex.ru> and others
3    *
4    * This program and the accompanying materials are made available under the
5    * terms of the Eclipse Distribution License v. 1.0 which is available at
6    * https://www.eclipse.org/org/documents/edl-v10.php.
7    *
8    * SPDX-License-Identifier: BSD-3-Clause
9    */
10  package org.eclipse.jgit.junit;
11  
12  import java.net.MalformedURLException;
13  import java.net.URL;
14  import java.net.URLClassLoader;
15  import java.nio.file.Paths;
16  
17  import org.junit.runners.BlockJUnit4ClassRunner;
18  import org.junit.runners.model.InitializationError;
19  
20  /**
21   * This class is used when it's required to load jgit classes in separate
22   * classloader for each test class. It can be needed to isolate static field
23   * initialization between separate tests.
24   */
25  public class SeparateClassloaderTestRunner extends BlockJUnit4ClassRunner {
26  
27  	/**
28  	 * Creates a SeparateClassloaderTestRunner to run {@code klass}.
29  	 *
30  	 * @param klass
31  	 *            test class to run.
32  	 * @throws InitializationError
33  	 *             if the test class is malformed or can't be found.
34  	 */
35  	public SeparateClassloaderTestRunner(Class<?> klass)
36  			throws InitializationError {
37  		super(loadNewClass(klass));
38  	}
39  
40  	private static Class<?> loadNewClass(Class<?> klass)
41  			throws InitializationError {
42  		try {
43  			String pathSeparator = System.getProperty("path.separator");
44  			String[] classPathEntries = System.getProperty("java.class.path")
45  					.split(pathSeparator);
46  			URL[] urls = new URL[classPathEntries.length];
47  			for (int i = 0; i < classPathEntries.length; i++) {
48  				urls[i] = Paths.get(classPathEntries[i]).toUri().toURL();
49  			}
50  			ClassLoader testClassLoader = new URLClassLoader(urls) {
51  
52  				@Override
53  				public Class<?> loadClass(String name)
54  						throws ClassNotFoundException {
55  					if (name.startsWith("org.eclipse.jgit.")) {
56  						return super.findClass(name);
57  					}
58  
59  					return super.loadClass(name);
60  				}
61  			};
62  			return Class.forName(klass.getName(), true, testClassLoader);
63  		} catch (ClassNotFoundException | MalformedURLException e) {
64  			throw new InitializationError(e);
65  		}
66  	}
67  }