1   /*
2    *  TestConfig.java
3    *
4    *  Copyright (c) 1998-2004, The University of Sheffield.
5    *
6    *  This file is part of GATE (see http://gate.ac.uk/), and is free
7    *  software, licenced under the GNU Library General Public License,
8    *  Version 2, June 1991 (in the distribution as file licence.html,
9    *  and also available at http://gate.ac.uk/gate/licence.html).
10   *
11   *  Hamish Cunningham, 9/Nov/00
12   *
13   *  $Id: TestConfig.java,v 1.15 2004/10/06 11:35:47 valyt Exp $
14   */
15  
16  package gate.config;
17  
18  import java.io.*;
19  import java.net.URL;
20  import java.util.Map;
21  import java.util.Set;
22  
23  import junit.framework.*;
24  
25  import gate.*;
26  import gate.util.*;
27  
28  /** CREOLE test class
29    */
30  public class TestConfig extends TestCase
31  {
32    /** Debug flag */
33    private static final boolean DEBUG = false;
34  
35    /** Construction */
36    public TestConfig(String name) throws GateException { super(name); }
37  
38    /** Fixture set up */
39    public void setUp() throws Exception {
40      CreoleRegister register = Gate.getCreoleRegister();
41      register.registerDirectories(Gate.getUrl("tests"));
42    } // setUp
43  
44    /** Put things back as they should be after running tests
45      * (reinitialise the CREOLE register).
46      */
47    public void tearDown() throws Exception {
48      CreoleRegister register = Gate.getCreoleRegister();
49      register.clear();
50      Gate.init();
51    } // tearDown
52  
53    /**
54     * Helper method that processes a config file.
55     */
56    private void readConfig(URL configUrl) throws Exception {
57      ConfigDataProcessor configProcessor = new ConfigDataProcessor();
58  
59      // open a stream to the builtin config data file (tests version)
60      InputStream configStream = null;
61      try {
62        configStream = configUrl.openStream();
63      } catch(IOException e) {
64        throw new GateException(
65          "Couldn't open config data test file: " + configUrl + " " + e
66        );
67      }
68      if (DEBUG)
69        Out.prln(
70          "Parsing config file ... " + configStream + "from URL" + configUrl
71        );
72      configProcessor.parseConfigFile(configStream, configUrl);
73    } // readConfig
74  
75    /** Test config loading */
76    public void testConfigReading() throws Exception {
77      System.out.println("Reading GATE config from : " + Gate.getUrl("tests/gate.xml"));
78      readConfig(Gate.getUrl("tests/gate.xml"));
79  
80      // check that we got the CREOLE dir entry; then remove it
81      // so it doesn't get accessed in other tests
82      CreoleRegister reg = Gate.getCreoleRegister();
83      Set dirs = reg.getDirectories();
84      assertTrue(
85        "CREOLE register doesn't contain URL from test gate.xml",
86        dirs != null && ! dirs.isEmpty() &&
87        dirs.contains(new URL("http://gate.ac.uk/tests/"))
88      );
89  
90      // we should have a GATECONFIG entry on Gate
91      String fullSizeKeyName = "FULLSIZE";
92      String fullSizeValueName = "yes";
93      Map gateConfig = Gate.getUserConfig();
94      assertNotNull("no gate config map", gateConfig);
95      String fullSizeValue = (String) gateConfig.get(fullSizeKeyName);
96      assertNotNull("no full size value", fullSizeValue);
97      assertEquals(
98        "incorrect config data from tests/gate.xml",
99        fullSizeValueName, fullSizeValue
100     );
101 
102     // clear the gate config for subsequent tests
103     gateConfig.clear();
104 
105 
106 // the code below is removed after serial controller stopped
107 // being a PR. the XML config scripting of runnable systems isn't
108 // working anyhow. when/if it does work, appropriate tests should be
109 // re-added here
110 //    // get a test system
111 //    ResourceData controllerResData =
112 //      (ResourceData) reg.get("gate.creole.SerialController");
113 //    assertNotNull("no resdata for serial controller", controllerResData);
114 //    ProcessingResource controller =
115 //      (ProcessingResource) controllerResData.getInstantiations().pop();
116 //    assertNotNull("no controller instance", controller);
117 //
118 //    // try running the system
119 //    controller.execute();
120   } // testConfigReading()
121 
122   /** Test config updating */
123   public void testConfigUpdating() throws Exception {
124     // clear the gate config so we don't write values from the
125     // system initialisation into the test file
126     Map configMap = Gate.getUserConfig();
127     configMap.clear();
128 
129     // if user config file exists, save it and remember the name
130     String configName = Gate.getUserConfigFileName();
131     File userConfigFile = new File(configName);
132     File savedConfigFile = null;
133     if(userConfigFile.exists()) {
134       if(DEBUG) {
135         Out.prln(userConfigFile);
136         Out.prln("can write: " + userConfigFile.canWrite());
137       }
138       String userConfigDirectory = userConfigFile.getParent();
139       if(userConfigDirectory == null)
140         userConfigDirectory = "";
141       savedConfigFile = new File(
142         userConfigDirectory + Strings.getFileSep() +
143         "__saved_gate.xml__for_TestConfig__" + System.currentTimeMillis()
144       );
145       if(DEBUG) Out.prln(savedConfigFile);
146       boolean renamed = userConfigFile.renameTo(savedConfigFile);
147       assertTrue("rename failed", renamed);
148     }
149     assertTrue("user config file still there", ! userConfigFile.exists());
150 
151     // call Gate.writeConfig - check it creates an empty config file
152     //this is no longer a valid test as the written user config will at least
153     //contain the values for the known and autload plugin paths.
154     Gate.writeUserConfig();
155     String writtenConfig = Files.getString(new File(configName));
156     String empty = Gate.getEmptyConfigFile();
157 //    assertEquals("written config doesn't match", writtenConfig, empty);
158 
159     // set some config attributes via Gate.getConfigData
160     configMap.put("A", "1");
161     configMap.put("B", "2");
162 
163     // call Gate.writeConfig, delete the config data from Gate's map,
164     // read the config file and check that the new data is present
165     Gate.writeUserConfig();
166     configMap.clear();
167     readConfig(userConfigFile.toURL());
168 
169     // reinstante saved user config file if not null
170     userConfigFile.delete();
171     if(savedConfigFile != null) {
172       savedConfigFile.renameTo(userConfigFile);
173     }
174 
175   } // testConfigUpdating
176 
177   /** Test session state file naming */
178   public void testSessionStateFileNaming() throws Exception {
179     String fileSep = Strings.getFileSep();
180     if(DEBUG) {
181       Out.prln("file sep is: " + fileSep);
182     }
183 
184     if(Gate.runningOnUnix()) {
185       assertTrue(fileSep.equals("/"));
186       assertTrue(
187         Gate.getUserSessionFileName().endsWith("."+GateConstants.GATE_DOT_SER)
188       );
189     } else {
190       assertTrue(! fileSep.equals("/"));
191       assertTrue(
192         ! Gate.getUserSessionFileName().endsWith("."+GateConstants.GATE_DOT_SER)
193       );
194     }
195 
196   } // testSessionStateFileNaming
197 
198   /** Test config file naming */
199   public void testConfigFileNaming() throws Exception {
200     String fileSep = Strings.getFileSep();
201     if(DEBUG) {
202       Out.prln("file sep is: " + fileSep);
203     }
204 
205     if(Gate.runningOnUnix()) {
206       assertTrue(fileSep.equals("/"));
207       assertTrue(
208         Gate.getUserConfigFileName().endsWith("."+GateConstants.GATE_DOT_XML)
209       );
210     } else {
211       assertTrue(! fileSep.equals("/"));
212       assertTrue(
213         ! Gate.getUserConfigFileName().endsWith("."+GateConstants.GATE_DOT_XML)
214       );
215     }
216 
217   } // testConfigFileNaming
218 
219   /** Test suite routine for the test runner */
220   public static Test suite() {
221     return new TestSuite(TestConfig.class);
222   } // suite
223 
224 } // class TestConfig
225