/[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

Annotation of /trunk/t/5_Node.t

Parent Directory Parent Directory | Revision Log Revision Log


Revision 173 - (hide 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 dpavlin 28 #!/usr/bin/perl -w
2    
3     use strict;
4     use blib;
5    
6 dpavlin 173 my $tests = 280;
7 dpavlin 152
8     use Test::More;
9 dpavlin 28 use Test::Exception;
10     use Data::Dumper;
11    
12     BEGIN { use_ok('Search::Estraier') };
13    
14 dpavlin 152 plan tests => $tests;
15    
16 dpavlin 148 my $debug = shift @ARGV;
17 dpavlin 40
18 dpavlin 35 # name of node for test
19 dpavlin 137 my $test1_node = '_test1_' . $$;
20     my $test2_node = '_test2_' . $$;
21 dpavlin 35
22 dpavlin 152 my $estmaster_uri = $ENV{'ESTMASTER_URI'} || 'http://localhost:1978';
23    
24 dpavlin 57 ok(my $node = new Search::Estraier::Node( debug => $debug ), 'new');
25 dpavlin 28 isa_ok($node, 'Search::Estraier::Node');
26    
27 dpavlin 152 ok($node->set_url("$estmaster_uri/node/$test1_node"), "set_url $test1_node");
28 dpavlin 29
29 dpavlin 38 ok($node->set_proxy('', 8080), 'set_proxy');
30 dpavlin 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 dpavlin 31
35 dpavlin 153 my ($user, $passwd) = (
36     $ENV{EST_USER} || 'admin',
37     $ENV{EST_PASSWD} || 'admin'
38     );
39 dpavlin 32
40 dpavlin 153 ok($node->set_auth($user, $passwd), 'set_auth');
41    
42 dpavlin 32 cmp_ok($node->status, '==', -1, 'status');
43 dpavlin 35
44 dpavlin 134 # test master functionality
45    
46 dpavlin 152 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 dpavlin 151 diag("node->master shutdown not tested");
52 dpavlin 134
53 dpavlin 151 diag("node->master backup not tested");
54 dpavlin 134
55 dpavlin 135 ok(my @users = $node->master( action => 'userlist' ), 'userlist');
56    
57 dpavlin 137 #diag "users: ", Dumper( \@users );
58     diag "found ", $#users + 1, " users";
59 dpavlin 135
60 dpavlin 137 my $user = {
61     name => '_test_' . $$,
62     flags => 'b',
63     fname => 'Search::Estraier',
64     misc => 'test user',
65     };
66 dpavlin 73
67 dpavlin 151 my $msg;
68 dpavlin 137 ok($msg = $node->master(
69     action => 'useradd',
70     %{ $user },
71     passwd => 'test1234',
72     ), "useradd: $msg");
73 dpavlin 73
74 dpavlin 137 ok(my @users2 = $node->master( action => 'userlist' ), 'userlist');
75     cmp_ok($#users2, '==', $#users + 1, 'added user');
76 dpavlin 38
77 dpavlin 137 while (my $row = shift @users2) {
78     next unless ($row->{name} eq $user);
79     map {
80     cmp_ok($user->{$_}, 'eq', $row->{$_}, "$_");
81     } keys %{ $user };
82 dpavlin 37 }
83 dpavlin 35
84 dpavlin 137 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 dpavlin 138 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 dpavlin 137
104 dpavlin 138 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 dpavlin 137 _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 dpavlin 35 my $draft = <<'_END_OF_DRAFT_';
134 dpavlin 148 @uri=data0
135 dpavlin 35 @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 dpavlin 40 #diag "draft:\n$draft";
144     ok(my $doc = new Search::Estraier::Document($draft), 'new doc from draft');
145    
146 dpavlin 46 ok( $node->put_doc($doc), "put_doc data001");
147    
148 dpavlin 148 for ( 1 .. 17 ) {
149 dpavlin 41 $doc->add_attr('@uri', 'test' . $_);
150     ok( $node->put_doc($doc), "put_doc test$_");
151     #diag $doc->dump_draft;
152 dpavlin 151 cmp_ok( $node->doc_num, '==', ($_ + 1), "node->doc_num " . ($_ + 1));
153 dpavlin 41 }
154    
155 dpavlin 148 ok(! $node->uri_to_id( 'does-not-exists' ), "non-existant uri_to_id");
156    
157 dpavlin 50 my $id;
158 dpavlin 148 ok($id = $node->uri_to_id( 'data0' ), "uri_to_id(data0)");
159 dpavlin 41
160 dpavlin 169 throws_ok { $node->get_doc( 'foo') } qr/id must be number/, 'croak on non-number';
161    
162 dpavlin 148 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 dpavlin 100
167 dpavlin 150 my $doc_num;
168     ok( $doc_num = $node->doc_num, "node->doc_num $doc_num");
169    
170 dpavlin 148 ok( $node->out_doc( $id ), "out_doc($id)");
171    
172 dpavlin 150 cmp_ok( $node->doc_num, '==', --$doc_num, "node->doc_num " . $doc_num);
173    
174 dpavlin 148 ok( ! $node->edit_doc( $doc ), "edit_doc of removed doc");
175    
176 dpavlin 160 my $cache;
177     ok($cache = $node->cacheusage, "cacheusage: $cache");
178    
179 dpavlin 148 my $delete_num = 5;
180    
181     for ( 1 .. $delete_num ) {
182 dpavlin 43 ok( $node->out_doc_by_uri( 'test' . $_ ), "out_doc_by_uri test$_");
183 dpavlin 150 cmp_ok( $node->doc_num, '==', $doc_num - $_, "node->doc_num " . ($doc_num - $_));
184 dpavlin 41 }
185 dpavlin 42
186 dpavlin 148 my $doc_num2 = $doc_num - $delete_num;
187     cmp_ok($node->doc_num, '==', $doc_num2, "node->doc_num $doc_num2");
188 dpavlin 50
189 dpavlin 148 my $max = int($doc_num2 / 2);
190 dpavlin 50
191 dpavlin 51 ok(my $cond = new Search::Estraier::Condition, 'new cond');
192     ok($cond->set_phrase('girl'), 'cond set_phrase');
193 dpavlin 148 ok($cond->set_max($max), "cond set_max($max)");
194 dpavlin 51 ok($cond->set_order('@uri ASCD'), 'cond set_order');
195     ok($cond->add_attr('@title STRINC Material'), 'cond add_attr');
196 dpavlin 173 ok($cond->set_mask(qw/1 2/), 'cond set_mask');
197 dpavlin 51
198 dpavlin 173 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 dpavlin 51
200 dpavlin 91 ok( my $nres = $node->search( $cond, 0 ), 'search');
201 dpavlin 51
202 dpavlin 91 isa_ok( $nres, 'Search::Estraier::NodeResult' );
203 dpavlin 51
204 dpavlin 148 cmp_ok($nres->doc_num, '==', $max, "nres->doc_num $max");
205 dpavlin 53
206 dpavlin 148 cmp_ok($nres->hits, '==', $doc_num2, "nres->hits $doc_num2");
207 dpavlin 100
208 dpavlin 148 # upper limit is $nres->hits and not $nres->doc_num because we
209     # check all documents, not just results!
210 dpavlin 115 for my $i ( 0 .. ($nres->hits - 1) ) {
211 dpavlin 148 my $num = $i + $delete_num + 1;
212     my $uri = 'test' . $num;
213 dpavlin 115
214     if ($i < $nres->doc_num) {
215 dpavlin 148 ok( my $rdoc = $nres->get_doc( $i ), "nres->get_doc $i");
216 dpavlin 115
217     cmp_ok( $rdoc->attr('@uri'), 'eq', $uri, "\@uri = $uri");
218 dpavlin 148 cmp_ok( $node->uri_to_id( $uri ), '==', $num + 1, "uri_to_id($uri)");
219    
220 dpavlin 115 ok( my $k = $rdoc->keywords( $id ), "rdoc keywords");
221 dpavlin 148 } else {
222     ok( ! $nres->get_doc( $i ), "nres->get_doc doesn't exist");
223 dpavlin 115 }
224    
225 dpavlin 148 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 dpavlin 49 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 dpavlin 115 ok( my $k1 = $node->etch_doc( $id ), "etch_doc_by_uri $uri");
231 dpavlin 49 ok( my $k2 = $node->etch_doc_by_uri( $uri ), "etch_doc_by_uri $uri");
232     #diag Dumper($k, $k2);
233 dpavlin 115 ok( eq_hash( $k1, $k2 ), "keywords");
234 dpavlin 43 }
235 dpavlin 48
236 dpavlin 91 ok(my $hints = $nres->hints, 'hints');
237 dpavlin 152 diag Dumper($hints) if ($debug);
238 dpavlin 170 foreach my $h (qw/TIME DOCNUM VERSION NODE HIT WORDNUM/) {
239     ok(defined( $nres->hint($h) ), "have hint $h");
240     }
241 dpavlin 91
242 dpavlin 72 ok($node->_set_info, "refresh _set_info");
243    
244 dpavlin 48 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 dpavlin 110 ok(defined($v = $node->word_num), "word_num: $v");
249 dpavlin 48 ok($v = $node->size, "size: $v");
250    
251 dpavlin 55 ok($node->set_snippet_width( 100, 10, 10 ), "set_snippet_width");
252    
253 dpavlin 148 # 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 dpavlin 167 cmp_ok($cond->skip, '==', $skip, "skip is $skip");
257 dpavlin 148
258 dpavlin 155 like($node->cond_to_query( $cond ), qr/skip=$skip/, 'cond_to_query have skip');
259    
260 dpavlin 148 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 dpavlin 155 my $uri = 'test' . ($i + $delete_num + $skip + 1);
267 dpavlin 148 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 dpavlin 56 # user doesn't exist
277 dpavlin 156 ok($node->set_user('foobar', 1), 'set_user');
278 dpavlin 56
279 dpavlin 152 ok(my $node2 = new Search::Estraier::Node( "$estmaster_uri/node/$test2_node" ), "new $test2_node");
280 dpavlin 94 ok($node2->set_auth('admin','admin'), "set_auth $test2_node");
281 dpavlin 57
282 dpavlin 78 # croak_on_error
283    
284 dpavlin 152 ok($node = new Search::Estraier::Node( url => "$estmaster_uri/non-existant", croak_on_error => 1 ), "new non-existant");
285 dpavlin 94 throws_ok { $node->name } qr/404/, 'croak on error';
286 dpavlin 78
287 dpavlin 103 # croak_on_error
288 dpavlin 153 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 dpavlin 94
290 dpavlin 103 ok(! $node->uri_to_id('foobar'), 'uri_to_id without croak');
291    
292 dpavlin 137
293 dpavlin 107 # test users
294 dpavlin 156 ok($node->admins, 'have admins');
295 dpavlin 107 ok(! $node->guests, 'no guests');
296    
297 dpavlin 137
298 dpavlin 129 # 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 dpavlin 137 # now, test links
305     my $test2_label = "$test2_node label";
306 dpavlin 152 my $link_url = "$estmaster_uri/node/$test2_node";
307 dpavlin 137 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 dpavlin 152 ok($node->set_link("$estmaster_uri/node/$test2_node", $test2_label, 0), "set_link $test2_node ($test2_label) delete");
312 dpavlin 72
313 dpavlin 151 ok($msg = $node->master(
314     action => 'nodeclr',
315     name => $node->name,
316 dpavlin 155 ), "nodeclr " . $node->name . ": $msg");
317 dpavlin 151
318     cmp_ok($node->doc_num, '==', 0, 'no documents');
319    
320 dpavlin 137 # 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 dpavlin 107
328 dpavlin 139 # test create
329     my $node_name = '_test_create_' . $$;
330     my $node_label = "test $$ label";
331    
332     ok($node = new Search::Estraier::Node(
333 dpavlin 152 url => "$estmaster_uri/node/$node_name",
334 dpavlin 139 create => 1,
335     label => $node_label,
336     croak_on_error => 1
337 dpavlin 140 ), "new create+croak");
338 dpavlin 139
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 dpavlin 140 ok($node = new Search::Estraier::Node(
343 dpavlin 152 url => "$estmaster_uri/node/$node_name",
344 dpavlin 140 create => 1,
345     label => $node_label,
346     croak_on_error => 0
347     ), "new create existing");
348    
349     ok($node = new Search::Estraier::Node(
350 dpavlin 152 url => "$estmaster_uri/node/$node_name",
351 dpavlin 140 create => 1,
352     label => $node_label,
353     croak_on_error => 1
354     ), "new create+croak existing");
355    
356     # cleanup
357 dpavlin 139 ok($msg = $node->master(
358     action => 'nodedel',
359     name => $node_name,
360     ), "nodedel $node_name: $msg");
361    
362 dpavlin 140 # and again, this time without node
363     ok($node = new Search::Estraier::Node(
364 dpavlin 152 url => "$estmaster_uri/node/$node_name",
365 dpavlin 140 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 dpavlin 151 ok($msg = $node->master( action => 'sync' ), "sync: $msg");
380    
381 dpavlin 152 } # SKIP
382    
383 dpavlin 55 diag "over";

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26