| // Copyright 2019 The Chromium OS 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 <stdint.h> |
| |
| #include <base/macros.h> |
| #include <base/posix/eintr_wrapper.h> |
| #include <gtest/gtest.h> |
| |
| #include "arc/vm/libvda/decode/test/decode_unittest_common.h" |
| |
| class LibvdaFakeTest : public ::testing::Test { |
| public: |
| LibvdaFakeTest() = default; |
| ~LibvdaFakeTest() override = default; |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(LibvdaFakeTest); |
| }; |
| |
| // Test that the fake implementation initializes and deinitializes |
| // successfully. |
| TEST_F(LibvdaFakeTest, InitializeFake) { |
| ImplPtr impl = SetupImpl(FAKE); |
| EXPECT_NE(impl, nullptr); |
| } |
| |
| // Test that the fake implementation creates and closes a decode session |
| // successfully. |
| TEST_F(LibvdaFakeTest, InitDecodeSessionFake) { |
| ImplPtr impl = SetupImpl(FAKE); |
| SessionPtr session = SetupSession(impl, H264PROFILE_MAIN); |
| ASSERT_NE(session, nullptr); |
| EXPECT_NE(session->ctx, nullptr); |
| EXPECT_GT(session->event_pipe_fd, 0); |
| } |
| |
| // Test that the fake implementation processes a decode event, and echoes back |
| // a PICTURE_READY event that can be read from the event FD. |
| TEST_F(LibvdaFakeTest, DecodeAndGetPictureReadyEventFake) { |
| ImplPtr impl = SetupImpl(FAKE); |
| SessionPtr session = SetupSession(impl, H264PROFILE_MAIN); |
| int32_t fake_bitstream_id = 12345; |
| vda_decode(session->ctx, fake_bitstream_id /* bitstream_id */, -1 /* fd */, |
| 0 /* offset */, 0 /* bytes_used */); |
| vda_event_t event; |
| ASSERT_GT( |
| HANDLE_EINTR(read(session->event_pipe_fd, &event, sizeof(vda_event_t))), |
| 0); |
| EXPECT_EQ(event.event_type, PICTURE_READY); |
| EXPECT_EQ(event.event_data.picture_ready.bitstream_id, fake_bitstream_id); |
| } |
| |
| // Test that the dummy implementation will process multiple events and return |
| // a response. |
| TEST_F(LibvdaFakeTest, ReadMultipleEventsFake) { |
| ImplPtr impl = SetupImpl(FAKE); |
| SessionPtr session = SetupSession(impl, H264PROFILE_MAIN); |
| vda_flush(session->ctx); |
| vda_event_t event; |
| EXPECT_GT( |
| HANDLE_EINTR(read(session->event_pipe_fd, &event, sizeof(vda_event_t))), |
| 0); |
| EXPECT_EQ(event.event_type, FLUSH_RESPONSE); |
| vda_reset(session->ctx); |
| EXPECT_GT( |
| HANDLE_EINTR(read(session->event_pipe_fd, &event, sizeof(vda_event_t))), |
| 0); |
| EXPECT_EQ(event.event_type, RESET_RESPONSE); |
| } |