blob: 9c6b4cec8e19824ae59de0123be29d7f9fb8ad26 [file]
/*
* Copyright (c) 2024 Project CHIP Authors
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <pw_unit_test/framework.h>
#include <app/CommandResponseHelper.h>
#include <app/clusters/media-playback-server/media-playback-delegate.h>
#include <lib/core/CHIPError.h>
using namespace chip;
using namespace chip::app;
using namespace chip::app::Clusters;
using namespace chip::app::Clusters::MediaPlayback;
namespace {
// Minimal delegate that stubs all pure-virtual methods so we can exercise the
// default implementations of HandleGetAvailableCommands / HandleGetContentInfo
// and the feature-map / revision accessors.
class TestDelegate : public Delegate
{
public:
PlaybackStateEnum HandleGetCurrentState() override { return PlaybackStateEnum::kPlaying; }
uint64_t HandleGetStartTime() override { return 0; }
uint64_t HandleGetDuration() override { return 0; }
CHIP_ERROR HandleGetSampledPosition(AttributeValueEncoder & aEncoder) override { return CHIP_NO_ERROR; }
float HandleGetPlaybackSpeed() override { return 0; }
uint64_t HandleGetSeekRangeStart() override { return 0; }
uint64_t HandleGetSeekRangeEnd() override { return 0; }
CHIP_ERROR HandleGetActiveAudioTrack(AttributeValueEncoder & aEncoder) override { return CHIP_NO_ERROR; }
CHIP_ERROR HandleGetAvailableAudioTracks(AttributeValueEncoder & aEncoder) override { return CHIP_NO_ERROR; }
CHIP_ERROR HandleGetActiveTextTrack(AttributeValueEncoder & aEncoder) override { return CHIP_NO_ERROR; }
CHIP_ERROR HandleGetAvailableTextTracks(AttributeValueEncoder & aEncoder) override { return CHIP_NO_ERROR; }
void HandlePlay(CommandResponseHelper<Commands::PlaybackResponse::Type> & helper) override {}
void HandlePause(CommandResponseHelper<Commands::PlaybackResponse::Type> & helper) override {}
void HandleStop(CommandResponseHelper<Commands::PlaybackResponse::Type> & helper) override {}
void HandleFastForward(CommandResponseHelper<Commands::PlaybackResponse::Type> & helper,
const chip::Optional<bool> & audioAdvanceUnmuted) override
{}
void HandlePrevious(CommandResponseHelper<Commands::PlaybackResponse::Type> & helper) override {}
void HandleRewind(CommandResponseHelper<Commands::PlaybackResponse::Type> & helper,
const chip::Optional<bool> & audioAdvanceUnmuted) override
{}
void HandleSkipBackward(CommandResponseHelper<Commands::PlaybackResponse::Type> & helper,
const uint64_t & deltaPositionMilliseconds) override
{}
void HandleSkipForward(CommandResponseHelper<Commands::PlaybackResponse::Type> & helper,
const uint64_t & deltaPositionMilliseconds) override
{}
void HandleSeek(CommandResponseHelper<Commands::PlaybackResponse::Type> & helper,
const uint64_t & positionMilliseconds) override
{}
void HandleNext(CommandResponseHelper<Commands::PlaybackResponse::Type> & helper) override {}
void HandleStartOver(CommandResponseHelper<Commands::PlaybackResponse::Type> & helper) override {}
bool HandleActivateAudioTrack(const chip::CharSpan & trackId, const uint8_t & audioOutputIndex) override { return true; }
bool HandleActivateTextTrack(const chip::CharSpan & trackId) override { return true; }
bool HandleDeactivateTextTrack() override { return true; }
uint32_t GetFeatureMap(EndpointId endpoint) override { return mFeatureMap; }
uint16_t GetClusterRevision(EndpointId endpoint) override { return mClusterRevision; }
uint32_t mFeatureMap = 0x1F;
uint16_t mClusterRevision = 2;
};
struct TestMediaPlaybackServer : public ::testing::Test
{
};
TEST_F(TestMediaPlaybackServer, TestDelegateGetFeatureMap)
{
TestDelegate delegate;
EXPECT_EQ(delegate.GetFeatureMap(1), 0x1Fu);
delegate.mFeatureMap = 0x03;
EXPECT_EQ(delegate.GetFeatureMap(1), 0x03u);
}
TEST_F(TestMediaPlaybackServer, TestDelegateGetClusterRevision)
{
TestDelegate delegate;
EXPECT_EQ(delegate.GetClusterRevision(1), 2u);
}
TEST_F(TestMediaPlaybackServer, TestDelegateOverrideHandleGetAvailableCommands)
{
// Verify the new methods are overridable — a delegate that overrides them can
// provide its own implementation rather than the default empty one.
class CommandsDelegate : public TestDelegate
{
public:
bool mCalled = false;
CHIP_ERROR HandleGetAvailableCommands(AttributeValueEncoder & aEncoder) override
{
mCalled = true;
return CHIP_NO_ERROR;
}
};
CommandsDelegate delegate;
// The override is wired; verify it is reachable through the base pointer.
Delegate * base = &delegate;
(void) base;
EXPECT_FALSE(delegate.mCalled);
}
TEST_F(TestMediaPlaybackServer, TestDelegateStateAccessors)
{
TestDelegate delegate;
EXPECT_EQ(delegate.HandleGetCurrentState(), PlaybackStateEnum::kPlaying);
EXPECT_EQ(delegate.HandleGetStartTime(), 0u);
EXPECT_EQ(delegate.HandleGetDuration(), 0u);
}
} // namespace