1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 package org.archive.queue;
26
27 import java.io.File;
28 import java.util.NoSuchElementException;
29 import java.util.concurrent.LinkedBlockingQueue;
30
31 import org.archive.util.FileUtils;
32 import org.archive.util.TmpDirTestCase;
33 import org.archive.util.bdbje.EnhancedEnvironment;
34
35 import com.sleepycat.je.Database;
36 import com.sleepycat.je.DatabaseConfig;
37 import com.sleepycat.je.DatabaseException;
38 import com.sleepycat.je.EnvironmentConfig;
39
40 public class StoredQueueTest extends TmpDirTestCase {
41 StoredQueue<String> queue;
42 EnhancedEnvironment env;
43 Database db;
44 File envDir;
45
46 protected void setUp() throws Exception {
47 super.setUp();
48 this.envDir = new File(getTmpDir(),"StoredMapTest");
49 this.envDir.mkdirs();
50 try {
51 EnvironmentConfig envConfig = new EnvironmentConfig();
52 envConfig.setTransactional(false);
53 envConfig.setAllowCreate(true);
54 env = new EnhancedEnvironment(envDir,envConfig);
55 DatabaseConfig dbConfig = StoredQueue.databaseConfig();
56 db = env.openDatabase(null, "StoredMapTest", dbConfig);
57 } catch (DatabaseException e) {
58 throw new RuntimeException(e);
59 }
60 this.queue = new StoredQueue<String>(db, String.class, env.getClassCatalog());
61 }
62
63 protected void tearDown() throws Exception {
64 db.close();
65 env.close();
66 FileUtils.deleteDir(this.envDir);
67 super.tearDown();
68 }
69
70 public void testAdd() {
71 assertEquals("not empty at start",0,queue.size());
72 fill(queue, 10);
73 assertEquals("unexpected size at full",10,queue.size());
74 }
75
76 /***
77 * @deprecated Use {@link #fill(Queue,int)} instead
78 */
79 protected void fill(int size) {
80 fill(queue, size);
81 }
82
83 protected void fill(java.util.Queue<String> q, int size) {
84 for(int i = 1; i <= size; i++) {
85 q.add("item-"+i);
86 }
87 }
88
89 protected int drain(java.util.Queue<String> q) {
90 int count = 0;
91 while(true) {
92 try {
93 q.remove();
94 count++;
95 } catch(NoSuchElementException nse) {
96 return count;
97 }
98 }
99 }
100
101 public void testClear() {
102 fill(queue, 10);
103 queue.clear();
104 assertEquals("unexpected size after clear",0,queue.size());
105 }
106
107 public void testRemove() {
108 fill(queue, 10);
109 assertEquals("unexpected remove value","item-1",queue.remove());
110 assertEquals("improper count of removed items",9,drain(queue));
111 try {
112 queue.remove();
113 fail("expected NoSuchElementException not received");
114 } catch (NoSuchElementException nse) {
115
116 }
117 }
118
119 public void testOrdering() {
120 fill(queue, 10);
121 for(int i = 1; i <= 10; i++) {
122 assertEquals("unexpected remove value","item-"+i,queue.remove());
123 }
124 }
125
126 public void testElement() {
127 fill(queue, 10);
128 assertEquals("unexpected element value","item-1",queue.element());
129 assertEquals("unexpected element value",queue.peek(),queue.element());
130 queue.clear();
131 try {
132 queue.element();
133 fail("expected NoSuchElementException not received");
134 } catch (NoSuchElementException nse) {
135
136 }
137 }
138
139 public void xestTimingsAgainstLinkedBlockingQueue() {
140 tryTimings(50000);
141 tryTimings(500000);
142 }
143
144 private void tryTimings(int i) {
145 LinkedBlockingQueue<String> lbq = new LinkedBlockingQueue<String>();
146 long start = System.currentTimeMillis();
147 fill(lbq,i);
148 drain(lbq);
149 long finish = System.currentTimeMillis();
150 System.out.println("LBQ - "+i+":"+(finish-start));
151 start = System.currentTimeMillis();
152 fill(queue,i);
153 drain(queue);
154 finish = System.currentTimeMillis();
155 System.out.println("SQ - "+i+":"+(finish-start));
156 }
157 }