diff options
| -rw-r--r-- | source4/torture/rpc/spoolss.c | 171 | 
1 files changed, 128 insertions, 43 deletions
diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 4cc0e84769..d4970c1fed 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -2386,7 +2386,8 @@ static bool test_EnumForms_find_one(struct torture_context *tctx,  static bool test_DeleteForm(struct torture_context *tctx,  			    struct dcerpc_binding_handle *b,  			    struct policy_handle *handle, -			    const char *form_name) +			    const char *form_name, +			    WERROR expected_result)  {  	struct spoolss_DeleteForm r; @@ -2398,13 +2399,15 @@ static bool test_DeleteForm(struct torture_context *tctx,  	torture_assert_ntstatus_ok(tctx,  		dcerpc_spoolss_DeleteForm_r(b, tctx, &r),  		"DeleteForm failed"); -	torture_assert_werr_ok(tctx, r.out.result, -		"DeleteForm failed"); -	torture_assert_ntstatus_ok(tctx, -		dcerpc_spoolss_DeleteForm_r(b, tctx, &r), -		"2nd DeleteForm failed"); -	torture_assert_werr_equal(tctx, r.out.result, WERR_INVALID_FORM_NAME, -		"2nd DeleteForm failed"); +	torture_assert_werr_equal(tctx, r.out.result, expected_result, +		"DeleteForm gave unexpected result"); +	if (W_ERROR_IS_OK(r.out.result)) { +		torture_assert_ntstatus_ok(tctx, +			dcerpc_spoolss_DeleteForm_r(b, tctx, &r), +			"2nd DeleteForm failed"); +		torture_assert_werr_equal(tctx, r.out.result, WERR_INVALID_FORM_NAME, +			"2nd DeleteForm failed"); +	}  	return true;  } @@ -2413,7 +2416,8 @@ static bool test_AddForm(struct torture_context *tctx,  			 struct dcerpc_binding_handle *b,  			 struct policy_handle *handle,  			 uint32_t level, -			 union spoolss_AddFormInfo *info) +			 union spoolss_AddFormInfo *info, +			 WERROR expected_result)  {  	struct spoolss_AddForm r; @@ -2425,19 +2429,14 @@ static bool test_AddForm(struct torture_context *tctx,  	r.in.level	= level;  	r.in.info	= *info; -	torture_comment(tctx, "Testing AddForm(%s) level %d\n", -		r.in.info.info1->form_name, r.in.level); +	torture_comment(tctx, "Testing AddForm(%s) level %d, type %d\n", +		r.in.info.info1->form_name, r.in.level, +		r.in.info.info1->flags);  	torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_AddForm_r(b, tctx, &r),  		"AddForm failed"); -	if (W_ERROR_EQUAL(r.out.result, WERR_FILE_EXISTS)) { -		test_DeleteForm(tctx, b, handle, r.in.info.info1->form_name); -		torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_AddForm_r(b, tctx, &r), -			"AddForm failed"); -	} - -	torture_assert_werr_ok(tctx, r.out.result, -		"AddForm failed"); +	torture_assert_werr_equal(tctx, r.out.result, expected_result, +		"AddForm gave unexpected result");  	torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_AddForm_r(b, tctx, &r),  		"2nd AddForm failed"); @@ -2483,41 +2482,33 @@ static bool test_GetForm_winreg(struct torture_context *tctx,  				uint32_t *w_length,  				uint8_t **w_data); -static bool test_Forms(struct torture_context *tctx, -		       struct dcerpc_binding_handle *b, -		       struct policy_handle *handle, -		       bool print_server, -		       const char *printer_name, -		       struct dcerpc_binding_handle *winreg_handle, -		       struct policy_handle *hive_handle) +static bool test_Forms_args(struct torture_context *tctx, +			    struct dcerpc_binding_handle *b, +			    struct policy_handle *handle, +			    bool print_server, +			    const char *printer_name, +			    struct dcerpc_binding_handle *winreg_handle, +			    struct policy_handle *hive_handle, +			    const char *form_name, +			    struct spoolss_AddFormInfo1 *info1, +			    WERROR expected_add_result, +			    WERROR expected_delete_result)  {  	union spoolss_FormInfo info; -	const char *form_name = "testform3"; -  	union spoolss_AddFormInfo add_info; -	struct spoolss_AddFormInfo1 info1;  	enum winreg_Type w_type;  	uint32_t w_size;  	uint32_t w_length;  	uint8_t *w_data; -	info1.flags		= SPOOLSS_FORM_USER; -	info1.form_name		= form_name; -	info1.size.width	= 50; -	info1.size.height	= 25; -	info1.area.left		= 5; -	info1.area.top		= 10; -	info1.area.right	= 45; -	info1.area.bottom	= 15; - -	add_info.info1 = &info1; +	add_info.info1 = info1;  	torture_assert(tctx, -		test_AddForm(tctx, b, handle, 1, &add_info), +		test_AddForm(tctx, b, handle, 1, &add_info, expected_add_result),  		"failed to add form"); -	if (winreg_handle && hive_handle) { +	if (winreg_handle && hive_handle && W_ERROR_IS_OK(expected_add_result)) {  		torture_assert(tctx,  			test_GetForm_winreg(tctx, winreg_handle, hive_handle, TOP_LEVEL_CONTROL_FORMS_KEY, form_name, &w_type, &w_size, &w_length, &w_data), @@ -2536,7 +2527,7 @@ static bool test_Forms(struct torture_context *tctx,  		torture_assert_mem_equal(tctx, &w_data[28], &add_info.info1->flags, 4, "flags mismatch");  	} -	if (!print_server) { +	if (!print_server && W_ERROR_IS_OK(expected_add_result)) {  		torture_assert(tctx,  			test_GetForm_args(tctx, b, handle, form_name, 1, &info),  			"failed to get added form"); @@ -2577,12 +2568,106 @@ static bool test_Forms(struct torture_context *tctx,  		"Newly added form not found in enum call");  	torture_assert(tctx, -		test_DeleteForm(tctx, b, handle, form_name), +		test_DeleteForm(tctx, b, handle, form_name, expected_delete_result),  		"failed to delete form");  	return true;  } +static bool test_Forms(struct torture_context *tctx, +		       struct dcerpc_binding_handle *b, +		       struct policy_handle *handle, +		       bool print_server, +		       const char *printer_name, +		       struct dcerpc_binding_handle *winreg_handle, +		       struct policy_handle *hive_handle) +{ + +	struct spoolss_FormSize size; +	struct spoolss_FormArea area; +	int i; + +	size.width	= 50; +	size.height	= 25; +	area.left	= 5; +	area.top	= 10; +	area.right	= 45; +	area.bottom	= 15; + +	struct { +		struct spoolss_AddFormInfo1 info1; +		WERROR expected_add_result; +		WERROR expected_delete_result; +	} forms[] = { +		{ +			.info1.flags		= SPOOLSS_FORM_USER, +			.info1.form_name	= "testform_user", +			.info1.size		= size, +			.info1.area		= area, +			.expected_add_result	= WERR_OK, +			.expected_delete_result	= WERR_OK +		}, +/* +		weird, we can add a builtin form but we can never remove it +		again - gd + +		{ +			.info1.flags		= SPOOLSS_FORM_BUILTIN, +			.info1.form_name	= "testform_builtin", +			.info1.size		= size, +			.info1.area		= area, +			.expected_add_result	= WERR_OK, +			.expected_delete_result	= WERR_INVALID_PARAM, +		}, +*/ +		{ +			.info1.flags		= SPOOLSS_FORM_PRINTER, +			.info1.form_name	= "testform_printer", +			.info1.size		= size, +			.info1.area		= area, +			.expected_add_result	= WERR_OK, +			.expected_delete_result	= WERR_OK +		}, +		{ +			.info1.flags		= SPOOLSS_FORM_USER, +			.info1.form_name	= "Letter", +			.info1.size		= size, +			.info1.area		= area, +			.expected_add_result	= WERR_FILE_EXISTS, +			.expected_delete_result	= WERR_INVALID_PARAM +		}, +		{ +			.info1.flags		= SPOOLSS_FORM_BUILTIN, +			.info1.form_name	= "Letter", +			.info1.size		= size, +			.info1.area		= area, +			.expected_add_result	= WERR_FILE_EXISTS, +			.expected_delete_result	= WERR_INVALID_PARAM +		}, +		{ +			.info1.flags		= SPOOLSS_FORM_PRINTER, +			.info1.form_name	= "Letter", +			.info1.size		= size, +			.info1.area		= area, +			.expected_add_result	= WERR_FILE_EXISTS, +			.expected_delete_result	= WERR_INVALID_PARAM +		} +	}; + +	for (i=0; i < ARRAY_SIZE(forms); i++) { +		torture_assert(tctx, +			test_Forms_args(tctx, b, handle, print_server, printer_name, +					winreg_handle, hive_handle, +					forms[i].info1.form_name, +					&forms[i].info1, +					forms[i].expected_add_result, +					forms[i].expected_delete_result), +			talloc_asprintf(tctx, "failed to test form '%s'", forms[i].info1.form_name)); +	} + +	return true; +} +  static bool test_EnumPorts_old(struct torture_context *tctx,  			       struct dcerpc_pipe *p)  {  | 
