]> git.sur5r.net Git - bacula/bacula/blob - regress/tests/bweb-test.pl
regress: work on bweb regress test
[bacula/bacula] / regress / tests / bweb-test.pl
1 #!/usr/bin/perl -w
2 use strict;
3
4 =head1 LICENSE
5
6    Bweb - A Bacula web interface
7    Bacula® - The Network Backup Solution
8
9    Copyright (C) 2000-2010 Free Software Foundation Europe e.V.
10
11    The main author of Bweb is Eric Bollengier.
12    The main author of Bacula is Kern Sibbald, with contributions from
13    many others, a complete list can be found in the file AUTHORS.
14
15    This program is Free Software; you can redistribute it and/or
16    modify it under the terms of version two of the GNU General Public
17    License as published by the Free Software Foundation plus additions
18    that are listed in the file LICENSE.
19
20    This program is distributed in the hope that it will be useful, but
21    WITHOUT ANY WARRANTY; without even the implied warranty of
22    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23    General Public License for more details.
24
25    You should have received a copy of the GNU General Public License
26    along with this program; if not, write to the Free Software
27    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
28    02110-1301, USA.
29
30    Bacula® is a registered trademark of Kern Sibbald.
31    The licensor of Bacula is the Free Software Foundation Europe
32    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zurich,
33    Switzerland, email:ftf@fsfeurope.org.
34
35 =head1 USAGE
36
37     - You need to be in a X session
38     - Install Selenium IDE addon from http://seleniumhq.org/
39     - Install through CPAN WWW::Selenium
40       $ perl -e 'install WWW::Selenium' -MCPAN 
41     - Download Selenium RC (remote control) from  http://seleniumhq.org/
42     - unzip the archive, and start the Selenium server (require java >= 1.5)
43       $ java -jar selenium-server.jar
44     - Load bweb sql file
45     - run backup-bacula-test
46     - uncomment schedule
47     - Start the test
48       $ ./tests/bweb-test.pl
49
50 =cut
51
52 use warnings;
53 use Time::HiRes qw(sleep);
54 use Test::WWW::Selenium;
55 use Test::More "no_plan";
56 use Test::Exception;
57 use Getopt::Long;
58 use scripts::functions;
59
60 my ($login, $pass, $url, $verbose, %part, @part, $noclean, $client);
61 my @available = qw/client group location run missingjob media overview/;
62
63 GetOptions ("login=s"  => \$login,
64             "passwd=s" => \$pass,
65             "url|u=s"  => \$url,
66             "module=s@"   => \@part,
67             "verbose"  => \$verbose,
68             "nocleanup" => \$noclean,
69             "client=s"    => \$client,
70             );
71
72 die "Usage: $0 --url http://.../cgi-bin/bweb/bweb.pl [-m module] [-n]"
73     unless ($url);
74
75 if (scalar(@part)) {
76     %part = map { $_ => 1 } @part;
77 } else {
78     %part = map { $_ => 1 } @available;
79 }
80
81 if (!$noclean) {
82     cleanup();
83     start_bacula();
84 }
85
86 my $sel = Test::WWW::Selenium->new( host => "localhost", 
87                                     port => 4444, 
88                                     browser => "*firefox", 
89                                     browser_url => $url );
90
91 $sel->open_ok("/cgi-bin/bweb/bweb.pl?");
92 $sel->set_speed(500);
93
94 if ($part{client}) {
95 # test client
96     $sel->open_ok("/cgi-bin/bweb/bweb.pl?");
97     $sel->is_text_present_ok("Informations");
98
99     $sel->click_ok("link=Clients");
100     $sel->wait_for_page_to_load_ok("30000");
101     $client = $sel->get_text("//tr[\@id='even_row']/td[1]");
102
103     $sel->click_ok("//input[\@name='client']"); # click the first client
104     $sel->click_ok("//button[\@name='action' and \@value='client_status']");
105     $sel->wait_for_page_to_load_ok("30000");
106
107     $sel->is_text_present_ok("Command output");
108     $sel->click_ok("link=Clients");
109     $sel->wait_for_page_to_load_ok("30000");
110
111     $sel->is_text_present_ok("Running Jobs"); # This message is in client status
112 }
113
114 if ($part{media}) {
115 # add media
116     $sel->open_ok("/cgi-bin/bweb/bweb.pl");
117     $sel->click_ok("link=Add Media");
118     $sel->wait_for_page_to_load_ok("30000");
119
120     $sel->select_ok("pool", "label=Scratch");
121     $sel->select_ok("storage", "label=File");
122     $sel->type_ok("nb", "10");
123     $sel->click_ok("//button[\@name='action']"); # create 10 volumes
124     $sel->wait_for_page_to_load_ok("30000");
125
126   WAIT: {
127       for (1..60) {
128           if (eval { $sel->is_text_present("Select") }) { pass; last WAIT }
129         sleep(1);
130       }
131       fail("timeout");
132 }
133     $sel->click_ok("link=All Media");
134     $sel->wait_for_page_to_load_ok("30000");
135
136     $sel->is_text_present_ok("Vol0001");
137     $sel->is_text_present_ok("Vol0010");
138     $sel->select_ok("mediatype", "label=File");
139     $sel->select_ok("volstatus", "label=Append");
140     $sel->select_ok("pool", "label=Scratch");
141     $sel->click_ok("//button[\@name='action']");
142     $sel->wait_for_page_to_load_ok("30000");
143
144     $sel->is_text_present_ok("Vol0001");
145     $sel->click_ok("media");
146     $sel->click_ok("//button[\@name='action' and \@value='update_media']");
147     $sel->wait_for_page_to_load_ok("30000");
148
149     $sel->select_ok("volstatus", "label=Archive");
150     $sel->select_ok("enabled", "label=no");
151     $sel->click_ok("//button[\@name='action']");
152     $sel->wait_for_page_to_load_ok("30000");
153
154     $sel->click_ok("arrow_0");
155     $sel->is_text_present_ok("New Volume status is: Archive");
156     $sel->click_ok("link=All Media");
157     $sel->wait_for_page_to_load_ok("30000");
158
159     $sel->is_text_present_ok("Archive");
160     $sel->select_ok("volstatus", "label=Append");
161     $sel->click_ok("//button[\@name='action']");
162     $sel->wait_for_page_to_load_ok("30000");
163
164     $sel->click_ok("media");
165     $sel->click_ok("//button[\@name='action' and \@value='media_zoom']");
166     $sel->wait_for_page_to_load_ok("30000");
167
168     $sel->is_text_present_ok("Volume Infos");
169     $sel->click_ok("//button[\@name='action' and \@value='purge']");
170     $sel->wait_for_page_to_load_ok("30000");
171
172     $sel->is_text_present_ok("Marking it purged");
173 }
174
175 if ($part{missingjob}) {
176 # view missing jobs
177     $sel->open_ok("/cgi-bin/bweb/bweb.pl");
178     $sel->click_ok("link=Missing Jobs");
179     $sel->wait_for_page_to_load_ok("30000");
180
181     $sel->is_text_present_ok("backup");
182     $sel->is_text_present_ok("BackupCatalog");
183     $sel->click_ok("job");
184     $sel->click_ok("//input[\@name='job' and \@value='BackupCatalog']");
185     $sel->click_ok("//button[\@name='action' and \@value='job']");
186     $sel->wait_for_page_to_load_ok("30000");
187
188     $sel->body_text_isnt("BackupCatalog");
189 }
190
191 if ($part{run}) {
192 # run a new job
193     $sel->open_ok("/cgi-bin/bweb/bweb.pl?");
194     $sel->click_ok("link=Defined Jobs");
195     $sel->wait_for_page_to_load_ok("30000");
196
197     $sel->select_ok("job", "label=backup");
198     $sel->is_text_present_ok("backup");
199     $sel->click_ok("//button[\@name='action' and \@value='run_job_mod']");
200     $sel->wait_for_page_to_load_ok("30000");
201
202     $sel->is_text_present_ok("Default");
203     $sel->is_text_present_ok("Full Set");
204     $sel->is_text_present_ok("Incremental");
205     $sel->click_ok("//button[\@name='action']");
206     $sel->wait_for_page_to_load_ok("30000");
207
208   WAIT: {
209       for (1..60) {
210           if (eval { $sel->is_text_present("Start Backup JobId") }) { pass; last WAIT }
211           sleep(1);
212       }
213     fail("timeout");
214     }
215     $sel->is_text_present_ok("Log: backup on");
216     $sel->click_ok("//button[\@name='action']");
217     $sel->wait_for_page_to_load_ok("30000");
218
219   WAIT: {
220       for (1..60) {
221           if (eval { $sel->is_text_present("Termination: Backup OK") }) { pass; last WAIT }
222           sleep(1);
223       }
224       fail("timeout");
225     }
226     my $volume = $sel->get_text("//tr[\@id='even_row']/td[12]");
227     $sel->click_ok("//button[\@name='action' and \@value='media']");
228     $sel->wait_for_page_to_load_ok("30000");
229
230     my $volume_found = $sel->get_text("//tr[\@id='even_row']/td[1]");
231     $sel->click_ok("media");
232     $sel->text_is("//tr[\@id='even_row']/td[5]", "Append");
233     $sel->click_ok("//button[\@name='action' and \@value='media_zoom']");
234     $sel->wait_for_page_to_load_ok("30000");
235
236     $sel->is_text_present_ok("Volume Infos");
237     $sel->click_ok("//img[\@title='terminated normally']");
238     $sel->wait_for_page_to_load_ok("30000");
239
240     $sel->click_ok("//button[\@name='action' and \@value='fileset_view']");
241     $sel->wait_for_page_to_load_ok("30000");
242
243     $sel->is_text_present_ok("FileSet Full Set");
244     $sel->is_text_present_ok("What is included:");
245     $sel->is_text_present_ok("/regress/build");
246     $sel->go_back_ok();
247     $sel->wait_for_page_to_load_ok("30000");
248
249     $sel->click_ok("//button[\@name='action' and \@value='run_job_mod']");
250     $sel->wait_for_page_to_load_ok("30000");
251
252     $sel->is_element_present_ok("level");
253     $sel->selected_value_is("name=level", "Full");
254     $sel->selected_label_is("name=fileset", "Full Set");
255     $sel->selected_label_is("name=job", "backup");
256     $sel->click_ok("//button[\@name='action' and \@value='fileset_view']");
257     $sel->wait_for_page_to_load_ok("30000");
258
259     $sel->is_text_present_ok("FileSet Full Set");
260     $sel->is_text_present_ok("/regress/build");
261 }
262
263 if ($part{group}) {
264 # test group
265     $sel->open_ok("/cgi-bin/bweb/bweb.pl");
266     $sel->click_ok("link=Groups");
267     $sel->wait_for_page_to_load_ok("30000");
268
269     $sel->text_is("//h1", "Groups");
270     $sel->click_ok("//button[\@name='action' and \@value='groups_edit']");
271     $sel->wait_for_page_to_load_ok("30000");
272
273     $sel->type_ok("newgroup", "All");
274     $sel->select_ok("name=client", "index=0");
275     $sel->click_ok("//button[\@name='action' and \@value='groups_save']");
276     $sel->wait_for_page_to_load_ok("30000");
277
278     $sel->is_text_present_ok("All");
279     $sel->click_ok("//input [\@name='client_group' and \@value='All']");
280     $sel->click_ok("//button[3]");
281     $sel->wait_for_page_to_load_ok("30000");
282
283     $sel->is_text_present_ok("Group: 'All'");
284     $sel->selected_index_is("name=client", "0");
285     $sel->click_ok("//button[\@name='action' and \@value='groups_save']");
286     $sel->wait_for_page_to_load_ok("30000");
287
288     $sel->click_ok("//input[\@name='client_group' and \@value='All']");
289     $sel->click_ok("//button[4]");
290     $sel->wait_for_page_to_load_ok("30000");
291
292     $sel->click_ok("//input[\@name='client']");
293     $sel->click_ok("//button[\@name='action' and \@value='client_edit']");
294     $sel->wait_for_page_to_load_ok("30000");
295
296     $sel->is_text_present_ok("All");
297     $sel->click_ok("link=Groups");
298     $sel->wait_for_page_to_load_ok("30000");
299
300     $sel->click_ok("//button[\@name='action' and \@value='groups_edit']");
301     $sel->wait_for_page_to_load_ok("30000");
302
303     $sel->type_ok("newgroup", "Empty");
304     $sel->click_ok("//button[\@name='action']");
305     $sel->wait_for_page_to_load_ok("30000");
306
307     $sel->click_ok("client_group");
308     $sel->is_text_present_ok("Empty");
309     $sel->click_ok("//button[\@name='action' and \@value='client']");
310     $sel->wait_for_page_to_load_ok("30000");
311
312     $sel->click_ok("//input[\@name='client']");
313     $sel->click_ok("//button[\@name='action' and \@value='client_edit']");
314     $sel->wait_for_page_to_load_ok("30000");
315
316     $sel->click_ok("link=Groups");
317     $sel->wait_for_page_to_load_ok("30000");
318
319     $sel->click_ok("//input[\@name='client_group' and \@value='Empty']");
320     $sel->click_ok("//button[\@name='action' and \@value='groups_del']");
321     ok($sel->get_confirmation() =~ /^Do you want to delete this group[\s\S]$/);
322     $sel->click_ok("link=Groups");
323     $sel->wait_for_page_to_load_ok("30000");
324
325     $sel->click_ok("//button[\@name='action']");
326     $sel->wait_for_page_to_load_ok("30000");
327
328     $sel->type_ok("newgroup", "Empty");
329     $sel->click_ok("//button[\@name='action']");
330     $sel->wait_for_page_to_load_ok("30000");
331
332     $sel->is_text_present_ok("Empty");
333     $sel->click_ok("//input[\@name='client_group' and \@value='All']");
334     $sel->click_ok("//button[\@name='action' and \@value='client']");
335     $sel->wait_for_page_to_load_ok("30000");
336
337     $sel->click_ok("//input[\@name='client']");
338     $sel->click_ok("//button[\@name='action' and \@value='client_edit']");
339     $sel->wait_for_page_to_load_ok("30000");
340
341     ok(not $sel->is_checked("//input[\@name='client_group' and \@value='Empty']"));
342     $sel->click_ok("link=Group Statistics");
343     $sel->wait_for_page_to_load_ok("30000");
344
345     $sel->is_text_present_ok("All");
346     $sel->is_text_present_ok("Empty");
347     $sel->click_ok("link=Groups");
348     $sel->wait_for_page_to_load_ok("30000");
349
350     $sel->click_ok("//input[\@name='client_group' and \@value='Empty']");
351     $sel->click_ok("document.forms[1].elements[4]");
352     $sel->wait_for_page_to_load_ok("30000");
353
354     $sel->type_ok("newgroup", "EmptyGroup");
355     $sel->click_ok("//button[\@name='action']");
356     $sel->wait_for_page_to_load_ok("30000");
357
358     $sel->is_text_present_ok("EmptyGroup");
359 }
360
361 if ($part{location}) {
362 # test location
363     $sel->open_ok("/cgi-bin/bweb/bweb.pl");
364     $sel->click_ok("link=Locations");
365     $sel->wait_for_page_to_load_ok("30000");
366
367     $sel->click_ok("//button[\@name='action' and \@value='location_add']");
368     $sel->wait_for_page_to_load_ok("30000");
369
370     $sel->type_ok("location", "Bank");
371     $sel->click_ok("//button[\@name='action']"); # save
372     $sel->wait_for_page_to_load_ok("30000");
373
374     $sel->is_text_present_ok("Bank");
375     $sel->click_ok("location");
376     $sel->click_ok("//button[\@name='action' and \@value='location_edit']");
377     $sel->wait_for_page_to_load_ok("30000");
378
379     $sel->type_ok("cost", "100");
380     $sel->is_text_present_ok("Location: Bank");
381     $sel->click_ok("//button[\@name='action']");
382     $sel->wait_for_page_to_load_ok("30000");
383
384     $sel->is_text_present_ok("100");
385     $sel->is_element_present_ok("//img[\@src='/bweb/inflag1.png']");
386     $sel->click_ok("location");
387     $sel->click_ok("//button[\@name='action' and \@value='location_edit']");
388     $sel->wait_for_page_to_load_ok("30000");
389
390     $sel->select_ok("enabled", "label=no");
391     $sel->click_ok("//button[\@name='action']");
392     $sel->wait_for_page_to_load_ok("30000");
393
394     $sel->is_element_present_ok("//img[\@src='/bweb/inflag0.png']");
395     $sel->click_ok("location");
396     $sel->click_ok("//button[\@name='action' and \@value='location_edit']");
397     $sel->wait_for_page_to_load_ok("30000");
398
399     $sel->select_ok("enabled", "label=archived");
400     $sel->click_ok("//button[\@name='action']");
401     $sel->wait_for_page_to_load_ok("30000");
402
403     $sel->is_element_present_ok("//img[\@src='/bweb/inflag2.png']");
404     $sel->click_ok("location");
405     $sel->click_ok("//button[\@name='action' and \@value='location_edit']");
406     $sel->wait_for_page_to_load_ok("30000");
407
408     $sel->type_ok("newlocation", "Office");
409     $sel->click_ok("//button[\@name='action']");
410     $sel->wait_for_page_to_load_ok("30000");
411
412     $sel->is_text_present_ok("Office");
413     $sel->click_ok("link=All Media");
414     $sel->wait_for_page_to_load_ok("30000");
415
416     $sel->click_ok("media");
417     $sel->click_ok("//button[\@name='action' and \@value='update_media']");
418     $sel->wait_for_page_to_load_ok("30000");
419
420     $sel->select_ok("location", "label=Office");
421     $sel->click_ok("//button[\@name='action']");
422     $sel->wait_for_page_to_load_ok("30000");
423
424     $sel->selected_value_is("location", "Office");
425     $sel->click_ok("//button[\@name='action' and \@value='media']");
426     $sel->wait_for_page_to_load_ok("30000");
427
428     $sel->select_ok("location", "label=Office");
429     $sel->click_ok("//button[\@name='action']");
430     $sel->wait_for_page_to_load_ok("30000");
431
432     $sel->body_text_isnt("Vol0010");
433     $sel->click_ok("link=Locations");
434     $sel->wait_for_page_to_load_ok("30000");
435
436     $sel->click_ok("location");
437     $sel->click_ok("//button[\@name='action' and \@value='location_del']");
438     ok($sel->get_confirmation() =~ /^Do you want to remove this location[\s\S]$/);
439     $sel->wait_for_page_to_load_ok("30000");
440
441     $sel->is_text_present_ok("Sorry, the location must be empty");
442     $sel->click_ok("link=Locations");
443     $sel->wait_for_page_to_load_ok("30000");
444
445     $sel->click_ok("//button[\@name='action']");
446     $sel->wait_for_page_to_load_ok("30000");
447
448     $sel->type_ok("location", "OtherPlace");
449     $sel->click_ok("//button[\@name='action']");
450     $sel->wait_for_page_to_load_ok("30000");
451
452     $sel->click_ok("location");
453     $sel->click_ok("//button[\@name='action' and \@value='media']");
454     $sel->wait_for_page_to_load_ok("30000");
455
456     $sel->click_ok("media");
457     $sel->click_ok("//button[\@name='action' and \@value='update_media']");
458     $sel->wait_for_page_to_load_ok("30000");
459
460     $sel->select_ok("location", "label=OtherPlace");
461     $sel->click_ok("//button[\@name='action']");
462     $sel->wait_for_page_to_load_ok("30000");
463
464     $sel->click_ok("link=Locations");
465     $sel->wait_for_page_to_load_ok("30000");
466
467     $sel->click_ok("location");
468     $sel->click_ok("//button[\@name='action' and \@value='location_del']");
469     ok($sel->get_confirmation() =~ /^Do you want to remove this location[\s\S]$/);
470     $sel->wait_for_page_to_load_ok("30000");
471
472     $sel->body_text_isnt("Office");
473 }
474
475 if ($part{overview}) {
476     unless ($client) {
477         $sel->click_ok("link=Clients");
478         $sel->wait_for_page_to_load_ok("30000");
479         $client = $sel->get_text("//tr[\@id='even_row']/td[1]");
480     }
481     $sel->open_ok("/cgi-bin/bweb/bweb.pl");
482     $sel->click_ok("link=Jobs overview");
483     $sel->wait_for_page_to_load_ok("30000");
484
485     $sel->is_text_present_ok("All");
486     $sel->click_ok("link=All");
487     $sel->wait_for_page_to_load_ok("30000");
488
489     $sel->click_ok("link=$client");
490     $sel->wait_for_page_to_load_ok("30000");
491
492     $sel->is_text_present_ok("backup");
493     $sel->is_text_present_ok("Full Set");
494 }
495
496 if ($part{config}) {
497     my ($dbi, $user, $pass);
498     $sel->open_ok("/cgi-bin/bweb/bweb.pl");
499     $sel->click_ok("link=Configuration");
500     $sel->wait_for_page_to_load_ok("30000");
501     $sel->is_text_present_ok("Main Configuration");
502
503     $dbi = $sel->get_text("//tr[2]/td[2]");
504     $user = $sel->get_text("//tr[3]/td[2]");
505     $pass = $sel->get_text("//tr[4]/td[2]");
506
507     $sel->click_ok("//button[\@name='action' and \@value='edit_main_conf']");
508     $sel->wait_for_page_to_load_ok("30000");
509     $sel->is_text_present_ok("Main Configuration");
510     my $histo = $sel->get_text("//input[\@type='text' and \@name='stat_job_table']");
511
512     print "dbi=$dbi histo=$histo\n";
513     if ($histo eq 'Job') {
514         $sel->type_ok("stat_job_table", "JobHisto");
515     } else {
516         $sel->type_ok("stat_job_table", "Job");
517     }
518 }