# -*- python -*-
# Copyright (c) 2013 The Native Client Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

Import('env')

def AddLibcTest(env, src, golden_file=None, test_suffix='', is_broken=False,
                compile_env=None, link_env=None, EXTRA_LIBS=[]):
  """Convenience function for adding new tests.

  src: name of the source file for the test. The test name is derived from it
       by removing the extension and appending the optional test_suffix.
  golden_file: golden file for stdout, if applicable
  is_broken: is the test expected to be broken?
  compile_env, link_env: if passed, these are used as the envs for compiling and
       linking the code, respectively.
  EXTRA_LIBS: extra libraries to provide during linking.
  """
  name = src.split('.')[0]
  name += test_suffix

  compile_env = compile_env or env
  link_env = link_env or env

  obj = compile_env.ComponentObject(name, src)
  nexe = link_env.ComponentProgram(
      name, obj, EXTRA_LIBS=['${NONIRT_LIBS}'] + EXTRA_LIBS)
  node = env.CommandSelLdrTestNacl(name + '.out',
                                   nexe,
                                   stdout_golden=golden_file)
  env.AddNodeToTestSuite(node,
                         ['toolchain_tests', 'small_tests'],
                         'run_' + name + '_test',
                         is_broken=is_broken)

for envtype in ['builtin', 'nobuiltin']:
  uenv = env.Clone()
  # Prevent the compiler from replacing or modifying calls to memcpy et al. so
  # we actually test the libc imlementation.
  if envtype == 'nobuiltin':
    uenv.Append(CFLAGS=['-fno-builtin'])
  AddLibcTest(uenv, 'memcpy_move_set.c', test_suffix='_' + envtype,
              golden_file=env.File('memcpy_move_set.stdout'))

AddLibcTest(env, 'malloc_realloc_calloc_free.c')

AddLibcTest(env, 'inet.c')
AddLibcTest(env, 'uname.c')
AddLibcTest(env, 'snprintf.c', golden_file=env.File('snprintf.stdout'))
AddLibcTest(env, 'strtoll.c')
AddLibcTest(env, 'strtoull.c')
AddLibcTest(env, 'timezone.c')
AddLibcTest(env, 'wcstoll.c', is_broken=env.Bit('nacl_glibc'))

AddLibcTest(env, 'iconv.c', is_broken=env.Bit('nacl_glibc'))

# Test that using link-time optimization does not convert calls to
# library functions that were never linked in.
if env.Bit('bitcode'):
  unopt_env = env.Clone()
  unopt_env.Append(CFLAGS=['-O0'])
  unopt_env.Append(CCFLAGS=['-O0'])
  opt_env = env.Clone()
  opt_env.Append(CFLAGS=['-O3'])
  opt_env.Append(CCFLAGS=['-O3'])
  opt_env.Append(LINKFLAGS=['-O3'])
  AddLibcTest(env, 'printf_to_puts.c', compile_env=unopt_env, link_env=opt_env)

AddLibcTest(env, 'posix_memalign.c')
