/* GStreamer
 *
 * unit test for the id3tag element
 *
 * Copyright (C) 2006 Tim-Philipp Müller  <tim centricular net>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

#include <gst/check/gstcheck.h>

#include <gst/gst.h>
#include <string.h>

#define TEST_ARTIST           "Ar T\303\255st"
#define TEST_TITLE            "M\303\274llermilch!"
#define TEST_ALBUM            "Boom"
#define TEST_DATE             g_date_new_dmy(1,1,2006)
#define TEST_TRACK_NUMBER     7
#define TEST_TRACK_COUNT      19
#define TEST_VOLUME_NUMBER    2
#define TEST_VOLUME_COUNT     3
#define TEST_TRACK_GAIN      1.45
#define TEST_ALBUM_GAIN      0.78
#define TEST_TRACK_PEAK      0.83
#define TEST_ALBUM_PEAK      0.18
#define TEST_BPM             113.0

/* for dummy mp3 frame sized MP3_FRAME_SIZE bytes,
 * start: ff fb b0 44 00 00 08 00  00 4b 00 00 00 00 00 00 */
static const guint8 mp3_dummyhdr[] = { 0xff, 0xfb, 0xb0, 0x44, 0x00, 0x00,
  0x08, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00
};

static const guint8 privatedata[] = { 0x99, 0x66, 0x33, 0x11, 0x22, 0x44 };

#define MP3_FRAME_SIZE 626

/* the peak and gain values are stored pretty roughly, so check that they're
 * within 2% of the expected value.
 */
#define fail_unless_sorta_equals_float(a, b)				\
G_STMT_START {								\
  double first = a;							\
  double second = b;							\
  fail_unless(fabs (first - second) < (0.02 * fabs (first)),		\
      "'" #a "' (%g) is not equal to '" #b "' (%g)", first, second);	\
} G_STMT_END;


static GstTagList *
test_taglib_id3mux_create_tags (guint32 mask)
{
  GstTagList *tags;

  tags = gst_tag_list_new_empty ();

  if (mask & (1 << 0)) {
    gst_tag_list_add (tags, GST_TAG_MERGE_KEEP,
        GST_TAG_ARTIST, TEST_ARTIST, NULL);
  }
  if (mask & (1 << 1)) {
    gst_tag_list_add (tags, GST_TAG_MERGE_KEEP,
        GST_TAG_TITLE, TEST_TITLE, NULL);
  }
  if (mask & (1 << 2)) {
    gst_tag_list_add (tags, GST_TAG_MERGE_KEEP,
        GST_TAG_ALBUM, TEST_ALBUM, NULL);
  }
  if (mask & (1 << 3)) {
    GDate *date;

    date = TEST_DATE;
    gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, GST_TAG_DATE, date, NULL);
    g_date_free (date);
  }
  if (mask & (1 << 4)) {
    gst_tag_list_add (tags, GST_TAG_MERGE_KEEP,
        GST_TAG_TRACK_NUMBER, TEST_TRACK_NUMBER, NULL);
  }
  if (mask & (1 << 5)) {
    gst_tag_list_add (tags, GST_TAG_MERGE_KEEP,
        GST_TAG_TRACK_COUNT, TEST_TRACK_COUNT, NULL);
  }
  if (mask & (1 << 6)) {
    gst_tag_list_add (tags, GST_TAG_MERGE_KEEP,
        GST_TAG_ALBUM_VOLUME_NUMBER, TEST_VOLUME_NUMBER, NULL);
  }
  if (mask & (1 << 7)) {
    gst_tag_list_add (tags, GST_TAG_MERGE_KEEP,
        GST_TAG_ALBUM_VOLUME_COUNT, TEST_VOLUME_COUNT, NULL);
  }
  if (mask & (1 << 8)) {
    gst_tag_list_add (tags, GST_TAG_MERGE_KEEP,
        GST_TAG_TRACK_GAIN, TEST_TRACK_GAIN, NULL);
  }
  if (mask & (1 << 9)) {
    gst_tag_list_add (tags, GST_TAG_MERGE_KEEP,
        GST_TAG_ALBUM_GAIN, TEST_ALBUM_GAIN, NULL);
  }
  if (mask & (1 << 10)) {
    gst_tag_list_add (tags, GST_TAG_MERGE_KEEP,
        GST_TAG_TRACK_PEAK, TEST_TRACK_PEAK, NULL);
  }
  if (mask & (1 << 11)) {
    gst_tag_list_add (tags, GST_TAG_MERGE_KEEP,
        GST_TAG_ALBUM_PEAK, TEST_ALBUM_PEAK, NULL);
  }
  if (mask & (1 << 12)) {
    gst_tag_list_add (tags, GST_TAG_MERGE_KEEP,
        GST_TAG_BEATS_PER_MINUTE, TEST_BPM, NULL);
  }
  if (mask & (1 << 13)) {
    GstSample *sample;
    GstBuffer *buf;

    buf = gst_buffer_new_and_alloc (sizeof (privatedata));
    gst_buffer_fill (buf, 0, privatedata, sizeof (privatedata));
    sample = gst_sample_new (buf, NULL, NULL,
        gst_structure_new ("ID3PrivateFrame",
            "owner", G_TYPE_STRING, "me", NULL));
    gst_buffer_unref (buf);
    gst_tag_list_add (tags, GST_TAG_MERGE_KEEP,
        GST_TAG_PRIVATE_DATA, sample, NULL);
    gst_sample_unref (sample);
  }
  if (mask & (1 << 14)) {
  }
  return tags;
}

