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

Diff of /trunk/t/5_Node.t

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 137 by dpavlin, Tue May 9 14:05:57 2006 UTC revision 190 by dpavlin, Sun Nov 5 16:25:56 2006 UTC
# Line 3  Line 3 
3  use strict;  use strict;
4  use blib;  use blib;
5    
6  use Test::More tests => 132;  my $tests = 312;
7    
8    use Test::More;
9  use Test::Exception;  use Test::Exception;
10  use Data::Dumper;  use Data::Dumper;
11    
12  BEGIN { use_ok('Search::Estraier') };  BEGIN { use_ok('Search::Estraier') };
13    
14  my $debug = 0;  plan tests => $tests;
15    
16    my $debug = shift @ARGV;
17    
18  # name of node for test  # name of node for test
19  my $test1_node = '_test1_' . $$;  my $test1_node = '_test1_' . $$;
20  my $test2_node = '_test2_' . $$;  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');  ok(my $node = new Search::Estraier::Node( debug => $debug ), 'new');
25  isa_ok($node, 'Search::Estraier::Node');  isa_ok($node, 'Search::Estraier::Node');
26    
27  ok($node->set_url("http://localhost:1978/node/$test1_node"), "set_url $test1_node");  ok($node->set_url("$estmaster_uri/node/$test1_node"), "set_url $test1_node");
28    
29  ok($node->set_proxy('', 8080), 'set_proxy');  ok($node->set_proxy('', 8080), 'set_proxy');
30  throws_ok {$node->set_proxy('proxy.example.com', 'foo') } qr/port/, 'set_proxy port NaN';  throws_ok {$node->set_proxy('proxy.example.com', 'foo') } qr/port/, 'set_proxy port NaN';
# Line 26  throws_ok {$node->set_proxy('proxy.examp Line 32  throws_ok {$node->set_proxy('proxy.examp
32  ok($node->set_timeout(42), 'set_timeout');  ok($node->set_timeout(42), 'set_timeout');
33  throws_ok {$node->set_timeout('foo') } qr/timeout/, 'set_timeout NaN';  throws_ok {$node->set_timeout('foo') } qr/timeout/, 'set_timeout NaN';
34    
35  ok($node->set_auth('admin','admin'), 'set_auth');  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');  cmp_ok($node->status, '==', -1, 'status');
43    
44  # test master functionality  # test master functionality
45    
46  #diag "not testing shutdown\n";  SKIP: {
47    
48  my $msg;  skip "can't find estmaster at $estmaster_uri", ($tests - 9) if (! eval { $node->master( action => 'nodelist' ) } );
49    
50  ok($msg = $node->master( action => 'sync' ), "sync: $msg");  diag "using $estmaster_uri";
51    diag("node->master shutdown not tested");
52    
53  #diag "not testing backup\n";  diag("node->master backup not tested");
54    
55  ok(my @users = $node->master( action => 'userlist' ), 'userlist');  ok(my @users = $node->master( action => 'userlist' ), 'userlist');
56    
# Line 52  my $user = { Line 64  my $user = {
64          misc => 'test user',          misc => 'test user',
65  };  };
66    
67    my $msg;
68  ok($msg = $node->master(  ok($msg = $node->master(
69          action => 'useradd',          action => 'useradd',
70          %{ $user },          %{ $user },
# Line 85  if ($#nodes > 42) { Line 98  if ($#nodes > 42) {
98    
99  This tests create three nodes in your Hyper Estraier.  This tests create three nodes in your Hyper Estraier.
100    
101  Since you have more than 43 modes, and Hyper Estraier seems to be limited to  Since you have more than 43 modes, and Hyper Estraier needs more than
102  maximum of 46 nodes on each estmaster process, expect tests to fail.  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_  _END_OF_WARNING_
112  }  }
# Line 102  foreach my $node_name ( $test1_node , $t Line 122  foreach my $node_name ( $test1_node , $t
122  }  }
123    
124  ok($msg = $node->master(  ok($msg = $node->master(
         action => 'nodeclr',  
         name => $temp_node,  
 ), "nodeclr $temp_node: $msg");  
   
 ok($msg = $node->master(  
125          action => 'nodedel',          action => 'nodedel',
126          name => $temp_node,          name => $temp_node,
127  ), "nodedel $temp_node: $msg");  ), "nodedel $temp_node: $msg");
# Line 116  ok($msg = $node->master( Line 131  ok($msg = $node->master(
131  # test document creation  # test document creation
132    
133  my $draft = <<'_END_OF_DRAFT_';  my $draft = <<'_END_OF_DRAFT_';
134  @uri=data001  @uri=data0
135  @title=Material Girl  @title=Material Girl
136    
137  Living in a material world  Living in a material world
# Line 130  ok(my $doc = new Search::Estraier::Docum Line 145  ok(my $doc = new Search::Estraier::Docum
145    
146  ok( $node->put_doc($doc), "put_doc data001");  ok( $node->put_doc($doc), "put_doc data001");
147    
148  for ( 1 .. 10 ) {  for ( 1 .. 17 ) {
149          $doc->add_attr('@uri', 'test' . $_);          $doc->add_attr('@uri', 'test' . $_);
150            $doc->set_score( $_ * 10000 );
151          ok( $node->put_doc($doc), "put_doc test$_");          ok( $node->put_doc($doc), "put_doc test$_");
152          #diag $doc->dump_draft;          #diag $doc->dump_draft;
153            cmp_ok( $node->doc_num, '==', ($_ + 1), "node->doc_num " . ($_ + 1));
154  }  }
155    
156  my $id;  ok(! $node->uri_to_id( 'does-not-exists' ), "non-existant uri_to_id");
 ok($id = $node->uri_to_id( 'data001' ), "uri_to_id = $id");  
