Commit 74ae7e0c964056214685af582e61a20c63fed77b

Authored by Dancovich
1 parent 79d89477
Exists in master

Implementação de testes de bootstrap e notification do módulo de

gerenciamento e monitoração (antigo demoiselle-management).
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/ManagementBootstrap.java
... ... @@ -11,12 +11,12 @@ import javax.enterprise.inject.spi.AfterDeploymentValidation;
11 11 import javax.enterprise.inject.spi.AnnotatedType;
12 12 import javax.enterprise.inject.spi.Bean;
13 13 import javax.enterprise.inject.spi.BeanManager;
  14 +import javax.enterprise.inject.spi.BeforeShutdown;
14 15 import javax.enterprise.inject.spi.Extension;
15 16 import javax.enterprise.inject.spi.ProcessAnnotatedType;
16 17  
17 18 import br.gov.frameworkdemoiselle.internal.context.ContextManager;
18 19 import br.gov.frameworkdemoiselle.internal.context.ManagedContext;
19   -import br.gov.frameworkdemoiselle.lifecycle.AfterShutdownProccess;
20 20 import br.gov.frameworkdemoiselle.management.annotation.Managed;
21 21 import br.gov.frameworkdemoiselle.management.extension.ManagementExtension;
22 22 import br.gov.frameworkdemoiselle.management.internal.ManagedType;
... ... @@ -60,11 +60,13 @@ public class ManagementBootstrap implements Extension {
60 60 monitoringManager.initialize(managementExtensionCache);
61 61 }
62 62  
63   - public void unregisterAvailableManagedTypes(@Observes final AfterShutdownProccess event) {
  63 + public void unregisterAvailableManagedTypes(@Observes final BeforeShutdown event) {
64 64  
65 65 MonitoringManager manager = Beans.getReference(MonitoringManager.class);
66 66 manager.shutdown(managementExtensionCache);
67   -
  67 +
  68 + managementExtensionCache.clear();
  69 + types.clear();
68 70 }
69 71  
70 72 }
... ...
impl/core/src/main/java/br/gov/frameworkdemoiselle/management/internal/MonitoringManager.java
... ... @@ -13,6 +13,7 @@ import javax.management.ReflectionException;
13 13 import org.slf4j.Logger;
14 14  
15 15 import br.gov.frameworkdemoiselle.DemoiselleException;
  16 +import br.gov.frameworkdemoiselle.annotation.Name;
