test_sql_negative.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import os
  2. import pytest
  3. import yatest.common
  4. from yql_utils import get_supported_providers, get_param
  5. from test_utils import pytest_generate_tests_for_run, get_config, SQLRUN_PATH
  6. NEGATIVE_TEMPLATE = '.sqlx'
  7. DATA_PATH = yatest.common.source_path('yql/essentials/tests/sql/suites')
  8. def pytest_generate_tests(metafunc):
  9. pytest_generate_tests_for_run(metafunc, NEGATIVE_TEMPLATE, data_path=DATA_PATH)
  10. def run_sql2yql(program_sql, out_dir, err_file_path):
  11. def out_file(name):
  12. return os.path.join(out_dir, name)
  13. # translate sql to yql
  14. program_yql = out_file('program.yql')
  15. cmd_sql = [
  16. SQLRUN_PATH,
  17. '--yql',
  18. '--output=' + program_yql,
  19. '--syntax-version=1',
  20. '/dev/stdin',
  21. ]
  22. with open(program_sql) as f:
  23. sql_res = yatest.common.process.execute(cmd_sql, check_exit_code=False, stdin=f, env={'YQL_DETERMINISTIC_MODE': '1'})
  24. if sql_res.exit_code:
  25. sql_stderr = sql_res.std_err.strip()
  26. assert sql_stderr
  27. with open(err_file_path, 'wb') as err_file:
  28. err_file.write(sql_stderr)
  29. return sql_res
  30. def test(suite, case, cfg, tmpdir):
  31. config = get_config(suite, case, cfg, DATA_PATH)
  32. if 'yt' not in get_supported_providers(config):
  33. pytest.skip('YT provider is not supported here')
  34. if get_param('TARGET_PLATFORM'):
  35. if "yson" in case:
  36. pytest.skip('yson is not supported on non-default target platform')
  37. program_sql = os.path.join(DATA_PATH, suite, case + NEGATIVE_TEMPLATE)
  38. out_dir = tmpdir.mkdir(suite).mkdir(case).dirname
  39. files = []
  40. err_file_path = os.path.join(out_dir, 'err_file.out')
  41. res = run_sql2yql(program_sql, out_dir, err_file_path)
  42. with open(program_sql) as f:
  43. program_sql_content = f.read()
  44. assert res.exit_code != 0, 'execute finished without error, on file: %s, query:\n%s' % \
  45. (program_sql, program_sql_content)
  46. assert os.path.getsize(err_file_path) > 0, 'exit code is %d, but error is empty, on file: %s, query:\n%s' % \
  47. (res.exit_code, program_sql, program_sql_content)
  48. files.append(err_file_path)
  49. return [yatest.common.canonical_file(file_name) for file_name in files]