Firefox-Profile.t 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #! /usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Selenium::Remote::Driver;
  5. use Test::More;
  6. use MIME::Base64 qw/decode_base64/;
  7. use Archive::Extract;
  8. use File::Temp;
  9. use JSON;
  10. use Selenium::Remote::Driver::Firefox::Profile;
  11. BEGIN {
  12. if (defined $ENV{'WD_MOCKING_RECORD'} && ($ENV{'WD_MOCKING_RECORD'}==1))
  13. {
  14. use t::lib::MockSeleniumWebDriver;
  15. my $p = Net::Ping->new("tcp", 2);
  16. $p->port_number(4444);
  17. unless ($p->ping('localhost')) {
  18. plan skip_all => "Selenium server is not running on localhost:4444";
  19. exit;
  20. }
  21. warn "\n\nRecording...\n\n";
  22. }
  23. }
  24. my $record = (defined $ENV{'WD_MOCKING_RECORD'} && ($ENV{'WD_MOCKING_RECORD'}==1))?1:0;
  25. my $os = $^O;
  26. if ($os =~ m/(aix|freebsd|openbsd|sunos|solaris)/)
  27. {
  28. $os = 'linux';
  29. }
  30. my $mock_file = "firefox-profile-mock-$os.json";
  31. if (!$record && !(-e "t/mock-recordings/$mock_file"))
  32. {
  33. plan skip_all => "Mocking of tests is not been enabled for this platform";
  34. }
  35. t::lib::MockSeleniumWebDriver::register($record,"t/mock-recordings/$mock_file");
  36. CUSTOM_EXTENSION_LOADED: {
  37. my $profile = Selenium::Remote::Driver::Firefox::Profile->new();
  38. my $website = 'http://localhost:63636';
  39. $profile->set_preferences(
  40. 'browser.startup.homepage' => $website
  41. );
  42. # This extension rewrites any page url to a single <h1>. The
  43. # following javascript is in redisplay.xpi's
  44. # resources/gempesaw/lib/main.js:
  45. # var pageMod = require("sdk/page-mod");
  46. # pageMod.PageMod({
  47. # include: "*",
  48. # contentScript: 'document.body.innerHTML = ' +
  49. # ' "<h1>Page matches ruleset</h1>";'
  50. # });
  51. $profile->add_extension('t/www/redisplay.xpi');
  52. my $filename = "test";
  53. open (my $fh, ">", $filename);
  54. print $fh $profile->_encode;
  55. close ($fh);
  56. my $driver = Selenium::Remote::Driver->new(
  57. extra_capabilities => {
  58. firefox_profile => $profile
  59. }
  60. );
  61. ok(defined $driver, "made a driver without dying");
  62. # the initial automatic homepage load found in the preference
  63. # 'browser.startup.homepage' isn't blocking, so we need to wait
  64. # until the page is loaded (when we can find elements)
  65. $driver->set_implicit_wait_timeout(30000);
  66. $driver->find_element("h1", "tag_name");
  67. cmp_ok($driver->get_current_url, '=~', qr/localhost/i,
  68. "profile loaded and preference respected!");
  69. $driver->get($website . '/index.html');
  70. cmp_ok($driver->get_text("body", "tag_name"), "=~", qr/ruleset/,
  71. "custom profile with extension loaded");
  72. }
  73. PREFERENCES_FORMATTING: {
  74. my $profile = Selenium::Remote::Driver::Firefox::Profile->new();
  75. my $prefs = {
  76. 'string' => "howdy, there",
  77. 'integer' => 12345,
  78. 'true' => JSON::true,
  79. 'false' => JSON::false,
  80. 'string.like.integer' => '"12345"',
  81. };
  82. my %expected = map {
  83. my $q = $_ eq 'string' ? '"' : '';
  84. $_ => $q . $prefs->{$_} . $q
  85. } keys %$prefs;
  86. $profile->set_preference(%$prefs);
  87. foreach (keys %$prefs) {
  88. cmp_ok($profile->get_preference($_), "eq", $expected{$_},
  89. "$_ preference is formatted properly");
  90. }
  91. my $encoded = $profile->_encode();
  92. my $fh = File::Temp->new();
  93. print $fh decode_base64($encoded);
  94. close $fh;
  95. my $zip = Archive::Extract->new(
  96. archive => $fh->filename,
  97. type => "zip"
  98. );
  99. my $tempdir = File::Temp->newdir();
  100. my $ok = $zip->extract( to => $tempdir );
  101. my $outdir = $zip->extract_path;
  102. my $filename = $tempdir . "/user.js";
  103. open ($fh, "<", $filename);
  104. my (@file) = <$fh>;
  105. close ($fh);
  106. my $userjs = join('', @file);
  107. foreach (keys %expected) {
  108. cmp_ok($userjs, "=~", qr/$expected{$_}\);/,
  109. "$_ preference is formatted properly after packing and unpacking");
  110. }
  111. }
  112. CROAKING: {
  113. my $profile = Selenium::Remote::Driver::Firefox::Profile->new();
  114. {
  115. eval {
  116. $profile->add_extension('00-load.t');
  117. };
  118. ok($@ =~ /xpi format/i, "caught invalid extension filetype");
  119. }
  120. {
  121. eval {
  122. $profile->add_extension('t/www/invalid-extension.xpi');
  123. my $test = $profile->_encode;
  124. };
  125. ok($@ =~ /install\.rdf/i, "caught invalid extension structure");
  126. }
  127. {
  128. eval {
  129. my $croakingDriver = Selenium::Remote::Driver->new(
  130. extra_capabilities => {
  131. firefox_profile => 'clearly invalid!'
  132. }
  133. );
  134. };
  135. ok ($@ =~ /coercion.*failed/, "caught invalid extension in driver constructor");
  136. }
  137. }
  138. done_testing;