@@ -965,8 +965,35 @@ mod tests {
965
965
use super::*;
966
966
967
967
use std::f64;
968
- use std::os;
969
968
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
+ }
970
997
971
998
fn test_get_time ( ) {
972
999
static SOME_RECENT_DATE : i64 = 1325376000i64 ; // 2012-01-01T00:00:00Z
@@ -1007,57 +1034,54 @@ mod tests {
1007
1034
}
1008
1035
1009
1036
fn test_at_utc ( ) {
1010
- os:: setenv( "TZ" , "America/Los_Angeles" ) ;
1011
- tzset( ) ;
1037
+ set_time_zone ( ) ;
1012
1038
1013
1039
let time = Timespec :: new ( 1234567890 , 54321 ) ;
1014
1040
let utc = at_utc ( time) ;
1015
1041
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);
1028
1054
}
1029
1055
1030
1056
fn test_at() {
1031
- os::setenv(" TZ ", " America /Los_Angeles ");
1032
- tzset();
1057
+ set_time_zone();
1033
1058
1034
1059
let time = Timespec::new(1234567890, 54321);
1035
1060
let local = at(time);
1036
1061
1037
1062
error!(" time_at: { : ?} ", local);
1038
1063
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);
1049
1074
1050
1075
// FIXME (#2350): We should probably standardize on the timezone
1051
1076
// abbreviation.
1052
1077
let zone = &local.tm_zone;
1053
1078
assert!(*zone == ~" PST " || *zone == ~" Pacific Standard Time ");
1054
1079
1055
- assert !(local.tm_nsec == 54321_i32);
1080
+ assert_eq !(local.tm_nsec, 54321_i32);
1056
1081
}
1057
1082
1058
1083
fn test_to_timespec() {
1059
- os::setenv(" TZ ", " America /Los_Angeles ");
1060
- tzset();
1084
+ set_time_zone();
1061
1085
1062
1086
let time = Timespec::new(1234567890, 54321);
1063
1087
let utc = at_utc(time);
@@ -1067,8 +1091,7 @@ mod tests {
1067
1091
}
1068
1092
1069
1093
fn test_conversions() {
1070
- os::setenv(" TZ ", " America /Los_Angeles ");
1071
- tzset();
1094
+ set_time_zone();
1072
1095
1073
1096
let time = Timespec::new(1234567890, 54321);
1074
1097
let utc = at_utc(time);
@@ -1083,8 +1106,7 @@ mod tests {
1083
1106
}
1084
1107
1085
1108
fn test_strptime() {
1086
- os::setenv(" TZ ", " America /Los_Angeles ");
1087
- tzset();
1109
+ set_time_zone();
1088
1110
1089
1111
match strptime(" ", " ") {
1090
1112
Ok(ref tm) => {
@@ -1248,8 +1270,7 @@ mod tests {
1248
1270
}
1249
1271
1250
1272
fn test_ctime() {
1251
- os:: setenv( "TZ ", "America/Los_Angeles" ) ;
1252
- tzset( ) ;
1273
+ set_time_zone();
1253
1274
1254
1275
let time = Timespec::new(1234567890, 54321);
1255
1276
let utc = at_utc(time);
@@ -1262,8 +1283,7 @@ mod tests {
1262
1283
}
1263
1284
1264
1285
fn test_strftime() {
1265
- os:: setenv( "TZ ", "America/Los_Angeles" ) ;
1266
- tzset( ) ;
1286
+ set_time_zone();
1267
1287
1268
1288
let time = Timespec::new(1234567890, 54321);
1269
1289
let utc = at_utc(time);
@@ -1323,8 +1343,7 @@ mod tests {
1323
1343
// abbreviation.
1324
1344
let rfc822 = local.rfc822();
1325
1345
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 ");
1328
1347
1329
1348
assert_eq!(local.ctime(), ~" Fri Feb 13 15 : 31 : 30 2009 ");
1330
1349
assert_eq!(local.rfc822z(), ~" Fri , 13 Feb 2009 15 : 31 : 30 -0800 ");
0 commit comments