/[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 129 by dpavlin, Mon May 8 12:01:00 2006 UTC revision 167 by dpavlin, Sun Aug 6 16:29:34 2006 UTC
# Line 3  Line 3 
3  use strict;  use strict;
4  use blib;  use blib;
5    
6  use Test::More tests => 118;  my $tests = 272;
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
45    
46  SKIP: {  SKIP: {
47    
48  skip "no $test1_node node in Hyper Estraier", 105, unless($node->name);  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  my @res = ( -1, 200 );  diag("node->master backup not tested");
54    
55  my $nodelist;  ok(my @users = $node->master( action => 'userlist' ), 'userlist');
56  foreach my $url (qw{?action=nodelist http://localhost:1978/master?action=nodelist}) {  
57          cmp_ok(  #diag "users: ", Dumper( \@users );
58                  $node->shuttle_url( $url, 'text/plain', undef, \$nodelist)  diag "found ", $#users + 1, " users";
59          ,'==', shift @res, 'nodelist');  
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_';  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 58  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          ok( $node->put_doc($doc), "put_doc test$_");          ok( $node->put_doc($doc), "put_doc test$_");
151          #diag $doc->dump_draft;          #diag $doc->dump_draft;
152            cmp_ok( $node->doc_num, '==', ($_ + 1), "node->doc_num " . ($_ + 1));
153  }  }
154    
155  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");  
   
 my $data_max = 5;  
156    
157  for ( 1 .. $data_max ) {  my $id;
158          ok( $node->out_doc_by_uri( 'test' . $_ ), "out_doc_by_uri test$_");  ok($id = $node->uri_to_id( 'data0' ), "uri_to_id(data0)");
 }  
159    
160  ok($doc = $node->get_doc( $id ), 'get_doc for edit');  ok($doc = $node->get_doc( $id ), "get_doc($id) for edit");
161  $doc->add_attr('foo', 'bar');  $doc->add_attr('foo', 'bar');
162  #diag Dumper($doc);  #diag Dumper($doc);
163  ok( $node->edit_doc( $doc ), 'edit_doc');  ok( $node->edit_doc( $doc ), 'edit_doc');
164    
165  ok( $node->out_doc( $id ), "out_doc $id");  my $doc_num;
166    ok( $doc_num = $node->doc_num, "node->doc_num $doc_num");
167    
168  ok( ! $node->edit_doc( $doc ), "edit removed");  ok( $node->out_doc( $id ), "out_doc($id)");
169    
170  my $max = 3;  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');  ok(my $cond = new Search::Estraier::Condition, 'new cond');
190  ok($cond->set_phrase('girl'), 'cond set_phrase');  ok($cond->set_phrase('girl'), 'cond set_phrase');
191  ok($cond->set_max($max), "cond set_max $max");  ok($cond->set_max($max), "cond set_max($max)");
192  ok($cond->set_order('@uri ASCD'), 'cond set_order');  ok($cond->set_order('@uri ASCD'), 'cond set_order');
193  ok($cond->add_attr('@title STRINC Material'), 'cond add_attr');  ok($cond->add_attr('@title STRINC Material'), 'cond add_attr');
194    
# Line 96  ok( my $nres = $node->search( $cond, 0 ) Line 198  ok( my $nres = $node->search( $cond, 0 )
198    
199  isa_ok( $nres, 'Search::Estraier::NodeResult' );  isa_ok( $nres, 'Search::Estraier::NodeResult' );
200    
201  cmp_ok($nres->doc_num, '==', $max, "doc_num = $max");  cmp_ok($nres->doc_num, '==', $max, "nres->doc_num $max");
202    
203  cmp_ok($nres->hits, '==', $data_max, "hits");  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) ) {  for my $i ( 0 .. ($nres->hits - 1) ) {
208          my $uri = 'test' . ($i + $data_max + 1);          my $num = $i + $delete_num + 1;
209            my $uri = 'test' . $num;
210    
211          if ($i < $nres->doc_num) {          if ($i < $nres->doc_num) {
212                  ok( my $rdoc = $nres->get_doc( $i ), "get_doc $i");                  ok( my $rdoc = $nres->get_doc( $i ), "nres->get_doc $i");
213    
214                  cmp_ok( $rdoc->attr('@uri'), 'eq', $uri, "\@uri = $uri");                  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");                  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) = $id");          ok( my $id = $node->uri_to_id( $uri ), "uri_to_id($uri)");
223          ok( $node->get_doc( $id ), "get_doc $id");          ok( $node->get_doc( $id ), "get_doc($id)");
224          ok( $node->get_doc_by_uri( $uri ), "get_doc_by_uri $uri");          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");          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");          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");          ok( my $k1 = $node->etch_doc( $id ), "etch_doc_by_uri $uri");
# Line 122  for my $i ( 0 .. ($nres->hits - 1) ) { Line 231  for my $i ( 0 .. ($nres->hits - 1) ) {
231  }  }
232    
233  ok(my $hints = $nres->hints, 'hints');  ok(my $hints = $nres->hints, 'hints');
234  diag Dumper($hints);  diag Dumper($hints) if ($debug);
235    
236  ok($node->_set_info, "refresh _set_info");  ok($node->_set_info, "refresh _set_info");
237    
# Line 135  ok($v = $node->size, "size: $v"); Line 244  ok($v = $node->size, "size: $v");
244    
245  ok($node->set_snippet_width( 100, 10, 10 ), "set_snippet_width");  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  # user doesn't exist
271  ok(! $node->set_user('foobar', 1), 'set_user');  ok($node->set_user('foobar', 1), 'set_user');
272    
273  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");
274  ok($node2->set_auth('admin','admin'), "set_auth $test2_node");  ok($node2->set_auth('admin','admin'), "set_auth $test2_node");
275    
276  # croak_on_error  # croak_on_error
277    
278  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");
279  throws_ok { $node->name } qr/404/, 'croak on error';  throws_ok { $node->name } qr/404/, 'croak on error';
280    
281  # croak_on_error  # croak_on_error
282  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");
283    
284  ok(! $node->uri_to_id('foobar'), 'uri_to_id without croak');  ok(! $node->uri_to_id('foobar'), 'uri_to_id without croak');
285    
 # test users  
286    
287  ok(! $node->admins, 'no admins');  # test users
288    ok($node->admins, 'have admins');
289  ok(! $node->guests, 'no guests');  ok(! $node->guests, 'no guests');
290    
 # test search without results  
291    
292    # test search without results
293  ok($cond = new Search::Estraier::Condition, 'new cond');  ok($cond = new Search::Estraier::Condition, 'new cond');
294  ok($cond->set_phrase('this_is_phrase_which_does_not_exits'), 'cond set_phrase');  ok($cond->set_phrase('this_is_phrase_which_does_not_exits'), 'cond set_phrase');
295    
296  ok($nres = $node->search( $cond, 0 ), 'search');  ok($nres = $node->search( $cond, 0 ), 'search');
297    
298  SKIP: {  # now, test links
299          skip "no $test2_node in Hyper Estraier, skipping set_link", 5 unless (my $test2_label = $node2->label);  my $test2_label = "$test2_node label";
300    my $link_url = "$estmaster_uri/node/$test2_node";
301          my $link_url = "http://localhost:1978/node/$test2_node";  ok($node->set_link( $link_url, $test2_label, 42), "set_link $test2_node ($test2_label) 42");
302    ok(my $links = $node->links, 'links');
303          ok($node->set_link( $link_url, $test2_label, 42), "set_link $test2_node ($test2_label) 42");  cmp_ok($#{$links}, '==', 0, 'one link');
304    like($links->[0], qr/^$link_url/, 'link correct');
305          ok(my $links = $node->links, 'links');  ok($node->set_link("$estmaster_uri/node/$test2_node", $test2_label, 0), "set_link $test2_node ($test2_label) delete");
306    
307          cmp_ok($#{$links}, '==', 0, 'one link');  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          like($links->[0], qr/^$link_url/, 'link correct');  # 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($node->set_link("http://localhost:1978/node/$test2_node", $test2_label, 0), "set_link $test2_node ($test2_label) delete");  ok($msg = $node->master( action => 'sync' ), "sync: $msg");
 }       # SKIP 2  
374    
375  }       # SKIP 1  } # SKIP
376    
377  diag "over";  diag "over";

Legend:
Removed from v.129  
changed lines
  Added in v.167

  ViewVC Help
Powered by ViewVC 1.1.26