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

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26