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

Legend:
Removed from v.44  
changed lines
  Added in v.170

  ViewVC Help
Powered by ViewVC 1.1.26