// Copyright 2020 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 <fcntl.h>
#include <lib/zx/vmo.h>
#include <sys/stat.h>
#include <sys/types.h>

#include <gtest/gtest.h>

#include "src/media/sounds/soundplayer/ogg_demux.h"

namespace soundplayer {
namespace test {

class TestDiscardableSound : public DiscardableSound {
 public:
  TestDiscardableSound(fbl::unique_fd fd) : DiscardableSound(std::move(fd)) {}

  const zx::vmo& LockForRead() {
    auto& result = DiscardableSound::LockForRead();
    Restore();
    return result;
  }
};

constexpr uint64_t kGoldenHashArm64 = 3820812293088111280u;
constexpr uint64_t kGoldenHashX64 = 15504583706996406662u;
constexpr size_t kVmoNameBufSize = 32;
const char kExpectedVmoName[] = "soundplayer decoded sound";
static_assert(kVmoNameBufSize > sizeof(kExpectedVmoName));

// Demuxes and decodes a test opus file.
TEST(OggOpusTests, DemuxDecodeTestFile) {
  fbl::unique_fd fd = fbl::unique_fd(open("/pkg/data/testfile.ogg", O_RDONLY));
  EXPECT_NE(fd.get(), -1);

  OggDemux demux;
  DiscardableSound sound(std::move(fd));
  zx_status_t status = demux.Process(sound);

  EXPECT_EQ(ZX_OK, status);
  auto& vmo = sound.LockForRead();
  EXPECT_TRUE(!!vmo);
  EXPECT_EQ(530592u, sound.size());
  EXPECT_EQ(2u, sound.stream_type().channels);

  auto size = sound.size();

  // Do a simple hash of the data and compare against a golden value.
  auto buffer = std::make_unique<int16_t[]>(size / sizeof(int16_t));
  EXPECT_EQ(ZX_OK, vmo.read(buffer.get(), 0, size));

  int16_t* p = buffer.get();
  uint64_t hash = 0;
  for (uint64_t i = 0; i < size / sizeof(int16_t); ++i) {
    hash = ((hash << 5) + hash) + *p;
    ++p;
  }

  if (hash != kGoldenHashArm64 && hash != kGoldenHashX64) {
    // This will fail, displaying the value of |hash|. Note that either golden value passes
    // the test.
    EXPECT_EQ(kGoldenHashArm64, hash);
  }

  // Expect that the VMO is named.
  char name[kVmoNameBufSize];
  EXPECT_EQ(ZX_OK, vmo.get_property(ZX_PROP_NAME, name, sizeof(name)));
  EXPECT_EQ(0, strcmp(kExpectedVmoName, name));

  sound.Unlock();
}

// Demuxes and decodes a test opus file.
TEST(OggOpusTests, RestoreDemuxDecodeTestFile) {
  fbl::unique_fd fd = fbl::unique_fd(open("/pkg/data/testfile.ogg", O_RDONLY));
  EXPECT_NE(fd.get(), -1);

  OggDemux demux;
  // |TestDiscardableSound| always restores on |LockForRead|.
  TestDiscardableSound sound(std::move(fd));
  zx_status_t status = demux.Process(sound);

  EXPECT_EQ(ZX_OK, status);
  auto& vmo = sound.LockForRead();
  EXPECT_TRUE(!!vmo);
  EXPECT_EQ(530592u, sound.size());
  EXPECT_EQ(2u, sound.stream_type().channels);

  auto size = sound.size();

  // Do a simple hash of the data and compare against a golden value.
  auto buffer = std::make_unique<int16_t[]>(size / sizeof(int16_t));
  EXPECT_EQ(ZX_OK, vmo.read(buffer.get(), 0, size));

  int16_t* p = buffer.get();
  uint64_t hash = 0;
  for (uint64_t i = 0; i < size / sizeof(int16_t); ++i) {
    hash = ((hash << 5) + hash) + *p;
    ++p;
  }

  if (hash != kGoldenHashArm64 && hash != kGoldenHashX64) {
    // This will fail, displaying the value of |hash|. Note that either golden value passes
    // the test.
    EXPECT_EQ(kGoldenHashArm64, hash);
  }

  sound.Unlock();
}

}  // namespace test
}  // namespace soundplayer
