Blame elf/tst-dl-hwcaps_split.c

Packit Service 237526
/* Unit tests for dl-hwcaps.c.
Packit Service 237526
   Copyright (C) 2020 Free Software Foundation, Inc.
Packit Service 237526
   This file is part of the GNU C Library.
Packit Service 237526
Packit Service 237526
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 237526
   modify it under the terms of the GNU Lesser General Public
Packit Service 237526
   License as published by the Free Software Foundation; either
Packit Service 237526
   version 2.1 of the License, or (at your option) any later version.
Packit Service 237526
Packit Service 237526
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 237526
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 237526
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 237526
   Lesser General Public License for more details.
Packit Service 237526
Packit Service 237526
   You should have received a copy of the GNU Lesser General Public
Packit Service 237526
   License along with the GNU C Library; if not, see
Packit Service 237526
   <https://www.gnu.org/licenses/>.  */
Packit Service 237526
Packit Service 237526
#include <array_length.h>
Packit Service 237526
#include <dl-hwcaps.h>
Packit Service 237526
#include <string.h>
Packit Service 237526
#include <support/check.h>
Packit Service 237526
Packit Service 237526
static void
Packit Service 237526
check_split_masked (const char *input, int32_t bitmask, const char *mask,
Packit Service 237526
                    const char *expected[], size_t expected_length)
Packit Service 237526
{
Packit Service 237526
  struct dl_hwcaps_split_masked split;
Packit Service 237526
  _dl_hwcaps_split_masked_init (&split, input, bitmask, mask);
Packit Service 237526
  size_t index = 0;
Packit Service 237526
  while (_dl_hwcaps_split_masked (&split))
Packit Service 237526
    {
Packit Service 237526
      TEST_VERIFY_EXIT (index < expected_length);
Packit Service 237526
      TEST_COMPARE_BLOB (expected[index], strlen (expected[index]),
Packit Service 237526
                         split.split.segment, split.split.length);
Packit Service 237526
      ++index;
Packit Service 237526
    }
Packit Service 237526
  TEST_COMPARE (index, expected_length);
Packit Service 237526
}
Packit Service 237526
Packit Service 237526
static void
Packit Service 237526
check_split (const char *input,
Packit Service 237526
             const char *expected[], size_t expected_length)
