/[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 160 - (show annotations)
Sat Jun 24 15:34:42 2006 UTC (17 years, 10 months ago) by dpavlin
File MIME type: application/x-troff
File size: 10594 byte(s)
added cacheusage, version bumped to 0.07_2
1 #!/usr/bin/perl -w
2
3 use strict;
4 use blib;
5
6 my $tests = 271;
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
251 like($node->cond_to_query( $cond ), qr/skip=$skip/, 'cond_to_query have skip');
252
253 ok( $nres = $node->search( $cond, 0 ), 'search');
254 isa_ok( $nres, 'Search::Estraier::NodeResult' );
255 cmp_ok($nres->doc_num, '==', $max, "nres->doc_num " . ($max - $skip));
256 cmp_ok($nres->hits, '==', $doc_num2, "nres->hits $doc_num2");
257
258 for my $i ( 0 .. ($nres->doc_num - 1) ) {
259 my $uri = 'test' . ($i + $delete_num + $skip + 1);
260 ok( my $rdoc = $nres->get_doc( $i ), "nres->get_doc $i");
261 if ($rdoc) {
262 cmp_ok( $rdoc->attr('@uri'), 'eq', $uri, "\@uri = $uri");
263 } else {
264 fail('no rdoc');
265 }
266 }
267
268
269 # user doesn't exist
270 ok($node->set_user('foobar', 1), 'set_user');
271
272 ok(my $node2 = new Search::Estraier::Node( "$estmaster_uri/node/$test2_node" ), "new $test2_node");
273 ok($node2->set_auth('admin','admin'), "set_auth $test2_node");
274
275 # croak_on_error
276
277 ok($node = new Search::Estraier::Node( url => "$estmaster_uri/non-existant", croak_on_error => 1 ), "new non-existant");
278 throws_ok { $node->name } qr/404/, 'croak on error';
279
280 # croak_on_error
281 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");
282
283 ok(! $node->uri_to_id('foobar'), 'uri_to_id without croak');
284
285
286 # test users
287 ok($node->admins, 'have admins');
288 ok(! $node->guests, 'no guests');
289
290
291 # test search without results
292 ok($cond = new Search::Estraier::Condition, 'new cond');
293 ok($cond->set_phrase('this_is_phrase_which_does_not_exits'), 'cond set_phrase');
294
295 ok($nres = $node->search( $cond, 0 ), 'search');
296
297 # now, test links
298 my $test2_label = "$test2_node label";
299 my $link_url = "$estmaster_uri/node/$test2_node";
300 ok($node->set_link( $link_url, $test2_label, 42), "set_link $test2_node ($test2_label) 42");
301 ok(my $links = $node->links, 'links');
302 cmp_ok($#{$links}, '==', 0, 'one link');
303 like($links->[0], qr/^$link_url/, 'link correct');
304 ok($node->set_link("$estmaster_uri/node/$test2_node", $test2_label, 0), "set_link $test2_node ($test2_label) delete");
305
306 ok($msg = $node->master(
307 action => 'nodeclr',
308 name => $node->name,
309 ), "nodeclr " . $node->name . ": $msg");
310
311 cmp_ok($node->doc_num, '==', 0, 'no documents');
312
313 # cleanup test nodes
314 foreach my $node_name ( $test1_node , $test2_node ) {
315 ok($msg = $node->master(
316 action => 'nodedel',
317 name => $node_name,
318 ), "nodedel $node_name: $msg");
319 }
320
321 # test create
322 my $node_name = '_test_create_' . $$;
323 my $node_label = "test $$ 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 => 1
330 ), "new create+croak");
331
332 cmp_ok($node->name, 'eq', $node_name, "node $node_name exists");
333 cmp_ok($node->label, 'eq', $node_label, "node label: $node_label");
334
335 ok($node = new Search::Estraier::Node(
336 url => "$estmaster_uri/node/$node_name",
337 create => 1,
338 label => $node_label,
339 croak_on_error => 0
340 ), "new create existing");
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 => 1
347 ), "new create+croak existing");
348
349 # cleanup
350 ok($msg = $node->master(
351 action => 'nodedel',
352 name => $node_name,
353 ), "nodedel $node_name: $msg");
354
355 # and again, this time without node
356 ok($node = new Search::Estraier::Node(
357 url => "$estmaster_uri/node/$node_name",
358 create => 1,
359 label => $node_label,
360 croak_on_error => 0
361 ), "new create non-existing");
362
363 cmp_ok($node->name, 'eq', $node_name, "node $node_name exists");
364 cmp_ok($node->label, 'eq', $node_label, "node label: $node_label");
365
366 # cleanup
367 ok($msg = $node->master(
368 action => 'nodedel',
369 name => $node_name,
370 ), "nodedel $node_name: $msg");
371
372 ok($msg = $node->master( action => 'sync' ), "sync: $msg");
373
374 } # SKIP
375
376 diag "over";

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26