/[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 170 - (show annotations)
Sun Aug 6 17:15:01 2006 UTC (17 years, 8 months ago) by dpavlin
File MIME type: application/x-troff
File size: 10839 byte(s)
test $nres->hint()
1 #!/usr/bin/perl -w
2
3 use strict;
4 use blib;
5
6 my $tests = 279;
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
197 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');
198
199 ok( my $nres = $node->search( $cond, 0 ), 'search');
200
201 isa_ok( $nres, 'Search::Estraier::NodeResult' );
202
203 cmp_ok($nres->doc_num, '==', $max, "nres->doc_num $max");
204
205 cmp_ok($nres->hits, '==', $doc_num2, "nres->hits $doc_num2");
206
207 # upper limit is $nres->hits and not $nres->doc_num because we
208 # check all documents, not just results!
209 for my $i ( 0 .. ($nres->hits - 1) ) {
210 my $num = $i + $delete_num + 1;
211 my $uri = 'test' . $num;
212
213 if ($i < $nres->doc_num) {
214 ok( my $rdoc = $nres->get_doc( $i ), "nres->get_doc $i");
215
216 cmp_ok( $rdoc->attr('@uri'), 'eq', $uri, "\@uri = $uri");
217 cmp_ok( $node->uri_to_id( $uri ), '==', $num + 1, "uri_to_id($uri)");
218
219 ok( my $k = $rdoc->keywords( $id ), "rdoc keywords");
220 } else {
221 ok( ! $nres->get_doc( $i ), "nres->get_doc doesn't exist");
222 }
223
224 ok( my $id = $node->uri_to_id( $uri ), "uri_to_id($uri)");
225 ok( $node->get_doc( $id ), "get_doc($id)");
226 ok( $node->get_doc_by_uri( $uri ), "get_doc_by_uri($uri)");
227 cmp_ok( $node->get_doc_attr( $id, '@uri' ), 'eq', $uri, "get_doc_attr $id");
228 cmp_ok( $node->get_doc_attr_by_uri( $uri, '@uri' ), 'eq', $uri, "get_doc_attr $id");
229 ok( my $k1 = $node->etch_doc( $id ), "etch_doc_by_uri $uri");
230 ok( my $k2 = $node->etch_doc_by_uri( $uri ), "etch_doc_by_uri $uri");
231 #diag Dumper($k, $k2);
232 ok( eq_hash( $k1, $k2 ), "keywords");
233 }
234
235 ok(my $hints = $nres->hints, 'hints');
236 diag Dumper($hints) if ($debug);
237 foreach my $h (qw/TIME DOCNUM VERSION NODE HIT WORDNUM/) {
238 ok(defined( $nres->hint($h) ), "have hint $h");
239 }
240
241 ok($node->_set_info, "refresh _set_info");
242
243 my $v;
244 ok($v = $node->name, "name: $v");
245 ok($v = $node->label, "label: $v");
246 ok($v = $node->doc_num, "doc_num: $v");
247 ok(defined($v = $node->word_num), "word_num: $v");
248 ok($v = $node->size, "size: $v");
249
250 ok($node->set_snippet_width( 100, 10, 10 ), "set_snippet_width");
251
252 # test skip
253 my $skip = int($max / 2) || die "skip is zero, can't test";
254 ok($cond->set_skip( $skip ), "cond set_skip($skip)");
255 cmp_ok($cond->skip, '==', $skip, "skip is $skip");
256
257 like($node->cond_to_query( $cond ), qr/skip=$skip/, 'cond_to_query have skip');
258
259 ok( $nres = $node->search( $cond, 0 ), 'search');
260 isa_ok( $nres, 'Search::Estraier::NodeResult' );
261 cmp_ok($nres->doc_num, '==', $max, "nres->doc_num " . ($max - $skip));
262 cmp_ok($nres->hits, '==', $doc_num2, "nres->hits $doc_num2");
263
264 for my $i ( 0 .. ($nres->doc_num - 1) ) {
265 my $uri = 'test' . ($i + $delete_num + $skip + 1);
266 ok( my $rdoc = $nres->get_doc( $i ), "nres->get_doc $i");
267 if ($rdoc) {
268 cmp_ok( $rdoc->attr('@uri'), 'eq', $uri, "\@uri = $uri");
269 } else {
270 fail('no rdoc');
271 }
272 }
273
274
275 # user doesn't exist
276 ok($node->set_user('foobar', 1), 'set_user');
277
278 ok(my $node2 = new Search::Estraier::Node( "$estmaster_uri/node/$test2_node" ), "new $test2_node");
279 ok($node2->set_auth('admin','admin'), "set_auth $test2_node");
280
281 # croak_on_error
282
283 ok($node = new Search::Estraier::Node( url => "$estmaster_uri/non-existant", croak_on_error => 1 ), "new non-existant");
284 throws_ok { $node->name } qr/404/, 'croak on error';
285
286 # croak_on_error
287 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");
288
289 ok(! $node->uri_to_id('foobar'), 'uri_to_id without croak');
290
291
292 # test users
293 ok($node->admins, 'have admins');
294 ok(! $node->guests, 'no guests');
295
296
297 # test search without results
298 ok($cond = new Search::Estraier::Condition, 'new cond');
299 ok($cond->set_phrase('this_is_phrase_which_does_not_exits'), 'cond set_phrase');
300
301 ok($nres = $node->search( $cond, 0 ), 'search');
302
303 # now, test links
304 my $test2_label = "$test2_node label";
305 my $link_url = "$estmaster_uri/node/$test2_node";
306 ok($node->set_link( $link_url, $test2_label, 42), "set_link $test2_node ($test2_label) 42");
307 ok(my $links = $node->links, 'links');
308 cmp_ok($#{$links}, '==', 0, 'one link');
309 like($links->[0], qr/^$link_url/, 'link correct');
310 ok($node->set_link("$estmaster_uri/node/$test2_node", $test2_label, 0), "set_link $test2_node ($test2_label) delete");
311
312 ok($msg = $node->master(
313 action => 'nodeclr',
314 name => $node->name,
315 ), "nodeclr " . $node->name . ": $msg");
316
317 cmp_ok($node->doc_num, '==', 0, 'no documents');
318
319 # cleanup test nodes
320 foreach my $node_name ( $test1_node , $test2_node ) {
321 ok($msg = $node->master(
322 action => 'nodedel',
323 name => $node_name,
324 ), "nodedel $node_name: $msg");
325 }
326
327 # test create
328 my $node_name = '_test_create_' . $$;
329 my $node_label = "test $$ label";
330
331 ok($node = new Search::Estraier::Node(
332 url => "$estmaster_uri/node/$node_name",
333 create => 1,
334 label => $node_label,
335 croak_on_error => 1
336 ), "new create+croak");
337
338 cmp_ok($node->name, 'eq', $node_name, "node $node_name exists");
339 cmp_ok($node->label, 'eq', $node_label, "node label: $node_label");
340
341 ok($node = new Search::Estraier::Node(
342 url => "$estmaster_uri/node/$node_name",
343 create => 1,
344 label => $node_label,
345 croak_on_error => 0
346 ), "new create existing");
347
348 ok($node = new Search::Estraier::Node(
349 url => "$estmaster_uri/node/$node_name",
350 create => 1,
351 label => $node_label,
352 croak_on_error => 1
353 ), "new create+croak existing");
354
355 # cleanup
356 ok($msg = $node->master(
357 action => 'nodedel',
358 name => $node_name,
359 ), "nodedel $node_name: $msg");
360
361 # and again, this time without node
362 ok($node = new Search::Estraier::Node(
363 url => "$estmaster_uri/node/$node_name",
364 create => 1,
365 label => $node_label,
366 croak_on_error => 0
367 ), "new create non-existing");
368
369 cmp_ok($node->name, 'eq', $node_name, "node $node_name exists");
370 cmp_ok($node->label, 'eq', $node_label, "node label: $node_label");
371
372 # cleanup
373 ok($msg = $node->master(
374 action => 'nodedel',
375 name => $node_name,
376 ), "nodedel $node_name: $msg");
377
378 ok($msg = $node->master( action => 'sync' ), "sync: $msg");
379
380 } # SKIP
381
382 diag "over";

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26