blob: b5774b049f1a3b5f25a8b32f2a37e66ced186960 [file] [log] [blame]
// Copyright 2019 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/audio_core/packet.h"
#include <fbl/ref_ptr.h>
#include "src/lib/testing/loop_fixture/test_loop_fixture.h"
namespace media::audio {
namespace {
class PacketTest : public gtest::TestLoopFixture {
protected:
fbl::RefPtr<RefCountedVmoMapper> CreateVmoBufferWithSize(size_t buffer_size) {
auto vmo_mapper = fbl::MakeRefCounted<RefCountedVmoMapper>();
zx_status_t res = vmo_mapper->CreateAndMap(buffer_size, ZX_VM_PERM_READ | ZX_VM_PERM_WRITE);
if (res != ZX_OK) {
return nullptr;
}
return vmo_mapper;
}
Packet::Allocator allocator_{1, true};
};
TEST_F(PacketTest, PostCallbackToDispatcherOnDestruction) {
auto vmo_mapper = CreateVmoBufferWithSize(128);
ASSERT_TRUE(vmo_mapper);
bool packet1_callback_received = false;
bool packet2_callback_received = false;
{
auto packet1 =
allocator_.New(vmo_mapper, 0, Fixed(10), Fixed(0), dispatcher(),
[&packet1_callback_received] { packet1_callback_received = true; });
EXPECT_EQ(0, packet1->start());
EXPECT_EQ(10, packet1->end());
EXPECT_EQ(10, packet1->length());
EXPECT_EQ(vmo_mapper->start(), packet1->payload());
{
auto packet2 =
allocator_.New(vmo_mapper, 64, Fixed(10), Fixed(10), dispatcher(),
[&packet2_callback_received] { packet2_callback_received = true; });
EXPECT_EQ(10, packet2->start());
EXPECT_EQ(20, packet2->end());
EXPECT_EQ(10, packet2->length());
EXPECT_EQ(reinterpret_cast<uint8_t*>(vmo_mapper->start()) + 64, packet2->payload());
// No callbacks yet.
RunLoopUntilIdle();
EXPECT_FALSE(packet1_callback_received);
EXPECT_FALSE(packet2_callback_received);
}
// Packet2 should invoke callback in dtor.
RunLoopUntilIdle();
EXPECT_FALSE(packet1_callback_received);
EXPECT_TRUE(packet2_callback_received);
}
// Packet1 should invoke callback in dtor.
RunLoopUntilIdle();
EXPECT_TRUE(packet1_callback_received);
EXPECT_TRUE(packet2_callback_received);
}
TEST_F(PacketTest, NullCallback) {
// Just verify we don't crash with a null callback.
auto vmo_mapper = CreateVmoBufferWithSize(128);
ASSERT_TRUE(vmo_mapper);
auto packet1 = allocator_.New(vmo_mapper, 0, Fixed(10), Fixed(0), dispatcher(), nullptr);
auto packet2 = allocator_.New(vmo_mapper, 0, Fixed(10), Fixed(0), nullptr, nullptr);
}
} // namespace
} // namespace media::audio