/[Search-Estraier]/trunk/t/5_Node.t
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /trunk/t/5_Node.t

Parent Directory Parent Directory | Revision Log Revision Log


Revision 152 - (show annotations)
Tue May 16 12:11:39 2006 UTC (17 years, 11 months ago) by dpavlin
File MIME type: application/x-troff
File size: 10298 byte(s)
skip tests if estmaster isn't running, optional way to test against remove
Hyper Estraier server using:

ESTMASTER_URI=http://estraier.example.com:1978 make test

1 #!/usr/bin/perl -w
2
3 use strict;
4 use blib;
5
6 my $tests = 269;
7
8 use Test::More;
9 use Test::Exception;
10 use Data::Dumper;
11
12 BEGIN { use_ok('Search::Estraier') };
13
14 plan tests => $tests;
15
16 my $debug = shift @ARGV;
17
18 # name of node for test
19 my $test1_node = '_test1_' . $$;
20 my $test2_node = '_test2_' . $$;
21
22 my $estmaster_uri = $ENV{'ESTMASTER_URI'} || 'http://localhost:1978';
23
24 ok(my $node = new Search::Estraier::Node( debug => $debug ), 'new');
25 isa_ok($node, 'Search::Estraier::Node');
26
27 ok($node->set_url("$estmaster_uri/node/$test1_node"), "set_url $test1_node");
28
29 ok($node->set_proxy('', 8080), 'set_proxy');
30 throws_ok {$node->set_proxy('proxy.example.com', 'foo') } qr/port/, 'set_proxy port NaN';
31
32 ok($node->set_timeout(42), 'set_timeout');
33 throws_ok {$node->set_timeout('foo') } qr/timeout/, 'set_timeout NaN';
34
35 ok($node->set_auth('admin','admin'), 'set_auth');
36
37 cmp_ok($node->status, '==', -1, 'status');
38
39 # test master functionality
40
41 SKIP: {
42
43 skip "can't find estmaster at $estmaster_uri", ($tests - 9) if (! eval { $node->master( action => 'nodelist' ) } );
44
45 diag "using $estmaster_uri";
46 diag("node->master shutdown not tested");
47
48 diag("node->master backup not tested");
49
50 ok(my @users = $node->master( action => 'userlist' ), 'userlist');
51
52 #diag "users: ", Dumper( \@users );
53 diag "found ", $#users + 1, " users";
54
55 my $user = {
56 name => '_test_' . $$,
57 flags => 'b',
58 fname => 'Search::Estraier',
59 misc => 'test user',
60 };
61
62 my $msg;
63 ok($msg = $node->master(
64 action => 'useradd',
65 %{ $user },
66 passwd => 'test1234',
67 ), "useradd: $msg");
68
69 ok(my @users2 = $node->master( action => 'userlist' ), 'userlist');
70 cmp_ok($#users2, '==', $#users + 1, 'added user');
71
72 while (my $row = shift @users2) {
73 next unless ($row->{name} eq $user);
74 map {
75 cmp_ok($user->{$_}, 'eq', $row->{$_}, "$_");
76 } keys %{ $user };
77 }
78
79 ok($msg = $node->master(
80 action => 'userdel',
81 name => $user->{name},
82 ), "userdel: $msg");
83
84 ok(@users2 = $node->master( action => 'userlist' ), 'userlist');
85 cmp_ok($#users2, '==', $#users, 'removed user');
86
87 ok(my @nodes = $node->master( action => 'nodelist' ), 'nodelist' );
88 #diag "nodelist: ", Dumper( \@nodes );
89 diag "found ", $#nodes + 1, " nodes";
90
91 if ($#nodes > 42) {
92 diag <<'_END_OF_WARNING_';
93
94 This tests create three nodes in your Hyper Estraier.
95
96 Since you have more than 43 modes, and Hyper Estraier needs more than
97 1024 file descriptors for more than 46 nodes, expect tests to fail.
98
99 If tests do fail, you can try to add
100
101 ulimit -n 2048
102
103 before staring estmaster, which will increase number of available nodes
104 to 96 before estmaster runs out of file descriptors.
105
106 _END_OF_WARNING_
107 }
108
109 my $temp_node = "_test_temp_$$";
110
111 foreach my $node_name ( $test1_node , $test2_node, $temp_node ) {
112 ok($msg = $node->master(
113 action => 'nodeadd',
114 name => $node_name,
115 label => "$node_name label",
116 ), "nodeadd $node_name: $msg");
117 }
118
119 ok($msg = $node->master(
120 action => 'nodedel',
121 name => $temp_node,
122 ), "nodedel $temp_node: $msg");
123
124 #diag "not testing logrtt\n";
125
126 # test document creation
127
128 my $draft = <<'_END_OF_DRAFT_';
129 @uri=data0
130 @title=Material Girl
131
132 Living in a material world
133 And I am a material girl
134 You know that we are living in a material world
135 And I am a material girl
136 _END_OF_DRAFT_
137
138 #diag "draft:\n$draft";
139 ok(my $doc = new Search::Estraier::Document($draft), 'new doc from draft');
140
141 ok( $node->put_doc($doc), "put_doc data001");
142
143 for ( 1 .. 17 ) {
144 $doc->add_attr('@uri', 'test' . $_);
145 ok( $node->put_doc($doc), "put_doc test$_");
146 #diag $doc->dump_draft;
147 cmp_ok( $node->doc_num, '==', ($_ + 1), "node->doc_num " . ($_ + 1));
148 }
149
150 ok(! $node->uri_to_id( 'does-not-exists' ), "non-existant uri_to_id");
151
152 my $id;
153 ok($id = $node->uri_to_id( 'data0' ), "uri_to_id(data0)");
154
155 ok($doc = $node->get_doc( $id ), "get_doc($id) for edit");
156 $doc->add_attr('foo', 'bar');
157 #diag Dumper($doc);
158 ok( $node->edit_doc( $doc ), 'edit_doc');
159
160 my $doc_num;
161 ok( $doc_num = $node->doc_num, "node->doc_num $doc_num");
162
163 ok( $node->out_doc( $id ), "out_doc($id)");
164
165 cmp_ok( $node->doc_num, '==', --$doc_num, "node->doc_num " . $doc_num);
166
167 ok( ! $node->edit_doc( $doc ), "edit_doc of removed doc");
168
169 my $delete_num = 5;
170
171 for ( 1 .. $delete_num ) {
172 ok( $node->out_doc_by_uri( 'test' . $_ ), "out_doc_by_uri test$_");
173 cmp_ok( $node->doc_num, '==', $doc_num - $_, "node->doc_num " . ($doc_num - $_));
174 }
175
176 my $doc_num2 = $doc_num - $delete_num;
177 cmp_ok($node->doc_num, '==', $doc_num2, "node->doc_num $doc_num2");
178
179 my $max = int($doc_num2 / 2);
180
181 ok(my $cond = new Search::Estraier::Condition, 'new cond');
182 ok($cond->set_phrase('girl'), 'cond set_phrase');
183 ok($cond->set_max($max), "cond set_max($max)");
184 ok($cond->set_order('@uri ASCD'), 'cond set_order');
185 ok($cond->add_attr('@title STRINC Material'), 'cond add_attr');
186
187 cmp_ok($node->cond_to_query( $cond ), 'eq' , 'phrase=girl&attr1=%40title%20STRINC%20Material&order=%40uri%20ASCD&max='.$max.'&wwidth=480&hwidth=96&awidth=96', 'cond_to_query');
188
189 ok( my $nres = $node->search( $cond, 0 ), 'search');
190
191 isa_ok( $nres, 'Search::Estraier::NodeResult' );
192
193 cmp_ok($nres->doc_num, '==', $max, "nres->doc_num $max");
194
195 cmp_ok($nres->hits, '==', $doc_num2, "nres->hits $doc_num2");
196
197 # upper limit is $nres->hits and not $nres->doc_num because we
198 # check all documents, not just results!
199 for my $i ( 0 .. ($nres->hits - 1) ) {
200 my $num = $i + $delete_num + 1;
201 my $uri = 'test' . $num;
202
203 if ($i < $nres->doc_num) {
204 ok( my $rdoc = $nres->get_doc( $i ), "nres->get_doc $i");
205
206 cmp_ok( $rdoc->attr('@uri'), 'eq', $uri, "\@uri = $uri");
207 cmp_ok( $node->uri_to_id( $uri ), '==', $num + 1, "uri_to_id($uri)");
208
209 ok( my $k = $rdoc->keywords( $id ), "rdoc keywords");
210 } else {
211 ok( ! $nres->get_doc( $i ), "nres->get_doc doesn't exist");
212 }
213
214 ok( my $id = $node->uri_to_id( $uri ), "uri_to_id($uri)");
215 ok( $node->get_doc( $id ), "get_doc($id)");
216 ok( $node->get_doc_by_uri( $uri ), "get_doc_by_uri($uri)");
217 cmp_ok( $node->get_doc_attr( $id, '@uri' ), 'eq', $uri, "get_doc_attr $id");
218 cmp_ok( $node->get_doc_attr_by_uri( $uri, '@uri' ), 'eq', $uri, "get_doc_attr $id");
219 ok( my $k1 = $node->etch_doc( $id ), "etch_doc_by_uri $uri");
220 ok( my $k2 = $node->etch_doc_by_uri( $uri ), "etch_doc_by_uri $uri");
221 #diag Dumper($k, $k2);
222 ok( eq_hash( $k1, $k2 ), "keywords");
223 }
224
225 ok(my $hints = $nres->hints, 'hints');
226 diag Dumper($hints) if ($debug);
227
228 ok($node->_set_info, "refresh _set_info");
229
230 my $v;
231 ok($v = $node->name, "name: $v");
232 ok($v = $node->label, "label: $v");
233 ok($v = $node->doc_num, "doc_num: $v");
234 ok(defined($v = $node->word_num), "word_num: $v");
235 ok($v = $node->size, "size: $v");
236
237 ok($node->set_snippet_width( 100, 10, 10 ), "set_snippet_width");
238
239 # test skip
240 my $skip = int($max / 2) || die "skip is zero, can't test";
241 ok($cond->set_skip( $skip ), "cond set_skip($skip)");
242
243 ok( $nres = $node->search( $cond, 0 ), 'search');
244 isa_ok( $nres, 'Search::Estraier::NodeResult' );
245 cmp_ok($nres->doc_num, '==', $max, "nres->doc_num " . ($max - $skip));
246 cmp_ok($nres->hits, '==', $doc_num2, "nres->hits $doc_num2");
247
248 for my $i ( 0 .. ($nres->doc_num - 1) ) {
249 my $uri = 'test' . ($i + $delete_num + 1);
250 ok( my $rdoc = $nres->get_doc( $i ), "nres->get_doc $i");
251 if ($rdoc) {
252 cmp_ok( $rdoc->attr('@uri'), 'eq', $uri, "\@uri = $uri");
253 } else {
254 fail('no rdoc');
255 }
256 }
257
258
259 # user doesn't exist
260 ok(! $node->set_user('foobar', 1), 'set_user');
261
262 ok(my $node2 = new Search::Estraier::Node( "$estmaster_uri/node/$test2_node" ), "new $test2_node");
263 ok($node2->set_auth('admin','admin'), "set_auth $test2_node");
264
265 # croak_on_error
266
267 ok($node = new Search::Estraier::Node( url => "$estmaster_uri/non-existant", croak_on_error => 1 ), "new non-existant");
268 throws_ok { $node->name } qr/404/, 'croak on error';
269
270 # croak_on_error
271 ok($node = new Search::Estraier::Node( url => "$estmaster_uri/node/$test1_node", croak_on_error => 1 ), "new $test1_node");
272
273 ok(! $node->uri_to_id('foobar'), 'uri_to_id without croak');
274
275
276 # test users
277 ok(! $node->admins, 'no admins');
278 ok(! $node->guests, 'no guests');
279
280
281 # test search without results
282 ok($cond = new Search::Estraier::Condition, 'new cond');
283 ok($cond->set_phrase('this_is_phrase_which_does_not_exits'), 'cond set_phrase');
284
285 ok($nres = $node->search( $cond, 0 ), 'search');
286
287 # now, test links
288 my $test2_label = "$test2_node label";
289 my $link_url = "$estmaster_uri/node/$test2_node";
290 ok($node->set_link( $link_url, $test2_label, 42), "set_link $test2_node ($test2_label) 42");
291 ok(my $links = $node->links, 'links');
292 cmp_ok($#{$links}, '==', 0, 'one link');
293 like($links->[0], qr/^$link_url/, 'link correct');
294 ok($node->set_link("$estmaster_uri/node/$test2_node", $test2_label, 0), "set_link $test2_node ($test2_label) delete");
295
296 ok($msg = $node->master(
297 action => 'nodeclr',
298 name => $node->name,
299 ), "nodeclr $node->name: $msg");
300
301 cmp_ok($node->doc_num, '==', 0, 'no documents');
302
303 # cleanup test nodes
304 foreach my $node_name ( $test1_node , $test2_node ) {
305 ok($msg = $node->master(
306 action => 'nodedel',
307 name => $node_name,
308 ), "nodedel $node_name: $msg");
309 }
310
311 # test create
312 my $node_name = '_test_create_' . $$;
313 my $node_label = "test $$ label";
314
315 ok($node = new Search::Estraier::Node(
316 url => "$estmaster_uri/node/$node_name",
317 create => 1,
318 label => $node_label,
319 croak_on_error => 1
320 ), "new create+croak");
321
322 cmp_ok($node->name, 'eq', $node_name, "node $node_name exists");
323 cmp_ok($node->label, 'eq', $node_label, "node label: $node_label");
324
325 ok($node = new Search::Estraier::Node(
326 url => "$estmaster_uri/node/$node_name",
327 create => 1,
328 label => $node_label,
329 croak_on_error => 0
330 ), "new create existing");
331
332 ok($node = new Search::Estraier::Node(
333 url => "$estmaster_uri/node/$node_name",
334 create => 1,
335 label => $node_label,
336 croak_on_error => 1
337 ), "new create+croak existing");
338
339 # cleanup
340 ok($msg = $node->master(
341 action => 'nodedel',
342 name => $node_name,
343 ), "nodedel $node_name: $msg");
344
345 # and again, this time without node
346 ok($node = new Search::Estraier::Node(
347 url => "$estmaster_uri/node/$node_name",
348 create => 1,
349 label => $node_label,
350 croak_on_error => 0
351 ), "new create non-existing");
352
353 cmp_ok($node->name, 'eq', $node_name, "node $node_name exists");
354 cmp_ok($node->label, 'eq', $node_label, "node label: $node_label");
355
356 # cleanup
357 ok($msg = $node->master(
358 action => 'nodedel',
359 name => $node_name,
360 ), "nodedel $node_name: $msg");
361
362 ok($msg = $node->master( action => 'sync' ), "sync: $msg");
363
364 } # SKIP
365
366 diag "over";

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26