blob: 3980e136d9cb0e24afb3f50edf5a096ba919dbd6 [file] [log] [blame]
// Copyright 2022 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.
#include "src/media/audio/lib/clock/clock_snapshot.h"
#include <lib/syslog/cpp/macros.h>
#include <gtest/gtest.h>
#include "src/media/audio/lib/clock/synthetic_clock_realm.h"
using media::TimelineFunction;
namespace media_audio {
namespace {
TEST(ClockSnapshotTest, Create) {
auto realm = SyntheticClockRealm::Create();
realm->AdvanceBy(zx::msec(10));
auto backing = realm->CreateClock("clock", Clock::kExternalDomain, true);
auto to_mono_snapshot = backing->to_clock_mono_snapshot();
ClockSnapshot snapshot(backing, realm->now());
EXPECT_EQ(snapshot.name(), "clock");
EXPECT_EQ(snapshot.domain(), Clock::kExternalDomain);
EXPECT_EQ(snapshot.now(), realm->now());
EXPECT_EQ(snapshot.to_clock_mono_snapshot().to_clock_mono, to_mono_snapshot.to_clock_mono);
EXPECT_EQ(snapshot.to_clock_mono_snapshot().generation, to_mono_snapshot.generation);
realm->AdvanceBy(zx::msec(10));
backing->SetRate(1000);
EXPECT_EQ(snapshot.name(), "clock");
EXPECT_EQ(snapshot.domain(), Clock::kExternalDomain);
EXPECT_EQ(snapshot.now(), realm->now() - zx::msec(10));
EXPECT_EQ(snapshot.to_clock_mono_snapshot().to_clock_mono, to_mono_snapshot.to_clock_mono);
EXPECT_EQ(snapshot.to_clock_mono_snapshot().generation, to_mono_snapshot.generation);
}
TEST(ClockSnapshotsTest, Update) {
auto realm = SyntheticClockRealm::Create();
realm->AdvanceBy(zx::msec(10));
auto clock1 = realm->CreateClock("clock1", Clock::kExternalDomain, true);
auto clock2 = realm->CreateClock("clock2", Clock::kExternalDomain, true);
clock2->SetRate(1000);
ClockSnapshots snapshots;
snapshots.AddClock(clock1);
snapshots.AddClock(clock2);
realm->AdvanceBy(zx::msec(10));
snapshots.Update(realm->now());
auto snapshot1 = snapshots.SnapshotFor(clock1->koid());
auto snapshot2 = snapshots.SnapshotFor(clock2->koid());
EXPECT_EQ(snapshot1.name(), "clock1");
EXPECT_EQ(snapshot1.koid(), clock1->koid());
EXPECT_EQ(snapshot1.domain(), clock1->domain());
EXPECT_EQ(snapshot1.now(), clock1->now());
EXPECT_EQ(snapshot1.mono_now(), realm->now());
EXPECT_EQ(snapshot1.to_clock_mono(), clock1->to_clock_mono());
EXPECT_EQ(snapshot1.to_clock_mono_snapshot().generation, 0);
EXPECT_EQ(snapshot2.name(), "clock2");
EXPECT_EQ(snapshot2.koid(), clock2->koid());
EXPECT_EQ(snapshot2.domain(), clock2->domain());
EXPECT_EQ(snapshot2.now(), clock2->now());
EXPECT_EQ(snapshot2.mono_now(), realm->now());
EXPECT_EQ(snapshot2.to_clock_mono(), clock2->to_clock_mono());
EXPECT_EQ(snapshot2.to_clock_mono_snapshot().generation, 1);
realm->AdvanceBy(zx::msec(10));
clock1->SetRate(-1000);
clock2->SetRate(-1000);
EXPECT_NE(snapshot1.now(), clock1->now());
EXPECT_NE(snapshot1.mono_now(), realm->now());
EXPECT_NE(snapshot1.to_clock_mono(), clock1->to_clock_mono());
EXPECT_NE(snapshot2.now(), clock1->now());
EXPECT_NE(snapshot2.mono_now(), realm->now());
EXPECT_NE(snapshot2.to_clock_mono(), clock1->to_clock_mono());
}
} // namespace
} // namespace media_audio