mirror of https://github.com/aria2/aria2
				
				
				
			2008-08-09 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Implemented ServerStatMan::load(...) function and its test case. * src/ServerStat.cc * src/ServerStat.h * src/ServerStatMan.cc * test/ServerStatManTest.cc * test/ServerStatTest.ccpull/1/head
							parent
							
								
									8208e538ba
								
							
						
					
					
						commit
						d85014b937
					
				| 
						 | 
				
			
			@ -1,3 +1,12 @@
 | 
			
		|||
2008-08-09  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
 | 
			
		||||
 | 
			
		||||
	Implemented ServerStatMan::load(...) function and its test case.
 | 
			
		||||
	* src/ServerStat.cc
 | 
			
		||||
	* src/ServerStat.h
 | 
			
		||||
	* src/ServerStatMan.cc
 | 
			
		||||
	* test/ServerStatManTest.cc
 | 
			
		||||
	* test/ServerStatTest.cc
 | 
			
		||||
 | 
			
		||||
2008-08-09  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
 | 
			
		||||
 | 
			
		||||
	Use time_t instead of int32_t. Use int64_t where milli second is
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,7 +33,9 @@
 | 
			
		|||
 */
 | 
			
		||||
/* copyright --> */
 | 
			
		||||
#include "ServerStat.h"
 | 
			
		||||
#include "array_fun.h"
 | 
			
		||||
#include <ostream>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
 | 
			
		||||
namespace aria2 {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -91,6 +93,23 @@ void ServerStat::updateDownloadSpeed(unsigned int downloadSpeed)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
void ServerStat::setStatus(STATUS status)
 | 
			