16 17 import br.gov.frameworkdemoiselle.internal.context.ContextManager;
17 18 import br.gov.frameworkdemoiselle.internal.context.ManagedContext;
18 19 import br.gov.frameworkdemoiselle.management.annotation.Managed;
... ... @@ -38,12 +39,14 @@ public class MonitoringManager {
38 39 private Logger logger;
39 40  
40 41 @Inject
  42 + @Name("demoiselle-core-bundle")
41 43 private ResourceBundle bundle;
42 44  
43 45 private final List<ManagedType> managedTypes = new ArrayList<ManagedType>();
44 46  
45 47 public void addManagedType(ManagedType managedType) {
46 48 managedTypes.add(managedType);
  49 + logger.debug(bundle.getString("management-debug-registering-managed-type",managedType.getType().getCanonicalName()));
47 50 }
48 51  
49 52 /**
... ... @@ -189,8 +192,13 @@ public class MonitoringManager {
189 192 //Manda uma notificação de mudança de atributo
190 193 NotificationManager notificationManager = Beans.getReference(NotificationManager.class);
191 194 Class<? extends Object> attributeType = newValue!=null ? newValue.getClass() : null;
192   - AttributeChangeNotification notification = new AttributeChangeNotification(bundle.getString(""), propertyName, attributeType, oldValue, newValue);
193   - notificationManager.sendAttributeChangedMessage(notification);
  195 +
  196 + AttributeChangeNotification notification = new AttributeChangeNotification(bundle.getString("management-notification-attribute-changed",propertyName,managedType.getType().getCanonicalName())
  197 + , propertyName
  198 + , attributeType
  199 + , oldValue
  200 + , newValue);
  201 + notificationManager.sendNotification(notification);
194 202  
195 203 } catch (Exception e) {
196 204 throw new DemoiselleException(bundle.getString(
... ... @@ -233,6 +241,8 @@ public class MonitoringManager {
233 241 ManagementExtension monitoringExtension = Beans.getReference(monitoringExtensionClass);
234 242  
235 243 monitoringExtension.shutdown(this.getManagedTypes());
  244 +
  245 + logger.debug( bundle.getString("management-debug-removing-management-extension",monitoringExtension.getClass().getCanonicalName()) );
236 246  
237 247 }
238 248  
... ... @@ -246,6 +256,8 @@ public class MonitoringManager {
246 256 .getReference(monitoringExtensionClass);
247 257  
248 258 monitoringExtension.initialize(this.getManagedTypes());
  259 +
  260 + logger.debug( bundle.getString("management-debug-processing-management-extension",monitoringExtension.getClass().getCanonicalName()) );
249 261  
250 262 }
251 263  
... ...
impl/core/src/main/java/br/gov/frameworkdemoiselle/management/notification/NotificationManager.java
... ... @@ -5,6 +5,7 @@ import java.io.Serializable;
5 5 import javax.enterprise.context.ApplicationScoped;
6 6 import javax.enterprise.event.Event;
7 7 import javax.enterprise.event.Observes;
  8 +import javax.enterprise.util.AnnotationLiteral;
8 9 import javax.inject.Inject;
9 10  
10 11 import br.gov.frameworkdemoiselle.management.internal.notification.event.NotificationEvent;
... ... @@ -48,16 +49,32 @@ public class NotificationManager implements Serializable{
48 49 * @param notification The notification to send
49 50 */
50 51 public void sendNotification(Notification notification) {
51   - genericNotificationEvent.fire(new NotificationEvent(notification));
  52 + if (! AttributeChangeNotification.class.isInstance(notification) ){
  53 + getGenericNotificationEvent().fire(new NotificationEvent(notification));
  54 + }
  55 + else{
  56 + getAttributeChangeNotificationEvent().fire(new NotificationEvent(notification));
  57 + }
  58 + }
  59 +
  60 + @SuppressWarnings("unchecked")
  61 + private Event<NotificationEvent> getGenericNotificationEvent() {
  62 + if (genericNotificationEvent==null){
  63 + genericNotificationEvent = Beans.getReference(Event.class , new AnnotationLiteral<Generic>() {});
  64 + }
  65 +
  66 + return genericNotificationEvent;
52 67 }
53 68  
54   - /**
55   - * Sends a notification comunicating about a change of value for an attribute.
56   - *
57   - * @param notification Special notification communicating a change of value in an attribute.
58   - *
59   - */
60   - public void sendAttributeChangedMessage(AttributeChangeNotification notification){
61   - attributeChangeNotificationEvent.fire(new NotificationEvent(notification));
  69 + @SuppressWarnings("unchecked")
  70 + private Event<NotificationEvent> getAttributeChangeNotificationEvent() {
  71 + if (attributeChangeNotificationEvent==null){
  72 + attributeChangeNotificationEvent = Beans.getReference(Event.class , new AnnotationLiteral<AttributeChange>() {});
  73 + }
  74 +
  75 + return attributeChangeNotificationEvent;
62 76 }
  77 +
  78 +
  79 +
63 80 }
... ...
impl/core/src/main/resources/demoiselle-core-bundle.properties
... ... @@ -98,15 +98,19 @@ user-has-role=Usu\u00E1rio {0} possui a(s) role(s)\: {1}
98 98  
99 99 authenticator-not-defined=Nenhum mecanismo de autentica\u00E7\u00E3o foi definido. Para utilizar {0} \u00E9 preciso definir a propriedade frameworkdemoiselle.security.authenticator.class como mecanismo de autentica\u00E7\u00E3o desejado no arquivo demoiselle.properties.
100 100  
101   -management-null-class-defined=A classe gerenciada informada n\u00E3o pode ser nula.
102   -management-no-annotation-found=Classe {0} precisa ser anotada com @Managed.
103   -management-invalid-property-no-getter-setter=Falha ao inicializar classe gerenciada {0}, n\u00E3o foi encontrado um m\u00E9todo get ou m\u00E9todo set para a propriedade {1}.
104   -management-invalid-property-as-operation=Falha ao inicializar classe gerenciada {0}, n\u00E3o \u00E9 poss\u00EDvel declarar uma propriedade cujo m\u00E9todo get ou set \u00E9 uma opera\u00E7\u00E3o.
105   -management-introspection-error=Erro ao ler atributos da classe gerenciada {0}.
106   -management-type-not-found=A classe gerenciada informada n\u00E3o existe: {0}.
107   -management-invoke-error=Erro ao tentar invocar a opera\u00E7\u00E3o "{0}" da classe gerenciada, a opera\u00E7\u00E3o n\u00E3o foi encontrada.
108   -management-debug-acessing-property=Acessando propriedade {0} da classe gerenciada {1}.
109   -management-debug-setting-property=Definindo novo valor para propriedade {0} da classe gerenciada {1}.
110   -management-debug-invoking-operation=Invocando opera\u00E7\u00E3o {0} da classe gerenciada {1}.
111   -management-debug-starting-custom-context=Levantando contexto {0} para executar comando na classe gerenciada {1}.
112   -management-debug-stoping-custom-context=Desligando contexto {0} para classe gerenciada {1}.
  101 +management-notification-attribute-changed=O atributo [{0}] da classe gerenciada [{1}] foi alterado
  102 +management-null-class-defined=A classe gerenciada informada n\u00E3o pode ser nula
  103 +management-no-annotation-found=Classe {0} precisa ser anotada com @Managed
  104 +management-invalid-property-no-getter-setter=Falha ao inicializar classe gerenciada {0}, n\u00E3o foi encontrado um m\u00E9todo get ou m\u00E9todo set para a propriedade {1}
  105 +management-invalid-property-as-operation=Falha ao inicializar classe gerenciada {0}, n\u00E3o \u00E9 poss\u00EDvel declarar uma propriedade cujo m\u00E9todo get ou set \u00E9 uma opera\u00E7\u00E3o
  106 +management-introspection-error=Erro ao ler atributos da classe gerenciada {0}
  107 +management-type-not-found=A classe gerenciada informada n\u00E3o existe\: {0}
  108 +management-invoke-error=Erro ao tentar invocar a opera\u00E7\u00E3o "{0}" da classe gerenciada, a opera\u00E7\u00E3o n\u00E3o foi encontrada
  109 +management-debug-acessing-property=Acessando propriedade {0} da classe gerenciada {1}
  110 +management-debug-setting-property=Definindo novo valor para propriedade {0} da classe gerenciada {1}
  111 +management-debug-invoking-operation=Invocando opera\u00E7\u00E3o {0} da classe gerenciada {1}
  112 +management-debug-starting-custom-context=Levantando contexto {0} para executar comando na classe gerenciada {1}
  113 +management-debug-stoping-custom-context=Desligando contexto {0} para classe gerenciada {1}
  114 +management-debug-registering-managed-type=Registrando classe gerenciada [{0}]
  115 +management-debug-processing-management-extension=Processando extens\u00E3o de gerenciamento [{0}]
  116 +management-debug-removing-management-extension=Desativando extens\u00E3o de gerenciamento [{0}]
113 117 \ No newline at end of file
... ...
impl/core/src/test/java/management/DummyManagedClass.java
... ... @@ -1,74 +0,0 @@
1   -package management;
2   -
3   -import java.util.UUID;
4   -
5   -import br.gov.frameworkdemoiselle.management.annotation.Managed;
6   -import br.gov.frameworkdemoiselle.management.annotation.Operation;
7   -import br.gov.frameworkdemoiselle.management.annotation.Property;
8   -import br.gov.frameworkdemoiselle.management.annotation.validation.AllowedValues;
9   -import br.gov.frameworkdemoiselle.management.annotation.validation.AllowedValues.ValueType;
10   -
11   -@Managed
12   -public class DummyManagedClass {
13   -
14   - @Property
15   - @AllowedValues(allows={"f","m","F","M"},valueType=ValueType.INTEGER)
16   - private Integer id;
17   -
18   - @Property
19   - private String uuid;
20   -
21   - @Property
22   - private String writeOnlyProperty;
23   -
24   - /**
25   - * Propriedade para testar detecção de métodos GET e SET quando propriedade tem apenas uma letra.
26   - */
27   - @Property
28   - private Integer a;
29   -
30   - /**
31   - * Propriedade para testar detecção de métodos GET e SET quando propriedade tem apenas letras maiúsculas.
32   - */
33   - @Property
34   - private Integer MAIUSCULO;
35   -
36   - public Integer getId() {
37   - return id;
38   - }
39   -
40   - public void setId(Integer id) {
41   - this.id = id;
42   - }
43   -
44   - public String getUuid() {
45   - return uuid;
46   - }
47   -
48   - public void setWriteOnlyProperty(String newValue){
49   - this.writeOnlyProperty = newValue;
50   - }
51   -
52   - public Integer getA() {
53   - return a;
54   - }
55   -
56   - public void setA(Integer a) {
57   - this.a = a;
58   - }
59   -
60   - public Integer getMAIUSCULO() {
61   - return MAIUSCULO;
62   - }
63   -
64   -
65   - public void setMAIUSCULO(Integer mAIUSCULO) {
66   - MAIUSCULO = mAIUSCULO;
67   - }
68   -
69   - @Operation(description="Generates a random UUID")
70   - public String generateUUID(){
71   - this.uuid = UUID.randomUUID().toString();
72   - return this.uuid;
73   - }
74   -}
impl/core/src/test/java/management/DummyManagementExtension.java
... ... @@ -1,29 +0,0 @@
1   -package management;
2   -
3   -import java.util.List;
4   -
5   -import javax.inject.Inject;
6   -
7   -import br.gov.frameworkdemoiselle.management.extension.ManagementExtension;
8   -import br.gov.frameworkdemoiselle.management.internal.ManagedType;
9   -
10   -public class DummyManagementExtension implements ManagementExtension {
11   -
12   - @Inject
13   - private ManagedClassStore store;
14   -
15   - @Override
16   - public void initialize(List<ManagedType> managedTypes) {
17   - // Armazena os beans managed detectados neste store,
18   - // para depois serem testados.
19   - store.setManagedTypes(managedTypes);
20   - }
21   -
22   - @Override
23   - public void shutdown(List<ManagedType> managedTypes) {
24   - // Limpa o store, depois o teste verificará se
25   - // o processo de shutdown rodou e limpou o store.
26   - store.setManagedTypes(null);
27   - }
28   -
29   -}
impl/core/src/test/java/management/ManagedClassStore.java
1 1 package management;
2 2  
  3 +import java.util.ArrayList;
  4 +import java.util.Collection;
3 5 import java.util.List;
4 6  
5 7 import javax.enterprise.context.ApplicationScoped;
... ... @@ -9,15 +11,15 @@ import br.gov.frameworkdemoiselle.management.internal.ManagedType;
9 11 @ApplicationScoped
10 12 public class ManagedClassStore {
11 13  
12   - private List<ManagedType> managedTypes = null;
  14 + private List<ManagedType> managedTypes = new ArrayList<ManagedType>();
13 15  
14 16  
15 17 public List<ManagedType> getManagedTypes() {
16 18 return managedTypes;
17 19 }
18 20  
19   - public void setManagedTypes(List<ManagedType> managedTypes) {
20   - this.managedTypes = managedTypes;
  21 + public void addManagedTypes(Collection<ManagedType> managedTypes){
  22 + this.managedTypes.addAll(managedTypes);
21 23 }
22 24  
23 25 }
... ...
impl/core/src/test/java/management/ManagementBootstrapTest.java
... ... @@ -1,68 +0,0 @@
1   -package management;
2   -
3   -import javax.inject.Inject;
4   -
5   -import org.jboss.arquillian.container.test.api.Deployment;
6   -import org.jboss.arquillian.junit.Arquillian;
7   -import org.jboss.shrinkwrap.api.spec.JavaArchive;
8   -import org.junit.Assert;
9   -import org.junit.Test;
10   -import org.junit.runner.RunWith;
11   -
12   -import test.Tests;
13   -import br.gov.frameworkdemoiselle.lifecycle.AfterShutdownProccess;
14   -import br.gov.frameworkdemoiselle.management.extension.ManagementExtension;
15   -import br.gov.frameworkdemoiselle.util.Beans;
16   -
17   -
18   -@RunWith(Arquillian.class)
19   -public class ManagementBootstrapTest {
20   -
21   - @Inject
22   - private ManagedClassStore store;
23   -
24   - @Deployment
25   - public static JavaArchive createDeployment() {
26   - JavaArchive deployment = Tests.createDeployment(ManagementBootstrapTest.class);
27   -
28   - /*deployment
29   - .addClass(ManagedClassStore.class)
30   - .addClass(DummyManagedClass.class)
31   - .addClass(DummyManagementExtension.class);*/
32   -
33   - return deployment;
34   - }
35   -
36   - /**
37   - * Test if a a management extension (a library that implements {@link ManagementExtension}) is correctly detected.
38   - */
39   - @Test
40   - public void testManagementExtensionRegistration(){
41   -
42   - //"store" é application scoped e é usado pelo DummyManagementExtension para
43   - //armazenar todos os beans anotados com @Managed. Se o bootstrap rodou corretamente,
44   - //ele chamou DummyManagementExtension.initialize e este store conterá o bean de teste que anotamos.
45   - Assert.assertNotNull(store.getManagedTypes());
46   - Assert.assertEquals(1, store.getManagedTypes().size());
47   -
48   - }
49   -
50   - /**
51   - * Test if a a management extension's (a library that implements {@link ManagementExtension}) shutdown
52   - * method is correctly called upon application shutdown.
53   - */
54   - @Test
55   - public void testManagementExtensionShutdown(){
56   -
57   - //"store" é application scoped e é usado pelo DummyManagementExtension para
58   - //armazenar todos os beans anotados com @Managed. Se o bootstrap rodou corretamente,
59   - //ele chamou DummyManagementExtension.initialize e este store conterá o bean de teste que anotamos.
60   - //Nós então disparamos o evento de shutdown onde ele deverá limpar o store.
61   - Assert.assertNotNull(store.getManagedTypes());
62   - Assert.assertEquals(1, store.getManagedTypes().size());
63   -
64   - Beans.getBeanManager().fireEvent(new AfterShutdownProccess() {});
65   - Assert.assertNull(store.getManagedTypes());
66   - }
67   -
68   -}
impl/core/src/test/java/management/ManagementBootstrapTestCase.java 0 → 100644
... ... @@ -0,0 +1,124 @@
  1 +package management;
  2 +
  3 +import java.io.File;
  4 +import java.util.List;
  5 +
  6 +import management.testclasses.DummyManagedClass;
  7 +import management.testclasses.DummyManagedClassPropertyError;
  8 +import management.testclasses.DummyManagementExtension;
  9 +
  10 +import org.jboss.arquillian.container.test.api.Deployer;
  11 +import org.jboss.arquillian.container.test.api.Deployment;
  12 +import org.jboss.arquillian.junit.Arquillian;
  13 +import org.jboss.arquillian.test.api.ArquillianResource;
  14 +import org.jboss.shrinkwrap.api.ShrinkWrap;
  15 +import org.jboss.shrinkwrap.api.asset.FileAsset;
  16 +import org.jboss.shrinkwrap.api.spec.JavaArchive;
  17 +import org.junit.Assert;
  18 +import org.junit.Test;
  19 +import org.junit.runner.RunWith;
  20 +
  21 +import test.LocaleProducer;
  22 +import br.gov.frameworkdemoiselle.management.extension.ManagementExtension;
  23 +import br.gov.frameworkdemoiselle.management.internal.ManagedType;
  24 +import br.gov.frameworkdemoiselle.util.Beans;
  25 +
  26 +@RunWith(Arquillian.class)
  27 +public class ManagementBootstrapTestCase {
  28 +
  29 + @ArquillianResource
  30 + private Deployer deployer;
  31 +
  32 + /**
  33 + * Deployment to test normal deployment behaviour
  34 + *
  35 + */
  36 + @Deployment(name = "default",managed=false,testable=false)
  37 + public static JavaArchive createDeployment() {
  38 + return ShrinkWrap
  39 + .create(JavaArchive.class)
  40 + .addClass(LocaleProducer.class)
  41 + .addPackages(true, "br")
  42 + .addAsResource(new FileAsset(new File("src/test/resources/test/beans.xml")), "beans.xml")
  43 + .addAsManifestResource(
  44 + new File("src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension"),
  45 + "services/javax.enterprise.inject.spi.Extension")
  46 + .addPackages(false, ManagementBootstrapTestCase.class.getPackage())
  47 + .addClasses(DummyManagementExtension.class,DummyManagedClass.class);
  48 + }
  49 +
  50 + /**
  51 + * Deployment containing a malformed managed class. Tests using this deployment will
  52 + * check if deployment fails (it has to).
  53 + *
  54 + */
  55 + @Deployment(name = "wrong_annotation",managed=false,testable=false)
  56 + public static JavaArchive createWrongAnnotationDeployment() {
  57 + return ShrinkWrap
  58 + .create(JavaArchive.class)
  59 + .addClass(LocaleProducer.class)
  60 + .addPackages(true, "br")
  61 + .addAsResource(new FileAsset(new File("src/test/resources/test/beans.xml")), "beans.xml")
  62 + .addAsManifestResource(
  63 + new File("src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension"),
  64 + "services/javax.enterprise.inject.spi.Extension")
  65 + .addPackages(false, ManagementBootstrapTestCase.class.getPackage())
  66 + .addClasses(DummyManagementExtension.class,DummyManagedClassPropertyError.class);
  67 + }
  68 +
  69 + /**
  70 + * Test if a a management extension (a library that implements {@link ManagementExtension}) is correctly detected.
  71 + */
  72 + @Test
  73 + public void testManagementExtensionRegistration() {
  74 + deployer.deploy("default");
  75 +
  76 + // "store" é application scoped e é usado pelo DummyManagementExtension para
  77 + // armazenar todos os beans anotados com @Managed. Se o bootstrap rodou corretamente,
  78 + // ele chamou DummyManagementExtension.initialize e este store conterá o bean de teste que anotamos.
  79 + ManagedClassStore store = Beans.getReference(ManagedClassStore.class);
  80 +
  81 + Assert.assertEquals(1, store.getManagedTypes().size());
  82 +
  83 + deployer.undeploy("default");
  84 + }
  85 +
  86 + /**
  87 + * Test if a a management extension's shutdown method is
  88 + * correctly called upon application shutdown.
  89 + */
  90 + @Test
  91 + public void testManagementExtensionShutdown() {
  92 + deployer.deploy("default");
  93 +
  94 + // "store" é application scoped e é usado pelo DummyManagementExtension para
  95 + // armazenar todos os beans anotados com @Managed. Se o bootstrap rodou corretamente,
  96 + // ele chamou DummyManagementExtension.initialize e este store conterá o bean de teste que anotamos.
  97 + // Nós então disparamos o evento de shutdown onde ele deverá limpar o store.
  98 + ManagedClassStore store = Beans.getReference(ManagedClassStore.class);
  99 +
  100 + //Detecta se a classe anotada foi detectada
  101 + List<ManagedType> managedTypes = store.getManagedTypes();
  102 + Assert.assertEquals(1, managedTypes.size());
  103 +
  104 + deployer.undeploy("default");
  105 +
  106 + //Após o "undeploy", o ciclo de vida precisa ter removido a classe gerenciada da lista.
  107 + Assert.assertEquals(0, managedTypes.size());
  108 + }
  109 +
  110 + @Test
  111 + public void testWrongAnnotation(){
  112 +
  113 + try{
  114 + deployer.deploy("wrong_annotation");
  115 +
  116 + //O processo de deploy precisa falhar, pois temos uma classe anotada com falhas.
  117 + Assert.fail();
  118 + }
  119 + catch(Exception e){
  120 + deployer.undeploy("wrong_annotation");
  121 + }
  122 + }
  123 +
  124 +}
... ...
impl/core/src/test/java/management/NotificationTestCase.java 0 → 100644
... ... @@ -0,0 +1,100 @@
  1 +package management;
  2 +
  3 +import java.io.File;
  4 +
  5 +import javax.inject.Inject;
  6 +
  7 +import junit.framework.Assert;
  8 +import management.testclasses.DummyManagedClass;
  9 +import management.testclasses.DummyNotificationListener;
  10 +
  11 +import org.jboss.arquillian.container.test.api.Deployment;
  12 +import org.jboss.arquillian.junit.Arquillian;
  13 +import org.jboss.shrinkwrap.api.ShrinkWrap;
  14 +import org.jboss.shrinkwrap.api.asset.FileAsset;
  15 +import org.jboss.shrinkwrap.api.spec.JavaArchive;
  16 +import org.junit.Test;
  17 +import org.junit.runner.RunWith;
  18 +
  19 +import test.LocaleProducer;
  20 +import br.gov.frameworkdemoiselle.annotation.Name;
  21 +import br.gov.frameworkdemoiselle.management.internal.ManagedType;
  22 +import br.gov.frameworkdemoiselle.management.internal.MonitoringManager;
  23 +import br.gov.frameworkdemoiselle.management.notification.AttributeChangeNotification;
  24 +import br.gov.frameworkdemoiselle.management.notification.Notification;
  25 +import br.gov.frameworkdemoiselle.management.notification.NotificationManager;
  26 +import br.gov.frameworkdemoiselle.util.Beans;
  27 +import br.gov.frameworkdemoiselle.util.ResourceBundle;
  28 +
  29 +/**
  30 + * Test the {@link NotificationManager} with a dummy extension
  31 + * to check if notifications are correctly propagated
  32 + *
  33 + * @author serpro
  34 + *
  35 + */
  36 +@RunWith(Arquillian.class)
  37 +public class NotificationTestCase {
  38 +
  39 + @Inject
  40 + private NotificationManager manager;
  41 +
  42 + @Inject
  43 + @Name("demoiselle-core-bundle")
  44 + private ResourceBundle bundle;
  45 +
  46 + @Deployment
  47 + public static JavaArchive createDeployment() {
  48 + return ShrinkWrap
  49 + .create(JavaArchive.class)
  50 + .addClass(LocaleProducer.class)
  51 + .addPackages(true, "br")
  52 + .addAsResource(new FileAsset(new File("src/test/resources/test/beans.xml")), "beans.xml")
  53 + .addAsManifestResource(
  54 + new File("src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension"),
  55 + "services/javax.enterprise.inject.spi.Extension")
  56 + .addPackages(false, ManagementBootstrapTestCase.class.getPackage())
  57 + .addClasses(DummyNotificationListener.class,DummyManagedClass.class);
  58 + }
  59 +
  60 + /**
  61 + * Test sending a normal notification
  62 + */
  63 + @Test
  64 + public void testSendGenericNotification(){
  65 + manager.sendNotification(new Notification("Test Message"));
  66 + DummyNotificationListener listener = Beans.getReference(DummyNotificationListener.class);
  67 + Assert.assertEquals("Test Message", listener.getMessage());
  68 + }
  69 +
  70 + /**
  71 + * Test sending a notification of change in attribute
  72 + */
  73 + @Test
  74 + public void testSendAttributeChangeNotification(){
  75 + manager.sendNotification(new AttributeChangeNotification("Test Message", "attribute", String.class, "old", "new"));
  76 + DummyNotificationListener listener = Beans.getReference(DummyNotificationListener.class);
  77 + Assert.assertEquals("Test Message - attribute", listener.getMessage());
  78 + }
  79 +
  80 + /**
  81 + * Test if notifications are automatically sent when an attribute from a managed
  82 + * class change values
  83 + */
  84 + @Test
  85 + public void testNotifyChangeManagedClass(){
  86 + MonitoringManager manager = Beans.getReference(MonitoringManager.class);
  87 +
  88 + for (ManagedType type : manager.getManagedTypes()){
  89 + if (type.getType().equals(DummyManagedClass.class)){
  90 + manager.setProperty(type, "id", new Integer(10));
  91 + break;
  92 + }
  93 + }
  94 +
  95 + DummyNotificationListener listener = Beans.getReference(DummyNotificationListener.class);
  96 + Assert.assertEquals( bundle.getString("management-notification-attribute-changed","id",DummyManagedClass.class.getCanonicalName()) + " - id"
  97 + , listener.getMessage());
  98 + }
  99 +
  100 +}
... ...
impl/core/src/test/java/management/testclasses/DummyManagedClass.java 0 → 100644
... ... @@ -0,0 +1,74 @@
  1 +package management.testclasses;
  2 +
  3 +import java.util.UUID;
  4 +
  5 +import br.gov.frameworkdemoiselle.management.annotation.Managed;
  6 +import br.gov.frameworkdemoiselle.management.annotation.Operation;
  7 +import br.gov.frameworkdemoiselle.management.annotation.Property;
  8 +import br.gov.frameworkdemoiselle.management.annotation.validation.AllowedValues;
  9 +import br.gov.frameworkdemoiselle.management.annotation.validation.AllowedValues.ValueType;
  10 +
  11 +@Managed
  12 +public class DummyManagedClass {
  13 +
  14 + @Property
  15 + @AllowedValues(allows={"f","m","F","M"},valueType=ValueType.INTEGER)
  16 + private Integer id;
  17 +
  18 + @Property
  19 + private String uuid;
  20 +
  21 + @Property
  22 + private String writeOnlyProperty;
  23 +
  24 + /**
  25 + * Propriedade para testar detecção de métodos GET e SET quando propriedade tem apenas uma letra.
  26 + */
  27 + @Property
  28 + private Integer a;
  29 +
  30 + /**
  31 + * Propriedade para testar detecção de métodos GET e SET quando propriedade tem apenas letras maiúsculas.
  32 + */
  33 + @Property
  34 + private Integer MAIUSCULO;
  35 +
  36 + public Integer getId() {
  37 + return id;
  38 + }
  39 +
  40 + public void setId(Integer id) {
  41 + this.id = id;
  42 + }
  43 +
  44 + public String getUuid() {
  45 + return uuid;
  46 + }
  47 +
  48 + public void setWriteOnlyProperty(String newValue){
  49 + this.writeOnlyProperty = newValue;
  50 + }
  51 +
  52 + public Integer getA() {
  53 + return a;
  54 + }
  55 +
  56 + public void setA(Integer a) {
  57 + this.a = a;
  58 + }
  59 +
  60 + public Integer getMAIUSCULO() {
  61 + return MAIUSCULO;
  62 + }
  63 +
  64 +
  65 + public void setMAIUSCULO(Integer mAIUSCULO) {
  66 + MAIUSCULO = mAIUSCULO;
  67 + }
  68 +
  69 + @Operation(description="Generates a random UUID")
  70 + public String generateUUID(){
  71 + this.uuid = UUID.randomUUID().toString();
  72 + return this.uuid;
  73 + }
  74 +}
... ...
impl/core/src/test/java/management/testclasses/DummyManagedClassPropertyError.java 0 → 100644
... ... @@ -0,0 +1,23 @@
  1 +package management.testclasses;
  2 +
  3 +import br.gov.frameworkdemoiselle.management.annotation.Managed;
  4 +import br.gov.frameworkdemoiselle.management.annotation.Property;
  5 +
  6 +
  7 +/**
  8 + *
  9 + * Used in tests to detect if the bootstrap detects wrong annotations
  10 + *
  11 + * @author serpro
  12 + *
  13 + */
  14 +@Managed
  15 +public class DummyManagedClassPropertyError {
  16 +
  17 + /**
  18 + * Property with no setter or getter
  19 + */
  20 + @Property
  21 + private Long property;
  22 +
  23 +}
... ...
impl/core/src/test/java/management/testclasses/DummyManagementExtension.java 0 → 100644
... ... @@ -0,0 +1,31 @@
  1 +package management.testclasses;
  2 +
  3 +import java.util.List;
  4 +
  5 +import javax.inject.Inject;
  6 +
  7 +import management.ManagedClassStore;
  8 +
  9 +import br.gov.frameworkdemoiselle.management.extension.ManagementExtension;
  10 +import br.gov.frameworkdemoiselle.management.internal.ManagedType;
  11 +
  12 +public class DummyManagementExtension implements ManagementExtension {
  13 +
  14 + @Inject
  15 + private ManagedClassStore store;
  16 +
  17 + @Override
  18 + public void initialize(List<ManagedType> managedTypes) {
  19 + // Armazena os beans managed detectados neste store,
  20 + // para depois serem testados.
  21 + store.addManagedTypes(managedTypes);
  22 + }
  23 +
  24 + @Override
  25 + public void shutdown(List<ManagedType> managedTypes) {
  26 + // Limpa o store, depois o teste verificará se
  27 + // o processo de shutdown rodou e limpou o store.
  28 + store.getManagedTypes().clear();
  29 + }
  30 +
  31 +}
... ...
impl/core/src/test/java/management/testclasses/DummyNotificationListener.java 0 → 100644
... ... @@ -0,0 +1,35 @@
  1 +package management.testclasses;
  2 +
  3 +import javax.enterprise.context.ApplicationScoped;
  4 +import javax.enterprise.event.Observes;
  5 +
  6 +import br.gov.frameworkdemoiselle.management.internal.notification.event.NotificationEvent;
  7 +import br.gov.frameworkdemoiselle.management.internal.notification.qualifier.AttributeChange;
  8 +import br.gov.frameworkdemoiselle.management.internal.notification.qualifier.Generic;
  9 +import br.gov.frameworkdemoiselle.management.notification.AttributeChangeNotification;
  10 +import br.gov.frameworkdemoiselle.management.notification.NotificationManager;
  11 +
  12 +/**
  13 + * Dummy class to test receiving of notifications sent by the {@link NotificationManager}
  14 + *
  15 + * @author serpro
  16 + *
  17 + */
  18 +@ApplicationScoped
  19 +public class DummyNotificationListener {
  20 +
  21 + private String message = null;
  22 +
  23 + public void listenNotification(@Observes @Generic NotificationEvent event){
  24 + message = event.getNotification().getMessage().toString();
  25 + }
  26 +
  27 + public void listenAttributeChangeNotification(@Observes @AttributeChange NotificationEvent event){
  28 + AttributeChangeNotification notification = (AttributeChangeNotification)event.getNotification();
  29 + message = notification.getMessage().toString() + " - " + notification.getAttributeName();
  30 + }
  31 +
  32 + public String getMessage() {
  33 + return message;
  34 + }
  35 +}
... ...