Skip to content

Commit fe18fe0

Browse files
committed
extra::time: Fix test on Windows
Closes #10307
1 parent e63ffc1 commit fe18fe0

File tree

1 file changed

+59
-40
lines changed

1 file changed

+59
-40
lines changed

src/libextra/time.rs

+59-40
Original file line numberDiff line numberDiff line change
@@ -965,8 +965,35 @@ mod tests {
965965
use super::*;
966966
967967
use std::f64;
968-
use std::os;
969968
use std::result::{Err, Ok};
969+
use std::libc;
970+
971+
#[cfg(windows)]
972+
#[fixed_stack_segment]
973+
fn set_time_zone() {
974+
// Windows crt doesn't see any environment variable set by
975+
// `SetEnvironmentVariable`, which `os::setenv` internally uses.
976+
// It is why we use `putenv` here.
977+
extern {
978+
fn _putenv(envstring: *libc::c_char) -> libc::c_int;
979+
}
980+
981+
unsafe {
982+
// Windows does not understand "America/Los_Angeles".
983+
// PST+08 may look wrong, but not! "PST" indicates
984+
// the name of timezone. "+08" means UTC = local + 08.
985+
do "TZ=PST+08".with_c_str |env| {
986+
_putenv(env);
987+
}
988+
}
989+
tzset();
990+
}
991+
#[cfg(not(windows))]
992+
fn set_time_zone() {
993+
use std::os;
994+
os::setenv("TZ", "America/Los_Angeles");
995+
tzset();
996+
}
970997

971998
fn test_get_time() {
972999
static SOME_RECENT_DATE: i64 = 1325376000i64; // 2012-01-01T00:00:00Z
@@ -1007,57 +1034,54 @@ mod tests {
10071034
}
10081035

10091036
fn test_at_utc() {
1010-
os::setenv("TZ", "America/Los_Angeles");
1011-
tzset();
1037+
set_time_zone();
10121038

10131039
let time = Timespec::new(1234567890, 54321);
10141040
let utc = at_utc(time);
10151041

1016-
assert!(utc.tm_sec == 30_i32);
1017-
assert!(utc.tm_min == 31_i32);
1018-
assert!(utc.tm_hour == 23_i32);
1019-
assert!(utc.tm_mday == 13_i32);
1020-
assert!(utc.tm_mon == 1_i32);
1021-
assert!(utc.tm_year == 109_i32);
1022-
assert!(utc.tm_wday == 5_i32);
1023-
assert!(utc.tm_yday == 43_i32);
1024-
assert!(utc.tm_isdst == 0_i32);
1025-
assert!(utc.tm_gmtoff == 0_i32);
1026-
assert!(utc.tm_zone == ~"UTC");
1027-
assert!(utc.tm_nsec == 54321_i32);
1042+
assert_eq!(utc.tm_sec, 30_i32);
1043+
assert_eq!(utc.tm_min, 31_i32);
1044+
assert_eq!(utc.tm_hour, 23_i32);
1045+
assert_eq!(utc.tm_mday, 13_i32);
1046+
assert_eq!(utc.tm_mon, 1_i32);
1047+
assert_eq!(utc.tm_year, 109_i32);
1048+
assert_eq!(utc.tm_wday, 5_i32);
1049+
assert_eq!(utc.tm_yday, 43_i32);
1050+
assert_eq!(utc.tm_isdst, 0_i32);
1051+
assert_eq!(utc.tm_gmtoff, 0_i32);
1052+
assert_eq!(utc.tm_zone, ~"UTC");
1053+
assert_eq!(utc.tm_nsec, 54321_i32);
10281054
}
10291055
10301056
fn test_at() {
1031-
os::setenv("TZ", "America/Los_Angeles");
1032-
tzset();
1057+
set_time_zone();
10331058
10341059
let time = Timespec::new(1234567890, 54321);
10351060
let local = at(time);
10361061
10371062
error!("time_at: {:?}", local);
10381063
1039-
assert!(local.tm_sec == 30_i32);
1040-
assert!(local.tm_min == 31_i32);
1041-
assert!(local.tm_hour == 15_i32);
1042-
assert!(local.tm_mday == 13_i32);
1043-
assert!(local.tm_mon == 1_i32);
1044-
assert!(local.tm_year == 109_i32);
1045-
assert!(local.tm_wday == 5_i32);
1046-
assert!(local.tm_yday == 43_i32);
1047-
assert!(local.tm_isdst == 0_i32);
1048-
assert!(local.tm_gmtoff == -28800_i32);
1064+
assert_eq!(local.tm_sec, 30_i32);
1065+
assert_eq!(local.tm_min, 31_i32);
1066+
assert_eq!(local.tm_hour, 15_i32);
1067+
assert_eq!(local.tm_mday, 13_i32);
1068+
assert_eq!(local.tm_mon, 1_i32);
1069+
assert_eq!(local.tm_year, 109_i32);
1070+
assert_eq!(local.tm_wday, 5_i32);
1071+
assert_eq!(local.tm_yday, 43_i32);
1072+
assert_eq!(local.tm_isdst, 0_i32);
1073+
assert_eq!(local.tm_gmtoff, -28800_i32);
10491074
10501075
// FIXME (#2350): We should probably standardize on the timezone
10511076
// abbreviation.
10521077
let zone = &local.tm_zone;
10531078
assert!(*zone == ~"PST" || *zone == ~"Pacific Standard Time");
10541079
1055-
assert!(local.tm_nsec == 54321_i32);
1080+
assert_eq!(local.tm_nsec, 54321_i32);
10561081
}
10571082
10581083
fn test_to_timespec() {
1059-
os::setenv("TZ", "America/Los_Angeles");
1060-
tzset();
1084+
set_time_zone();
10611085
10621086
let time = Timespec::new(1234567890, 54321);
10631087
let utc = at_utc(time);
@@ -1067,8 +1091,7 @@ mod tests {
10671091
}
10681092
10691093
fn test_conversions() {
1070-
os::setenv("TZ", "America/Los_Angeles");
1071-
tzset();
1094+
set_time_zone();
10721095
10731096
let time = Timespec::new(1234567890, 54321);
10741097
let utc = at_utc(time);
@@ -1083,8 +1106,7 @@ mod tests {
10831106
}
10841107
10851108
fn test_strptime() {
1086-
os::setenv("TZ", "America/Los_Angeles");
1087-
tzset();
1109+
set_time_zone();
10881110
10891111
match strptime("", "") {
10901112
Ok(ref tm) => {
@@ -1248,8 +1270,7 @@ mod tests {
12481270
}
12491271
12501272
fn test_ctime() {
1251-
os::setenv("TZ", "America/Los_Angeles");
1252-
tzset();
1273+
set_time_zone();
12531274
12541275
let time = Timespec::new(1234567890, 54321);
12551276
let utc = at_utc(time);
@@ -1262,8 +1283,7 @@ mod tests {
12621283
}
12631284
12641285
fn test_strftime() {
1265-
os::setenv("TZ", "America/Los_Angeles");
1266-
tzset();
1286+
set_time_zone();
12671287
12681288
let time = Timespec::new(1234567890, 54321);
12691289
let utc = at_utc(time);
@@ -1323,8 +1343,7 @@ mod tests {
13231343
// abbreviation.
13241344
let rfc822 = local.rfc822();
13251345
let prefix = ~"Fri, 13 Feb 2009 15:31:30 ";
1326-
assert!(rfc822 == prefix + "PST" ||
1327-
rfc822 == prefix + "Pacific Standard Time");
1346+
assert!(rfc822 == prefix + "PST" || rfc822 == prefix + "Pacific Standard Time");
13281347
13291348
assert_eq!(local.ctime(), ~"Fri Feb 13 15:31:30 2009");
13301349
assert_eq!(local.rfc822z(), ~"Fri, 13 Feb 2009 15:31:30 -0800");

0 commit comments

Comments
 (0)