static gboolean
utf_string_in_buf (GstBuffer * buf, const gchar * s, int v2version)
{
  gint i, len;
  gchar *free_str = NULL;
  GstMapInfo map;

  if (v2version == 3) {
    free_str = g_convert (s, -1, "UTF-16LE", "UTF-8", NULL, NULL, NULL);
    s = free_str;
  }

  len = strlen (s);
  gst_buffer_map (buf, &map, GST_MAP_READ);
  for (i = 0; i < (map.size - len); ++i) {
    if (memcmp (map.data + i, s, len) == 0) {
      gst_buffer_unmap (buf, &map);
      g_free (free_str);
      return TRUE;
    }
  }
  gst_buffer_unmap (buf, &map);

  g_free (free_str);
  return FALSE;
}

static void
test_taglib_id3mux_check_tag_buffer (GstBuffer * buf, guint32 mask,
    int v2version)
{
  /* make sure our UTF-8 string hasn't been put into the tag as ISO-8859-1 */
  if (mask & (1 << 0)) {
    fail_unless (utf_string_in_buf (buf, TEST_ARTIST, v2version));
  }
  /* make sure our UTF-8 string hasn't been put into the tag as ISO-8859-1 */
  if (mask & (1 << 1)) {
    fail_unless (utf_string_in_buf (buf, TEST_TITLE, v2version));
  }
  /* make sure our UTF-8 string hasn't been put into the tag as ISO-8859-1 */
  if (mask & (1 << 2)) {
    fail_unless (utf_string_in_buf (buf, TEST_ALBUM, v2version));
  }
}