		||||
{
 | 
			
		||||
  _status = status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ServerStat::setStatus(const std::string& status)
 | 
			
		||||
{
 | 
			
		||||
  size_t len = arrayLength(STATUS_STRING);
 | 
			
		||||
  const std::string* p = std::find(&STATUS_STRING[0],
 | 
			
		||||
				   &STATUS_STRING[len],
 | 
			
		||||
				   status);
 | 
			
		||||
  if(p != &STATUS_STRING[len]) {
 | 
			
		||||
    _status = static_cast<STATUS>(ServerStat::OK+
 | 
			
		||||
				  std::distance(&STATUS_STRING[0], p));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ServerStat::setStatusInternal(STATUS status)
 | 
			
		||||
{
 | 
			
		||||
  _status = status;
 | 
			
		||||
  _lastUpdated.reset();
 | 
			
		||||
| 
						 | 
				
			
			@ -108,7 +127,7 @@ bool ServerStat::isOK() const
 | 
			
		|||
 | 
			
		||||
void ServerStat::setOK()
 | 
			
		||||
{
 | 
			
		||||
  setStatus(OK);
 | 
			
		||||
  setStatusInternal(OK);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool ServerStat::isError() const
 | 
			
		||||
| 
						 | 
				
			
			@ -118,7 +137,7 @@ bool ServerStat::isError() const
 | 
			
		|||
 | 
			
		||||
void ServerStat::setError()
 | 
			
		||||
{
 | 
			
		||||
  setStatus(ERROR);
 | 
			
		||||
  setStatusInternal(ERROR);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool ServerStat::operator<(const ServerStat& serverStat) const
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -64,6 +64,7 @@ public:
 | 
			
		|||
 | 
			
		||||
  const Time& getLastUpdated() const;
 | 
			
		||||
 | 
			
		||||
  // This method doesn't update _lastUpdate.
 | 
			
		||||
  void setLastUpdated(const Time& time);
 | 
			
		||||
 | 
			
		||||
  unsigned int getDownloadSpeed() const;
 | 
			
		||||
| 
						 | 
				
			
			@ -74,8 +75,14 @@ public:
 | 
			
		|||
  // set download speed. This method doesn't update _lastUpdate.
 | 
			
		||||
  void setDownloadSpeed(unsigned int downloadSpeed);
 | 
			
		||||
 | 
			
		||||
  // This method doesn't update _lastUpdate.
 | 
			
		||||
  void setStatus(STATUS status);
 | 
			
		||||
 | 
			
		||||
  // status should be one of the followings: "OK", "ERROR".
 | 
			
		||||
  // Giving other string will not change the status of this object.
 | 
			
		||||
  // This method doesn't update _lastUpdate.
 | 
			
		||||
  void setStatus(const std::string& status);
 | 
			
		||||
 | 
			
		||||
  STATUS getStatus() const;
 | 
			
		||||
 | 
			
		||||
  bool isOK() const;
 | 
			
		||||
| 
						 | 
				
			
			@ -101,6 +108,8 @@ private:
 | 
			
		|||
  STATUS _status;
 | 
			
		||||
 | 
			
		||||
  Time _lastUpdated;
 | 
			
		||||
 | 
			
		||||
  void setStatusInternal(STATUS status);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
std::ostream& operator<<(std::ostream& o, const ServerStat& serverStat);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,9 +34,12 @@
 | 
			
		|||
/* copyright --> */
 | 
			
		||||
#include "ServerStatMan.h"
 | 
			
		||||
#include "ServerStat.h"
 | 
			
		||||
#include "Util.h"
 | 
			
		||||
#include "RecoverableException.h"
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <ostream>
 | 
			
		||||
#include <iterator>
 | 
			
		||||
#include <map>
 | 
			
		||||
 | 
			
		||||
namespace aria2 {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -77,4 +80,43 @@ void ServerStatMan::save(std::ostream& out) const
 | 
			
		|||
	    std::ostream_iterator<SharedHandle<ServerStat> >(out, "\n"));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ServerStatMan::load(std::istream& in)
 | 
			
		||||
{
 | 
			
		||||
  static const std::string S_HOST = "host";
 | 
			
		||||
  static const std::string S_PROTOCOL = "protocol";
 | 
			
		||||
  static const std::string S_DL_SPEED = "dl_speed";
 | 
			
		||||
  static const std::string S_LAST_UPDATED = "last_updated";
 | 
			
		||||
  static const std::string S_STATUS = "status";
 | 
			
		||||
 | 
			
		||||
  std::string line;
 | 
			
		||||
  while(getline(in, line)) {
 | 
			
		||||
    Util::trimSelf(line);
 | 
			
		||||
    if(line.empty()) {
 | 
			
		||||
      continue;
 | 
			
		||||
    }
 | 
			
		||||
    std::deque<std::string> items;
 | 
			
		||||
    Util::slice(items, line, ',');
 | 
			
		||||
    std::map<std::string, std::string> m;
 | 
			
		||||
    for(std::deque<std::string>::const_iterator i = items.begin();
 | 
			
		||||
	i != items.end(); ++i) {
 | 
			
		||||
      std::pair<std::string, std::string> p = Util::split(*i, "=");
 | 
			
		||||
      Util::trimSelf(p.first);
 | 
			
		||||
      Util::trimSelf(p.second);
 | 
			
		||||
      m[p.first] = p.second;
 | 
			
		||||
    }
 | 
			
		||||
    if(m[S_HOST].empty() || m[S_PROTOCOL].empty()) {
 | 
			
		||||
      continue;
 | 
			
		||||
    }
 | 
			
		||||
    SharedHandle<ServerStat> sstat(new ServerStat(m[S_HOST], m[S_PROTOCOL]));
 | 
			
		||||
    try {
 | 
			
		||||
      sstat->setDownloadSpeed(Util::parseUInt(m[S_DL_SPEED]));
 | 
			
		||||
      sstat->setLastUpdated(Time(Util::parseInt(m[S_LAST_UPDATED])));
 | 
			
		||||
      sstat->setStatus(m[S_STATUS]);
 | 
			
		||||
      add(sstat);
 | 
			
		||||
    } catch(RecoverableException* e) {
 | 
			
		||||
      continue;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace aria2
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -56,7 +56,8 @@ aria2c_SOURCES = AllTest.cc\
 | 
			
		|||
	SignatureTest.cc\
 | 
			
		||||
	ServerStatManTest.cc\
 | 
			
		||||
	ServerStatURISelectorTest.cc\
 | 
			
		||||
	InOrderURISelectorTest.cc
 | 
			
		||||
	InOrderURISelectorTest.cc\
 | 
			
		||||
	ServerStatTest.cc
 | 
			
		||||
 | 
			
		||||
if HAVE_LIBZ
 | 
			
		||||
aria2c_SOURCES += GZipDecoderTest.cc
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -190,7 +190,8 @@ am__aria2c_SOURCES_DIST = AllTest.cc SocketCoreTest.cc \
 | 
			
		|||
	DownloadHandlerFactoryTest.cc ChunkedDecoderTest.cc \
 | 
			
		||||
	SignatureTest.cc ServerStatManTest.cc \
 | 
			
		||||
	ServerStatURISelectorTest.cc InOrderURISelectorTest.cc \
 | 
			
		||||
	GZipDecoderTest.cc MessageDigestHelperTest.cc \
 | 
			
		||||
	ServerStatTest.cc GZipDecoderTest.cc \
 | 
			
		||||
	MessageDigestHelperTest.cc \
 | 
			
		||||
	IteratableChunkChecksumValidatorTest.cc \
 | 
			
		||||
	IteratableChecksumValidatorTest.cc BtAllowedFastMessageTest.cc \
 | 
			
		||||
	BtBitfieldMessageTest.cc BtCancelMessageTest.cc \
 | 
			
		||||
| 
						 | 
				
			
			@ -357,8 +358,9 @@ am_aria2c_OBJECTS = AllTest.$(OBJEXT) SocketCoreTest.$(OBJEXT) \
 | 
			
		|||
	ChunkedDecoderTest.$(OBJEXT) SignatureTest.$(OBJEXT) \
 | 
			
		||||
	ServerStatManTest.$(OBJEXT) \
 | 
			
		||||
	ServerStatURISelectorTest.$(OBJEXT) \
 | 
			
		||||
	InOrderURISelectorTest.$(OBJEXT) $(am__objects_1) \
 | 
			
		||||
	$(am__objects_2) $(am__objects_3) $(am__objects_4)
 | 
			
		||||
	InOrderURISelectorTest.$(OBJEXT) ServerStatTest.$(OBJEXT) \
 | 
			
		||||
	$(am__objects_1) $(am__objects_2) $(am__objects_3) \
 | 
			
		||||
	$(am__objects_4)
 | 
			
		||||
aria2c_OBJECTS = $(am_aria2c_OBJECTS)
 | 
			
		||||
am__DEPENDENCIES_1 =
 | 
			
		||||
aria2c_DEPENDENCIES = ../src/libaria2c.a $(am__DEPENDENCIES_1)
 | 
			
		||||
| 
						 | 
				
			
			@ -575,8 +577,8 @@ aria2c_SOURCES = AllTest.cc SocketCoreTest.cc array_funTest.cc \
 | 
			
		|||
	DownloadHandlerFactoryTest.cc ChunkedDecoderTest.cc \
 | 
			
		||||
	SignatureTest.cc ServerStatManTest.cc \
 | 
			
		||||
	ServerStatURISelectorTest.cc InOrderURISelectorTest.cc \
 | 
			
		||||
	$(am__append_1) $(am__append_2) $(am__append_3) \
 | 
			
		||||
	$(am__append_4)
 | 
			
		||||
	ServerStatTest.cc $(am__append_1) $(am__append_2) \
 | 
			
		||||
	$(am__append_3) $(am__append_4)
 | 
			
		||||
 | 
			
		||||
#aria2c_CXXFLAGS = ${CPPUNIT_CFLAGS} -I../src -I../lib -Wall -D_FILE_OFFSET_BITS=64
 | 
			
		||||
#aria2c_LDFLAGS = ${CPPUNIT_LIBS}
 | 
			
		||||
| 
						 | 
				
			
			@ -781,6 +783,7 @@ distclean-compile:
 | 
			
		|||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SegmentTest.Po@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SequenceTest.Po@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ServerStatManTest.Po@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ServerStatTest.Po@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ServerStatURISelectorTest.Po@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ShareRatioSeedCriteriaTest.Po@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SharedHandleTest.Po@am__quote@
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,6 +13,7 @@ class ServerStatManTest:public CppUnit::TestFixture {
 | 
			
		|||
  CPPUNIT_TEST_SUITE(ServerStatManTest);
 | 
			
		||||
  CPPUNIT_TEST(testAddAndFind);
 | 
			
		||||
  CPPUNIT_TEST(testSave);
 | 
			
		||||
  CPPUNIT_TEST(testLoad);
 | 
			
		||||
  CPPUNIT_TEST_SUITE_END();
 | 
			
		||||
public:
 | 
			
		||||
  void setUp() {}
 | 
			
		||||
| 
						 | 
				
			
			@ -20,8 +21,8 @@ public:
 | 
			
		|||
  void tearDown() {}
 | 
			
		||||
 | 
			
		||||
  void testAddAndFind();
 | 
			
		||||
 | 
			
		||||
  void testSave();
 | 
			
		||||
  void testLoad();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -80,4 +81,31 @@ void ServerStatManTest::testSave()
 | 
			
		|||
     out);			   
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ServerStatManTest::testLoad()
 | 
			
		||||
{
 | 
			
		||||
  std::string in =
 | 
			
		||||
    "host=localhost, protocol=ftp, dl_speed=30000, last_updated=1210000001, status=OK\n"
 | 
			
		||||
    "host=localhost, protocol=http, dl_speed=25000, last_updated=1210000000, status=OK\n"
 | 
			
		||||
    "host=mirror, protocol=http, dl_speed=0, last_updated=1210000002, status=ERROR\n";
 | 
			
		||||
 | 
			
		||||
  std::stringstream ss(in);
 | 
			
		||||
 | 
			
		||||
  ServerStatMan ssm;
 | 
			
		||||
  ssm.load(ss);
 | 
			
		||||
 | 
			
		||||
  SharedHandle<ServerStat> localhost_http = ssm.find("localhost", "http");
 | 
			
		||||
  CPPUNIT_ASSERT(!localhost_http.isNull());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(std::string("localhost"), localhost_http->getHostname());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(std::string("http"), localhost_http->getProtocol());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(static_cast<unsigned int>(25000),
 | 
			
		||||
		       localhost_http->getDownloadSpeed());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(static_cast<time_t>(1210000000),
 | 
			
		||||
		       localhost_http->getLastUpdated().getTime());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(ServerStat::OK, localhost_http->getStatus());
 | 
			
		||||
 | 
			
		||||
  SharedHandle<ServerStat> mirror = ssm.find("mirror", "http");
 | 
			
		||||
  CPPUNIT_ASSERT(!mirror.isNull());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(ServerStat::ERROR, mirror->getStatus());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace aria2
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,75 @@
 | 
			
		|||
#include "ServerStat.h"
 | 
			
		||||
#include "Exception.h"
 | 
			
		||||
#include "Util.h"
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <sstream>
 | 
			
		||||
#include <cppunit/extensions/HelperMacros.h>
 | 
			
		||||
 | 
			
		||||
namespace aria2 {
 | 
			
		||||
 | 
			
		||||
class ServerStatTest:public CppUnit::TestFixture {
 | 
			
		||||
 | 
			
		||||
  CPPUNIT_TEST_SUITE(ServerStatTest);
 | 
			
		||||
  CPPUNIT_TEST(testSetStatus);
 | 
			
		||||
  CPPUNIT_TEST(testOperatorOstream);
 | 
			
		||||
  CPPUNIT_TEST_SUITE_END();
 | 
			
		||||
public:
 | 
			
		||||
  void setUp() {}
 | 
			
		||||
 | 
			
		||||
  void tearDown() {}
 | 
			
		||||
 | 
			
		||||
  void testSetStatus();
 | 
			
		||||
  void testOperatorOstream();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
CPPUNIT_TEST_SUITE_REGISTRATION(ServerStatTest);
 | 
			
		||||
 | 
			
		||||
void ServerStatTest::testSetStatus()
 | 
			
		||||
{
 | 
			
		||||
  ServerStat ss("localhost", "http");
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(ServerStat::OK, ss.getStatus());
 | 
			
		||||
  ss.setStatus("ERROR");
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(ServerStat::ERROR, ss.getStatus());
 | 
			
		||||
  // See undefined status string will not change current status.
 | 
			
		||||
  ss.setStatus("__BADSTATUS");
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(ServerStat::ERROR, ss.getStatus());
 | 
			
		||||
  ss.setStatus("OK");
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(ServerStat::OK, ss.getStatus());
 | 
			
		||||
  // See undefined status string will not change current status.
 | 
			
		||||
  ss.setStatus("__BADSTATUS");
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(ServerStat::OK, ss.getStatus());  
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ServerStatTest::testOperatorOstream()
 | 
			
		||||
{
 | 
			
		||||
  ServerStat localhost_http("localhost", "http");
 | 
			
		||||
  localhost_http.setDownloadSpeed(90000);
 | 
			
		||||
  localhost_http.setLastUpdated(Time(1000));
 | 
			
		||||
 | 
			
		||||
  std::stringstream ss;
 | 
			
		||||
  
 | 
			
		||||
  ss << localhost_http;
 | 
			
		||||
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL
 | 
			
		||||
    (std::string
 | 
			
		||||
     ("host=localhost, protocol=http, dl_speed=90000, last_updated=1000, status=OK"),
 | 
			
		||||
     ss.str());
 | 
			
		||||
 | 
			
		||||
  ss.str("");
 | 
			
		||||
 | 
			
		||||
  ServerStat localhost_ftp("localhost", "ftp");
 | 
			
		||||
  localhost_ftp.setDownloadSpeed(10000);
 | 
			
		||||
  localhost_ftp.setLastUpdated(Time(1210000000));
 | 
			
		||||
  localhost_ftp.setStatus("ERROR");
 | 
			
		||||
 | 
			
		||||
  ss << localhost_ftp;
 | 
			
		||||
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL
 | 
			
		||||
    (std::string
 | 
			
		||||
     ("host=localhost, protocol=ftp, dl_speed=10000, last_updated=1210000000, status=ERROR"),
 | 
			
		||||
     ss.str());
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace aria2
 | 
			
		||||
		Loading…
	
		Reference in New Issue