Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "absl/time/internal/test_util.h"
00016
00017 #include <algorithm>
00018 #include <cstddef>
00019 #include <cstring>
00020
00021 #include "absl/base/internal/raw_logging.h"
00022 #include "absl/time/internal/cctz/include/cctz/zone_info_source.h"
00023
00024 namespace cctz = absl::time_internal::cctz;
00025
00026 namespace absl {
00027 namespace time_internal {
00028
00029 TimeZone LoadTimeZone(const std::string& name) {
00030 TimeZone tz;
00031 ABSL_RAW_CHECK(LoadTimeZone(name, &tz), name.c_str());
00032 return tz;
00033 }
00034
00035 }
00036 }
00037
00038 namespace absl {
00039 namespace time_internal {
00040 namespace cctz_extension {
00041 namespace {
00042
00043
00044
00045
00046
00047 #include "absl/time/internal/zoneinfo.inc"
00048
00049 const struct ZoneInfo {
00050 const char* name;
00051 const char* data;
00052 std::size_t length;
00053 } kZoneInfo[] = {
00054
00055 {"America/Los_Angeles",
00056 reinterpret_cast<char*>(America_Los_Angeles), America_Los_Angeles_len},
00057 {"America/New_York",
00058 reinterpret_cast<char*>(America_New_York), America_New_York_len},
00059 {"Australia/Sydney",
00060 reinterpret_cast<char*>(Australia_Sydney), Australia_Sydney_len},
00061
00062
00063 {"Invalid/TimeZone", nullptr, 0},
00064 {"", nullptr, 0},
00065
00066
00067 {"US/Pacific",
00068 reinterpret_cast<char*>(America_Los_Angeles), America_Los_Angeles_len},
00069
00070
00071 #ifdef _MSC_VER
00072 {"localtime",
00073 reinterpret_cast<char*>(America_Los_Angeles), America_Los_Angeles_len},
00074 #else
00075 {"/etc/localtime",
00076 reinterpret_cast<char*>(America_Los_Angeles), America_Los_Angeles_len},
00077 #endif
00078 };
00079
00080 class TestZoneInfoSource : public cctz::ZoneInfoSource {
00081 public:
00082 TestZoneInfoSource(const char* data, std::size_t size)
00083 : data_(data), end_(data + size) {}
00084
00085 std::size_t Read(void* ptr, std::size_t size) override {
00086 const std::size_t len = std::min<std::size_t>(size, end_ - data_);
00087 memcpy(ptr, data_, len);
00088 data_ += len;
00089 return len;
00090 }
00091
00092 int Skip(std::size_t offset) override {
00093 data_ += std::min<std::size_t>(offset, end_ - data_);
00094 return 0;
00095 }
00096
00097 private:
00098 const char* data_;
00099 const char* const end_;
00100 };
00101
00102 std::unique_ptr<cctz::ZoneInfoSource> TestFactory(
00103 const std::string& name,
00104 const std::function<std::unique_ptr<cctz::ZoneInfoSource>(
00105 const std::string& name)>& ) {
00106 for (const ZoneInfo& zoneinfo : kZoneInfo) {
00107 if (name == zoneinfo.name) {
00108 if (zoneinfo.data == nullptr) return nullptr;
00109 return std::unique_ptr<cctz::ZoneInfoSource>(
00110 new TestZoneInfoSource(zoneinfo.data, zoneinfo.length));
00111 }
00112 }
00113 ABSL_RAW_LOG(FATAL, "Unexpected time zone \"%s\" in test", name.c_str());
00114 return nullptr;
00115 }
00116
00117 }
00118
00119 ZoneInfoSourceFactory zone_info_source_factory = TestFactory;
00120
00121 }
00122 }
00123 }