Packit Service 237526
{
Packit Service 237526
  struct dl_hwcaps_split split;
Packit Service 237526
  _dl_hwcaps_split_init (&split, input);
Packit Service 237526
  size_t index = 0;
Packit Service 237526
  while (_dl_hwcaps_split (&split))
Packit Service 237526
    {
Packit Service 237526
      TEST_VERIFY_EXIT (index < expected_length);
Packit Service 237526
      TEST_COMPARE_BLOB (expected[index], strlen (expected[index]),
Packit Service 237526
                         split.segment, split.length);
Packit Service 237526
      ++index;
Packit Service 237526
    }
Packit Service 237526
  TEST_COMPARE (index, expected_length);
Packit Service 237526
Packit Service 237526
  /* Reuse the test cases with masking that does not actually remove
Packit Service 237526
     anything.  */
Packit Service 237526
  check_split_masked (input, -1, NULL, expected, expected_length);
Packit Service 237526
  check_split_masked (input, -1, input, expected, expected_length);
Packit Service 237526
}
Packit Service 237526
Packit Service 237526
static int
Packit Service 237526
do_test (void)
Packit Service 237526
{
Packit Service 237526
  /* Splitting tests, without masking.  */
Packit Service 237526
  check_split (NULL, NULL, 0);
Packit Service 237526
  check_split ("", NULL, 0);
Packit Service 237526
  check_split (":", NULL, 0);
Packit Service 237526
  check_split ("::", NULL, 0);
Packit Service 237526
Packit Service 237526
  {
Packit Service 237526
    const char *expected[] = { "first" };
Packit Service 237526
    check_split ("first", expected, array_length (expected));
Packit Service 237526
    check_split (":first", expected, array_length (expected));
Packit Service 237526
    check_split ("first:", expected, array_length (expected));
Packit Service 237526
    check_split (":first:", expected, array_length (expected));
Packit Service 237526
  }
Packit Service 237526
Packit Service 237526
  {
Packit Service 237526
    const char *expected[] = { "first", "second" };
Packit Service 237526
    check_split ("first:second", expected, array_length (expected));
Packit Service 237526
    check_split ("first::second", expected, array_length (expected));
Packit Service 237526
    check_split (":first:second", expected, array_length (expected));
Packit Service 237526
    check_split ("first:second:", expected, array_length (expected));
Packit Service 237526
    check_split (":first:second:", expected, array_length (expected));
Packit Service 237526
  }
Packit Service 237526
Packit Service 237526
  /* Splitting tests with masking.  */
Packit Service 237526
  {
Packit Service 237526
    const char *expected[] = { "first" };
Packit Service 237526
    check_split_masked ("first", 3, "first:second",
Packit Service 237526
                        expected, array_length (expected));
Packit Service 237526
    check_split_masked ("first:second", 3, "first:",
Packit Service 237526
                        expected, array_length (expected));
Packit Service 237526
    check_split_masked ("first:second", 1, NULL,
Packit Service 237526
                        expected, array_length (expected));
Packit Service 237526
  }
Packit Service 237526
  {
Packit Service 237526
    const char *expected[] = { "second" };
Packit Service 237526
    check_split_masked ("first:second", 3, "second",
Packit Service 237526
                        expected, array_length (expected));
Packit Service 237526
    check_split_masked ("first:second:third", -1, "second:",
Packit Service 237526
                        expected, array_length (expected));
Packit Service 237526
    check_split_masked ("first:second", 2, NULL,
Packit Service 237526
                        expected, array_length (expected));
Packit Service 237526
    check_split_masked ("first:second:third", 2, "first:second",
Packit Service 237526
                        expected, array_length (expected));
Packit Service 237526
  }
Packit Service 237526
Packit Service 237526
  /* Tests for _dl_hwcaps_contains.  */
Packit Service 237526
  TEST_VERIFY (_dl_hwcaps_contains (NULL, "first", strlen ("first")));
Packit Service 237526
  TEST_VERIFY (_dl_hwcaps_contains (NULL, "", 0));
Packit Service 237526
  TEST_VERIFY (! _dl_hwcaps_contains ("", "first", strlen ("first")));
Packit Service 237526
  TEST_VERIFY (! _dl_hwcaps_contains ("firs", "first", strlen ("first")));
Packit Service 237526
  TEST_VERIFY (_dl_hwcaps_contains ("firs", "first", strlen ("first") - 1));
Packit Service 237526
  for (int i = 0; i < strlen ("first"); ++i)
Packit Service 237526
    TEST_VERIFY (! _dl_hwcaps_contains ("first", "first", i));
Packit Service 237526
  TEST_VERIFY (_dl_hwcaps_contains ("first", "first", strlen ("first")));
Packit Service 237526
  TEST_VERIFY (_dl_hwcaps_contains ("first:", "first", strlen ("first")));
Packit Service 237526
  TEST_VERIFY (_dl_hwcaps_contains ("first:second",
Packit Service 237526
                                    "first", strlen ("first")));
Packit Service 237526
  TEST_VERIFY (_dl_hwcaps_contains (":first:second", "first",
Packit Service 237526
                                    strlen ("first")));
Packit Service 237526
  TEST_VERIFY (_dl_hwcaps_contains ("first:second", "second",
Packit Service 237526
                                    strlen ("second")));
Packit Service 237526
  TEST_VERIFY (_dl_hwcaps_contains ("first:second:", "second",
Packit Service 237526
                                    strlen ("second")));
Packit Service 237526
  TEST_VERIFY (_dl_hwcaps_contains ("first::second:", "second",
Packit Service 237526
                                    strlen ("second")));
Packit Service 237526
  TEST_VERIFY (_dl_hwcaps_contains ("first:second::", "second",
Packit Service 237526
                                    strlen ("second")));
Packit Service 237526
  for (int i = 0; i < strlen ("second"); ++i)
Packit Service 237526
    {
Packit Service 237526
      TEST_VERIFY (!_dl_hwcaps_contains ("first:second", "second", i));
Packit Service 237526
      TEST_VERIFY (!_dl_hwcaps_contains ("first:second:", "second", i));
Packit Service 237526
      TEST_VERIFY (!_dl_hwcaps_contains ("first:second::", "second", i));
Packit Service 237526
      TEST_VERIFY (!_dl_hwcaps_contains ("first::second", "second", i));
Packit Service 237526
    }
Packit Service 237526
Packit Service 237526
  return 0;
Packit Service 237526
}
Packit Service 237526
Packit Service 237526
#include <support/test-driver.c>
Packit Service 237526
Packit Service 237526
/* Rebuild the sources here because the object file is built for
Packit Service 237526
   inclusion into the dynamic loader.  */
Packit Service 237526
#include "dl-hwcaps_split.c"