View Javadoc
1   /*
2    * The Kuali Financial System, a comprehensive financial management system for higher education.
3    * 
4    * Copyright 2005-2014 The Kuali Foundation
5    * 
6    * This program is free software: you can redistribute it and/or modify
7    * it under the terms of the GNU Affero General Public License as
8    * published by the Free Software Foundation, either version 3 of the
9    * License, or (at your option) any later version.
10   * 
11   * This program is distributed in the hope that it will be useful,
12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   * GNU Affero General Public License for more details.
15   * 
16   * You should have received a copy of the GNU Affero General Public License
17   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18   */
19  package org.kuali.kfs.sys.batch;
20  
21  import java.util.ArrayList;
22  import java.util.Collection;
23  import java.util.List;
24  
25  import org.kuali.kfs.sys.ConfigureContext;
26  import org.kuali.kfs.sys.context.KualiTestBase;
27  import org.kuali.kfs.sys.context.SpringContext;
28  import org.kuali.kfs.sys.suite.AnnotationTestSuite;
29  import org.kuali.kfs.sys.suite.PreCommitSuite;
30  import org.kuali.rice.krad.service.KualiModuleService;
31  import org.kuali.rice.krad.service.ModuleService;
32  import org.springframework.beans.factory.NoSuchBeanDefinitionException;
33  
34  /**
35   * Tests the spring configuration for batch jobs.
36   */
37  @ConfigureContext(initializeBatchSchedule=true)
38  @AnnotationTestSuite(PreCommitSuite.class)
39  public class BatchConfigurationTest extends KualiTestBase {
40      private List<ModuleService> moduleServices;
41      private Collection<JobDescriptor> jobDescriptors;
42      private Collection<TriggerDescriptor> triggerDescriptors;
43  
44      /**
45       * @see junit.framework.TestCase#setUp()
46       */
47      @Override
48      protected void setUp() throws Exception {
49          super.setUp();
50          moduleServices = SpringContext.getBean(KualiModuleService.class).getInstalledModuleServices();
51          jobDescriptors = SpringContext.getBeansOfType(JobDescriptor.class).values();
52          triggerDescriptors = SpringContext.getBeansOfType(TriggerDescriptor.class).values();
53      }
54  
55      /**
56       * Verifies that registered job names correspond to JobDescriptor beans.
57       */
58      public final void testRegisteredJobsExist() throws Exception {
59          List<String> nonExistentJobNames = new ArrayList();
60          StringBuffer errorMessage = new StringBuffer("The following registered job names do not correspond to JobDescriptor beans:");
61          for (ModuleService module : moduleServices) {
62              for (String jobName : module.getModuleConfiguration().getJobNames()) {
63                  try {
64                      BatchSpringContext.getJobDescriptor(jobName);
65                  }
66                  catch (NoSuchBeanDefinitionException e) {
67                      nonExistentJobNames.add(jobName);
68                      errorMessage.append("\n\t").append(module.getModuleConfiguration().getNamespaceCode()).append(": ").append(jobName);
69                  }
70              }
71          }
72          assertTrue(errorMessage.toString(), nonExistentJobNames.isEmpty());
73      }
74  
75      /**
76       * Verifies that registered trigger names correspond to TriggerDescriptor beans.
77       */
78      public final void testRegisteredTriggersExist() throws Exception {
79          List<String> nonExistentTriggerNames = new ArrayList();
80          StringBuffer errorMessage = new StringBuffer("The following registered trigger names do not correspond to TriggerDescriptor beans:");
81          for (ModuleService module : moduleServices) {
82              for (String triggerName : module.getModuleConfiguration().getTriggerNames()) {
83                  try {
84                      BatchSpringContext.getTriggerDescriptor(triggerName);
85                  }
86                  catch (NoSuchBeanDefinitionException e) {
87                      nonExistentTriggerNames.add(triggerName);
88                      errorMessage.append("\n\t").append(module.getModuleConfiguration().getNamespaceCode()).append(": ").append(triggerName);
89                  }
90              }
91          }
92          assertTrue(errorMessage.toString(), nonExistentTriggerNames.isEmpty());
93      }
94  
95      /**
96       * Verifies that beans of type JobDescriptor are registered with KFS as a whole or with an individual module.
97       */
98      public final void testJobsRegistered() throws Exception {
99          List<String> unregisteredJobNames = new ArrayList();
100         StringBuffer errorMessage = new StringBuffer("The following JobDescriptor beans are not registered with KFS as a whole or any module:");
101         for (JobDescriptor jobDescriptor : SpringContext.getBeansOfType(JobDescriptor.class).values()) {
102             boolean isRegistered = false;
103             for (ModuleService module : moduleServices) {
104                 if (module.getModuleConfiguration().getJobNames().contains(jobDescriptor.getJobDetail().getName())) {
105                     isRegistered = true;
106                     break;
107                 }
108             }
109             if (!isRegistered) {
110                 unregisteredJobNames.add(jobDescriptor.getJobDetail().getName());
111                 errorMessage.append("\n\t").append(jobDescriptor.getJobDetail().getFullName());
112             }
113         }
114         assertTrue(errorMessage.toString(), unregisteredJobNames.isEmpty());
115     }
116 
117     /**
118      * Verifies that beans of type TriggerDescriptor are registered with KFS as a whole or with an individual module.
119      */
120     public final void testTriggersRegistered() throws Exception {
121         List<String> unregisteredTriggerNames = new ArrayList();
122         StringBuffer errorMessage = new StringBuffer("The following TriggerDescriptor beans are not registered with KFS as a whole or any module:");
123         for (TriggerDescriptor triggerDescriptor : SpringContext.getBeansOfType(TriggerDescriptor.class).values()) {
124             boolean isRegistered = false;
125             for (ModuleService module : moduleServices) {
126                 if (module.getModuleConfiguration().getTriggerNames().contains(triggerDescriptor.getTrigger().getName())) {
127                     isRegistered = true;
128                     break;
129                 }
130             }
131             if (!isRegistered) {
132                 unregisteredTriggerNames.add(triggerDescriptor.getTrigger().getName());
133                 errorMessage.append("\n\t").append(triggerDescriptor.getTrigger().getFullName());
134             }
135         }
136         assertTrue(errorMessage.toString(), unregisteredTriggerNames.isEmpty());
137     }
138 
139     /**
140      * Verifies that dependecies listed for a name defined JobDescriptor beans.
141      */
142     public final void testDependenciesExist() throws Exception {
143         List<String> nonExistentDependencies = new ArrayList();
144         StringBuffer errorMessage = new StringBuffer("The following dependencies do not refer to JobDescriptor beans:");
145         for (JobDescriptor jobDescriptor : SpringContext.getBeansOfType(JobDescriptor.class).values()) {
146             for (String dependencyJobName : jobDescriptor.getDependencies().keySet()) {
147                 try {
148                     BatchSpringContext.getJobDescriptor(dependencyJobName);
149                 }
150                 catch (NoSuchBeanDefinitionException e) {
151                     nonExistentDependencies.add(dependencyJobName);
152                     errorMessage.append("\n\t").append(jobDescriptor.getJobDetail().getFullName()).append("depends on: ").append(dependencyJobName);
153                 }
154             }
155         }
156         assertTrue(errorMessage.toString(), nonExistentDependencies.isEmpty());
157     }
158 }