static void
test_taglib_id3mux_check_tags (GstTagList * tags, guint32 mask, int v2version)
{
  if (mask & (1 << 0)) {
    gchar *s = NULL;

    fail_unless (gst_tag_list_get_string (tags, GST_TAG_ARTIST, &s));
    fail_unless (g_str_equal (s, TEST_ARTIST));
    g_free (s);
  }
  if (mask & (1 << 1)) {
    gchar *s = NULL;

    fail_unless (gst_tag_list_get_string (tags, GST_TAG_TITLE, &s));
    fail_unless (g_str_equal (s, TEST_TITLE));
    g_free (s);
  }
  if (mask & (1 << 2)) {
    gchar *s = NULL;

    fail_unless (gst_tag_list_get_string (tags, GST_TAG_ALBUM, &s));
    fail_unless (g_str_equal (s, TEST_ALBUM));
    g_free (s);
  }
  if (mask & (1 << 3)) {
    GDate *shouldbe, *date = NULL;

    shouldbe = TEST_DATE;
    fail_unless (gst_tag_list_get_date (tags, GST_TAG_DATE, &date));
    fail_unless (g_date_compare (shouldbe, date) == 0);
    g_date_free (shouldbe);
    g_date_free (date);
  }
  if (mask & (1 << 4)) {
    guint num;

    fail_unless (gst_tag_list_get_uint (tags, GST_TAG_TRACK_NUMBER, &num));
    fail_unless (num == TEST_TRACK_NUMBER);
  }
  if (mask & (1 << 5)) {
    guint count;

    fail_unless (gst_tag_list_get_uint (tags, GST_TAG_TRACK_COUNT, &count));
    fail_unless (count == TEST_TRACK_COUNT);
  }
  if (mask & (1 << 6)) {
    guint num;

    fail_unless (gst_tag_list_get_uint (tags, GST_TAG_ALBUM_VOLUME_NUMBER,
            &num));
    fail_unless (num == TEST_VOLUME_NUMBER);
  }
  if (mask & (1 << 7)) {
    guint count;

    fail_unless (gst_tag_list_get_uint (tags, GST_TAG_ALBUM_VOLUME_COUNT,
            &count));
    fail_unless (count == TEST_VOLUME_COUNT);
  }
  if (mask & (1 << 8)) {
    gdouble gain;

    if (v2version == 4) {
      fail_unless (gst_tag_list_get_double (tags, GST_TAG_TRACK_GAIN, &gain));
      fail_unless_sorta_equals_float (gain, TEST_TRACK_GAIN);
    }
  }
  if (mask & (1 << 9)) {
    gdouble gain;

    if (v2version == 4) {
      fail_unless (gst_tag_list_get_double (tags, GST_TAG_ALBUM_GAIN, &gain));
      fail_unless_sorta_equals_float (gain, TEST_ALBUM_GAIN);
    }
  }
  if (mask & (1 << 10)) {
    gdouble peak;

    if (v2version == 4) {
      fail_unless (gst_tag_list_get_double (tags, GST_TAG_TRACK_PEAK, &peak));
      fail_unless_sorta_equals_float (peak, TEST_TRACK_PEAK);
    }
  }
  if (mask & (1 << 11)) {
    gdouble peak;

    if (v2version == 4) {
      fail_unless (gst_tag_list_get_double (tags, GST_TAG_ALBUM_PEAK, &peak));
      fail_unless_sorta_equals_float (peak, TEST_ALBUM_PEAK);
    }
  }
  if (mask & (1 << 12)) {
    gdouble bpm;

    fail_unless (gst_tag_list_get_double (tags, GST_TAG_BEATS_PER_MINUTE,
            &bpm));
    fail_unless_sorta_equals_float (bpm, TEST_BPM);
  }
  if (mask & (1 << 13)) {
    GstSample *sample = NULL;
    const GstStructure *info;
    GstBuffer *buf;

    fail_unless (gst_tag_list_get_sample (tags, GST_TAG_PRIVATE_DATA, &sample));
    fail_unless (sample != NULL);
    buf = gst_sample_get_buffer (sample);
    fail_if (gst_buffer_memcmp (buf, 0, privatedata, sizeof (privatedata)));
    info = gst_sample_get_info (sample);
    fail_unless (gst_structure_has_name (info, "ID3PrivateFrame"));
    fail_unless_equals_string (gst_structure_get_string (info, "owner"), "me");
    gst_sample_unref (sample);
  }
  if (mask & (1 << 14)) {
  }
}

static void
fill_mp3_buffer (GstElement * fakesrc, GstBuffer * buf, GstPad * pad,
    guint64 * p_offset)
{
  fail_unless (gst_buffer_get_size (buf) == MP3_FRAME_SIZE);

  GST_LOG ("filling buffer with fake mp3 data, offset = %" G_GUINT64_FORMAT,
      *p_offset);

  gst_buffer_fill (buf, 0, mp3_dummyhdr, sizeof (mp3_dummyhdr));

#if 0
  /* can't use gst_buffer_set_caps() here because the metadata isn't writable
   * because of the extra refcounts taken by the signal emission mechanism;
   * we know it's fine to use GST_BUFFER_CAPS() here though */
  GST_BUFFER_CAPS (buf) = gst_caps_new_simple ("audio/mpeg", "mpegversion",
      G_TYPE_INT, 1, "layer", G_TYPE_INT, 3, NULL);
#endif

  GST_BUFFER_OFFSET (buf) = *p_offset;
  *p_offset += gst_buffer_get_size (buf);
}

