blob: 3914dc2df45d806c7df29d49ed50f4ad15afcb96 [file] [log] [blame]
// Copyright 2016 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "base/test/time_helpers.h"
#include <unicode/ucal.h>
#include <unicode/uloc.h>
#include <unicode/ustring.h>
#include "base/basictypes.h"
#include "base/logging.h"
#include "base/stringprintf.h"
#include "base/time.h"
// Negative statuses are considered warnings, so this only fails if the status
// value is greater than zero.
#define UCHECK(status) DCHECK_GE(U_ZERO_ERROR, status) << __FUNCTION__ << ": "
namespace base {
namespace test {
namespace time_helpers {
namespace {
base::Time UDateToTime(UDate udate) {
return base::Time::UnixEpoch() +
base::TimeDelta::FromMicroseconds(static_cast<int64_t>(
udate * base::Time::kMicrosecondsPerMillisecond));
}
const char* ToMonthString(int month) {
switch (month) {
case 1:
return "Jan";
case 2:
return "Feb";
case 3:
return "Mar";
case 4:
return "Apr";
case 5:
return "May";
case 6:
return "Jun";
case 7:
return "Jul";
case 8:
return "Aug";
case 9:
return "Sep";
case 10:
return "Oct";
case 11:
return "Nov";
case 12:
return "Dec";
}
return "UNK";
}
} // namespace
base::Time FieldsToTime(TimeZone timezone,
int year,
int month,
int date,
int hour,
int minute,
int second) {
UErrorCode status = U_ZERO_ERROR;
UChar timezone_buffer[32] = {0};
UChar* timezone_uname = NULL;
switch (timezone) {
case kTimeZonePacific:
u_strFromUTF8(timezone_buffer, arraysize(timezone_buffer), NULL,
"America/Los_Angeles", -1, &status);
timezone_uname = timezone_buffer;
break;
case kTimeZoneGMT:
u_strFromUTF8(timezone_buffer, arraysize(timezone_buffer), NULL,
"Etc/GMT", -1, &status);
timezone_uname = timezone_buffer;
case kTimeZoneLocal:
// Leave NULL.
break;
}
UCHECK(status);
UCalendar* calendar =
ucal_open(timezone_uname, -1, uloc_getDefault(), UCAL_DEFAULT, &status);
DCHECK(calendar);
UCHECK(status);
ucal_setMillis(calendar, 0, &status); // Clear the calendar.
UCHECK(status);
ucal_setDateTime(calendar, year, month - 1 + UCAL_JANUARY, date, hour, minute,
second, &status);
UCHECK(status);
UDate udate = ucal_getMillis(calendar, &status);
UCHECK(status);
ucal_close(calendar);
return UDateToTime(udate);
}
base::Time TestDateToTime(TimeZone timezone) {
return FieldsToTime(timezone,
2007, // year
10, // month
15, // date
12, // hour
45, // minute
0); // second
}
std::string TimeFormatUTC(base::Time time) {
Time::Exploded exploded;
time.UTCExplode(&exploded);
return base::StringPrintf("%s %02d %02d:%02d:%02d %04d",
ToMonthString(exploded.month),
exploded.day_of_month, exploded.hour,
exploded.minute, exploded.second, exploded.year);
}
std::string TimeFormatLocal(base::Time time) {
Time::Exploded exploded;
time.LocalExplode(&exploded);
return base::StringPrintf("%s %02d %02d:%02d:%02d %04d",
ToMonthString(exploded.month),
exploded.day_of_month, exploded.hour,
exploded.minute, exploded.second, exploded.year);
}
} // namespace time_helpers
} // namespace test
} // namespace base