1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.configuration.event;
18
19 import java.io.IOException;
20 import java.net.URL;
21
22 import org.apache.commons.configuration.AbstractFileConfiguration;
23 import org.apache.commons.configuration.ConfigurationException;
24 import org.apache.commons.configuration.FileConfiguration;
25 import org.apache.commons.configuration.reloading.ReloadingStrategy;
26
27 /***
28 * A base test class that can be used for testing file-based configurations.
29 * This class tests reload events, too.
30 *
31 * @version $Id: AbstractTestFileConfigurationEvents.java 439648 2006-09-02 20:42:10Z oheger $
32 */
33 public abstract class AbstractTestFileConfigurationEvents extends
34 AbstractTestConfigurationEvents
35 {
36 /***
37 * Initializes the file configuration for the tests.
38 *
39 * @throws ConfigurationException if an error occurs
40 */
41 protected void setUpFileConfiguration() throws ConfigurationException,
42 IOException
43 {
44 FileConfiguration fc = (FileConfiguration) config;
45 fc.setReloadingStrategy(new AlwaysReloadingStrategy());
46 fc.setURL(getSourceURL());
47
48
49
50 config.removeConfigurationListener(l);
51 fc.load();
52 config.addConfigurationListener(l);
53 }
54
55 /***
56 * Returns the URL of the file to be loaded. Must be implemented in concrete
57 * test classes.
58 *
59 * @return the URL of the file-based configuration
60 * @throws IOException if an error occurs
61 */
62 protected abstract URL getSourceURL() throws IOException;
63
64 /***
65 * Tests events generated by the reload() method.
66 */
67 public void testReloadEvent() throws ConfigurationException, IOException
68 {
69 setUpFileConfiguration();
70 config.isEmpty();
71 l.checkEvent(AbstractFileConfiguration.EVENT_RELOAD, null,
72 getSourceURL(), true);
73 l.checkEvent(AbstractFileConfiguration.EVENT_RELOAD, null,
74 getSourceURL(), false);
75 l.done();
76 }
77
78 /***
79 * Tests events generated by the reload() method when detail events are
80 * enabled.
81 */
82 public void testReloadEventWithDetails() throws ConfigurationException,
83 IOException
84 {
85 setUpFileConfiguration();
86 config.setDetailEvents(true);
87 config.isEmpty();
88 l.checkEventCount(2);
89 l.checkEvent(AbstractFileConfiguration.EVENT_RELOAD, null,
90 getSourceURL(), true);
91 l.skipToLast(AbstractFileConfiguration.EVENT_RELOAD);
92 l.checkEvent(AbstractFileConfiguration.EVENT_RELOAD, null,
93 getSourceURL(), false);
94 l.done();
95 }
96
97 /***
98 * Tests accessing a property during a reload event to ensure that no
99 * infinite loops are possible.
100 */
101 public void testAccessPropertiesOnReload() throws ConfigurationException,
102 IOException
103 {
104 setUpFileConfiguration();
105 config.addConfigurationListener(new ConfigurationListener()
106 {
107 public void configurationChanged(ConfigurationEvent event)
108 {
109 config.getString("test");
110 }
111 });
112 config.isEmpty();
113 l.checkEvent(AbstractFileConfiguration.EVENT_RELOAD, null,
114 getSourceURL(), true);
115 l.checkEvent(AbstractFileConfiguration.EVENT_RELOAD, null,
116 getSourceURL(), false);
117 l.done();
118 }
119
120 /***
121 * A dummy implementation of the ReloadingStrategy interface. This
122 * implementation will always indicate that a reload should be performed. So
123 * it can be used for testing reloading events.
124 */
125 static class AlwaysReloadingStrategy implements ReloadingStrategy
126 {
127 public void setConfiguration(FileConfiguration configuration)
128 {
129 }
130
131 public void init()
132 {
133 }
134
135 public boolean reloadingRequired()
136 {
137 return true;
138 }
139
140 public void reloadingPerformed()
141 {
142 }
143 }
144 }