static void
got_buffer (GstElement * fakesink, GstBuffer * buf, GstPad * pad,
    GstBuffer ** p_buf)
{
  GstMapInfo map;
  gint64 off;
  guint size;

  off = GST_BUFFER_OFFSET (buf);
  gst_buffer_map (buf, &map, GST_MAP_READ);
  size = map.size;

  GST_LOG ("got buffer, size=%u, offset=%" G_GINT64_FORMAT, size, off);

  fail_unless (GST_BUFFER_OFFSET_IS_VALID (buf));

  if (*p_buf == NULL || (off + size) > gst_buffer_get_size (*p_buf)) {
    GstBuffer *newbuf;

    /* not very elegant, but who cares */
    newbuf = gst_buffer_new_and_alloc (off + size);
    if (*p_buf) {
      GstMapInfo pmap;

      gst_buffer_map (*p_buf, &pmap, GST_MAP_READ);
      gst_buffer_fill (newbuf, 0, pmap.data, pmap.size);
      gst_buffer_unmap (*p_buf, &pmap);
    }
    gst_buffer_fill (newbuf, off, map.data, size);

    if (*p_buf)
      gst_buffer_unref (*p_buf);
    *p_buf = newbuf;
  } else {
    gst_buffer_fill (*p_buf, off, map.data, size);
  }
  gst_buffer_unmap (buf, &map);
}

static void
test_taglib_id3mux_check_output_buffer (GstBuffer * buf)
{
  GstMapInfo map;
  guint off;

  gst_buffer_map (buf, &map, GST_MAP_READ);

  g_assert (map.size % MP3_FRAME_SIZE == 0);

  for (off = 0; off < map.size; off += MP3_FRAME_SIZE) {
    fail_unless (memcmp (map.data + off, mp3_dummyhdr,
            sizeof (mp3_dummyhdr)) == 0);
  }
  gst_buffer_unmap (buf, &map);
}

static void
identity_cb (GstElement * identity, GstBuffer * buf, GstBuffer ** p_tagbuf)
{
  if (*p_tagbuf == NULL) {
    *p_tagbuf = gst_buffer_ref (buf);
  }
}

static void
test_taglib_id3mux_with_tags (GstTagList * tags, guint32 mask, int v2version)
{
  GstMessage *msg;
  GstTagList *tags_read = NULL;
  GstElement *pipeline, *id3mux, *id3demux, *fakesrc, *identity, *fakesink;
  GstBus *bus;
  guint64 offset;
  GstBuffer *outbuf = NULL;
  GstBuffer *tagbuf = NULL;
  GstStateChangeReturn state_result;

  pipeline = gst_pipeline_new ("pipeline");
  g_assert (pipeline != NULL);

  fakesrc = gst_element_factory_make ("fakesrc", "fakesrc");
  g_assert (fakesrc != NULL);

  id3mux = gst_element_factory_make ("id3mux", "id3mux");
  g_assert (id3mux != NULL);
  g_object_set (id3mux, "v2-version", v2version, NULL);

  identity = gst_element_factory_make ("identity", "identity");
  g_assert (identity != NULL);

  id3demux = gst_element_factory_make ("id3demux", "id3demux");
  g_assert (id3demux != NULL);

  fakesink = gst_element_factory_make ("fakesink", "fakesink");
  g_assert (fakesink != NULL);

  /* set up sink */
  outbuf = NULL;
  g_object_set (fakesink, "signal-handoffs", TRUE, NULL);
  g_signal_connect (fakesink, "handoff", G_CALLBACK (got_buffer), &outbuf);

  gst_bin_add (GST_BIN (pipeline), fakesrc);
  gst_bin_add (GST_BIN (pipeline), id3mux);
  gst_bin_add (GST_BIN (pipeline), identity);
  gst_bin_add (GST_BIN (pipeline), id3demux);
  gst_bin_add (GST_BIN (pipeline), fakesink);

  gst_tag_setter_merge_tags (GST_TAG_SETTER (id3mux), tags,
      GST_TAG_MERGE_APPEND);

  gst_element_link_many (fakesrc, id3mux, identity, id3demux, fakesink, NULL);

  /* set up source */
  g_object_set (fakesrc, "signal-handoffs", TRUE, "can-activate-pull", FALSE,
      "filltype", 2, "sizetype", 2, "sizemax", MP3_FRAME_SIZE,
      "num-buffers", 16, NULL);

  offset = 0;
  g_signal_connect (fakesrc, "handoff", G_CALLBACK (fill_mp3_buffer), &offset);

  /* set up identity to catch tag buffer */
  g_signal_connect (identity, "handoff", G_CALLBACK (identity_cb), &tagbuf);

  GST_LOG ("setting and getting state ...");
  gst_element_set_state (pipeline, GST_STATE_PLAYING);
  state_result = gst_element_get_state (pipeline, NULL, NULL, -1);
  fail_unless (state_result == GST_STATE_CHANGE_SUCCESS,
      "Unexpected result from get_state(). Expected success, got %d",
      state_result);

  bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));

  GST_LOG ("Waiting for tag ...");
  msg =
      gst_bus_poll (bus, GST_MESSAGE_TAG | GST_MESSAGE_EOS | GST_MESSAGE_ERROR,
      -1);
  if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) {
    GError *err;
    gchar *dbg;

    gst_message_parse_error (msg, &err, &dbg);
    g_printerr ("ERROR from element %s: %s\n%s\n",
        GST_OBJECT_NAME (msg->src), err->message, GST_STR_NULL (dbg));
    g_error_free (err);
    g_free (dbg);
  } else if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS) {
    g_printerr ("EOS message, but were waiting for TAGS!\n");
  }
  fail_unless (msg->type == GST_MESSAGE_TAG);

  gst_message_parse_tag (msg, &tags_read);
  gst_message_unref (msg);

  GST_LOG ("Got tags: %" GST_PTR_FORMAT, tags_read);
  test_taglib_id3mux_check_tags (tags_read, mask, v2version);
  gst_tag_list_unref (tags_read);

  fail_unless (tagbuf != NULL);
  test_taglib_id3mux_check_tag_buffer (tagbuf, mask, v2version);
  gst_buffer_unref (tagbuf);

  GST_LOG ("Waiting for EOS ...");
  msg = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1);
  if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) {
    GError *err;
    gchar *dbg;

    gst_message_parse_error (msg, &err, &dbg);
    g_printerr ("ERROR from element %s: %s\n%s\n",
        GST_OBJECT_NAME (msg->src), err->message, GST_STR_NULL (dbg));
    g_error_free (err);
    g_free (dbg);
  }
  fail_unless (msg->type == GST_MESSAGE_EOS);
  gst_message_unref (msg);

  gst_object_unref (bus);

  GST_LOG ("Got EOS, shutting down ...");
  gst_element_set_state (pipeline, GST_STATE_NULL);
  gst_object_unref (pipeline);

  test_taglib_id3mux_check_output_buffer (outbuf);
  gst_buffer_unref (outbuf);

  GST_LOG ("Done");
}

