6 Bweb - A Bacula web interface
7 Bacula® - The Network Backup Solution
9 Copyright (C) 2000-2010 Free Software Foundation Europe e.V.
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.
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.
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.
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
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.
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
45 - run backup-bacula-test
48 $ ./tests/bweb-test.pl
53 use Time::HiRes qw(sleep);
54 use Test::WWW::Selenium;
55 use Test::More "no_plan";
58 use scripts::functions;
60 my ($login, $pass, $url, $verbose, %part, @part, $noclean, $client);
61 my @available = qw/client group location run missingjob media overview/;
63 GetOptions ("login=s" => \$login,
66 "module=s@" => \@part,
67 "verbose" => \$verbose,
68 "nocleanup" => \$noclean,
69 "client=s" => \$client,
72 die "Usage: $0 --url http://.../cgi-bin/bweb/bweb.pl [-m module] [-n]"
76 %part = map { $_ => 1 } @part;
78 %part = map { $_ => 1 } @available;
86 my $sel = Test::WWW::Selenium->new( host => "localhost",
88 browser => "*firefox",
89 browser_url => $url );
91 $sel->open_ok("/cgi-bin/bweb/bweb.pl?");
96 $sel->open_ok("/cgi-bin/bweb/bweb.pl?");
97 $sel->is_text_present_ok("Informations");
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]");
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");
107 $sel->is_text_present_ok("Command output");
108 $sel->click_ok("link=Clients");
109 $sel->wait_for_page_to_load_ok("30000");
111 $sel->is_text_present_ok("Running Jobs"); # This message is in client status
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");
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");
128 if (eval { $sel->is_text_present("Select") }) { pass; last WAIT }
133 $sel->click_ok("link=All Media");
134 $sel->wait_for_page_to_load_ok("30000");
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");
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");
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");
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");
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");
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");
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");
172 $sel->is_text_present_ok("Marking it purged");
175 if ($part{missingjob}) {
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");
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");
188 $sel->body_text_isnt("BackupCatalog");
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");
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");
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");
210 if (eval { $sel->is_text_present("Start Backup JobId") }) { pass; last WAIT }
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");
221 if (eval { $sel->is_text_present("Termination: Backup OK") }) { pass; last WAIT }
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");
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");
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");
240 $sel->click_ok("//button[\@name='action' and \@value='fileset_view']");
241 $sel->wait_for_page_to_load_ok("30000");
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");
247 $sel->wait_for_page_to_load_ok("30000");
249 $sel->click_ok("//button[\@name='action' and \@value='run_job_mod']");
250 $sel->wait_for_page_to_load_ok("30000");
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");
259 $sel->is_text_present_ok("FileSet Full Set");
260 $sel->is_text_present_ok("/regress/build");
265 $sel->open_ok("/cgi-bin/bweb/bweb.pl");
266 $sel->click_ok("link=Groups");
267 $sel->wait_for_page_to_load_ok("30000");
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");
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");
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");
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");
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");
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");
296 $sel->is_text_present_ok("All");
297 $sel->click_ok("link=Groups");
298 $sel->wait_for_page_to_load_ok("30000");
300 $sel->click_ok("//button[\@name='action' and \@value='groups_edit']");
301 $sel->wait_for_page_to_load_ok("30000");
303 $sel->type_ok("newgroup", "Empty");
304 $sel->click_ok("//button[\@name='action']");
305 $sel->wait_for_page_to_load_ok("30000");
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");
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");
316 $sel->click_ok("link=Groups");
317 $sel->wait_for_page_to_load_ok("30000");
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");
325 $sel->click_ok("//button[\@name='action']");
326 $sel->wait_for_page_to_load_ok("30000");
328 $sel->type_ok("newgroup", "Empty");
329 $sel->click_ok("//button[\@name='action']");
330 $sel->wait_for_page_to_load_ok("30000");
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");
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");
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");
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");
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");
354 $sel->type_ok("newgroup", "EmptyGroup");
355 $sel->click_ok("//button[\@name='action']");
356 $sel->wait_for_page_to_load_ok("30000");
358 $sel->is_text_present_ok("EmptyGroup");
361 if ($part{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");
367 $sel->click_ok("//button[\@name='action' and \@value='location_add']");
368 $sel->wait_for_page_to_load_ok("30000");
370 $sel->type_ok("location", "Bank");
371 $sel->click_ok("//button[\@name='action']"); # save
372 $sel->wait_for_page_to_load_ok("30000");
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");
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");
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");
390 $sel->select_ok("enabled", "label=no");
391 $sel->click_ok("//button[\@name='action']");
392 $sel->wait_for_page_to_load_ok("30000");
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");
399 $sel->select_ok("enabled", "label=archived");
400 $sel->click_ok("//button[\@name='action']");
401 $sel->wait_for_page_to_load_ok("30000");
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");
408 $sel->type_ok("newlocation", "Office");
409 $sel->click_ok("//button[\@name='action']");
410 $sel->wait_for_page_to_load_ok("30000");
412 $sel->is_text_present_ok("Office");
413 $sel->click_ok("link=All Media");
414 $sel->wait_for_page_to_load_ok("30000");
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");
420 $sel->select_ok("location", "label=Office");
421 $sel->click_ok("//button[\@name='action']");
422 $sel->wait_for_page_to_load_ok("30000");
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");
428 $sel->select_ok("location", "label=Office");
429 $sel->click_ok("//button[\@name='action']");
430 $sel->wait_for_page_to_load_ok("30000");
432 $sel->body_text_isnt("Vol0010");
433 $sel->click_ok("link=Locations");
434 $sel->wait_for_page_to_load_ok("30000");
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");
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");
445 $sel->click_ok("//button[\@name='action']");
446 $sel->wait_for_page_to_load_ok("30000");
448 $sel->type_ok("location", "OtherPlace");
449 $sel->click_ok("//button[\@name='action']");
450 $sel->wait_for_page_to_load_ok("30000");
452 $sel->click_ok("location");
453 $sel->click_ok("//button[\@name='action' and \@value='media']");
454 $sel->wait_for_page_to_load_ok("30000");
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");
460 $sel->select_ok("location", "label=OtherPlace");
461 $sel->click_ok("//button[\@name='action']");
462 $sel->wait_for_page_to_load_ok("30000");
464 $sel->click_ok("link=Locations");
465 $sel->wait_for_page_to_load_ok("30000");
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");
472 $sel->body_text_isnt("Office");
475 if ($part{overview}) {
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]");
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");
485 $sel->is_text_present_ok("All");
486 $sel->click_ok("link=All");
487 $sel->wait_for_page_to_load_ok("30000");
489 $sel->click_ok("link=$client");
490 $sel->wait_for_page_to_load_ok("30000");
492 $sel->is_text_present_ok("backup");
493 $sel->is_text_present_ok("Full Set");
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");
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]");
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']");
512 print "dbi=$dbi histo=$histo\n";
513 if ($histo eq 'Job') {
514 $sel->type_ok("stat_job_table", "JobHisto");
516 $sel->type_ok("stat_job_table", "Job");