llhttpdate_tut.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:6k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llhttpdate_tut.cpp
  3.  * @author Kartic Krishnamurthy
  4.  * @date Wednesday, 18 Jul 2007 17:00:00 GMT :)
  5.  *
  6.  * $LicenseInfo:firstyear=2007&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2007-2010, Linden Research, Inc.
  9.  * 
  10.  * Second Life Viewer Source Code
  11.  * The source code in this file ("Source Code") is provided by Linden Lab
  12.  * to you under the terms of the GNU General Public License, version 2.0
  13.  * ("GPL"), unless you have obtained a separate licensing agreement
  14.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  15.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  16.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  17.  * 
  18.  * There are special exceptions to the terms and conditions of the GPL as
  19.  * it is applied to this Source Code. View the full text of the exception
  20.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  21.  * online at
  22.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  23.  * 
  24.  * By copying, modifying or distributing this software, you acknowledge
  25.  * that you have read and understood your obligations described above,
  26.  * and agree to abide by those obligations.
  27.  * 
  28.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  29.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  30.  * COMPLETENESS OR PERFORMANCE.
  31.  * $/LicenseInfo$
  32.  */
  33. #include "linden_common.h"
  34. #include "lltut.h"
  35. #include "lldate.h"
  36. #include "llframetimer.h"
  37. #include <time.h>
  38. #include <locale.h>
  39. namespace tut
  40. {
  41.     struct httpdate_data
  42.     {
  43.         LLDate some_date;
  44.     };
  45.     typedef test_group<httpdate_data> httpdate_test;
  46.     typedef httpdate_test::object httpdate_object;
  47.     tut::httpdate_test httpdate("httpdate");
  48.     template<> template<>
  49.     void httpdate_object::test<1>()
  50.     {
  51.         static std::string epoch_expected = "Thursday, 01 Jan 1970 00:00:00 GMT" ;
  52.         ensure("Check Epoch in RFC 1123", ( epoch_expected == some_date.asRFC1123()));
  53.     }
  54.     template<> template<>
  55.     void httpdate_object::test<2>()
  56.     {
  57.         static std::string expected = "Wednesday, 18 Jul 2007 22:17:24 GMT" ;
  58.         some_date = LLDate(1184797044.037586);
  59.         ensure("Check some timestamp in RFC 1123", ( expected == some_date.asRFC1123()));
  60.     }
  61.     // This test of course most generic.. runs off current time
  62.     template<> template<>
  63.     void httpdate_object::test<3>()
  64.     {
  65.         //F64 sometime = LLFrameTimer::getTotalSeconds();
  66.         time_t sometime;
  67.         time(&sometime);
  68.         some_date = LLDate((F64) sometime);
  69.         struct tm *result;
  70.         char expected[255];
  71. std::string actual;
  72.         
  73.         result = gmtime(&sometime);
  74.         /*
  75.         std::cout << " seconds: "<< result->tm_sec 
  76.                   << ", minutes: " << result->tm_min
  77.                   << ", hours: " << result->tm_hour
  78.                   << ", day of the month: " << result->tm_mday
  79.                   << ", month: " << result->tm_mon
  80.                   << ", year: " << result->tm_year
  81.                   << ", day of the week: " << result->tm_wday
  82.                   << ", day in the year: " << result->tm_yday
  83.                   << ", DST: " << result->tm_isdst << std::endl;
  84.         */
  85.         strftime(expected, 255, "%A, %d %b %Y %H:%M:%S GMT", result);
  86.         actual = some_date.asRFC1123();
  87.         // probably not a good idea to use strcmp but this is just a unit test
  88.         ensure("Current time in RFC 1123", (strcmp(expected, actual.c_str()) == 0));
  89.     }
  90. void test_date_string(const std::string &locale, struct tm *t,
  91.   const std::string &fmt, const std::string &expected)
  92. {
  93. std::string result = LLDate::toHTTPDateString(t, fmt);
  94. LLStringUtil::toLower(result);
  95. std::string label = std::string("toHTTPDateString - ") + locale;
  96. ensure_equals(label.c_str(), result, expected);
  97. }
  98. template<> template<>
  99. void httpdate_object::test<4>()
  100. {
  101. // test localization of http dates
  102. #if LL_WINDOWS
  103. const char *en_locale = "english";
  104. const char *fr_locale = "french";
  105. #else
  106. const char *en_locale = "en_GB.UTF-8";
  107. const char *fr_locale = "fr_FR.UTF-8";
  108. #endif
  109. std::string prev_locale = LLStringUtil::getLocale();
  110. std::string prev_clocale = std::string(setlocale(LC_TIME, NULL));
  111. time_t test_time = 1252374030;  // 8 Sep 2009 01:40:01
  112. struct tm *t = gmtime(&test_time);
  113. setlocale(LC_TIME, en_locale);
  114. if (strcmp(setlocale(LC_TIME, NULL), en_locale) != 0)
  115. {
  116. setlocale(LC_TIME, prev_clocale.c_str());
  117. skip("Cannot set English locale");
  118. }
  119. LLStringUtil::setLocale(en_locale);
  120. test_date_string(en_locale, t, "%d %B %Y - %H:%M", "08 september 2009 - 01:40");
  121. test_date_string(en_locale, t, "%H", "01");
  122. test_date_string(en_locale, t, "%M", "40");
  123. test_date_string(en_locale, t, "%I", "01");
  124. test_date_string(en_locale, t, "%d", "08");
  125. test_date_string(en_locale, t, "%Y", "2009");
  126. test_date_string(en_locale, t, "%p", "am");
  127. test_date_string(en_locale, t, "%A", "tuesday");
  128. test_date_string(en_locale, t, "%B", "september");
  129. setlocale(LC_TIME, fr_locale);
  130. if (strcmp(setlocale(LC_TIME, NULL), fr_locale) != 0)
  131. {
  132. LLStringUtil::setLocale(prev_locale);
  133. setlocale(LC_TIME, prev_clocale.c_str());
  134. skip("Cannot set French locale");
  135. }
  136. LLStringUtil::setLocale(fr_locale);
  137. test_date_string(fr_locale, t, "%d %B %Y - %H:%M", "08 septembre 2009 - 01:40");
  138. test_date_string(fr_locale, t, "%H", "01");
  139. test_date_string(fr_locale, t, "%M", "40");
  140. test_date_string(fr_locale, t, "%I", "01");
  141. test_date_string(fr_locale, t, "%d", "08");
  142. test_date_string(fr_locale, t, "%Y", "2009");
  143. test_date_string(fr_locale, t, "%A", "mardi");
  144. test_date_string(fr_locale, t, "%B", "septembre");
  145. LLStringUtil::setLocale(prev_locale);
  146. setlocale(LC_TIME, prev_clocale.c_str());
  147. }
  148. }