/mycila-plugin/tags/mycila-plugin-1.0/src/test/java/com/mycila/plugin/spi/DefaultPluginResolverTest.java

http://mycila.googlecode.com/ · Java · 255 lines · 193 code · 44 blank · 18 comment · 4 complexity · b74d5a66beb3eb5b4fdade0c3a7a4b8f MD5 · raw file

  1. /**
  2. * Copyright (C) 2008 Mathieu Carbou <mathieu.carbou@gmail.com>
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.mycila.plugin.spi;
  17. import com.mycila.plugin.api.*;
  18. import static com.mycila.plugin.spi.Builder.*;
  19. import static org.testng.Assert.*;
  20. import org.testng.annotations.Test;
  21. import java.util.Arrays;
  22. import java.util.List;
  23. /**
  24. * @author Mathieu Carbou (mathieu.carbou@gmail.com)
  25. */
  26. public final class DefaultPluginResolverTest {
  27. PluginResolver<MyPlugin> resolver;
  28. private PluginCache<MyPlugin> cache;
  29. @Test
  30. public void test_getPlugins() {
  31. setupResolver("/com/mycila/plugin/spi/two.properties");
  32. assertEquals(resolver.getPlugins().size(), 2);
  33. }
  34. @Test
  35. public void test_getPlugin() {
  36. setupResolver("/com/mycila/plugin/spi/two.properties");
  37. assertNotNull(resolver.getPlugin("plugin1"));
  38. }
  39. @Test
  40. public void test_getPlugin_error() {
  41. try {
  42. setupResolver("/com/mycila/plugin/spi/two.properties");
  43. resolver.getPlugin("plugin3");
  44. fail("must throw InexistingPluginException");
  45. } catch (InexistingPluginException e) {
  46. assertEquals(e.getPlugin(), "plugin3");
  47. }
  48. }
  49. @Test
  50. public void test_contains() {
  51. setupResolver("/com/mycila/plugin/spi/two.properties");
  52. assertTrue(resolver.contains("plugin1"));
  53. assertFalse(resolver.contains("plugin3"));
  54. }
  55. @Test
  56. public void test_getMissingDependenciesByPlugin() {
  57. setupResolver("/com/mycila/plugin/spi/noMiss.properties");
  58. assertTrue(resolver.getMissingDependenciesByPlugin().isEmpty());
  59. setupResolver("/com/mycila/plugin/spi/two.properties");
  60. assertFalse(resolver.getMissingDependenciesByPlugin().isEmpty());
  61. assertEquals(resolver.getMissingDependenciesByPlugin().size(), 2);
  62. assertEquals(resolver.getMissingDependenciesByPlugin().firstKey(), "plugin1");
  63. assertEquals(resolver.getMissingDependenciesByPlugin().get("plugin1").first(), "plugin3");
  64. assertEquals(resolver.getMissingDependenciesByPlugin().get("plugin2").first(), "inexisting");
  65. }
  66. @Test
  67. public void test_getResolvedPluginsName_empty() {
  68. setupResolver("/com/mycila/plugin/spi/empty.properties");
  69. assertEquals(resolver.getResolvedPluginsName().size(), 0);
  70. }
  71. @Test
  72. public void test_getResolvedPluginsName_simple() {
  73. setupResolver("/com/mycila/plugin/spi/two.properties");
  74. assertEquals(resolver.getResolvedPluginsName().size(), 2);
  75. assertListEquals(resolver.getResolvedPluginsName(), "plugin2", "plugin1");
  76. }
  77. @Test
  78. public void test_getResolvedPluginsName_simple_noMiss() {
  79. setupResolver("/com/mycila/plugin/spi/noMiss.properties");
  80. List<String> list = resolver.getResolvedPluginsName();
  81. assertEquals(list.size(), 4);
  82. assertListEquals(list, "inexisting", "plugin2", "plugin1", "plugin3");
  83. }
  84. @Test
  85. public void test_getResolvedPluginsName_complex1() {
  86. setupResolver("/com/mycila/plugin/spi/complex1.properties");
  87. List<String> list = resolver.getResolvedPluginsName();
  88. assertEquals(list.size(), 6);
  89. assertListEquals(list, "plugin2", "plugin1", "plugin5", "plugin6", "plugin3", "plugin4");
  90. }
  91. @Test
  92. public void test_getResolvedPluginsName_complex2() {
  93. setupResolver();
  94. cache.registerPlugin("plugin1", create().build());
  95. cache.registerPlugin("plugin2", create().afters("plugin1").build());
  96. cache.registerPlugin("plugin3", create().befores("plugin1").build());
  97. cache.registerPlugin("plugin4", create().build());
  98. cache.registerPlugin("plugin5", create().befores("plugin1").afters("plugin4").build());
  99. cache.registerPlugin("plugin6", create().befores("plugin5", "plugin2").afters("plugin3", "plugin4").build());
  100. List<String> list = resolver.getResolvedPluginsName();
  101. assertListEquals(list, "plugin2", "plugin1", "plugin5", "plugin6", "plugin3", "plugin4");
  102. }
  103. @Test
  104. public void test_getResolvedPluginsName_complex3() {
  105. setupResolver();
  106. cache.registerPlugin("plugin0", create().build());
  107. cache.registerPlugin("plugin1", create().build());
  108. cache.registerPlugin("plugin2", create().afters("plugin1").build());
  109. cache.registerPlugin("plugin3", create().befores("plugin1").build());
  110. List<String> list = resolver.getResolvedPluginsName();
  111. assertListEquals(list, "plugin0", "plugin2", "plugin1", "plugin3");
  112. }
  113. @Test
  114. public void test_getResolvedPluginsName_complex4() {
  115. setupResolver();
  116. cache.registerPlugin("plugin0", create().build());
  117. cache.registerPlugin("plugin1", create().build());
  118. cache.registerPlugin("plugin2", create().build());
  119. cache.registerPlugin("plugin3", create().build());
  120. cache.registerPlugin("plugin4", create().afters("plugin0").befores("plugin2").build());
  121. List<String> list = resolver.getResolvedPluginsName();
  122. assertListEquals(list, "plugin1", "plugin2", "plugin3", "plugin4", "plugin0");
  123. }
  124. @Test
  125. public void test_getResolvedPluginsName_complex5() {
  126. setupResolver();
  127. cache.registerPlugin("plugin0", create().build());
  128. cache.registerPlugin("plugin1", create().build());
  129. cache.registerPlugin("plugin2", create().build());
  130. cache.registerPlugin("plugin4", create().afters("plugin1").befores("plugin2").build());
  131. cache.registerPlugin("plugin3", create().befores("plugin4", "plugin0").afters("plugin1").build());
  132. List<String> list = resolver.getResolvedPluginsName();
  133. assertListEquals(list, "plugin0", "plugin2", "plugin4", "plugin3", "plugin1");
  134. }
  135. @Test
  136. public void test_getResolvedPluginsName_complex6() {
  137. setupResolver();
  138. cache.registerPlugin("plugin0", create().build());
  139. cache.registerPlugin("plugin1", create().build());
  140. cache.registerPlugin("plugin2", create().afters("plugin1").build());
  141. cache.registerPlugin("plugin3", create().befores("plugin1").afters("plugin0").build());
  142. List<String> list = resolver.getResolvedPluginsName();
  143. assertListEquals(list, "plugin2", "plugin1", "plugin3", "plugin0");
  144. }
  145. @Test
  146. public void test_getResolvedPluginsName_complex7() {
  147. setupResolver();
  148. cache.registerPlugin("plugin0", create().build());
  149. cache.registerPlugin("plugin1", create().build());
  150. cache.registerPlugin("pluginX", create().build());
  151. cache.registerPlugin("plugin2", create().afters("plugin1").build());
  152. cache.registerPlugin("plugin3", create().befores("plugin0").build());
  153. cache.registerPlugin("plugin4", create().afters("plugin0").build());
  154. List<String> list = resolver.getResolvedPluginsName();
  155. assertListEquals(list, "plugin2", "plugin4", "pluginX", "plugin1", "plugin0", "plugin3");
  156. }
  157. @Test
  158. public void test_getResolvedPluginsName_cyclic() {
  159. try {
  160. setupResolver();
  161. cache.registerPlugin("plugin0", create().build());
  162. cache.registerPlugin("plugin1", create().afters("plugin0").build());
  163. cache.registerPlugin("plugin2", create().afters("plugin1").befores("plugin0").build());
  164. List<String> list = resolver.getResolvedPluginsName();
  165. fail("must throw CyclicDependencyException. Actual: " + list);
  166. } catch (CyclicDependencyException e) {
  167. System.out.println(e.getMessage());
  168. assertEquals(e.getCyclics().keySet().toString(), "[plugin0, plugin1, plugin2]");
  169. }
  170. }
  171. @Test
  172. public void test_getResolvedPluginsName_cyclic2() {
  173. try {
  174. setupResolver();
  175. cache.registerPlugin("plugin0", create().build());
  176. cache.registerPlugin("plugin1", create().afters("plugin0").build());
  177. cache.registerPlugin("plugin2", create().afters("plugin1").befores("plugin3").build());
  178. cache.registerPlugin("plugin3", create().befores("plugin0").build());
  179. List<String> list = resolver.getResolvedPluginsName();
  180. fail("must throw CyclicDependencyException. Actual: " + list);
  181. } catch (CyclicDependencyException e) {
  182. System.out.println(e.getMessage());
  183. assertEquals(e.getCyclics().keySet().toString(), "[plugin0, plugin1, plugin2, plugin3]");
  184. }
  185. }
  186. @Test
  187. public void test_getResolvedPlugins() {
  188. setupResolver("/com/mycila/plugin/spi/noMiss.properties");
  189. List<PluginBinding<MyPlugin>> plugins = resolver.getResolvedPlugins();
  190. assertEquals(plugins.get(0).getPlugin().getClass(), MyPlugin4.class);
  191. assertEquals(plugins.get(1).getPlugin().getClass(), MyPlugin2.class);
  192. assertEquals(plugins.get(2).getPlugin().getClass(), MyPlugin1.class);
  193. assertEquals(plugins.get(3).getPlugin().getClass(), MyPlugin3.class);
  194. }
  195. private void setupResolver(String descriptor) {
  196. cache = new DefaultPluginCache<MyPlugin>(new DefaultPluginLoader<MyPlugin>(MyPlugin.class, descriptor));
  197. resolver = new DefaultPluginResolver<MyPlugin>(cache);
  198. }
  199. private void setupResolver() {
  200. cache = new DefaultPluginCache<MyPlugin>(new DefaultPluginLoader<MyPlugin>(MyPlugin.class));
  201. resolver = new DefaultPluginResolver<MyPlugin>(cache);
  202. }
  203. private void assertListEquals(List<String> plugins, String... names) {
  204. if (plugins.size() != names.length) {
  205. fail("Size differs.\nResolved: " + plugins + "\nExpected: " + Arrays.deepToString(names));
  206. }
  207. for (int i = 0; i < plugins.size() && i < names.length; i++) {
  208. assertEquals(plugins.get(i), names[i], "\nResolved: " + plugins + "\nExpected: " + Arrays.deepToString(names));
  209. }
  210. }
  211. }