HttpReaderTest.pm.svn-base
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:3k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. package HttpReaderTest;
  2. use strict;
  3. use Test::More;
  4. use Utils::HttpReader;
  5. use Time::HiRes qw(time sleep);
  6. use constant SMALL_TEST_URL => "http://www.openkore.com/misc/testHttpReader.txt";
  7. use constant SMALL_TEST_CONTENT => "Hello world!n";
  8. use constant SMALL_TEST_SIZE => 13;
  9. use constant SMALL_TEST_CHECKSUM => 2773980202;
  10. use constant ERROR_URL => "http://www.openkore.com/FileNotFound.txt";
  11. use constant ERROR_URL2 => "https://sourceforge.net/fooooooooooo/";
  12. use constant INVALID_URL => "http://111.111.111.111:82";
  13. sub start {
  14. print "### Starting HttpReaderTestn";
  15. StdHttpReader::init();
  16. HttpReaderTest->new()->run();
  17. }
  18. ################
  19. sub new {
  20. return bless {}, $_[0];
  21. }
  22. sub calcChecksum {
  23. use bytes;
  24. my ($data, $seed) = @_;
  25. $seed = 0 if (!defined $seed);
  26. my $max = 2 ** 32; # Warning: this assumes we're on a 32-bit system
  27. for (my $i = 0; $i < length($data); $i++) {
  28. $seed = ($seed * 32 + ord(substr($data, $i, 1))) % $max;
  29. }
  30. return $seed;
  31. }
  32. sub run {
  33. my ($self) = @_;
  34. $self->testMirrorSelection();
  35. $self->testDownload();
  36. $self->testFailedDownload();
  37. }
  38. sub testMirrorSelection {
  39. use constant TIMEOUT => 3000;
  40. my @urls = (ERROR_URL, INVALID_URL, SMALL_TEST_URL);
  41. my $beginTime = time;
  42. my $http = new MirrorHttpReader(@urls, TIMEOUT);
  43. while ($http->getStatus != HttpReader::DONE && $http->getStatus != HttpReader::ERROR) {
  44. sleep 0.01;
  45. }
  46. # Note that this test isn't entirely reliable because
  47. # it assumes that your network connection can connect
  48. # to SMALL_TEST_URL within TIMEOUT miliseconds.
  49. ok(time - $beginTime < TIMEOUT * scalar(@urls) + 1,
  50. "Mirror selection timeout works properly");
  51. is($http->getStatus, HttpReader::DONE,
  52. "Status is HTTP_READER_DONE");
  53. my $len;
  54. my $data = $http->getData($len);
  55. is(calcChecksum($data), SMALL_TEST_CHECKSUM,
  56. "Downloaded data is correct");
  57. }
  58. sub testDownload {
  59. my @urls = (SMALL_TEST_URL);
  60. my $http = new MirrorHttpReader(@urls);
  61. while ($http->getStatus == HttpReader::CONNECTING) {
  62. sleep 0.01;
  63. }
  64. isnt($http->getStatus, HttpReader::CONNECTING,
  65. "Status is not HTTP_READER_CONNECTING");
  66. my $done;
  67. my $checksum = 0;
  68. my $totalSize = 0;
  69. while (!$done) {
  70. my $buf;
  71. my $ret = $http->pullData($buf, 2);
  72. ok($ret == int($ret), "pullData() returns an integer");
  73. ok($ret >= -2, "pullData() returns >= -2");
  74. isnt($ret, -2, "pullData() never fails for valid test URL");
  75. if ($ret == -1) {
  76. # Try again
  77. sleep 0.01;
  78. } elsif ($ret > 0) {
  79. # There is data
  80. is(length($buf), $ret, "Size of buffer equals pullData() return value");
  81. $checksum = calcChecksum($buf, $checksum);
  82. $totalSize += $ret;
  83. } else {
  84. # $ret == 0: EOF
  85. $done = 1;
  86. }
  87. }
  88. is($http->getStatus, HttpReader::DONE, "Status is HTTP_READER_DONE");
  89. is($checksum, SMALL_TEST_CHECKSUM, "Checksum is OK");
  90. is($totalSize, SMALL_TEST_SIZE, "Size is OK");
  91. }
  92. sub testFailedDownload {
  93. my @urls = (ERROR_URL2);
  94. my $http = new MirrorHttpReader(@urls, 3000);
  95. while ($http->getStatus != HttpReader::DONE && $http->getStatus != HttpReader::ERROR) {
  96. sleep 0.01;
  97. }
  98. is($http->getStatus, HttpReader::ERROR, "Status for ERROR_URL is HTTP_READER_ERROR");
  99. my $buf;
  100. my $ret = $http->pullData($buf, 1024);
  101. is($ret, -2, "pullData() returns -2 for ERROR_URL");
  102. }
  103. 1;