1 package com.atlassian.plugin.spring;
2
3 import com.atlassian.plugin.osgi.hostcomponents.ContextClassLoaderStrategy;
4 import org.junit.Test;
5 import org.junit.runner.RunWith;
6 import org.mockito.Mock;
7 import org.mockito.junit.MockitoJUnitRunner;
8 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
9 import org.springframework.context.annotation.Bean;
10 import org.springframework.context.annotation.Configuration;
11 import org.springframework.context.annotation.Scope;
12
13 import java.util.List;
14 import java.util.Map;
15 import java.util.Set;
16
17 import static com.atlassian.plugin.osgi.hostcomponents.ContextClassLoaderStrategy.USE_HOST;
18 import static com.atlassian.plugin.osgi.hostcomponents.ContextClassLoaderStrategy.USE_PLUGIN;
19 import static org.mockito.Mockito.never;
20 import static org.mockito.Mockito.verify;
21
22 @RunWith(MockitoJUnitRunner.class)
23 public class TestAvailableToPluginsBeanDefinitionRegistryProcessor {
24
25 @Mock
26 static PluginBeanDefinitionRegistry pluginBeanDefinitionRegistry;
27
28 @Test
29 public void beanMethodAnnotationsAreProcessed() {
30 new AnnotationConfigApplicationContext(Config.class);
31
32 verify(pluginBeanDefinitionRegistry).addBeanName("simplePluginAvailableBean");
33 verify(pluginBeanDefinitionRegistry).addContextClassLoaderStrategy("simplePluginAvailableBean", USE_HOST);
34
35 verify(pluginBeanDefinitionRegistry).addBeanName("complexPluginAvailableBean");
36 verify(pluginBeanDefinitionRegistry).addBeanInterface("complexPluginAvailableBean", "java.util.Set");
37 verify(pluginBeanDefinitionRegistry).addBeanInterface("complexPluginAvailableBean", "java.util.Map");
38 verify(pluginBeanDefinitionRegistry).addBeanInterface("complexPluginAvailableBean", "java.util.List");
39 verify(pluginBeanDefinitionRegistry).addContextClassLoaderStrategy("complexPluginAvailableBean", USE_PLUGIN);
40 verify(pluginBeanDefinitionRegistry).addBundleTrackingBean("complexPluginAvailableBean");
41
42 verify(pluginBeanDefinitionRegistry, never()).addBeanName("nonPluginAvailableBean");
43 verify(pluginBeanDefinitionRegistry, never()).addBeanName("prototypeBean");
44 }
45
46 @Configuration
47 public static class Config {
48 @Bean
49 public Object nonPluginAvailableBean() {
50 return new Object();
51 }
52
53 @Bean
54 @AvailableToPlugins
55 public Object simplePluginAvailableBean() {
56 return new Object();
57 }
58
59 @Bean
60 @AvailableToPlugins(
61 value = Set.class,
62 interfaces = {List.class, Map.class},
63 contextClassLoaderStrategy = ContextClassLoaderStrategy.USE_PLUGIN,
64 trackBundle = true)
65 public Object complexPluginAvailableBean() {
66 return new Object();
67 }
68
69 @Bean
70 @AvailableToPlugins
71 @Scope("prototype")
72 public Object prototypeBean() {
73 return new Object();
74 }
75
76 @Bean
77 public AvailableToPluginsBeanDefinitionRegistryProcessor availableToPluginsProcessor() {
78 return new AvailableToPluginsBeanDefinitionRegistryProcessor(
79 (registry) -> pluginBeanDefinitionRegistry
80 );
81 }
82 }
83 }