157    
158  my $data_max = 5;  my $id;
159    ok($id = $node->uri_to_id( 'data0' ), "uri_to_id(data0)");
160    
161  for ( 1 .. $data_max ) {  throws_ok { $node->get_doc( 'foo') } qr/id must be number/, 'croak on non-number';
         ok( $node->out_doc_by_uri( 'test' . $_ ), "out_doc_by_uri test$_");  
 }  
162    
163  ok($doc = $node->get_doc( $id ), 'get_doc for edit');  ok($doc = $node->get_doc( $id ), "get_doc($id) for edit");
164  $doc->add_attr('foo', 'bar');  $doc->add_attr('foo', 'bar');
165  #diag Dumper($doc);  #diag Dumper($doc);
166  ok( $node->edit_doc( $doc ), 'edit_doc');  ok( $node->edit_doc( $doc ), 'edit_doc');
167    
168  ok( $node->out_doc( $id ), "out_doc $id");  my $doc_num;
169    ok( $doc_num = $node->doc_num, "node->doc_num $doc_num");
170    
171    ok( $node->out_doc( $id ), "out_doc($id)");
172    
173    cmp_ok( $node->doc_num, '==', --$doc_num, "node->doc_num " . $doc_num);
174    
175    ok( ! $node->edit_doc( $doc ), "edit_doc of removed doc");
176    
177  ok( ! $node->edit_doc( $doc ), "edit removed");  my $cache;
178    ok($cache = $node->cacheusage, "cacheusage: $cache");
179    
180  my $max = 3;  my $delete_num = 5;
181    
182    for ( 1 .. $delete_num ) {
183            ok( $node->out_doc_by_uri( 'test' . $_ ), "out_doc_by_uri test$_");
184            cmp_ok( $node->doc_num, '==', $doc_num - $_, "node->doc_num " . ($doc_num - $_));
185    }
186    
187    my $doc_num2 = $doc_num - $delete_num;
188    cmp_ok($node->doc_num, '==', $doc_num2, "node->doc_num $doc_num2");
189    
190    my $max = int($doc_num2 / 2);
191    
192  ok(my $cond = new Search::Estraier::Condition, 'new cond');  ok(my $cond = new Search::Estraier::Condition, 'new cond');
193  ok($cond->set_phrase('girl'), 'cond set_phrase');  ok($cond->set_phrase('girl'), 'cond set_phrase');
194  ok($cond->set_max($max), "cond set_max $max");  ok($cond->set_max($max), "cond set_max($max)");
195  ok($cond->set_order('@uri ASCD'), 'cond set_order');  ok($cond->set_order('@uri ASCD'), 'cond set_order');
196  ok($cond->add_attr('@title STRINC Material'), 'cond add_attr');  ok($cond->add_attr('@title STRINC Material'), 'cond add_attr');
197    ok($cond->set_mask(qw/1 2/), 'cond set_mask');
198    
199  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');  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');
200    
201  ok( my $nres = $node->search( $cond, 0 ), 'search');  ok( my $nres = $node->search( $cond, 0 ), 'search');
202    
203  isa_ok( $nres, 'Search::Estraier::NodeResult' );  isa_ok( $nres, 'Search::Estraier::NodeResult' );
204    
205  cmp_ok($nres->doc_num, '==', $max, "doc_num = $max");  cmp_ok($nres->doc_num, '==', $max, "nres->doc_num $max");
206    
207  cmp_ok($nres->hits, '==', $data_max, "hits");  cmp_ok($nres->hits, '==', $doc_num2, "nres->hits $doc_num2");
208    
209    # upper limit is $nres->hits and not $nres->doc_num because we
210    # check all documents, not just results!
211  for my $i ( 0 .. ($nres->hits - 1) ) {  for my $i ( 0 .. ($nres->hits - 1) ) {
212          my $uri = 'test' . ($i + $data_max + 1);          my $num = $i + $delete_num + 1;
213            my $uri = 'test' . $num;
214    
215          if ($i < $nres->doc_num) {          if ($i < $nres->doc_num) {
216                  ok( my $rdoc = $nres->get_doc( $i ), "get_doc $i");                  ok( my $rdoc = $nres->get_doc( $i ), "nres->get_doc $i");
217    
218                  cmp_ok( $rdoc->attr('@uri'), 'eq', $uri, "\@uri = $uri");                  cmp_ok( $rdoc->attr('@uri'), 'eq', $uri, "\@uri = $uri");
219                    cmp_ok( $node->uri_to_id( $uri ), '==', $num + 1, "uri_to_id($uri)");
220    
221                  ok( my $k = $rdoc->keywords( $id ), "rdoc keywords");                  ok( my $k = $rdoc->keywords( $id ), "rdoc keywords");
222            } else {
223                    ok( ! $nres->get_doc( $i ), "nres->get_doc doesn't exist");
224          }          }
225    
226          ok( my $id = $node->uri_to_id( $uri ), "uri_to_id($uri) = $id");          ok( my $id = $node->uri_to_id( $uri ), "uri_to_id($uri)");
227          ok( $node->get_doc( $id ), "get_doc $id");          my $doc;
228          ok( $node->get_doc_by_uri( $uri ), "get_doc_by_uri $uri");          my $score = $num * 10000;
229            ok( $doc = $node->get_doc( $id ), "get_doc($id)");
230            cmp_ok( $doc->score, '==', $score, "score $score");
231            ok( $doc = $node->get_doc_by_uri( $uri ), "get_doc_by_uri($uri)");
232            cmp_ok( $doc->score, '==', $score, "score $score");
233          cmp_ok( $node->get_doc_attr( $id, '@uri' ), 'eq', $uri, "get_doc_attr $id");          cmp_ok( $node->get_doc_attr( $id, '@uri' ), 'eq', $uri, "get_doc_attr $id");
234          cmp_ok( $node->get_doc_attr_by_uri( $uri, '@uri' ), 'eq', $uri, "get_doc_attr $id");          cmp_ok( $node->get_doc_attr_by_uri( $uri, '@uri' ), 'eq', $uri, "get_doc_attr $id");
235          ok( my $k1 = $node->etch_doc( $id ), "etch_doc_by_uri $uri");          ok( my $k1 = $node->etch_doc( $id ), "etch_doc_by_uri $uri");
# Line 194  for my $i ( 0 .. ($nres->hits - 1) ) { Line 239  for my $i ( 0 .. ($nres->hits - 1) ) {
239  }  }
240    
241  ok(my $hints = $nres->hints, 'hints');  ok(my $hints = $nres->hints, 'hints');
242  diag Dumper($hints);  diag Dumper($hints) if ($debug);
243    foreach my $h (qw/TIME DOCNUM VERSION NODE HIT WORDNUM/) {
244            ok(defined( $nres->hint($h) ), "have hint $h");
245    }
246    
247  ok($node->_set_info, "refresh _set_info");  ok($node->_set_info, "refresh _set_info");
248    
# Line 207  ok($v = $node->size, "size: $v"); Line 255  ok($v = $node->size, "size: $v");
255    
256  ok($node->set_snippet_width( 100, 10, 10 ), "set_snippet_width");  ok($node->set_snippet_width( 100, 10, 10 ), "set_snippet_width");
257    
258    # test skip
259    my $skip = int($max / 2) || die "skip is zero, can't test";
260    ok($cond->set_skip( $skip ), "cond set_skip($skip)");
261    cmp_ok($cond->skip, '==', $skip, "skip is $skip");
262    
263    like($node->cond_to_query( $cond ), qr/skip=$skip/, 'cond_to_query have skip');
264    
265    ok( $nres = $node->search( $cond, 0 ), 'search');
266    isa_ok( $nres, 'Search::Estraier::NodeResult' );
267    cmp_ok($nres->doc_num, '==', $max, "nres->doc_num " . ($max - $skip));
268    cmp_ok($nres->hits, '==', $doc_num2, "nres->hits $doc_num2");
269    
270    for my $i ( 0 .. ($nres->doc_num - 1) ) {
271            my $uri = 'test' . ($i + $delete_num + $skip + 1);
272            ok( my $rdoc = $nres->get_doc( $i ), "nres->get_doc $i");
273            if ($rdoc) {
274                    cmp_ok( $rdoc->attr('@uri'), 'eq', $uri, "\@uri = $uri");
275            } else {
276                    fail('no rdoc');
277            }
278    }
279    
280    # test distinct
281    ok(my $cond = new Search::Estraier::Condition, 'new cond');
282    ok($cond->set_phrase('girl'), 'cond set_phrase');
283    my $distinct = '@title';
284    ok($cond->set_distinct( $distinct ), "cond set_distinct($distinct)");
285    cmp_ok($cond->distinct, 'eq', $distinct, "distinct is $distinct");
286    like($node->cond_to_query( $cond ), qr/distinct=%40title/, 'cond_to_query have distinct');
287    ok( $nres = $node->search( $cond, 0 ), 'search with distinct');
288    cmp_ok($nres->doc_num, '==', 1, "nres->doc_num");
289    cmp_ok($nres->hits, '==', 1, "nres->hits");
290    diag "nres = ", Dumper( $nres ) if ($debug);
291    
292  # user doesn't exist  # user doesn't exist
293  ok(! $node->set_user('foobar', 1), 'set_user');  ok($node->set_user('foobar', 1), 'set_user');
294    
295  ok(my $node2 = new Search::Estraier::Node( "http://localhost:1978/node/$test2_node" ), "new $test2_node");  ok(my $node2 = new Search::Estraier::Node( "$estmaster_uri/node/$test2_node" ), "new $test2_node");
296  ok($node2->set_auth('admin','admin'), "set_auth $test2_node");  ok($node2->set_auth('admin','admin'), "set_auth $test2_node");
297    
298  # croak_on_error  # croak_on_error
299    
300  ok($node = new Search::Estraier::Node( url => "http://localhost:1978/non-existant", croak_on_error => 1 ), "new non-existant");  ok($node = new Search::Estraier::Node( url => "$estmaster_uri/non-existant", croak_on_error => 1 ), "new non-existant");
301  throws_ok { $node->name } qr/404/, 'croak on error';  throws_ok { $node->name } qr/404/, 'croak on error';
302    
303  # croak_on_error  # croak_on_error
304  ok($node = new Search::Estraier::Node( url => "http://localhost:1978/node/$test1_node", croak_on_error => 1 ), "new $test1_node");  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");
305    
306  ok(! $node->uri_to_id('foobar'), 'uri_to_id without croak');  ok(! $node->uri_to_id('foobar'), 'uri_to_id without croak');
307    
308    
309  # test users  # test users
310  ok(! $node->admins, 'no admins');  ok($node->admins, 'have admins');
311  ok(! $node->guests, 'no guests');  ok(! $node->guests, 'no guests');
312    
313    
# Line 237  ok($nres = $node->search( $cond, 0 ), 's Line 319  ok($nres = $node->search( $cond, 0 ), 's
319    
320  # now, test links  # now, test links
321  my $test2_label = "$test2_node label";  my $test2_label = "$test2_node label";
322  my $link_url = "http://localhost:1978/node/$test2_node";  my $link_url = "$estmaster_uri/node/$test2_node";
323  ok($node->set_link( $link_url, $test2_label, 42), "set_link $test2_node ($test2_label) 42");  ok($node->set_link( $link_url, $test2_label, 42), "set_link $test2_node ($test2_label) 42");
324  ok(my $links = $node->links, 'links');  ok(my $links = $node->links, 'links');
325  cmp_ok($#{$links}, '==', 0, 'one link');  cmp_ok($#{$links}, '==', 0, 'one link');
326  like($links->[0], qr/^$link_url/, 'link correct');  like($links->[0], qr/^$link_url/, 'link correct');
327  ok($node->set_link("http://localhost:1978/node/$test2_node", $test2_label, 0), "set_link $test2_node ($test2_label) delete");  ok($node->set_link("$estmaster_uri/node/$test2_node", $test2_label, 0), "set_link $test2_node ($test2_label) delete");
328    
329    ok($msg = $node->master(
330            action => 'nodeclr',
331            name => $node->name,
332    ), "nodeclr " . $node->name . ": $msg");
333    
334    cmp_ok($node->doc_num, '==', 0, 'no documents');
335    
336  # cleanup test nodes  # cleanup test nodes
337  foreach my $node_name ( $test1_node , $test2_node ) {  foreach my $node_name ( $test1_node , $test2_node ) {
# Line 252  foreach my $node_name ( $test1_node , $t Line 341  foreach my $node_name ( $test1_node , $t
341          ), "nodedel $node_name: $msg");          ), "nodedel $node_name: $msg");
342  }  }
343    
344    # test create
345    my $node_name = '_test_create_' . $$;
346    my $node_label = "test $$ label";
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");
354    
355    cmp_ok($node->name, 'eq', $node_name, "node $node_name exists");
356    cmp_ok($node->label, 'eq', $node_label, "node label: $node_label");
357    
358    ok($node = new Search::Estraier::Node(
359            url => "$estmaster_uri/node/$node_name",
360            create => 1,
361            label => $node_label,
362            croak_on_error => 0
363    ), "new create existing");
364    
365    ok($node = new Search::Estraier::Node(
366            url => "$estmaster_uri/node/$node_name",
367            create => 1,
368            label => $node_label,
369            croak_on_error => 1
370    ), "new create+croak existing");
371    
372    # cleanup
373    ok($msg = $node->master(
374            action => 'nodedel',
375            name => $node_name,
376    ), "nodedel $node_name: $msg");
377    
378    # and again, this time without node
379    ok($node = new Search::Estraier::Node(
380            url => "$estmaster_uri/node/$node_name",
381            create => 1,
382            label => $node_label,
383            croak_on_error => 0
384    ), "new create non-existing");
385    
386    cmp_ok($node->name, 'eq', $node_name, "node $node_name exists");
387    cmp_ok($node->label, 'eq', $node_label, "node label: $node_label");
388    
389    # cleanup
390    ok($msg = $node->master(
391            action => 'nodedel',
392            name => $node_name,
393    ), "nodedel $node_name: $msg");
394    
395    ok($msg = $node->master( action => 'sync' ), "sync: $msg");
396    
397    } # SKIP
398    
399  diag "over";  diag "over";

Legend:
Removed from v.137  
changed lines
  Added in v.190

  ViewVC Help
Powered by ViewVC 1.1.26