RTBKit
0.9
Open-source framework to create real-time ad bidding systems.
|
00001 /* date_test.cc 00002 Copyright (c) 2010 Datacratic. All rights reserved. 00003 */ 00004 00005 #define BOOST_TEST_MAIN 00006 #define BOOST_TEST_DYN_LINK 00007 #include "soa/types/date.h" 00008 #include <boost/test/unit_test.hpp> 00009 #include "soa/jsoncpp/json.h" 00010 #include "jml/arch/format.h" 00011 #include "jml/utils/parse_context.h" 00012 #include "ace/Time_Value.h" 00013 00014 using namespace std; 00015 using namespace ML; 00016 using namespace Datacratic; 00017 00018 #if 0 00019 BOOST_AUTO_TEST_CASE(test_date_parse_iso8601) 00020 { 00021 // Issue PLAT-151 should fix this test 00022 BOOST_CHECK_NO_THROW(Date::parseIso8601("2012-12-20T14:57:57.187775+00:00")) ; 00023 } 00024 #endif 00025 BOOST_AUTO_TEST_CASE( test_microsecond_date ) 00026 { 00027 Date d = Date::now(); 00028 double x; 00029 BOOST_CHECK_GT(modf(d.secondsSinceEpoch(), &x), 0.000001); 00030 } 00031 00032 BOOST_AUTO_TEST_CASE( test_quantize ) 00033 { 00034 Date d = Date::fromSecondsSinceEpoch(0.1); 00035 BOOST_CHECK_EQUAL(d.quantized(1.0), Date::fromSecondsSinceEpoch(0.0)); 00036 BOOST_CHECK_EQUAL(d.quantized(0.5), Date::fromSecondsSinceEpoch(0.0)); 00037 BOOST_CHECK_EQUAL(d.quantized(0.2), Date::fromSecondsSinceEpoch(0.2)); 00038 BOOST_CHECK_EQUAL(d.quantized(0.1), Date::fromSecondsSinceEpoch(0.1)); 00039 BOOST_CHECK_EQUAL(d.quantized(0.05), Date::fromSecondsSinceEpoch(0.1)); 00040 BOOST_CHECK_EQUAL(d.quantized(0.01), Date::fromSecondsSinceEpoch(0.1)); 00041 00042 d = Date::fromSecondsSinceEpoch(0.11); 00043 BOOST_CHECK_EQUAL(d.quantized(1.0), Date::fromSecondsSinceEpoch(0.0)); 00044 BOOST_CHECK_EQUAL(d.quantized(0.5), Date::fromSecondsSinceEpoch(0.0)); 00045 BOOST_CHECK_EQUAL(d.quantized(0.2), Date::fromSecondsSinceEpoch(0.2)); 00046 BOOST_CHECK_EQUAL(d.quantized(0.1), Date::fromSecondsSinceEpoch(0.1)); 00047 BOOST_CHECK_EQUAL(d.quantized(0.05), Date::fromSecondsSinceEpoch(0.1)); 00048 BOOST_CHECK_EQUAL(d.quantized(0.01), Date::fromSecondsSinceEpoch(0.11)); 00049 } 00050 00051 BOOST_AUTO_TEST_CASE( test_fractional_date_print ) 00052 { 00053 Date d1 = Date::fromSecondsSinceEpoch(0); 00054 Date d2 = d1.plusSeconds(0.33336); 00055 00056 BOOST_CHECK_EQUAL(d1.print(), d2.print()); 00057 BOOST_CHECK_EQUAL(d1.print() + ".3", d2.print(1)); 00058 BOOST_CHECK_EQUAL(d1.print() + ".33", d2.print(2)); 00059 BOOST_CHECK_EQUAL(d1.print() + ".333", d2.print(3)); 00060 BOOST_CHECK_EQUAL(d1.print() + ".3334", d2.print(4)); 00061 BOOST_CHECK_EQUAL(d1.print() + ".33336", d2.print(5)); 00062 } 00063 00064 00065 BOOST_AUTO_TEST_CASE( test_date_parse_roundtrip ) 00066 { 00067 Date d1 = Date::now().quantized(0.01); 00068 00069 string s = d1.print(6); 00070 00071 Date d2(s); 00072 00073 cerr << "s = " << d1.print(9) << " s2 = " << d2.print(9) << endl; 00074 00075 BOOST_CHECK_EQUAL(d1.quantized(0.000001), d2.quantized(0.000001)); 00076 00077 for (unsigned i = 0; i < 1000; ++i) { 00078 double sec = random(); 00079 double frac = random() / 1000000000.0; 00080 00081 Date d1 = Date::fromSecondsSinceEpoch(sec + frac); 00082 Date d2(d1.print(6)); 00083 00084 if (d1.print(6) != d2.print(6)) { 00085 cerr << "d1:6: " << d1.print(6) << endl; 00086 cerr << "d2:6: " << d2.print(6) << endl; 00087 cerr << "d1:9: " << d1.print(9) << endl; 00088 cerr << "d2:9: " << d2.print(9) << endl; 00089 cerr << "sec: " << ML::format("%32.10f", sec + frac) << endl; 00090 } 00091 00092 BOOST_CHECK_EQUAL(d1.print(6), d2.print(6)); 00093 } 00094 } 00095 00096 BOOST_AUTO_TEST_CASE( test_stream_print_equality ) 00097 { 00098 Date d = Date::fromSecondsSinceEpoch(4516978241); 00099 00100 std::stringstream ss; 00101 ss << d; 00102 00103 BOOST_CHECK_EQUAL(ss.str(), "2113-Feb-19 20:10:41"); 00104 } 00105 00106 BOOST_AUTO_TEST_CASE( test_ace ) 00107 { 00108 ACE_Time_Value ace(1, 0); 00109 00110 BOOST_CHECK_EQUAL(Date(ace).secondsSinceEpoch(), 1.0); 00111 BOOST_CHECK_EQUAL(Date(ace).toAce(), ace); 00112 } 00113 00114 BOOST_AUTO_TEST_CASE( test_print_format ) 00115 { 00116 BOOST_CHECK_EQUAL(Date(ACE_Time_Value(0)).print("%c"), "Thu Jan 1 00:00:00 1970"); 00117 BOOST_CHECK_EQUAL(Date(ACE_Time_Value(1)).print("%c"), "Thu Jan 1 00:00:01 1970"); 00118 } 00119 00120 BOOST_AUTO_TEST_CASE( test_utc_parse ) 00121 { 00122 Date d(2012, 06, 06, 15, 15, 38.380); 00123 string s = "2012-Jun-06 15:15:38.380"; 00124 Date d2 = Date::parseDefaultUtc(s); 00125 BOOST_CHECK_EQUAL(d2.print(3), s); 00126 } 00127 00128 BOOST_AUTO_TEST_CASE( test_now ) 00129 { 00130 cerr << "new: " << Date::now().print(6) << endl; 00131 cerr << "old: " << Date::nowOld().print(6) << endl; 00132 } 00133 00134 BOOST_AUTO_TEST_CASE( test_date_equality ) 00135 { 00136 BOOST_CHECK_EQUAL(Date(), Date()); 00137 } 00138 00139 BOOST_AUTO_TEST_CASE( test_date_parse_no_delimiter ) 00140 { 00141 const char * s = "20120624"; 00142 Parse_Context context(s, s, s + strlen(s)); 00143 Date date = Date::expect_date(context, "%y%m%d"); 00144 00145 BOOST_CHECK_EQUAL(date, Date(2012, 06, 24)); 00146 } 00147 00148 BOOST_AUTO_TEST_CASE( test_date_hour_of_week ) 00149 { 00150 BOOST_CHECK_EQUAL(Date(2012, 06, 24, 0, 0, 0).hourOfWeek(), 0); 00151 BOOST_CHECK_EQUAL(Date(2012, 06, 24, 1, 0, 0).hourOfWeek(), 1); 00152 BOOST_CHECK_EQUAL(Date(2012, 06, 25, 0, 0, 0).hourOfWeek(), 24); 00153 BOOST_CHECK_EQUAL(Date(2012, 06, 25, 23, 59, 59).hourOfWeek(), 47); 00154 BOOST_CHECK_EQUAL(Date(2012, 06, 26, 0, 0, 0).hourOfWeek(), 48); 00155 BOOST_CHECK_EQUAL(Date(2012, 06, 30, 23, 59, 59).hourOfWeek(), 167); 00156 BOOST_CHECK_EQUAL(Date(2012, 07, 1, 0, 0, 0).hourOfWeek(), 0); 00157 } 00158 00159 BOOST_AUTO_TEST_CASE( test_date_difference ) 00160 { 00161 BOOST_CHECK_EQUAL(Date(2012, 06, 24, 0, 0, 0) - 00162 Date(2012, 06, 24, 0, 0, 10), -10); 00163 BOOST_CHECK_EQUAL(Date(2012, 06, 24, 0, 1, 0) - 00164 Date(2012, 06, 24, 0, 0, 0), 60); 00165 } 00166 00167 BOOST_AUTO_TEST_CASE( test_rfc_2616 ) 00168 { 00169 BOOST_CHECK_EQUAL(Date(1994, 11, 6, 8, 49, 37).printRfc2616(), 00170 "Sun, 06 Nov 1994 08:49:37 GMT"); 00171 } 00172 00173 BOOST_AUTO_TEST_CASE( test_addFromString ) 00174 { 00175 Date d(2013, 1, 1, 0, 0, 0); 00176 d.addFromString("1d"); 00177 BOOST_CHECK_EQUAL(d, Date(2013, 1, 2, 0, 0, 0)); 00178 d.addFromString("2S"); 00179 BOOST_CHECK_EQUAL(d, Date(2013, 1, 2, 0, 0, 2)); 00180 d.addFromString("3M"); 00181 BOOST_CHECK_EQUAL(d, Date(2013, 1, 2, 0, 3, 2)); 00182 d.addFromString("4H"); 00183 BOOST_CHECK_EQUAL(d, Date(2013, 1, 2, 4, 3, 2)); 00184 if(false){ 00185 //this test leaks, skip it 00186 bool failureFailed = false; 00187 try{ 00188 d.addFromString("pwel"); 00189 }catch(const ML::Exception& e){ 00190 failureFailed = true; 00191 } 00192 if(!failureFailed){ 00193 throw ML::Exception("Invalid string should fail with a ML exception"); 00194 } 00195 } 00196 }