1   /*
2    *  TestBumpyStack.java
3    *
4    *  Copyright (c) 1998-2001, 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, 10/June/00
12   *
13   *  $Id: TestBumpyStack.java,v 1.9 2001/11/24 18:23:24 hamish Exp $
14   */
15  
16  package gate.util;
17  
18  import java.util.*;
19  import java.io.*;
20  import junit.framework.*;
21  import java.net.*;
22  
23  import gate.*;
24  import gate.creole.*;
25  
26  /** BumpyStack test class.
27    */
28  public class TestBumpyStack extends TestCase
29  {
30    /** Debug flag */
31    private static final boolean DEBUG = false;
32  
33    /** Construction */
34    public TestBumpyStack(String name) { super(name); }
35  
36    /** Fixture set up */
37    public void setUp() {
38    } // setUp
39  
40    /** Test suite routine for the test runner */
41    public static Test suite() {
42      return new TestSuite(TestBumpyStack.class);
43    } // suite
44  
45    public static void callGC(){
46      Runtime runtime = Runtime.getRuntime();
47      long memory;
48      do {
49        memory = runtime.totalMemory() - runtime.freeMemory();
50        runtime.gc();
51        try {
52          Thread.currentThread().wait(300);
53        } catch (Exception e) {}
54        runtime.gc();
55      } while (memory < runtime.totalMemory() - runtime.freeMemory());
56    }
57  
58    /** Test the bumpiness of the thing. */
59    public void testBumpiness() throws Exception {
60      WeakBumpyStack bumper = new WeakBumpyStack();
61  
62      String s1 = new String("s1");
63      String s2 = new String("s2");
64      String s3 = new String("s3");
65  
66      bumper.push(s3);
67      bumper.push(s2);
68      bumper.push(s1);
69  
70      assertTrue(
71        "managed to bump non-existent element",
72        ! bumper.bump(new String("something"))
73      );
74  
75      assertTrue("stack wrong length (I): " + bumper.size(), bumper.size() == 3);
76      assertTrue("couldn't bump s2", bumper.bump(s2));
77      assertTrue("s2 not front of stack", ((String) bumper.pop()).equals("s2"));
78      assertTrue("stack wrong length (II)" + bumper.size(), bumper.size() == 2);
79    } // testBumpiness()
80  
81    /**
82     * Tests whether the CreoleRegisterImpl keeps unreacheable resourecs alive.
83     * <B>WARNING: see notes on WeakBumptyStack</B>.
84     */
85    public void testSelfCleaning() throws Exception {
86      //count instances
87      Collection instances = ((ResourceData)
88                             Gate.getCreoleRegister().
89                             get("gate.corpora.DocumentImpl")).
90                             getInstantiations();
91      int docCnt = instances == null ? 0: instances.size();
92  
93      instances = ((ResourceData)
94                    Gate.getCreoleRegister().
95                    get("gate.corpora.CorpusImpl")).
96                    getInstantiations();
97      int corpusCnt = instances == null ? 0: instances.size();
98  
99      instances = ((ResourceData)
100                   Gate.getCreoleRegister().
101                   get("gate.creole.tokeniser.DefaultTokeniser")).
102                   getInstantiations();
103     int tokCnt = instances == null ? 0: instances.size();
104 
105     instances = ((ResourceData)
106                   Gate.getCreoleRegister().
107                   get("gate.creole.ANNIETransducer")).
108                   getInstantiations();
109     int japeCnt = instances == null ? 0: instances.size();
110 
111     instances = ((ResourceData)
112                   Gate.getCreoleRegister().
113                   get("gate.creole.SerialController")).
114                   getInstantiations();
115     int serctlCnt = instances == null ? 0: instances.size();
116 
117     instances = null;
118     //create some unreacheable resources
119     //LRs
120 
121     Resource res = Factory.newCorpus("corpus1");
122     res.getFeatures().put("large", new byte[500000]);
123     res = Factory.newCorpus("corpus2");
124     res.getFeatures().put("large", new byte[500000]);
125     res = Factory.newCorpus("corpus3");
126     res.getFeatures().put("large", new byte[500000]);
127 
128     res = Factory.newDocument("content");
129     res.getFeatures().put("large", new byte[500000]);
130     res = Factory.newDocument(Gate.getUrl("tests/doc0.html"));
131     res.getFeatures().put("large", new byte[500000]);
132     res = Factory.newDocument(Gate.getUrl("tests/doc0.html"));
133     res.getFeatures().put("large", new byte[500000]);
134     res = Factory.newDocument(Gate.getUrl("tests/doc0.html"));
135     res.getFeatures().put("large", new byte[500000]);
136 
137     //PRs
138     res = Factory.createResource("gate.creole.tokeniser.DefaultTokeniser");
139     res.getFeatures().put("large", new byte[500000]);
140     res = Factory.createResource("gate.creole.tokeniser.DefaultTokeniser");
141     res.getFeatures().put("large", new byte[500000]);
142     res = Factory.createResource("gate.creole.tokeniser.DefaultTokeniser");
143     res.getFeatures().put("large", new byte[500000]);
144 
145     res = Factory.createResource("gate.creole.ANNIETransducer");
146     res.getFeatures().put("large", new byte[500000]);
147 
148     //Controllers
149     res = Factory.createResource("gate.creole.SerialController");
150     res.getFeatures().put("large", new byte[500000]);
151     res = Factory.createResource("gate.creole.SerialController");
152     res.getFeatures().put("large", new byte[500000]);
153     res = Factory.createResource("gate.creole.SerialController");
154     res.getFeatures().put("large", new byte[500000]);
155     res = null;
156 
157 
158     //force GC
159     callGC();
160 
161     //check instances count
162     int newDocCnt = ((ResourceData)
163                   Gate.getCreoleRegister().
164                   get("gate.corpora.DocumentImpl")).
165                   getInstantiations().size();
166 
167     int newCorpusCnt = ((ResourceData)
168                   Gate.getCreoleRegister().
169                   get("gate.corpora.CorpusImpl")).
170                   getInstantiations().size();
171     int newTokCnt = ((ResourceData)
172                   Gate.getCreoleRegister().
173                   get("gate.creole.tokeniser.DefaultTokeniser")).
174                   getInstantiations().size();
175     int newJapeCnt = ((ResourceData)
176                   Gate.getCreoleRegister().
177                   get("gate.creole.ANNIETransducer")).
178                   getInstantiations().size();
179     int newSerctlCnt = ((ResourceData)
180                   Gate.getCreoleRegister().
181                   get("gate.creole.SerialController")).
182                   getInstantiations().size();
183 
184     String message =
185           "\nWARNING: testSelfCleaning: GC didn't run:" +
186           "\nDocs expected: " + docCnt + ", got: " + newDocCnt +
187           "\nCorpora expected: " + corpusCnt + ", got: " + newCorpusCnt +
188           "\nTokenisers expected: " + tokCnt + ", got: " + newTokCnt +
189           "\nJapes expected: " + japeCnt + ", got: " + newJapeCnt +
190           "\nSerCtls expected: " + serctlCnt + ", got: " + newSerctlCnt;
191 
192     // ordinarily the following "if" would be an assert, and if the
193     // conditions failed then the test would fail. see notes on
194     // WeakBumptyStack
195     if(! (
196       docCnt + 4 > newDocCnt &&
197       corpusCnt + 3 > newCorpusCnt &&
198       tokCnt + 3 > newTokCnt &&
199       japeCnt + 1 > newJapeCnt &&
200       serctlCnt + 3 > newSerctlCnt
201     ) && DEBUG)
202       Err.prln(message);
203   }
204 } // class TestBumpyStack
205