Changeset: 59b83a55fed5 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=59b83a55fed5 Modified Files: sql/test/Dump/Tests/reload-again.SQL.py sql/test/Dump/Tests/reload.SQL.py testing/sqltest.py Branch: mtest Log Message:
execute from stdin sqltest with mclient diffs (289 lines): diff --git a/sql/test/Dump/Tests/reload-again.SQL.py b/sql/test/Dump/Tests/reload-again.SQL.py --- a/sql/test/Dump/Tests/reload-again.SQL.py +++ b/sql/test/Dump/Tests/reload-again.SQL.py @@ -1,13 +1,22 @@ -import os, sys -try: - from MonetDBtesting import process -except ImportError: - import process +from MonetDBtesting.sqltest import SQLTestCase + +with SQLTestCase() as tc: + with open('dumpoutput2.sql') as f: + tc.execute(query=None, stdin=f, client='mclient')\ + .assertSucceeded()\ + .assertMatchStableOut('reload-again.stable.out') + -with process.client('sql', user = 'monetdb', passwd = 'monetdb', - stdin = open(os.path.join(os.environ['TSTTRGDIR'], - 'dumpoutput2.sql'), 'r'), - stdout = process.PIPE, stderr = process.PIPE) as clt: - out, err = clt.communicate() - sys.stdout.write(out) - sys.stderr.write(err) +#import os, sys +#try: +# from MonetDBtesting import process +#except ImportError: +# import process +# +#with process.client('sql', user = 'monetdb', passwd = 'monetdb', +# stdin = open(os.path.join(os.environ['TSTTRGDIR'], +# 'dumpoutput2.sql'), 'r'), +# stdout = process.PIPE, stderr = process.PIPE) as clt: +# out, err = clt.communicate() +# sys.stdout.write(out) +# sys.stderr.write(err) diff --git a/sql/test/Dump/Tests/reload.SQL.py b/sql/test/Dump/Tests/reload.SQL.py --- a/sql/test/Dump/Tests/reload.SQL.py +++ b/sql/test/Dump/Tests/reload.SQL.py @@ -1,13 +1,20 @@ -import os, sys -try: - from MonetDBtesting import process -except ImportError: - import process +from MonetDBtesting.sqltest import SQLTestCase -with process.client('sql', user = 'monetdb', passwd = 'monetdb', - stdin = open(os.path.join(os.environ['TSTTRGDIR'], - 'dumpoutput.sql'), 'r'), - stdout = process.PIPE, stderr = process.PIPE) as clt: - out, err = clt.communicate() - sys.stdout.write(out) - sys.stderr.write(err) +with SQLTestCase() as tc: + with open('dumpoutput.sql') as f: + tc.execute(query=None, stdin=f, client='mclient')\ + .assertSucceeded()\ + .assertMatchStableOut('reload.stable.out') +#import os, sys +#try: +# from MonetDBtesting import process +#except ImportError: +# import process +# +#with process.client('sql', user = 'monetdb', passwd = 'monetdb', +# stdin = open(os.path.join(os.environ['TSTTRGDIR'], +# 'dumpoutput.sql'), 'r'), +# stdout = process.PIPE, stderr = process.PIPE) as clt: +# out, err = clt.communicate() +# sys.stdout.write(out) +# sys.stderr.write(err) diff --git a/testing/sqltest.py b/testing/sqltest.py --- a/testing/sqltest.py +++ b/testing/sqltest.py @@ -138,7 +138,7 @@ class TestCaseResult(object): self.test_case = test_case self.assertion_errors = [] # holds assertion errors self.query = None - self.query_error = None + self.test_run_error = None self.err_code = None self.err_message = None self.data = [] @@ -172,7 +172,7 @@ class TestCaseResult(object): def assertFailed(self, err_code=None, err_message=None): """assert on query failed with optional err_code if provided""" - if self.query_error is None: + if self.test_run_error is None: msg = "expected to fail but didn't" self.fail(msg) else: @@ -192,8 +192,8 @@ class TestCaseResult(object): def assertSucceeded(self): """assert on query succeeded""" - if self.query_error is not None: - msg = "expected to succeed but didn't\n{}".format(str(self.query_error)) + if self.test_run_error is not None: + msg = "expected to succeed but didn't\n{}".format(str(self.test_run_error)) self.fail(msg) return self @@ -256,11 +256,18 @@ class MclientTestResult(TestCaseResult, self.data = out self.rowcount = self._get_row_count(out) if err: - self.query_error = err + self.test_run_error = err self.err_code, self.err_message = self._parse_error(err) elif stdin: - # TODO - pass + with process.client('sql', **kwargs, \ + args=list(args), \ + stdin=stdin, \ + stdout=process.PIPE, stderr=process.PIPE) as p: + out, err = p.communicate() + if out: + self.data = out + if err: + self.test_run_error = err self.did_run = True except Exception as e: raise SystemExit(e) @@ -322,7 +329,7 @@ class PyMonetDBTestResult(TestCaseResult self.data = ctx.crs.fetchall() self.description = ctx.crs.description except (pymonetdb.Error, ValueError) as e: - self.query_error = e + self.test_run_error = e self.err_code, self.err_message = self._parse_error(e.args[0]) self.did_run = True return self @@ -435,12 +442,12 @@ class SQLTestCase(): def conn_ctx(self): return self._conn_ctx or self.default_conn_ctx() - def execute(self, query:str, client='pymonetdb', *args): + def execute(self, query:str, *args, client='pymonetdb', stdin=None): if client == 'mclient': res = MclientTestResult(self) else: res = PyMonetDBTestResult(self) - res.run(query, *args) + res.run(query, *args, stdin=stdin) self.test_results.append(res) return res @@ -464,136 +471,3 @@ class SQLTestCase(): self.test_results.append(res) return res - -#----------------------- - -#class PyMonetDBTestResult(SQLTestResult): -# """Holder of sql execution information. Managed by SQLTestCase.""" -# test_case = None -# -# def __init__(self, test_case): -# self.test_case = test_case -# self.query = None -# self.assertion_errors = [] # holds assertion errors -# self.query_error = None -# self.data = [] -# self.rows = [] -# self.rowcount = -1 -# self.description = None -# -# def run(self, query:str): -# # ensure runs only once -# if self.query is None: -# self.query = query -# try: -# with self.test_case.conn_ctx as ctx: -# ctx.crs.execute(query) -# self.rowcount = ctx.crs.rowcount -# self.rows = ctx.crs._rows -# if ctx.crs.description: -# self.data = ctx.crs.fetchall() -# self.description = ctx.crs.description -# except (pymonetdb.Error, ValueError) as e: -# self.query_error = e -# return self -# -# def fail(self, msg, data=None): -# """ logs errors to test case err file""" -# err_file = self.test_case.err_file -# if len(self.assertion_errors) == 0: -# print(self.query, file=err_file) -# print('----', file=err_file) -# self.assertion_errors.append(AssertionError(msg)) -# print(msg, file=err_file) -# if data is not None: -# if len(data) < 100: -# print('query result:', file=err_file) -# else: -# print('truncated query result:', file=err_file) -# for row in data[:100]: -# sep='' -# for col in row: -# if col is None: -# print(sep, 'NULL', sep='', end='', file=err_file) -# else: -# print(sep, col, sep='', end='', file=err_file) -# sep = '|' -# print('', file=err_file) -# print('', file=err_file) -# -# def assertFailed(self, err_code=None, err_message=None): -# """assert on query failed with optional err_code if provided""" -# if self.query_error is None: -# msg = "expected to fail but didn't" -# self.fail(msg) -# else: -# err_code_received, err_msg_received = utils.parse_mapi_err_msg(self.query_error.args[0]) -# if err_code and err_message: -# if err_code != err_code_received or err_message.lower() != err_msg_received.lower(): -# msg = "expected to fail with error code {} and error message {} but failed with error code {} and error message {}".format(err_code, err_message, err_code_received, err_msg_received) -# self.fail(msg) -# elif err_code and not err_message: -# if err_code_received != err_code: -# msg = "expected to fail with error code {} but failed with error code {}".format(err_code, err_code_received) -# self.fail(msg) -# elif err_message and not err_code: -# if err_message.lower() != err_msg_received.lower(): -# msg = "expected to fail with error message {} but failed with error message {}".format(err_message, err_msg_received) -# self.fail(msg) -# return self -# -# def assertSucceeded(self): -# """assert on query succeeded""" -# if self.query_error is not None: -# msg = "expected to succeed but didn't\n{}".format(str(self.query_error)) -# self.fail(msg) -# return self -# -# def assertRowCount(self, rowcount): -# if self.rowcount != int(rowcount): -# msg = "received {} rows, expected {} rows".format(self.rowcount, rowcount) -# self.fail(msg) -# return self -# -# def assertResultHashTo(self, hash_value): -# raise NotImplementedError() -# -# def assertValue(self, row, col, val): -# """assert on a value matched against row, col in the result""" -# received = None -# row = int(row) -# col = int(col) -# try: -# received = self.data[row][col] -# except IndexError: -# pass -# if type(val) is type(received): -# if val != received: -# msg = 'expected "{}", received "{}" in row={}, col={}'.format(val, received, row, col) -# self.fail(msg, data=self.data) -# else: -# # handle type mismatch -# msg = 'expected type {} and value "{}", received type {} and value "{}" in row={}, col={}'.format(type(val), str(val), type(received), str(received), row, col) -# self.fail(msg, data=self.data) -# return self -# -# def assertDataResultMatch(self, data=[], index=None): -# """Assert on a match of a subset of the result. When index is provided it -# starts comparig from that row index onward. -# """ -# def mapfn(next): -# if type(next) is list: -# return tuple(next) -# return next -# data = list(map(mapfn, data)) -# if index is None: -# if len(data) > 0: -# first = data[0] -# for i, v in enumerate(self.data): -# if first == v: -# index = i -# break -# if not sequence_match(data, self.data, index): -# msg = '{}\nexpected to match query result starting at index={}, but it didn\'t'.format(piped_representation(data), index) -# self.fail(msg, data=self.data) -# return self _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list