testprogs: add DeletePrinterDataEx test.
[ira/wip.git] / testprogs / win32 / spoolss / spoolss.c
index d097bf378bab56877754bcbe56c2ec14e00b7c0d..698f024b11ea057f579cccd9d590d183016ccad2 100644 (file)
@@ -859,6 +859,111 @@ static BOOL test_DeviceModes(struct torture_context *tctx,
 /****************************************************************************
 ****************************************************************************/
 
+static BOOL test_GetJob(struct torture_context *tctx,
+                       LPSTR printername,
+                       HANDLE handle,
+                       DWORD job_id)
+{
+       DWORD levels[]  = { 1, 2, 3, 4 };
+       DWORD success[] = { 1, 1, 1, 1 };
+       DWORD i;
+       LPBYTE buffer = NULL;
+
+       for (i=0; i < ARRAY_SIZE(levels); i++) {
+
+               DWORD needed = 0;
+               DWORD err = 0;
+               char tmp[1024];
+
+               torture_comment(tctx, "Testing GetJob(%d) level %d", job_id, levels[i]);
+
+               if (tctx->samba3 && (levels[i] == 4) || (levels[i] == 3)) {
+                       torture_comment(tctx, "skipping level %d getjob against samba\n", levels[i]);
+                       continue;
+               }
+
+               GetJob(handle, job_id, levels[i], NULL, 0, &needed);
+               err = GetLastError();
+               if (err == ERROR_INSUFFICIENT_BUFFER) {
+                       err = 0;
+                       buffer = malloc(needed);
+                       torture_assert(tctx, buffer, "malloc failed");
+                       if (!GetJob(handle, job_id, levels[i], buffer, needed, &needed)) {
+                               err = GetLastError();
+                       }
+               }
+               if (err) {
+                       sprintf(tmp, "GetJob failed level %d on [%s] (buffer size = %d), error: %s\n",
+                               levels[i], printername, needed, errstr(err));
+                       if (success[i]) {
+                               torture_fail(tctx, tmp);
+                       } else {
+                               torture_warning(tctx, tmp);
+                       }
+               }
+
+               if (tctx->print) {
+                       print_job_info_bylevel(levels[i], buffer, 1);
+               }
+
+               free(buffer);
+               buffer = NULL;
+       }
+
+       return TRUE;
+}
+
+/****************************************************************************
+****************************************************************************/
+
+static BOOL test_EachJob(struct torture_context *tctx,
+                        LPSTR printername,
+                        HANDLE handle)
+{
+       DWORD i;
+       PJOB_INFO_1 buffer = NULL;
+       DWORD needed = 0;
+       DWORD returned = 0;
+       DWORD err = 0;
+       DWORD level = 1;
+       char tmp[1024];
+       BOOL ret = TRUE;
+
+       torture_comment(tctx, "Testing Each PrintJob %d");
+
+       EnumJobs(handle, 0, 100, level, NULL, 0, &needed, &returned);
+       err = GetLastError();
+       if (err == ERROR_INSUFFICIENT_BUFFER) {
+               err = 0;
+               buffer = (PJOB_INFO_1)malloc(needed);
+               torture_assert(tctx, buffer, "malloc failed");
+               if (!EnumJobs(handle, 0, 100, level, (LPBYTE)buffer, needed, &needed, &returned)) {
+                       err = GetLastError();
+               }
+       }
+       if (err) {
+               sprintf(tmp, "EnumJobs failed level %d on [%s] (buffer size = %d), error: %s\n",
+                       level, printername, needed, errstr(err));
+               torture_fail(tctx, tmp);
+       }
+
+       if (tctx->print) {
+               print_job_info_bylevel(level, (LPBYTE)buffer, returned);
+       }
+
+       for (i=0; i < returned; i++) {
+               ret = test_GetJob(tctx, printername, handle, buffer[i].JobId);
+       }
+
+       free(buffer);
+
+       return ret;
+
+}
+
+/****************************************************************************
+****************************************************************************/
+
 static BOOL test_OnePrinter(struct torture_context *tctx,
                            LPSTR printername,
                            LPSTR architecture,
@@ -874,6 +979,7 @@ static BOOL test_OnePrinter(struct torture_context *tctx,
        ret &= test_GetPrinterDriver(tctx, printername, architecture, handle);
        ret &= test_EnumForms(tctx, printername, handle);
        ret &= test_EnumJobs(tctx, printername, handle);
+       ret &= test_EachJob(tctx, printername, handle);
        ret &= test_EnumPrinterKey(tctx, printername, handle, "");
        ret &= test_EnumPrinterKey(tctx, printername, handle, "PrinterDriverData");
        ret &= test_EnumPrinterDataEx(tctx, printername, "PrinterDriverData", handle, NULL, NULL);
@@ -967,6 +1073,10 @@ static BOOL test_GetPrintProcessorDirectory(struct torture_context *tctx,
                        }
                }
 
+               if (tctx->print) {
+                       printf("\tPrint Processor Directory\t= %s\n\n", (LPSTR)buffer);
+               }
+
                free(buffer);
                buffer = NULL;
        }
@@ -1014,6 +1124,10 @@ static BOOL test_GetPrinterDriverDirectory(struct torture_context *tctx,
                        }
                }
 
+               if (tctx->print) {
+                       printf("\tPrinter Driver Directory\t= %s\n\n", (LPSTR)buffer);
+               }
+
                free(buffer);
                buffer = NULL;
        }
@@ -1129,6 +1243,30 @@ static BOOL test_GetPrinterDataEx(struct torture_context *tctx,
 /****************************************************************************
 ****************************************************************************/
 
+static BOOL test_DeletePrinterDataEx(struct torture_context *tctx,
+                                    LPSTR servername,
+                                    LPSTR keyname,
+                                    LPSTR valuename,
+                                    HANDLE handle)
+{
+       DWORD err = 0;
+       char tmp[1024];
+
+       torture_comment(tctx, "Testing DeletePrinterDataEx(%s - %s)", keyname, valuename);
+
+       err = DeletePrinterDataEx(handle, keyname, valuename);
+       if (err) {
+               sprintf(tmp, "DeletePrinterDataEx(%s - %s) failed on [%s], error: %s\n",
+                       keyname, valuename, servername, errstr(err));
+               torture_fail(tctx, tmp);
+       }
+
+       return TRUE;
+}
+
+/****************************************************************************
+****************************************************************************/
+
 static BOOL test_PrinterData(struct torture_context *tctx,
                             LPSTR servername,
                             HANDLE handle)
@@ -1225,6 +1363,15 @@ int main(int argc, char *argv[])
        defaults_use.pDevMode = NULL;
        defaults_use.DesiredAccess = PRINTER_ACCESS_USE;
 
+       if ((servername[0] == '\\') && (servername[1] == '\\')) {
+               LPSTR p = servername+2;
+               LPSTR p2;
+               if ((p2 = strchr(p, '\\')) != NULL) {
+                       ret = test_OnePrinter(tctx, servername, architecture, NULL);
+                       goto done;
+               }
+       }
+
        ret &= test_EnumPrinters(tctx, servername);
        ret &= test_EnumDrivers(tctx, servername, architecture);
        ret &= test_OpenPrinter(tctx, servername, NULL, &server_handle);
@@ -1240,6 +1387,7 @@ int main(int argc, char *argv[])
        ret &= test_GetPrinterDriverDirectory(tctx, servername, architecture);
        ret &= test_EachPrinter(tctx, servername, architecture, NULL);
 
+ done:
        if (!ret) {
                if (tctx->last_reason) {
                        fprintf(stderr, "failed: %s\n", tctx->last_reason);