Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ab73119c authored by Santiago Seifert's avatar Santiago Seifert
Browse files

Add unit test for uninitialized read fix

Bug: 173720767
Test: atest IMediaPlayerTest
Change-Id: Ia3cbc0626d38ffec7a37760b984d521eb9c9874e
Merged-In: Ia3cbc0626d38ffec7a37760b984d521eb9c9874e
(cherry picked from commit f8905e67)
parent 2ba29909
Loading
Loading
Loading
Loading
+0 −48
Original line number Diff line number Diff line
@@ -34,54 +34,6 @@ namespace android {

using media::VolumeShaper;

enum {
    DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
    SET_DATA_SOURCE_URL,
    SET_DATA_SOURCE_FD,
    SET_DATA_SOURCE_STREAM,
    SET_DATA_SOURCE_CALLBACK,
    SET_DATA_SOURCE_RTP,
    SET_BUFFERING_SETTINGS,
    GET_BUFFERING_SETTINGS,
    PREPARE_ASYNC,
    START,
    STOP,
    IS_PLAYING,
    SET_PLAYBACK_SETTINGS,
    GET_PLAYBACK_SETTINGS,
    SET_SYNC_SETTINGS,
    GET_SYNC_SETTINGS,
    PAUSE,
    SEEK_TO,
    GET_CURRENT_POSITION,
    GET_DURATION,
    RESET,
    NOTIFY_AT,
    SET_AUDIO_STREAM_TYPE,
    SET_LOOPING,
    SET_VOLUME,
    INVOKE,
    SET_METADATA_FILTER,
    GET_METADATA,
    SET_AUX_EFFECT_SEND_LEVEL,
    ATTACH_AUX_EFFECT,
    SET_VIDEO_SURFACETEXTURE,
    SET_PARAMETER,
    GET_PARAMETER,
    SET_RETRANSMIT_ENDPOINT,
    GET_RETRANSMIT_ENDPOINT,
    SET_NEXT_PLAYER,
    APPLY_VOLUME_SHAPER,
    GET_VOLUME_SHAPER_STATE,
    // Modular DRM
    PREPARE_DRM,
    RELEASE_DRM,
    // AudioRouting
    SET_OUTPUT_DEVICE,
    GET_ROUTED_DEVICE_ID,
    ENABLE_AUDIO_DEVICE_CALLBACK,
};

// ModDrm helpers
static void readVector(const Parcel& reply, Vector<uint8_t>& vector) {
    uint32_t size = reply.readUint32();
+50 −0
Original line number Diff line number Diff line
@@ -137,6 +137,56 @@ public:
    virtual status_t        setOutputDevice(audio_port_handle_t deviceId) = 0;
    virtual status_t        getRoutedDeviceId(audio_port_handle_t *deviceId) = 0;
    virtual status_t        enableAudioDeviceCallback(bool enabled) = 0;
protected:

    friend class IMediaPlayerTest;
    enum {
        DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
        SET_DATA_SOURCE_URL,
        SET_DATA_SOURCE_FD,
        SET_DATA_SOURCE_STREAM,
        SET_DATA_SOURCE_CALLBACK,
        SET_DATA_SOURCE_RTP,
        SET_BUFFERING_SETTINGS,
        GET_BUFFERING_SETTINGS,
        PREPARE_ASYNC,
        START,
        STOP,
        IS_PLAYING,
        SET_PLAYBACK_SETTINGS,
        GET_PLAYBACK_SETTINGS,
        SET_SYNC_SETTINGS,
        GET_SYNC_SETTINGS,
        PAUSE,
        SEEK_TO,
        GET_CURRENT_POSITION,
        GET_DURATION,
        RESET,
        NOTIFY_AT,
        SET_AUDIO_STREAM_TYPE,
        SET_LOOPING,
        SET_VOLUME,
        INVOKE,
        SET_METADATA_FILTER,
        GET_METADATA,
        SET_AUX_EFFECT_SEND_LEVEL,
        ATTACH_AUX_EFFECT,
        SET_VIDEO_SURFACETEXTURE,
        SET_PARAMETER,
        GET_PARAMETER,
        SET_RETRANSMIT_ENDPOINT,
        GET_RETRANSMIT_ENDPOINT,
        SET_NEXT_PLAYER,
        APPLY_VOLUME_SHAPER,
        GET_VOLUME_SHAPER_STATE,
        // Modular DRM
        PREPARE_DRM,
        RELEASE_DRM,
        // AudioRouting
        SET_OUTPUT_DEVICE,
        GET_ROUTED_DEVICE_ID,
        ENABLE_AUDIO_DEVICE_CALLBACK,
    };
};

// ----------------------------------------------------------------------------
+39 −0
Original line number Diff line number Diff line
/*
 * Copyright 2021 The Android Open Source Project
 *
 * 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.
 */

cc_test {
    name: "IMediaPlayerTest",
    test_suites: ["device-tests", "mts"],
    gtest: true,

    srcs: [
        "IMediaPlayerTest.cpp",
    ],

    shared_libs: [
        "libbinder",
        "liblog",
        "libmedia",
        "libstagefright",
        "libstagefright_foundation",
        "libutils",
    ],
    compile_multilib: "first",
    cflags: [
        "-Werror",
        "-Wall",
    ],
}
+73 −0
Original line number Diff line number Diff line
/*
 * Copyright 2021 The Android Open Source Project
 *
 * 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 <binder/IServiceManager.h>
#include <binder/Parcel.h>
#include <gtest/gtest.h>
#include <media/stagefright/foundation/ABuffer.h>
#include <media/IMediaPlayer.h>
#include <media/IMediaPlayerService.h>
#include <media/mediaplayer.h>

namespace android {

constexpr uint8_t kMockByteArray[16] = {};

 class IMediaPlayerTest : public testing::Test {
  protected:
   static constexpr uint32_t PREPARE_DRM = IMediaPlayer::PREPARE_DRM;

   void SetUp() override {
    mediaPlayer_ = sp<MediaPlayer>::make();
    sp<IServiceManager> serviceManager = defaultServiceManager();
    sp<IBinder> mediaPlayerService = serviceManager->getService(String16("media.player"));
    sp<IMediaPlayerService> iMediaPlayerService =
            IMediaPlayerService::asInterface(mediaPlayerService);
    iMediaPlayer_ = iMediaPlayerService->create(mediaPlayer_);
   }

   sp<MediaPlayer> mediaPlayer_;
   sp<IMediaPlayer> iMediaPlayer_;
 };

TEST_F(IMediaPlayerTest, PrepareDrmInvalidTransaction) {
    Parcel data, reply;
    data.writeInterfaceToken(iMediaPlayer_->getInterfaceDescriptor());
    data.write(kMockByteArray, 16);

    // We write a length greater than the following session id array. Should be discarded.
    data.writeUint32(2);
    data.writeUnpadded(kMockByteArray, 1);

    status_t result = IMediaPlayer::asBinder(iMediaPlayer_)
            ->transact(PREPARE_DRM, data, &reply);
    ASSERT_EQ(result, BAD_VALUE);
}

TEST_F(IMediaPlayerTest, PrepareDrmValidTransaction) {
    Parcel data, reply;
    data.writeInterfaceToken(iMediaPlayer_->getInterfaceDescriptor());
    data.write(kMockByteArray, 16);

    // We write a length equal to the length of the following data. The transaction should be valid.
    data.writeUint32(1);
    data.write(kMockByteArray, 1);

    status_t result = IMediaPlayer::asBinder(iMediaPlayer_)
            ->transact(PREPARE_DRM, data, &reply);
    ASSERT_EQ(result, OK);
}
}  // namespace android