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

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26