static void
run_id3mux_test (int v2version)
{
  GstTagList *tags;
  gint i;

  g_random_set_seed (247166295);

  /* internal consistency check */
  tags = test_taglib_id3mux_create_tags (0xFFFFFFFF);
  test_taglib_id3mux_check_tags (tags, 0xFFFFFFFF, v2version);
  gst_tag_list_unref (tags);

  /* now the real tests */
  for (i = 0; i < 50; ++i) {
    guint32 mask;

    mask = g_random_int ();
    GST_LOG ("tag mask = %08x (i=%d)", mask, i);

    if (mask == 0)
      continue;

    /* create tags */
    tags = test_taglib_id3mux_create_tags (mask);
    GST_LOG ("tags for mask %08x = %" GST_PTR_FORMAT, mask, tags);

    /* double-check for internal consistency */
    test_taglib_id3mux_check_tags (tags, mask, v2version);

    /* test with pipeline */
    test_taglib_id3mux_with_tags (tags, mask, v2version);

    /* free tags */
    gst_tag_list_unref (tags);
  }
}

GST_START_TEST (test_id3mux_v2_3)
{
  run_id3mux_test (3);
}

GST_END_TEST;

GST_START_TEST (test_id3mux_v2_4)
{
  run_id3mux_test (4);
}

GST_END_TEST;

static Suite *
id3mux_suite (void)
{
  Suite *s = suite_create ("id3mux");
  TCase *tc_chain = tcase_create ("general");

  suite_add_tcase (s, tc_chain);

  if (gst_registry_check_feature_version (gst_registry_get (), "id3demux",
          GST_VERSION_MAJOR, GST_VERSION_MINOR, 0)) {
    tcase_add_test (tc_chain, test_id3mux_v2_3);
    tcase_add_test (tc_chain, test_id3mux_v2_4);
  } else {
    GST_WARNING ("id3demux element not available, skipping tests");
  }

  return s;
}

GST_CHECK_MAIN (id3mux);
