Return-Path: X-Original-To: apmail-hawq-commits-archive@minotaur.apache.org Delivered-To: apmail-hawq-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 7C94C18AF1 for ; Wed, 4 Nov 2015 18:36:09 +0000 (UTC) Received: (qmail 52320 invoked by uid 500); 4 Nov 2015 18:36:00 -0000 Delivered-To: apmail-hawq-commits-archive@hawq.apache.org Received: (qmail 52282 invoked by uid 500); 4 Nov 2015 18:36:00 -0000 Mailing-List: contact commits-help@hawq.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@hawq.incubator.apache.org Delivered-To: mailing list commits@hawq.incubator.apache.org Received: (qmail 52272 invoked by uid 99); 4 Nov 2015 18:36:00 -0000 Received: from Unknown (HELO spamd1-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 04 Nov 2015 18:35:59 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd1-us-west.apache.org (ASF Mail Server at spamd1-us-west.apache.org) with ESMTP id 743F0C8A9D for ; Wed, 4 Nov 2015 18:35:59 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd1-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 1.77 X-Spam-Level: * X-Spam-Status: No, score=1.77 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, T_RP_MATCHES_RCVD=-0.01] autolearn=disabled Received: from mx1-us-west.apache.org ([10.40.0.8]) by localhost (spamd1-us-west.apache.org [10.40.0.7]) (amavisd-new, port 10024) with ESMTP id skRmbR7WxIV6 for ; Wed, 4 Nov 2015 18:35:55 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-us-west.apache.org (ASF Mail Server at mx1-us-west.apache.org) with SMTP id 97D6723067 for ; Wed, 4 Nov 2015 18:35:55 +0000 (UTC) Received: (qmail 52239 invoked by uid 99); 4 Nov 2015 18:35:55 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 04 Nov 2015 18:35:55 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 66022DFD7B; Wed, 4 Nov 2015 18:35:55 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: gcaragea@apache.org To: commits@hawq.incubator.apache.org Message-Id: <27c69eadb23f468b84380d73443732c9@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: incubator-hawq git commit: HAWQ-79. Re-enable unit test for shared input scan Date: Wed, 4 Nov 2015 18:35:55 +0000 (UTC) Repository: incubator-hawq Updated Branches: refs/heads/master a88bbdfec -> 04c0f28b9 HAWQ-79. Re-enable unit test for shared input scan Project: http://git-wip-us.apache.org/repos/asf/incubator-hawq/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-hawq/commit/04c0f28b Tree: http://git-wip-us.apache.org/repos/asf/incubator-hawq/tree/04c0f28b Diff: http://git-wip-us.apache.org/repos/asf/incubator-hawq/diff/04c0f28b Branch: refs/heads/master Commit: 04c0f28b9674dad7002010571b7fb7a6626a81a6 Parents: a88bbdf Author: Nikos Armenatzoglou Authored: Mon Nov 2 13:57:38 2015 -0800 Committer: Nikos Armenatzoglou Committed: Wed Nov 4 10:34:43 2015 -0800 ---------------------------------------------------------------------- src/backend/executor/test/.gitignore | 1 + src/backend/executor/test/Makefile | 156 +++++++++++++++++ src/backend/executor/test/execAmi_test.c | 37 ++++ src/backend/executor/test/execHHashagg_test.c | 145 ++++++++++++++++ src/backend/executor/test/execWorkfile_test.c | 101 +++++++++++ .../executor/test/nodeShareInputScan_test.c | 102 +++++++++++ src/backend/executor/test/nodeSubplan_test.c | 171 +++++++++++++++++++ src/backend/executor/test_discard/.gitignore | 1 - src/backend/executor/test_discard/Makefile | 157 ----------------- .../executor/test_discard/execAmi_test.c | 37 ---- .../executor/test_discard/execHHashagg_test.c | 145 ---------------- .../executor/test_discard/execWorkfile_test.c | 101 ----------- .../test_discard/nodeShareInputScan_test.c | 102 ----------- .../executor/test_discard/nodeSubplan_test.c | 159 ----------------- 14 files changed, 713 insertions(+), 702 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/04c0f28b/src/backend/executor/test/.gitignore ---------------------------------------------------------------------- diff --git a/src/backend/executor/test/.gitignore b/src/backend/executor/test/.gitignore new file mode 100644 index 0000000..a8d6b6c --- /dev/null +++ b/src/backend/executor/test/.gitignore @@ -0,0 +1 @@ +*.t http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/04c0f28b/src/backend/executor/test/Makefile ---------------------------------------------------------------------- diff --git a/src/backend/executor/test/Makefile b/src/backend/executor/test/Makefile new file mode 100644 index 0000000..d52c10d --- /dev/null +++ b/src/backend/executor/test/Makefile @@ -0,0 +1,156 @@ +subdir=src/backend/executor +top_builddir=../../../.. + +TARGETS=nodeSubplan nodeShareInputScan execAmi execWorkfile execHHashagg + +# Objects from backend, which don't need to be mocked but need to be linked. +nodeSubplan_REAL_OBJS=\ + $(top_srcdir)/src/backend/access/hash/hashfunc.o \ + $(top_srcdir)/src/backend/bootstrap/bootparse.o \ + $(top_srcdir)/src/backend/executor/execUtils.o \ + $(top_srcdir)/src/backend/lib/stringinfo.o \ + $(top_srcdir)/src/backend/nodes/bitmapset.o \ + $(top_srcdir)/src/backend/nodes/equalfuncs.o \ + $(top_srcdir)/src/backend/nodes/list.o \ + $(top_srcdir)/src/backend/parser/gram.o \ + $(top_srcdir)/src/backend/regex/regcomp.o \ + $(top_srcdir)/src/backend/regex/regerror.o \ + $(top_srcdir)/src/backend/regex/regexec.o \ + $(top_srcdir)/src/backend/regex/regfree.o \ + $(top_srcdir)/src/backend/storage/page/itemptr.o \ + $(top_srcdir)/src/backend/utils/adt/datum.o \ + $(top_srcdir)/src/backend/utils/adt/like.o \ + $(top_srcdir)/src/backend/utils/hash/dynahash.o \ + $(top_srcdir)/src/backend/utils/hash/hashfn.o \ + $(top_srcdir)/src/backend/utils/misc/guc.o \ + $(top_srcdir)/src/backend/utils/init/globals.o \ + $(top_srcdir)/src/port/exec.o \ + $(top_srcdir)/src/port/path.o \ + $(top_srcdir)/src/port/pgsleep.o \ + $(top_srcdir)/src/port/pgstrcasecmp.o \ + $(top_srcdir)/src/port/qsort.o \ + $(top_srcdir)/src/port/strlcpy.o \ + $(top_srcdir)/src/port/thread.o \ + $(top_srcdir)/src/timezone/localtime.o \ + $(top_srcdir)/src/timezone/pgtz.o + +nodeShareInputScan_REAL_OBJS=\ + $(top_srcdir)/src/backend/access/hash/hashfunc.o \ + $(top_srcdir)/src/backend/bootstrap/bootparse.o \ + $(top_srcdir)/src/backend/lib/stringinfo.o \ + $(top_srcdir)/src/backend/nodes/bitmapset.o \ + $(top_srcdir)/src/backend/nodes/equalfuncs.o \ + $(top_srcdir)/src/backend/nodes/list.o \ + $(top_srcdir)/src/backend/parser/gram.o \ + $(top_srcdir)/src/backend/regex/regcomp.o \ + $(top_srcdir)/src/backend/regex/regerror.o \ + $(top_srcdir)/src/backend/regex/regexec.o \ + $(top_srcdir)/src/backend/regex/regfree.o \ + $(top_srcdir)/src/backend/storage/page/itemptr.o \ + $(top_srcdir)/src/backend/utils/adt/datum.o \ + $(top_srcdir)/src/backend/utils/adt/like.o \ + $(top_srcdir)/src/backend/utils/fmgrtab.o \ + $(top_srcdir)/src/backend/utils/hash/dynahash.o \ + $(top_srcdir)/src/backend/utils/hash/hashfn.o \ + $(top_srcdir)/src/backend/utils/misc/guc.o \ + $(top_srcdir)/src/backend/utils/init/globals.o \ + $(top_srcdir)/src/port/exec.o \ + $(top_srcdir)/src/port/path.o \ + $(top_srcdir)/src/port/pgsleep.o \ + $(top_srcdir)/src/port/pgstrcasecmp.o \ + $(top_srcdir)/src/port/qsort.o \ + $(top_srcdir)/src/port/strlcpy.o \ + $(top_srcdir)/src/port/thread.o \ + $(top_srcdir)/src/timezone/localtime.o \ + $(top_srcdir)/src/timezone/pgtz.o + +execAmi_REAL_OBJS=\ + $(top_srcdir)/src/backend/access/hash/hashfunc.o \ + $(top_srcdir)/src/backend/bootstrap/bootparse.o \ + $(top_srcdir)/src/backend/lib/stringinfo.o \ + $(top_srcdir)/src/backend/nodes/bitmapset.o \ + $(top_srcdir)/src/backend/nodes/equalfuncs.o \ + $(top_srcdir)/src/backend/nodes/list.o \ + $(top_srcdir)/src/backend/parser/gram.o \ + $(top_srcdir)/src/backend/regex/regcomp.o \ + $(top_srcdir)/src/backend/regex/regerror.o \ + $(top_srcdir)/src/backend/regex/regexec.o \ + $(top_srcdir)/src/backend/regex/regfree.o \ + $(top_srcdir)/src/backend/storage/page/itemptr.o \ + $(top_srcdir)/src/backend/utils/adt/datum.o \ + $(top_srcdir)/src/backend/utils/adt/like.o \ + $(top_srcdir)/src/backend/utils/hash/dynahash.o \ + $(top_srcdir)/src/backend/utils/hash/hashfn.o \ + $(top_srcdir)/src/backend/utils/misc/guc.o \ + $(top_srcdir)/src/backend/utils/init/globals.o \ + $(top_srcdir)/src/port/exec.o \ + $(top_srcdir)/src/port/path.o \ + $(top_srcdir)/src/port/pgsleep.o \ + $(top_srcdir)/src/port/pgstrcasecmp.o \ + $(top_srcdir)/src/port/qsort.o \ + $(top_srcdir)/src/port/strlcpy.o \ + $(top_srcdir)/src/port/thread.o \ + $(top_srcdir)/src/timezone/localtime.o \ + $(top_srcdir)/src/timezone/pgtz.o + +execWorkfile_REAL_OBJS=\ + $(top_srcdir)/src/backend/access/hash/hashfunc.o \ + $(top_srcdir)/src/backend/bootstrap/bootparse.o \ + $(top_srcdir)/src/backend/lib/stringinfo.o \ + $(top_srcdir)/src/backend/nodes/bitmapset.o \ + $(top_srcdir)/src/backend/nodes/equalfuncs.o \ + $(top_srcdir)/src/backend/nodes/list.o \ + $(top_srcdir)/src/backend/parser/gram.o \ + $(top_srcdir)/src/backend/regex/regcomp.o \ + $(top_srcdir)/src/backend/regex/regerror.o \ + $(top_srcdir)/src/backend/regex/regexec.o \ + $(top_srcdir)/src/backend/regex/regfree.o \ + $(top_srcdir)/src/backend/storage/page/itemptr.o \ + $(top_srcdir)/src/backend/utils/adt/datum.o \ + $(top_srcdir)/src/backend/utils/adt/like.o \ + $(top_srcdir)/src/backend/utils/hash/dynahash.o \ + $(top_srcdir)/src/backend/utils/hash/hashfn.o \ + $(top_srcdir)/src/backend/utils/misc/guc.o \ + $(top_srcdir)/src/backend/utils/init/globals.o \ + $(top_srcdir)/src/port/exec.o \ + $(top_srcdir)/src/port/path.o \ + $(top_srcdir)/src/port/pgsleep.o \ + $(top_srcdir)/src/port/pgstrcasecmp.o \ + $(top_srcdir)/src/port/qsort.o \ + $(top_srcdir)/src/port/strlcpy.o \ + $(top_srcdir)/src/port/thread.o \ + $(top_srcdir)/src/timezone/localtime.o \ + $(top_srcdir)/src/timezone/pgtz.o + +execHHashagg_REAL_OBJS=\ + $(top_srcdir)/src/backend/access/hash/hashfunc.o \ + $(top_srcdir)/src/backend/bootstrap/bootparse.o \ + $(top_srcdir)/src/backend/executor/execUtils.o \ + $(top_srcdir)/src/backend/lib/stringinfo.o \ + $(top_srcdir)/src/backend/nodes/bitmapset.o \ + $(top_srcdir)/src/backend/nodes/equalfuncs.o \ + $(top_srcdir)/src/backend/nodes/list.o \ + $(top_srcdir)/src/backend/parser/gram.o \ + $(top_srcdir)/src/backend/regex/regcomp.o \ + $(top_srcdir)/src/backend/regex/regerror.o \ + $(top_srcdir)/src/backend/regex/regexec.o \ + $(top_srcdir)/src/backend/regex/regfree.o \ + $(top_srcdir)/src/backend/storage/page/itemptr.o \ + $(top_srcdir)/src/backend/utils/adt/datum.o \ + $(top_srcdir)/src/backend/utils/adt/like.o \ + $(top_srcdir)/src/backend/utils/hash/dynahash.o \ + $(top_srcdir)/src/backend/utils/hash/hashfn.o \ + $(top_srcdir)/src/backend/utils/misc/guc.o \ + $(top_srcdir)/src/backend/utils/init/globals.o \ + $(top_srcdir)/src/port/exec.o \ + $(top_srcdir)/src/port/path.o \ + $(top_srcdir)/src/port/pgsleep.o \ + $(top_srcdir)/src/port/pgstrcasecmp.o \ + $(top_srcdir)/src/port/qsort.o \ + $(top_srcdir)/src/port/strlcpy.o \ + $(top_srcdir)/src/port/thread.o \ + $(top_srcdir)/src/timezone/localtime.o \ + $(top_srcdir)/src/timezone/pgtz.o + +include ../../../Makefile.mock + http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/04c0f28b/src/backend/executor/test/execAmi_test.c ---------------------------------------------------------------------- diff --git a/src/backend/executor/test/execAmi_test.c b/src/backend/executor/test/execAmi_test.c new file mode 100644 index 0000000..9947104 --- /dev/null +++ b/src/backend/executor/test/execAmi_test.c @@ -0,0 +1,37 @@ +#include +#include +#include +#include "cmockery.h" + +#include "c.h" +#include "postgres.h" +#include "nodes/nodes.h" + +#include "../execAmi.c" + +/* ==================== ExecEagerFree ==================== */ +/* + * Tests that ExecEageFree calls the new ExecEagerFreeShareInputScan + * function when the input is a ShareInputScanState + */ +void +test__ExecEagerFree_ExecEagerFreeShareInputScan(void **state) +{ + ShareInputScanState *sisc = makeNode(ShareInputScanState); + + expect_value(ExecEagerFreeShareInputScan, node, sisc); + will_be_called(ExecEagerFreeShareInputScan); + + ExecEagerFree(sisc); +} + +int +main(int argc, char* argv[]) +{ + cmockery_parse_arguments(argc, argv); + + const UnitTest tests[] = { + unit_test(test__ExecEagerFree_ExecEagerFreeShareInputScan) + }; + return run_tests(tests); +} http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/04c0f28b/src/backend/executor/test/execHHashagg_test.c ---------------------------------------------------------------------- diff --git a/src/backend/executor/test/execHHashagg_test.c b/src/backend/executor/test/execHHashagg_test.c new file mode 100644 index 0000000..0972ad9 --- /dev/null +++ b/src/backend/executor/test/execHHashagg_test.c @@ -0,0 +1,145 @@ +#include +#include +#include +#include "cmockery.h" + +#include "c.h" +#include "postgres.h" + +/* Ignore elog */ +#include "utils/elog.h" +#undef elog +#define elog + + +/* Provide specialized mock implementations for memory allocation functions */ + +#undef palloc +#define palloc getSpillFile_palloc_mock +void *getSpillFile_palloc_mock(Size size); + +#include "../execHHashagg.c" + + +/* + * This is a mocked version of palloc to be used in getSpillFile(). + * It returns allocated memory padded with 0x7f pattern. + */ +void * +getSpillFile_palloc_mock(Size size) +{ + void *ptr = MemoryContextAlloc(CurrentMemoryContext, size); + MemSetAligned(ptr, 0x7f, size); + return ptr; +} + + +/* ==================== getSpillFile ==================== */ +/* + * Test that the spill_file->file_info->wfile field is allocated + * and initialized during normal execution (no exception thrown). + */ +void +test__getSpillFile__Initialize_wfile_success(void **state) +{ + int alloc_size = 0; + int file_no = 0; + int branching_factor = 32; + ExecWorkFile *ewfile = (ExecWorkFile *) palloc0(sizeof(ExecWorkFile)); + workfile_set *work_set = (workfile_set *) palloc0(sizeof(workfile_set)); + SpillSet *spill_set = (SpillSet *) palloc0(sizeof(SpillSet) + (branching_factor-1) * sizeof (SpillFile)); + + SpillFile *spill_file = &spill_set->spill_files[file_no]; + spill_file->file_info = NULL; + + expect_value(workfile_mgr_create_file, work_set, work_set); + will_return(workfile_mgr_create_file, ewfile); + + getSpillFile(work_set, spill_set, file_no, &alloc_size); + + assert_true(spill_file->file_info != NULL); + assert_int_equal(spill_file->file_info->total_bytes, 0); + assert_int_equal(spill_file->file_info->ntuples, 0); + assert_int_equal(alloc_size, BATCHFILE_METADATA); + + /* + * During normal execution, wfile should be initialized with + * the result of workfile_mgr_create_wfile, a valid ExecWorkFile pointer + */ + assert_true(spill_file->file_info->wfile == ewfile); +} + +/* + * Function used a side effect to simulate throwing exception + * by a certain function. + */ +void +throw_exception_side_effect() +{ + PG_RE_THROW(); +} + +/* ==================== getSpillFile ==================== */ +/* + * Test that the spill_file->file_info->wfile field is initialized to NULL + * when creating a workfile throws an exception. + */ +void +test__getSpillFile__Initialize_wfile_exception(void **state) +{ + + int alloc_size = 0; + int file_no = 0; + int branching_factor = 32; + ExecWorkFile *ewfile = (ExecWorkFile *) palloc0(sizeof(ExecWorkFile)); + workfile_set *work_set = (workfile_set *) palloc0(sizeof(workfile_set)); + SpillSet *spill_set = (SpillSet *) palloc0(sizeof(SpillSet) + (branching_factor-1) * sizeof (SpillFile)); + + SpillFile *spill_file = &spill_set->spill_files[0]; + spill_file->file_info = NULL; + + /* Make workfile_mgr_create_file throw an exception, using the side effect function */ + expect_value(workfile_mgr_create_file, work_set, work_set); + will_return_with_sideeffect(workfile_mgr_create_file, ewfile, &throw_exception_side_effect, NULL); + + PG_TRY(); + { + + /* This function will throw an exception, and we'll catch it below */ + getSpillFile(work_set, spill_set, file_no, &alloc_size); + + } + PG_CATCH(); + { + assert_true(spill_file->file_info != NULL); + assert_int_equal(spill_file->file_info->total_bytes, 0); + assert_int_equal(spill_file->file_info->ntuples, 0); + assert_int_equal(alloc_size, 0); + + /* + * This is the main test: We must initialize this pointer to NULL, even + * if an exception is thrown + */ + assert_true(spill_file->file_info->wfile == NULL); + return; + } + PG_END_TRY(); + + /* We shouldn't get here, the getSpillFile should throw an exception */ + assert_true(false); + +} + +/* ==================== main ==================== */ +int +main(int argc, char* argv[]) +{ + cmockery_parse_arguments(argc, argv); + + const UnitTest tests[] = { + unit_test(test__getSpillFile__Initialize_wfile_success), + unit_test(test__getSpillFile__Initialize_wfile_exception) + }; + + return run_tests(tests); +} http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/04c0f28b/src/backend/executor/test/execWorkfile_test.c ---------------------------------------------------------------------- diff --git a/src/backend/executor/test/execWorkfile_test.c b/src/backend/executor/test/execWorkfile_test.c new file mode 100644 index 0000000..9d95a1f --- /dev/null +++ b/src/backend/executor/test/execWorkfile_test.c @@ -0,0 +1,101 @@ +#include +#include +#include +#include "cmockery.h" + +#include "c.h" +#include "postgres.h" +#include "storage/buffile.h" +#include "storage/bfz.h" +#include "executor/execWorkfile.h" +#include "utils/memutils.h" + +/* Ignore elog */ +#include "utils/elog.h" + +#undef elog +#define elog + +/* Provide specialized mock implementations for memory allocation functions */ +#undef palloc0 +#define palloc0 execWorkfile_palloc0_mock +void *execWorkfile_palloc0_mock(Size size); + +#undef pstrdup +#define pstrdup execWorkfile_pstrdup_mock +char *execWorkfile_pstrdup_mock(const char *string); + +#include "../execWorkfile.c" + +/* + * This is a mocked version of palloc0 to be used in ExecWorkFile_Create. + * It asserts that it is executed in the TopMemoryContext. + */ +void * +execWorkfile_palloc0_mock(Size size) +{ + assert_int_equal(CurrentMemoryContext, TopMemoryContext); + return MemoryContextAllocZero(CurrentMemoryContext, size); +} + +/* + * This is a mocked version of pstrdup to be used in ExecWorkFile_Create. + * It asserts that it is executed in the TopMemoryContext. + */ +char *execWorkfile_pstrdup_mock(const char *string) +{ + assert_int_equal(CurrentMemoryContext, TopMemoryContext); + return MemoryContextStrdup(CurrentMemoryContext, string); +} + + +/* ==================== ExecWorkFile_Create ==================== */ +/* + * Test that the ExecWorkFile struct is allocated in TopMemoryContext + */ +void +test__ExecWorkFile_Create__InTopMemContext(void **state) +{ + + char *test_filename = "foo"; + + will_return(WorkfileQueryspace_AddWorkfile, true); + + expect_value(BufFileCreateFile, fileName, test_filename); + expect_value(BufFileCreateFile, delOnClose, true); + expect_value(BufFileCreateFile, interXact, false); + will_return(BufFileCreateFile, NULL); + + expect_value(BufFileSetWorkfile, buffile, NULL); + will_be_called(BufFileSetWorkfile); + + /* + * All the memory context stuff is mocked, so the TopMemoryContext is NULL + * at this point. Set it to something specific so we can distinguish it from + * the CurrentMemoryContext. + */ + TopMemoryContext = (MemoryContext) 0xdeadbeef; + CurrentMemoryContext = (MemoryContext) 0xfeadbead; + + /* + * ExecWorkFile_Create will call our mocked palloc0 function execWorkfile__palloc0_mock + * and our mocked pstrdup function execWorkfile_pstrdup_mock. + * These functions will assert that the allocation of the result happens + * in the TopMemoryContext. + */ + ExecWorkFile *ewf = ExecWorkFile_Create(test_filename, BUFFILE, true /* delOnClose */, 0 /* compressType */); + +} + +/* ==================== main ==================== */ +int +main(int argc, char* argv[]) +{ + cmockery_parse_arguments(argc, argv); + + const UnitTest tests[] = { + unit_test(test__ExecWorkFile_Create__InTopMemContext) + }; + + return run_tests(tests); +} http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/04c0f28b/src/backend/executor/test/nodeShareInputScan_test.c ---------------------------------------------------------------------- diff --git a/src/backend/executor/test/nodeShareInputScan_test.c b/src/backend/executor/test/nodeShareInputScan_test.c new file mode 100644 index 0000000..7bb8b92 --- /dev/null +++ b/src/backend/executor/test/nodeShareInputScan_test.c @@ -0,0 +1,102 @@ +#include +#include +#include +#include "cmockery.h" + +#include "c.h" +#include "postgres.h" +#include "nodes/nodes.h" +#include "../nodeShareInputScan.c" + +#define FIXED_POINTER_VAL ((LargestIntegralType) 0x0000beef) +#define SHARE_NODE_ENTRY_REFCOUNT 78 + +/* + * Tests ExecEagerFreeShareInputScan when plan->share_type = SHARE_NOTSHARED + * Verifies that all the pointers are set to NULL + */ +void +test__ExecEagerFreeShareInputScan_SHARE_NOTSHARED(void **state) +{ + ShareInputScanState *sisc = makeNode(ShareInputScanState); + ShareInputScan *plan = makeNode(ShareInputScan); + sisc->ss.ps.plan = plan; + + sisc->ts_markpos = FIXED_POINTER_VAL; + sisc->ts_pos = FIXED_POINTER_VAL; + sisc->ts_state = FIXED_POINTER_VAL; + sisc->freed = false; + + plan->share_type = SHARE_NOTSHARED; + + ExecEagerFreeShareInputScan(sisc); + + assert_int_equal(sisc->ts_markpos, NULL); + assert_int_equal(sisc->ts_pos, NULL); + assert_int_equal(sisc->ts_state, NULL); + assert_true(sisc->freed); + + return; +} + +/* ==================== ExecEagerFreeShareInputScan ==================== */ +/* + * Tests ExecEagerFreeShareInputScan when plan->share_type = SHARE_MATERIAL + * Verifies that the tuplestore accessor and the tuplestore state are destroyed, + * and that all the pointers are set to NULL + */ +void +test__ExecEagerFreeShareInputScan_SHARE_MATERIAL(void **state) +{ + ShareInputScanState *sisc = makeNode(ShareInputScanState); + ShareInputScan *plan = makeNode(ShareInputScan); + sisc->ss.ps.plan = plan; + + sisc->ts_markpos = NULL; + sisc->ts_pos = FIXED_POINTER_VAL; + sisc->ts_state = (GenericTupStore *) palloc0(sizeof(GenericTupStore)); + sisc->ts_state->matstore = FIXED_POINTER_VAL; + sisc->freed = false; + + plan->share_type = SHARE_MATERIAL; + + expect_value(ntuplestore_destroy_accessor, acc, FIXED_POINTER_VAL); + will_be_called(ntuplestore_destroy_accessor); + + expect_value(ntuplestore_is_readerwriter_reader, nts, FIXED_POINTER_VAL); + will_return(ntuplestore_is_readerwriter_reader, true); + + expect_value(ntuplestore_destroy, ts, FIXED_POINTER_VAL); + will_be_called(ntuplestore_destroy); + + + ShareNodeEntry *shareNodeEntry = makeNode(ShareNodeEntry); + shareNodeEntry->refcount = SHARE_NODE_ENTRY_REFCOUNT; + + expect_any(ExecGetShareNodeEntry, estate); + expect_any(ExecGetShareNodeEntry, shareidx); + expect_value(ExecGetShareNodeEntry, fCreate, false); + will_return(ExecGetShareNodeEntry, shareNodeEntry); + + ExecEagerFreeShareInputScan(sisc); + + assert_int_equal(sisc->ts_markpos, NULL); + assert_int_equal(sisc->ts_pos, NULL); + assert_int_equal(sisc->ts_state, NULL); + assert_int_equal(shareNodeEntry->refcount, SHARE_NODE_ENTRY_REFCOUNT - 1); + assert_true(sisc->freed); + + return; +} + +int +main(int argc, char* argv[]) +{ + cmockery_parse_arguments(argc, argv); + + const UnitTest tests[] = { + unit_test(test__ExecEagerFreeShareInputScan_SHARE_NOTSHARED), + unit_test(test__ExecEagerFreeShareInputScan_SHARE_MATERIAL) + }; + return run_tests(tests); +} http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/04c0f28b/src/backend/executor/test/nodeSubplan_test.c ---------------------------------------------------------------------- diff --git a/src/backend/executor/test/nodeSubplan_test.c b/src/backend/executor/test/nodeSubplan_test.c new file mode 100644 index 0000000..4786220 --- /dev/null +++ b/src/backend/executor/test/nodeSubplan_test.c @@ -0,0 +1,171 @@ +#include +#include +#include +#include "cmockery.h" + +#include "c.h" +#include "postgres.h" +#include "nodes/nodes.h" +#include "../nodeSubplan.c" + +/* Function passed to testing framework + * in order to force SetupInterconnect to fail */ +void +_RETHROW( ) +{ + PG_RE_THROW(); +} + + +/* Checks CdbCheckDispatchResult is called when queryDesc + * is not null (when shouldDispatch is true). + * This test falls in PG_CATCH when SetupInterconnect + * does not allocate queryDesc->estate->interconnect_context. + * The test is successful if the */ +void +test__ExecSetParamPlan__Check_Dispatch_Results(void **state) +{ + + /*Set plan to explain.*/ + SubPlanState *plan = makeNode(SubPlanState); + plan->xprstate.expr = makeNode(SubPlanState); + plan->planstate = makeNode(SubPlanState); + plan->planstate->instrument = (Instrumentation *)palloc(sizeof(Instrumentation)); + plan->planstate->plan = makeNode(SubPlanState); + + /*Function needed for estate.*/ + expect_any(AllocSetContextCreate,parent); + expect_any(AllocSetContextCreate,name); + expect_any(AllocSetContextCreate,minContextSize); + expect_any(AllocSetContextCreate,initBlockSize); + expect_any(AllocSetContextCreate,maxBlockSize); + will_be_called(AllocSetContextCreate); + EState *estate = CreateExecutorState(); + + /*Assign mocked estate to plan.*/ + ((PlanState *)(plan->planstate))->state= estate; + + /*Function needed for GetPerTupleExprContext*/ + expect_any(AllocSetContextCreate,parent); + expect_any(AllocSetContextCreate,name); + expect_any(AllocSetContextCreate,minContextSize); + expect_any(AllocSetContextCreate,initBlockSize); + expect_any(AllocSetContextCreate,maxBlockSize); + will_be_called(AllocSetContextCreate); + + /*Re-use estate mocked object. Needed as input parameter for + tested function */ + ExprContext *econtext = GetPerTupleExprContext(estate); + + + /*Set QueryDescriptor input parameter for tested function */ + PlannedStmt *plannedstmt = (PlannedStmt *)palloc(sizeof(PlannedStmt)); + QueryDesc *queryDesc = (QueryDesc *)palloc(sizeof(QueryDesc)); + queryDesc->plannedstmt = plannedstmt; + queryDesc->estate = (EState *)palloc(sizeof(EState)); + queryDesc->estate->es_sliceTable = (SliceTable *) palloc(sizeof(SliceTable)); + + /*Set of functions called within tested function*/ + expect_any(MemoryContextGetPeakSpace,context); + will_be_called(MemoryContextGetPeakSpace); + + expect_any(MemoryContextSetPeakSpace,context); + expect_any(MemoryContextSetPeakSpace,nbytes); + will_be_called(MemoryContextSetPeakSpace); + + /*QueryDescriptor generated when shouldDispatch is true.*/ + QueryDesc *internalQueryDesc = (QueryDesc *)palloc(sizeof(QueryDesc)); + internalQueryDesc->estate = (EState *)palloc(sizeof(EState)); + /* Added to force assertion on queryDesc->estate->interconnect_context; + to fail */ + internalQueryDesc->estate->interconnect_context=NULL; + internalQueryDesc->estate->es_sliceTable = (SliceTable *) palloc(sizeof(SliceTable)); + + expect_any(CreateQueryDesc,plannedstmt); + expect_any(CreateQueryDesc,sourceText); + expect_any(CreateQueryDesc,snapshot); + expect_any(CreateQueryDesc,crosscheck_snapshot); + expect_any(CreateQueryDesc,dest); + expect_any(CreateQueryDesc,params); + expect_any(CreateQueryDesc,doInstrument); + will_return(CreateQueryDesc,internalQueryDesc); + + expect_any(AllocSetContextCreate,parent); + expect_any(AllocSetContextCreate,name); + expect_any(AllocSetContextCreate,minContextSize); + expect_any(AllocSetContextCreate,initBlockSize); + expect_any(AllocSetContextCreate,maxBlockSize); + will_be_called(AllocSetContextCreate); + + Gp_role = GP_ROLE_DISPATCH; + plan->planstate->plan->dispatch=DISPATCH_PARALLEL; + + expect_any(SetupInterconnect,estate); + /* Force SetupInterconnect to fail */ + will_be_called_with_sideeffect(SetupInterconnect,&_RETHROW,NULL); + + + expect_any(cdbexplain_localExecStats,planstate); + expect_any(cdbexplain_localExecStats,showstatctx); + will_be_called(cdbexplain_localExecStats); + + expect_any(cdbexplain_recvExecStats,planstate); + expect_any(cdbexplain_recvExecStats,dispatchResults); + expect_any(cdbexplain_recvExecStats,sliceIndex); + expect_any(cdbexplain_recvExecStats,showstatctx); + expect_any(cdbexplain_recvExecStats,segmentNum); + will_be_called(cdbexplain_recvExecStats); + + expect_any(MemoryContextSetPeakSpace,context); + expect_any(MemoryContextSetPeakSpace,nbytes); + will_be_called(MemoryContextSetPeakSpace); + + will_be_called(TeardownSequenceServer); + + expect_any(TeardownInterconnect,transportStates); + expect_any(TeardownInterconnect,mlStates); + expect_any(TeardownInterconnect,forceEOS); + will_be_called(TeardownInterconnect); + + expect_any(initialize_dispatch_data, resource); + expect_any(initialize_dispatch_data, dispatch_to_all_cached_executors); + will_be_called(initialize_dispatch_data); + + expect_any(prepare_dispatch_query_desc, data); + expect_any(prepare_dispatch_query_desc, queryDesc); + will_be_called(prepare_dispatch_query_desc); + + expect_any(dispatch_run, data); + will_be_called(dispatch_run); + + expect_any(cleanup_dispatch_data, data); + will_be_called(cleanup_dispatch_data); + + expect_any(dispatch_wait, data); + will_be_called(dispatch_wait); + + expect_any(dispatch_get_segment_num, data); + will_be_called(dispatch_get_segment_num); + + expect_any(dispatch_get_results, data); + will_be_called(dispatch_get_results); + + /* Catch PG_RE_THROW(); after cleaning with CdbCheckDispatchResult */ + PG_TRY(); + ExecSetParamPlan(plan,econtext,queryDesc); + PG_CATCH(); + assert_true(true); + PG_END_TRY(); +} + +int +main(int argc, char* argv[]) +{ + cmockery_parse_arguments(argc, argv); + + const UnitTest tests[] = { + unit_test(test__ExecSetParamPlan__Check_Dispatch_Results) + }; + return run_tests(tests); +} + http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/04c0f28b/src/backend/executor/test_discard/.gitignore ---------------------------------------------------------------------- diff --git a/src/backend/executor/test_discard/.gitignore b/src/backend/executor/test_discard/.gitignore deleted file mode 100644 index a8d6b6c..0000000 --- a/src/backend/executor/test_discard/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.t http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/04c0f28b/src/backend/executor/test_discard/Makefile ---------------------------------------------------------------------- diff --git a/src/backend/executor/test_discard/Makefile b/src/backend/executor/test_discard/Makefile deleted file mode 100644 index bdc2f8f..0000000 --- a/src/backend/executor/test_discard/Makefile +++ /dev/null @@ -1,157 +0,0 @@ -subdir=src/backend/executor -top_builddir=../../../.. - -TARGETS=nodeSubplan nodeShareInputScan execAmi execWorkfile execHHashagg - -# Objects from backend, which don't need to be mocked but need to be linked. -nodeSubplan_REAL_OBJS=\ - $(top_srcdir)/src/backend/access/hash/hashfunc.o \ - $(top_srcdir)/src/backend/bootstrap/bootparse.o \ - $(top_srcdir)/src/backend/executor/execUtils.o \ - $(top_srcdir)/src/backend/lib/stringinfo.o \ - $(top_srcdir)/src/backend/nodes/bitmapset.o \ - $(top_srcdir)/src/backend/nodes/equalfuncs.o \ - $(top_srcdir)/src/backend/nodes/list.o \ - $(top_srcdir)/src/backend/parser/gram.o \ - $(top_srcdir)/src/backend/regex/regcomp.o \ - $(top_srcdir)/src/backend/regex/regerror.o \ - $(top_srcdir)/src/backend/regex/regexec.o \ - $(top_srcdir)/src/backend/regex/regfree.o \ - $(top_srcdir)/src/backend/storage/page/itemptr.o \ - $(top_srcdir)/src/backend/utils/adt/datum.o \ - $(top_srcdir)/src/backend/utils/adt/like.o \ - $(top_srcdir)/src/backend/utils/hash/dynahash.o \ - $(top_srcdir)/src/backend/utils/hash/hashfn.o \ - $(top_srcdir)/src/backend/utils/misc/guc.o \ - $(top_srcdir)/src/backend/utils/init/globals.o \ - $(top_srcdir)/src/port/exec.o \ - $(top_srcdir)/src/port/path.o \ - $(top_srcdir)/src/port/pgsleep.o \ - $(top_srcdir)/src/port/pgstrcasecmp.o \ - $(top_srcdir)/src/port/qsort.o \ - $(top_srcdir)/src/port/strlcpy.o \ - $(top_srcdir)/src/port/thread.o \ - $(top_srcdir)/src/timezone/localtime.o \ - $(top_srcdir)/src/timezone/pgtz.o - -nodeShareInputScan_REAL_OBJS=\ - $(top_srcdir)/src/backend/access/hash/hashfunc.o \ - $(top_srcdir)/src/backend/access/transam/filerepdefs.o \ - $(top_srcdir)/src/backend/bootstrap/bootparse.o \ - $(top_srcdir)/src/backend/lib/stringinfo.o \ - $(top_srcdir)/src/backend/nodes/bitmapset.o \ - $(top_srcdir)/src/backend/nodes/equalfuncs.o \ - $(top_srcdir)/src/backend/nodes/list.o \ - $(top_srcdir)/src/backend/parser/gram.o \ - $(top_srcdir)/src/backend/regex/regcomp.o \ - $(top_srcdir)/src/backend/regex/regerror.o \ - $(top_srcdir)/src/backend/regex/regexec.o \ - $(top_srcdir)/src/backend/regex/regfree.o \ - $(top_srcdir)/src/backend/storage/page/itemptr.o \ - $(top_srcdir)/src/backend/utils/adt/datum.o \ - $(top_srcdir)/src/backend/utils/adt/like.o \ - $(top_srcdir)/src/backend/utils/hash/dynahash.o \ - $(top_srcdir)/src/backend/utils/hash/hashfn.o \ - $(top_srcdir)/src/backend/utils/misc/guc.o \ - $(top_srcdir)/src/backend/utils/init/globals.o \ - $(top_srcdir)/src/port/exec.o \ - $(top_srcdir)/src/port/path.o \ - $(top_srcdir)/src/port/pgsleep.o \ - $(top_srcdir)/src/port/pgstrcasecmp.o \ - $(top_srcdir)/src/port/qsort.o \ - $(top_srcdir)/src/port/strlcpy.o \ - $(top_srcdir)/src/port/thread.o \ - $(top_srcdir)/src/timezone/localtime.o \ - $(top_srcdir)/src/timezone/pgtz.o - -execAmi_REAL_OBJS=\ - $(top_srcdir)/src/backend/access/hash/hashfunc.o \ - $(top_srcdir)/src/backend/access/transam/filerepdefs.o \ - $(top_srcdir)/src/backend/bootstrap/bootparse.o \ - $(top_srcdir)/src/backend/lib/stringinfo.o \ - $(top_srcdir)/src/backend/nodes/bitmapset.o \ - $(top_srcdir)/src/backend/nodes/equalfuncs.o \ - $(top_srcdir)/src/backend/nodes/list.o \ - $(top_srcdir)/src/backend/parser/gram.o \ - $(top_srcdir)/src/backend/regex/regcomp.o \ - $(top_srcdir)/src/backend/regex/regerror.o \ - $(top_srcdir)/src/backend/regex/regexec.o \ - $(top_srcdir)/src/backend/regex/regfree.o \ - $(top_srcdir)/src/backend/storage/page/itemptr.o \ - $(top_srcdir)/src/backend/utils/adt/datum.o \ - $(top_srcdir)/src/backend/utils/adt/like.o \ - $(top_srcdir)/src/backend/utils/hash/dynahash.o \ - $(top_srcdir)/src/backend/utils/hash/hashfn.o \ - $(top_srcdir)/src/backend/utils/misc/guc.o \ - $(top_srcdir)/src/backend/utils/init/globals.o \ - $(top_srcdir)/src/port/exec.o \ - $(top_srcdir)/src/port/path.o \ - $(top_srcdir)/src/port/pgsleep.o \ - $(top_srcdir)/src/port/pgstrcasecmp.o \ - $(top_srcdir)/src/port/qsort.o \ - $(top_srcdir)/src/port/strlcpy.o \ - $(top_srcdir)/src/port/thread.o \ - $(top_srcdir)/src/timezone/localtime.o \ - $(top_srcdir)/src/timezone/pgtz.o - -execWorkfile_REAL_OBJS=\ - $(top_srcdir)/src/backend/access/hash/hashfunc.o \ - $(top_srcdir)/src/backend/bootstrap/bootparse.o \ - $(top_srcdir)/src/backend/lib/stringinfo.o \ - $(top_srcdir)/src/backend/nodes/bitmapset.o \ - $(top_srcdir)/src/backend/nodes/equalfuncs.o \ - $(top_srcdir)/src/backend/nodes/list.o \ - $(top_srcdir)/src/backend/parser/gram.o \ - $(top_srcdir)/src/backend/regex/regcomp.o \ - $(top_srcdir)/src/backend/regex/regerror.o \ - $(top_srcdir)/src/backend/regex/regexec.o \ - $(top_srcdir)/src/backend/regex/regfree.o \ - $(top_srcdir)/src/backend/storage/page/itemptr.o \ - $(top_srcdir)/src/backend/utils/adt/datum.o \ - $(top_srcdir)/src/backend/utils/adt/like.o \ - $(top_srcdir)/src/backend/utils/hash/dynahash.o \ - $(top_srcdir)/src/backend/utils/hash/hashfn.o \ - $(top_srcdir)/src/backend/utils/misc/guc.o \ - $(top_srcdir)/src/backend/utils/init/globals.o \ - $(top_srcdir)/src/port/exec.o \ - $(top_srcdir)/src/port/path.o \ - $(top_srcdir)/src/port/pgsleep.o \ - $(top_srcdir)/src/port/pgstrcasecmp.o \ - $(top_srcdir)/src/port/qsort.o \ - $(top_srcdir)/src/port/strlcpy.o \ - $(top_srcdir)/src/port/thread.o \ - $(top_srcdir)/src/timezone/localtime.o \ - $(top_srcdir)/src/timezone/pgtz.o - -execHHashagg_REAL_OBJS=\ - $(top_srcdir)/src/backend/access/hash/hashfunc.o \ - $(top_srcdir)/src/backend/bootstrap/bootparse.o \ - $(top_srcdir)/src/backend/executor/execUtils.o \ - $(top_srcdir)/src/backend/lib/stringinfo.o \ - $(top_srcdir)/src/backend/nodes/bitmapset.o \ - $(top_srcdir)/src/backend/nodes/equalfuncs.o \ - $(top_srcdir)/src/backend/nodes/list.o \ - $(top_srcdir)/src/backend/parser/gram.o \ - $(top_srcdir)/src/backend/regex/regcomp.o \ - $(top_srcdir)/src/backend/regex/regerror.o \ - $(top_srcdir)/src/backend/regex/regexec.o \ - $(top_srcdir)/src/backend/regex/regfree.o \ - $(top_srcdir)/src/backend/storage/page/itemptr.o \ - $(top_srcdir)/src/backend/utils/adt/datum.o \ - $(top_srcdir)/src/backend/utils/adt/like.o \ - $(top_srcdir)/src/backend/utils/hash/dynahash.o \ - $(top_srcdir)/src/backend/utils/hash/hashfn.o \ - $(top_srcdir)/src/backend/utils/misc/guc.o \ - $(top_srcdir)/src/backend/utils/init/globals.o \ - $(top_srcdir)/src/port/exec.o \ - $(top_srcdir)/src/port/path.o \ - $(top_srcdir)/src/port/pgsleep.o \ - $(top_srcdir)/src/port/pgstrcasecmp.o \ - $(top_srcdir)/src/port/qsort.o \ - $(top_srcdir)/src/port/strlcpy.o \ - $(top_srcdir)/src/port/thread.o \ - $(top_srcdir)/src/timezone/localtime.o \ - $(top_srcdir)/src/timezone/pgtz.o - -include ../../../Makefile.mock - http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/04c0f28b/src/backend/executor/test_discard/execAmi_test.c ---------------------------------------------------------------------- diff --git a/src/backend/executor/test_discard/execAmi_test.c b/src/backend/executor/test_discard/execAmi_test.c deleted file mode 100644 index 9947104..0000000 --- a/src/backend/executor/test_discard/execAmi_test.c +++ /dev/null @@ -1,37 +0,0 @@ -#include -#include -#include -#include "cmockery.h" - -#include "c.h" -#include "postgres.h" -#include "nodes/nodes.h" - -#include "../execAmi.c" - -/* ==================== ExecEagerFree ==================== */ -/* - * Tests that ExecEageFree calls the new ExecEagerFreeShareInputScan - * function when the input is a ShareInputScanState - */ -void -test__ExecEagerFree_ExecEagerFreeShareInputScan(void **state) -{ - ShareInputScanState *sisc = makeNode(ShareInputScanState); - - expect_value(ExecEagerFreeShareInputScan, node, sisc); - will_be_called(ExecEagerFreeShareInputScan); - - ExecEagerFree(sisc); -} - -int -main(int argc, char* argv[]) -{ - cmockery_parse_arguments(argc, argv); - - const UnitTest tests[] = { - unit_test(test__ExecEagerFree_ExecEagerFreeShareInputScan) - }; - return run_tests(tests); -} http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/04c0f28b/src/backend/executor/test_discard/execHHashagg_test.c ---------------------------------------------------------------------- diff --git a/src/backend/executor/test_discard/execHHashagg_test.c b/src/backend/executor/test_discard/execHHashagg_test.c deleted file mode 100644 index 0972ad9..0000000 --- a/src/backend/executor/test_discard/execHHashagg_test.c +++ /dev/null @@ -1,145 +0,0 @@ -#include -#include -#include -#include "cmockery.h" - -#include "c.h" -#include "postgres.h" - -/* Ignore elog */ -#include "utils/elog.h" -#undef elog -#define elog - - -/* Provide specialized mock implementations for memory allocation functions */ - -#undef palloc -#define palloc getSpillFile_palloc_mock -void *getSpillFile_palloc_mock(Size size); - -#include "../execHHashagg.c" - - -/* - * This is a mocked version of palloc to be used in getSpillFile(). - * It returns allocated memory padded with 0x7f pattern. - */ -void * -getSpillFile_palloc_mock(Size size) -{ - void *ptr = MemoryContextAlloc(CurrentMemoryContext, size); - MemSetAligned(ptr, 0x7f, size); - return ptr; -} - - -/* ==================== getSpillFile ==================== */ -/* - * Test that the spill_file->file_info->wfile field is allocated - * and initialized during normal execution (no exception thrown). - */ -void -test__getSpillFile__Initialize_wfile_success(void **state) -{ - int alloc_size = 0; - int file_no = 0; - int branching_factor = 32; - ExecWorkFile *ewfile = (ExecWorkFile *) palloc0(sizeof(ExecWorkFile)); - workfile_set *work_set = (workfile_set *) palloc0(sizeof(workfile_set)); - SpillSet *spill_set = (SpillSet *) palloc0(sizeof(SpillSet) + (branching_factor-1) * sizeof (SpillFile)); - - SpillFile *spill_file = &spill_set->spill_files[file_no]; - spill_file->file_info = NULL; - - expect_value(workfile_mgr_create_file, work_set, work_set); - will_return(workfile_mgr_create_file, ewfile); - - getSpillFile(work_set, spill_set, file_no, &alloc_size); - - assert_true(spill_file->file_info != NULL); - assert_int_equal(spill_file->file_info->total_bytes, 0); - assert_int_equal(spill_file->file_info->ntuples, 0); - assert_int_equal(alloc_size, BATCHFILE_METADATA); - - /* - * During normal execution, wfile should be initialized with - * the result of workfile_mgr_create_wfile, a valid ExecWorkFile pointer - */ - assert_true(spill_file->file_info->wfile == ewfile); -} - -/* - * Function used a side effect to simulate throwing exception - * by a certain function. - */ -void -throw_exception_side_effect() -{ - PG_RE_THROW(); -} - -/* ==================== getSpillFile ==================== */ -/* - * Test that the spill_file->file_info->wfile field is initialized to NULL - * when creating a workfile throws an exception. - */ -void -test__getSpillFile__Initialize_wfile_exception(void **state) -{ - - int alloc_size = 0; - int file_no = 0; - int branching_factor = 32; - ExecWorkFile *ewfile = (ExecWorkFile *) palloc0(sizeof(ExecWorkFile)); - workfile_set *work_set = (workfile_set *) palloc0(sizeof(workfile_set)); - SpillSet *spill_set = (SpillSet *) palloc0(sizeof(SpillSet) + (branching_factor-1) * sizeof (SpillFile)); - - SpillFile *spill_file = &spill_set->spill_files[0]; - spill_file->file_info = NULL; - - /* Make workfile_mgr_create_file throw an exception, using the side effect function */ - expect_value(workfile_mgr_create_file, work_set, work_set); - will_return_with_sideeffect(workfile_mgr_create_file, ewfile, &throw_exception_side_effect, NULL); - - PG_TRY(); - { - - /* This function will throw an exception, and we'll catch it below */ - getSpillFile(work_set, spill_set, file_no, &alloc_size); - - } - PG_CATCH(); - { - assert_true(spill_file->file_info != NULL); - assert_int_equal(spill_file->file_info->total_bytes, 0); - assert_int_equal(spill_file->file_info->ntuples, 0); - assert_int_equal(alloc_size, 0); - - /* - * This is the main test: We must initialize this pointer to NULL, even - * if an exception is thrown - */ - assert_true(spill_file->file_info->wfile == NULL); - return; - } - PG_END_TRY(); - - /* We shouldn't get here, the getSpillFile should throw an exception */ - assert_true(false); - -} - -/* ==================== main ==================== */ -int -main(int argc, char* argv[]) -{ - cmockery_parse_arguments(argc, argv); - - const UnitTest tests[] = { - unit_test(test__getSpillFile__Initialize_wfile_success), - unit_test(test__getSpillFile__Initialize_wfile_exception) - }; - - return run_tests(tests); -} http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/04c0f28b/src/backend/executor/test_discard/execWorkfile_test.c ---------------------------------------------------------------------- diff --git a/src/backend/executor/test_discard/execWorkfile_test.c b/src/backend/executor/test_discard/execWorkfile_test.c deleted file mode 100644 index 9d95a1f..0000000 --- a/src/backend/executor/test_discard/execWorkfile_test.c +++ /dev/null @@ -1,101 +0,0 @@ -#include -#include -#include -#include "cmockery.h" - -#include "c.h" -#include "postgres.h" -#include "storage/buffile.h" -#include "storage/bfz.h" -#include "executor/execWorkfile.h" -#include "utils/memutils.h" - -/* Ignore elog */ -#include "utils/elog.h" - -#undef elog -#define elog - -/* Provide specialized mock implementations for memory allocation functions */ -#undef palloc0 -#define palloc0 execWorkfile_palloc0_mock -void *execWorkfile_palloc0_mock(Size size); - -#undef pstrdup -#define pstrdup execWorkfile_pstrdup_mock -char *execWorkfile_pstrdup_mock(const char *string); - -#include "../execWorkfile.c" - -/* - * This is a mocked version of palloc0 to be used in ExecWorkFile_Create. - * It asserts that it is executed in the TopMemoryContext. - */ -void * -execWorkfile_palloc0_mock(Size size) -{ - assert_int_equal(CurrentMemoryContext, TopMemoryContext); - return MemoryContextAllocZero(CurrentMemoryContext, size); -} - -/* - * This is a mocked version of pstrdup to be used in ExecWorkFile_Create. - * It asserts that it is executed in the TopMemoryContext. - */ -char *execWorkfile_pstrdup_mock(const char *string) -{ - assert_int_equal(CurrentMemoryContext, TopMemoryContext); - return MemoryContextStrdup(CurrentMemoryContext, string); -} - - -/* ==================== ExecWorkFile_Create ==================== */ -/* - * Test that the ExecWorkFile struct is allocated in TopMemoryContext - */ -void -test__ExecWorkFile_Create__InTopMemContext(void **state) -{ - - char *test_filename = "foo"; - - will_return(WorkfileQueryspace_AddWorkfile, true); - - expect_value(BufFileCreateFile, fileName, test_filename); - expect_value(BufFileCreateFile, delOnClose, true); - expect_value(BufFileCreateFile, interXact, false); - will_return(BufFileCreateFile, NULL); - - expect_value(BufFileSetWorkfile, buffile, NULL); - will_be_called(BufFileSetWorkfile); - - /* - * All the memory context stuff is mocked, so the TopMemoryContext is NULL - * at this point. Set it to something specific so we can distinguish it from - * the CurrentMemoryContext. - */ - TopMemoryContext = (MemoryContext) 0xdeadbeef; - CurrentMemoryContext = (MemoryContext) 0xfeadbead; - - /* - * ExecWorkFile_Create will call our mocked palloc0 function execWorkfile__palloc0_mock - * and our mocked pstrdup function execWorkfile_pstrdup_mock. - * These functions will assert that the allocation of the result happens - * in the TopMemoryContext. - */ - ExecWorkFile *ewf = ExecWorkFile_Create(test_filename, BUFFILE, true /* delOnClose */, 0 /* compressType */); - -} - -/* ==================== main ==================== */ -int -main(int argc, char* argv[]) -{ - cmockery_parse_arguments(argc, argv); - - const UnitTest tests[] = { - unit_test(test__ExecWorkFile_Create__InTopMemContext) - }; - - return run_tests(tests); -} http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/04c0f28b/src/backend/executor/test_discard/nodeShareInputScan_test.c ---------------------------------------------------------------------- diff --git a/src/backend/executor/test_discard/nodeShareInputScan_test.c b/src/backend/executor/test_discard/nodeShareInputScan_test.c deleted file mode 100644 index 7bb8b92..0000000 --- a/src/backend/executor/test_discard/nodeShareInputScan_test.c +++ /dev/null @@ -1,102 +0,0 @@ -#include -#include -#include -#include "cmockery.h" - -#include "c.h" -#include "postgres.h" -#include "nodes/nodes.h" -#include "../nodeShareInputScan.c" - -#define FIXED_POINTER_VAL ((LargestIntegralType) 0x0000beef) -#define SHARE_NODE_ENTRY_REFCOUNT 78 - -/* - * Tests ExecEagerFreeShareInputScan when plan->share_type = SHARE_NOTSHARED - * Verifies that all the pointers are set to NULL - */ -void -test__ExecEagerFreeShareInputScan_SHARE_NOTSHARED(void **state) -{ - ShareInputScanState *sisc = makeNode(ShareInputScanState); - ShareInputScan *plan = makeNode(ShareInputScan); - sisc->ss.ps.plan = plan; - - sisc->ts_markpos = FIXED_POINTER_VAL; - sisc->ts_pos = FIXED_POINTER_VAL; - sisc->ts_state = FIXED_POINTER_VAL; - sisc->freed = false; - - plan->share_type = SHARE_NOTSHARED; - - ExecEagerFreeShareInputScan(sisc); - - assert_int_equal(sisc->ts_markpos, NULL); - assert_int_equal(sisc->ts_pos, NULL); - assert_int_equal(sisc->ts_state, NULL); - assert_true(sisc->freed); - - return; -} - -/* ==================== ExecEagerFreeShareInputScan ==================== */ -/* - * Tests ExecEagerFreeShareInputScan when plan->share_type = SHARE_MATERIAL - * Verifies that the tuplestore accessor and the tuplestore state are destroyed, - * and that all the pointers are set to NULL - */ -void -test__ExecEagerFreeShareInputScan_SHARE_MATERIAL(void **state) -{ - ShareInputScanState *sisc = makeNode(ShareInputScanState); - ShareInputScan *plan = makeNode(ShareInputScan); - sisc->ss.ps.plan = plan; - - sisc->ts_markpos = NULL; - sisc->ts_pos = FIXED_POINTER_VAL; - sisc->ts_state = (GenericTupStore *) palloc0(sizeof(GenericTupStore)); - sisc->ts_state->matstore = FIXED_POINTER_VAL; - sisc->freed = false; - - plan->share_type = SHARE_MATERIAL; - - expect_value(ntuplestore_destroy_accessor, acc, FIXED_POINTER_VAL); - will_be_called(ntuplestore_destroy_accessor); - - expect_value(ntuplestore_is_readerwriter_reader, nts, FIXED_POINTER_VAL); - will_return(ntuplestore_is_readerwriter_reader, true); - - expect_value(ntuplestore_destroy, ts, FIXED_POINTER_VAL); - will_be_called(ntuplestore_destroy); - - - ShareNodeEntry *shareNodeEntry = makeNode(ShareNodeEntry); - shareNodeEntry->refcount = SHARE_NODE_ENTRY_REFCOUNT; - - expect_any(ExecGetShareNodeEntry, estate); - expect_any(ExecGetShareNodeEntry, shareidx); - expect_value(ExecGetShareNodeEntry, fCreate, false); - will_return(ExecGetShareNodeEntry, shareNodeEntry); - - ExecEagerFreeShareInputScan(sisc); - - assert_int_equal(sisc->ts_markpos, NULL); - assert_int_equal(sisc->ts_pos, NULL); - assert_int_equal(sisc->ts_state, NULL); - assert_int_equal(shareNodeEntry->refcount, SHARE_NODE_ENTRY_REFCOUNT - 1); - assert_true(sisc->freed); - - return; -} - -int -main(int argc, char* argv[]) -{ - cmockery_parse_arguments(argc, argv); - - const UnitTest tests[] = { - unit_test(test__ExecEagerFreeShareInputScan_SHARE_NOTSHARED), - unit_test(test__ExecEagerFreeShareInputScan_SHARE_MATERIAL) - }; - return run_tests(tests); -} http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/04c0f28b/src/backend/executor/test_discard/nodeSubplan_test.c ---------------------------------------------------------------------- diff --git a/src/backend/executor/test_discard/nodeSubplan_test.c b/src/backend/executor/test_discard/nodeSubplan_test.c deleted file mode 100644 index 9e6aa0b..0000000 --- a/src/backend/executor/test_discard/nodeSubplan_test.c +++ /dev/null @@ -1,159 +0,0 @@ -#include -#include -#include -#include "cmockery.h" - -#include "c.h" -#include "postgres.h" -#include "nodes/nodes.h" -#include "../nodeSubplan.c" - -/* Function passed to testing framework - * in order to force SetupInterconnect to fail */ -void -_RETHROW( ) -{ - PG_RE_THROW(); -} - - -/* Checks CdbCheckDispatchResult is called when queryDesc - * is not null (when shouldDispatch is true). - * This test falls in PG_CATCH when SetupInterconnect - * does not allocate queryDesc->estate->interconnect_context. - * The test is successful if the */ -void -test__ExecSetParamPlan__Check_Dispatch_Results(void **state) -{ - - /*Set plan to explain.*/ - SubPlanState *plan = makeNode(SubPlanState); - plan->xprstate.expr = makeNode(SubPlanState); - plan->planstate = makeNode(SubPlanState); - plan->planstate->instrument = (Instrumentation *)palloc(sizeof(Instrumentation)); - plan->planstate->plan = makeNode(SubPlanState); - - /*Function needed for estate.*/ - expect_any(AllocSetContextCreate,parent); - expect_any(AllocSetContextCreate,name); - expect_any(AllocSetContextCreate,minContextSize); - expect_any(AllocSetContextCreate,initBlockSize); - expect_any(AllocSetContextCreate,maxBlockSize); - will_be_called(AllocSetContextCreate); - EState *estate = CreateExecutorState(); - - /*Assign mocked estate to plan.*/ - ((PlanState *)(plan->planstate))->state= estate; - - /*Function needed for GetPerTupleExprContext*/ - expect_any(AllocSetContextCreate,parent); - expect_any(AllocSetContextCreate,name); - expect_any(AllocSetContextCreate,minContextSize); - expect_any(AllocSetContextCreate,initBlockSize); - expect_any(AllocSetContextCreate,maxBlockSize); - will_be_called(AllocSetContextCreate); - - /*Re-use estate mocked object. Needed as input parameter for - tested function */ - ExprContext *econtext = GetPerTupleExprContext(estate); - - - /*Set QueryDescriptor input parameter for tested function */ - PlannedStmt *plannedstmt = (PlannedStmt *)palloc(sizeof(PlannedStmt)); - QueryDesc *queryDesc = (QueryDesc *)palloc(sizeof(QueryDesc)); - queryDesc->plannedstmt = plannedstmt; - queryDesc->estate = (EState *)palloc(sizeof(EState)); - queryDesc->estate->es_sliceTable = (SliceTable *) palloc(sizeof(SliceTable)); - - /*Set of functions called within tested function*/ - expect_any(MemoryContextGetPeakSpace,context); - will_be_called(MemoryContextGetPeakSpace); - - expect_any(MemoryContextSetPeakSpace,context); - expect_any(MemoryContextSetPeakSpace,nbytes); - will_be_called(MemoryContextSetPeakSpace); - - /*QueryDescriptor generated when shouldDispatch is true.*/ - QueryDesc *internalQueryDesc = (QueryDesc *)palloc(sizeof(QueryDesc)); - internalQueryDesc->estate = (EState *)palloc(sizeof(EState)); - /* Added to force assertion on queryDesc->estate->interconnect_context; - to fail */ - internalQueryDesc->estate->interconnect_context=NULL; - internalQueryDesc->estate->es_sliceTable = (SliceTable *) palloc(sizeof(SliceTable)); - - expect_any(CreateQueryDesc,plannedstmt); - expect_any(CreateQueryDesc,sourceText); - expect_any(CreateQueryDesc,snapshot); - expect_any(CreateQueryDesc,crosscheck_snapshot); - expect_any(CreateQueryDesc,dest); - expect_any(CreateQueryDesc,params); - expect_any(CreateQueryDesc,doInstrument); - will_return(CreateQueryDesc,internalQueryDesc); - - expect_any(AllocSetContextCreate,parent); - expect_any(AllocSetContextCreate,name); - expect_any(AllocSetContextCreate,minContextSize); - expect_any(AllocSetContextCreate,initBlockSize); - expect_any(AllocSetContextCreate,maxBlockSize); - will_be_called(AllocSetContextCreate); - - Gp_role = GP_ROLE_DISPATCH; - plan->planstate->plan->dispatch=DISPATCH_PARALLEL; - - will_be_called(isCurrentDtxTwoPhase); - - expect_any(cdbdisp_dispatchPlan,queryDesc); - expect_any(cdbdisp_dispatchPlan,planRequiresTxn); - expect_any(cdbdisp_dispatchPlan,cancelOnError); - expect_any(cdbdisp_dispatchPlan,ds); - will_be_called(cdbdisp_dispatchPlan); - - expect_any(SetupInterconnect,estate); - /* Force SetupInterconnect to fail */ - will_be_called_with_sideeffect(SetupInterconnect,&_RETHROW,NULL); - - - expect_any(cdbexplain_localExecStats,planstate); - expect_any(cdbexplain_localExecStats,showstatctx); - will_be_called(cdbexplain_localExecStats); - - expect_any(CdbCheckDispatchResult,ds); - expect_any(CdbCheckDispatchResult,cancelUnfinishedWork); - will_be_called(CdbCheckDispatchResult); - - expect_any(cdbexplain_recvExecStats,planstate); - expect_any(cdbexplain_recvExecStats,dispatchResults); - expect_any(cdbexplain_recvExecStats,sliceIndex); - expect_any(cdbexplain_recvExecStats,showstatctx); - will_be_called(cdbexplain_recvExecStats); - - expect_any(MemoryContextSetPeakSpace,context); - expect_any(MemoryContextSetPeakSpace,nbytes); - will_be_called(MemoryContextSetPeakSpace); - - will_be_called(TeardownSequenceServer); - - expect_any(TeardownInterconnect,transportStates); - expect_any(TeardownInterconnect,mlStates); - expect_any(TeardownInterconnect,forceEOS); - will_be_called(TeardownInterconnect); - - /* Catch PG_RE_THROW(); after cleaning with CdbCheckDispatchResult */ - PG_TRY(); - ExecSetParamPlan(plan,econtext,queryDesc); - PG_CATCH(); - assert_true(true); - PG_END_TRY(); -} - -int -main(int argc, char* argv[]) -{ - cmockery_parse_arguments(argc, argv); - - const UnitTest tests[] = { - unit_test(test__ExecSetParamPlan__Check_Dispatch_Results) - }; - return run_tests(tests); -} -