blob: cb30adc998863a99278137dc08c63a2b56151df1 [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#[cfg(test)]
mod tests {
use {
anyhow::Result,
fable_lib::fable,
fidl_fuchsia_intl::{
self as fintl, CivilTime, CivilToAbsoluteTimeOptions, DayOfWeek, Month,
RepeatedTimeConversion, SkippedTimeConversion, TimeZoneId, TimeZoneInfo,
TimeZonesProxy,
},
fuchsia_async as fasync,
fuchsia_component_test::{
Capability, ChildOptions, RealmBuilder, RealmInstance, Ref, Route,
},
fuchsia_zircon as zx,
};
static SVC_URL: &str =
"fuchsia-pkg://fuchsia.com/time-zone-info-service-test#meta/time-zone-info-service.cm";
static TZ_NYC: &str = "America/New_York";
static NANOS_PER_SECOND: i64 = 1_000_000_000;
static SECONDS_PER_HOUR: i64 = 3600;
async fn connect_to_service() -> Result<(RealmInstance, TimeZonesProxy)> {
const MONIKER: &str = "tzinfo";
let builder = RealmBuilder::new().await?;
let tzinfo = builder.add_child(MONIKER, SVC_URL, ChildOptions::new()).await?;
builder
.add_route(
Route::new()
.capability(Capability::protocol::<fintl::TimeZonesMarker>())
.from(&tzinfo)
.to(Ref::parent()),
)
.await?;
let realm = builder.build().await?;
let svc = realm.root.connect_to_protocol_at_exposed_dir::<fintl::TimeZonesMarker>()?;
Ok((realm, svc))
}
#[fasync::run_singlethreaded(test)]
async fn test_civil_to_absolute_time() -> Result<()> {
let (realm, svc) = connect_to_service().await?;
let civil_time = fable! {
CivilTime {
year: 2021,
month: Month::August,
day: 15,
hour: 20,
minute: 17,
second: 42,
nanos: 123_456_789,
time_zone_id: TimeZoneId {
id: TZ_NYC.to_string(),
},
}
};
let options = fable! {
CivilToAbsoluteTimeOptions {
repeated_time_conversion: RepeatedTimeConversion::BeforeTransition,
skipped_time_conversion: SkippedTimeConversion::NextValidTime,
}
};
let actual =
svc.civil_to_absolute_time(civil_time, options).await?.map(zx::Time::from_nanos);
realm.destroy().await?;
let expected = Ok(zx::Time::from_nanos(1629073062 * NANOS_PER_SECOND + 123_456_789));
assert_eq!(actual, expected);
Ok(())
}
#[fasync::run_singlethreaded(test)]
async fn test_absolute_to_civil_time() -> Result<()> {
let (realm, svc) = connect_to_service().await?;
let absolute_time = 1629073062 * NANOS_PER_SECOND + 123_456_789;
let mut tz_id = TimeZoneId { id: TZ_NYC.to_string() };
let actual = svc.absolute_to_civil_time(&mut tz_id, absolute_time).await?;
realm.destroy().await?;
let expected = Ok(fable! {
CivilTime {
year: 2021,
month: Month::August,
day: 15,
hour: 20,
minute: 17,
second: 42,
nanos: 123_456_789,
weekday: DayOfWeek::Sunday,
year_day: 226,
time_zone_id: TimeZoneId {
id: TZ_NYC.to_string(),
},
}
});
assert_eq!(actual, expected);
Ok(())
}
#[fasync::run_singlethreaded(test)]
async fn test_get_time_zone_info() -> Result<()> {
let (realm, svc) = connect_to_service().await?;
let absolute_time = 1629073062 * NANOS_PER_SECOND + 123_456_789;
let mut tz_id = TimeZoneId { id: TZ_NYC.to_string() };
let actual = svc.get_time_zone_info(&mut tz_id, absolute_time).await?;
realm.destroy().await?;
let expected = Ok(fable! {
TimeZoneInfo {
id: tz_id,
total_offset_at_time: -4 * SECONDS_PER_HOUR * NANOS_PER_SECOND,
in_dst_at_time: true,
}
});
assert_eq!(actual, expected);
Ok(())
}
}