diff --git a/doc/xml/release.xml b/doc/xml/release.xml index d820a137b..329922183 100644 --- a/doc/xml/release.xml +++ b/doc/xml/release.xml @@ -177,6 +177,14 @@

Add StringId type.

+ + + + + +

Add local processs shim.

+
+ diff --git a/test/define.yaml b/test/define.yaml index 9bf01c499..dc907eabc 100644 --- a/test/define.yaml +++ b/test/define.yaml @@ -582,6 +582,12 @@ unit: # ---------------------------------------------------------------------------------------------------------------------------- - name: protocol total: 9 + harness: + name: protocol + shim: + protocol/helper: + function: + - protocolLocalExec containerReq: true binReq: true @@ -760,7 +766,6 @@ unit: # ---------------------------------------------------------------------------------------------------------------------------- - name: restore total: 12 - binReq: true coverage: - command/restore/file @@ -783,7 +788,6 @@ unit: # ---------------------------------------------------------------------------------------------------------------------------- - name: backup total: 10 - binReq: true coverage: - command/backup/backup @@ -814,7 +818,6 @@ unit: # ---------------------------------------------------------------------------------------------------------------------------- - name: verify total: 8 - binReq: true coverage: - command/verify/file diff --git a/test/src/common/harnessProtocol.c b/test/src/common/harnessProtocol.c new file mode 100644 index 000000000..ebf653048 --- /dev/null +++ b/test/src/common/harnessProtocol.c @@ -0,0 +1,116 @@ +/*********************************************************************************************************************************** +Harness for Protocol Testing +***********************************************************************************************************************************/ +#include "build.auto.h" + +#include +#include + +#include "common/io/fdRead.h" +#include "common/io/fdWrite.h" +#include "common/fork.h" + +#include "common/harnessConfig.h" +#include "common/harnessDebug.h" +#include "common/harnessLog.h" +#include "common/harnessProtocol.h" + +/*********************************************************************************************************************************** +Include shimmed C modules +***********************************************************************************************************************************/ +{[SHIM_MODULE]} + +/*********************************************************************************************************************************** +Shim initialization state +***********************************************************************************************************************************/ +static struct +{ + bool localHandler; + const ProtocolServerHandler *localHandlerList; + unsigned int localHandlerListSize; +} hrnProtocolStatic; + +/*********************************************************************************************************************************** +Shim protocolLocalExec() to provide coverage as detailed in the hrnProtocolLocalShimInstall() documentation. +***********************************************************************************************************************************/ +static void +protocolLocalExec( + ProtocolHelperClient *helper, ProtocolStorageType protocolStorageType, unsigned int hostIdx, unsigned int processId) +{ + // Call the shim when initialized + if (hrnProtocolStatic.localHandler) + { + FUNCTION_HARNESS_BEGIN(); + FUNCTION_HARNESS_PARAM_P(VOID, helper); + FUNCTION_HARNESS_PARAM(ENUM, protocolStorageType); + FUNCTION_HARNESS_PARAM(UINT, hostIdx); + FUNCTION_HARNESS_PARAM(UINT, processId); + FUNCTION_HARNESS_END(); + + // Create pipes to communicate with the subprocess. The names of the pipes are from the perspective of the parent process + // since the child process will use them only briefly before exec'ing. + int pipeRead[2]; + int pipeWrite[2]; + + THROW_ON_SYS_ERROR(pipe(pipeRead) == -1, KernelError, "unable to create read pipe"); + THROW_ON_SYS_ERROR(pipe(pipeWrite) == -1, KernelError, "unable to create write pipe"); + + // Exec command in the child process + if (forkSafe() == 0) + { + // Load configuration + const StringList *const paramList = protocolLocalParam(protocolStorageType, hostIdx, processId); + harnessCfgLoadRaw(strLstSize(paramList), strLstPtr(paramList)); + + // Change log process id to aid in debugging + hrnLogProcessIdSet(processId); + + // Run server with provided handlers + String *name = strNewFmt(PROTOCOL_SERVICE_LOCAL "-shim-%u", processId); + IoRead *read = ioFdReadNew(name, pipeWrite[0], 5000); + ioReadOpen(read); + IoWrite *write = ioFdWriteNew(name, pipeRead[1], 5000); + ioWriteOpen(write); + + ProtocolServer *server = protocolServerNew(name, PROTOCOL_SERVICE_LOCAL_STR, read, write); + protocolServerProcess(server, NULL, hrnProtocolStatic.localHandlerList, hrnProtocolStatic.localHandlerListSize); + + // Exit when done + exit(0); + } + + // Close the unused file descriptors + close(pipeRead[1]); + close(pipeWrite[0]); + + // Create protocol object + IoRead *read = ioFdReadNew(strNewFmt(PROTOCOL_SERVICE_LOCAL "-%u shim protocol read", processId), pipeRead[0], 5000); + ioReadOpen(read); + IoWrite *write = ioFdWriteNew(strNewFmt(PROTOCOL_SERVICE_LOCAL "-%u shim protocol write", processId), pipeWrite[1], 5000); + ioWriteOpen(write); + + helper->client = protocolClientNew( + strNewFmt(PROTOCOL_SERVICE_LOCAL "-%u shim protocol", processId), PROTOCOL_SERVICE_LOCAL_STR, read, write); + + FUNCTION_HARNESS_RETURN_VOID(); + } + // Else call the base function + else + protocolLocalExec_SHIMMED(helper, protocolStorageType, hostIdx, processId); +} + +/**********************************************************************************************************************************/ +void +hrnProtocolLocalShimInstall(const ProtocolServerHandler *const handlerList, const unsigned int handlerListSize) +{ + FUNCTION_HARNESS_BEGIN(); + FUNCTION_HARNESS_PARAM_P(VOID, handlerList); + FUNCTION_HARNESS_PARAM(UINT, handlerListSize); + FUNCTION_HARNESS_END(); + + hrnProtocolStatic.localHandler = true; + hrnProtocolStatic.localHandlerList = handlerList; + hrnProtocolStatic.localHandlerListSize = handlerListSize; + + FUNCTION_HARNESS_RETURN_VOID(); +} diff --git a/test/src/common/harnessProtocol.h b/test/src/common/harnessProtocol.h new file mode 100644 index 000000000..e8bbf52c3 --- /dev/null +++ b/test/src/common/harnessProtocol.h @@ -0,0 +1,12 @@ +/*********************************************************************************************************************************** +Harness for Protocol Testing +***********************************************************************************************************************************/ +#include "protocol/server.h" + +/*********************************************************************************************************************************** +Functions +***********************************************************************************************************************************/ +// Initialize the shim that allows protocalLocalGet() to start a local in a forked process rather than being exec'd. The main +// benefit is that code running in the forked process will be included in coverage so no separate tests for the local protocol +// functions should be required. A side benefit is that the pgbackrest binary does not need to be built since there is no exec. +void hrnProtocolLocalShimInstall(const ProtocolServerHandler *const handlerList, const unsigned int handlerListSize); diff --git a/test/src/module/command/backupTest.c b/test/src/module/command/backupTest.c index 2cd793f56..7a4e563d9 100644 --- a/test/src/module/command/backupTest.c +++ b/test/src/module/command/backupTest.c @@ -4,9 +4,7 @@ Test Backup Command #include "command/stanza/create.h" #include "command/stanza/upgrade.h" #include "common/crypto/hash.h" -#include "common/io/bufferRead.h" #include "common/io/bufferWrite.h" -#include "common/io/io.h" #include "postgres/interface/static.vendor.h" #include "storage/helper.h" #include "storage/posix/storage.h" @@ -14,6 +12,7 @@ Test Backup Command #include "common/harnessConfig.h" #include "common/harnessPostgres.h" #include "common/harnessPq.h" +#include "common/harnessProtocol.h" #include "common/harnessStorage.h" /*********************************************************************************************************************************** @@ -443,19 +442,15 @@ testRun(void) { FUNCTION_HARNESS_VOID(); + // Install local command handler shim + static const ProtocolServerHandler testLocalHandlerList[] = {PROTOCOL_SERVER_HANDLER_BACKUP_LIST}; + hrnProtocolLocalShimInstall(testLocalHandlerList, PROTOCOL_SERVER_HANDLER_LIST_SIZE(testLocalHandlerList)); + // The tests expect the timezone to be UTC setenv("TZ", "UTC", true); Storage *storageTest = storagePosixNewP(strNew(testPath()), .write = true); - // Start a protocol server to test the protocol directly - Buffer *serverWrite = bufNew(8192); - IoWrite *serverWriteIo = ioBufferWriteNew(serverWrite); - ioWriteOpen(serverWriteIo); - - ProtocolServer *server = protocolServerNew(strNew("test"), strNew("test"), ioBufferReadNew(bufNew(0)), serverWriteIo); - bufUsedSet(serverWrite, 0); - const String *pgFile = strNew("testfile"); const String *missingFile = strNew("missing"); const String *backupLabel = strNew("20190718-155825F"); @@ -471,7 +466,7 @@ testRun(void) } // ***************************************************************************************************************************** - if (testBegin("backupFile() and backupFileProtocol()")) + if (testBegin("backupFile()")) { // Load Parameters StringList *argList = strLstNew(); @@ -495,29 +490,6 @@ testRun(void) TEST_RESULT_UINT(result.copySize + result.repoSize, 0, " copy/repo size 0"); TEST_RESULT_UINT(result.backupCopyResult, backupCopyResultSkip, " skip file"); - // Check protocol function directly - // ------------------------------------------------------------------------------------------------------------------------- - // NULL, zero param values, ignoreMissing=true - varLstAdd(paramList, varNewStr(missingFile)); // pgFile - varLstAdd(paramList, varNewBool(true)); // pgFileIgnoreMissing - varLstAdd(paramList, varNewUInt64(0)); // pgFileSize - varLstAdd(paramList, varNewBool(true)); // pgFileCopyExactSize - varLstAdd(paramList, NULL); // pgFileChecksum - varLstAdd(paramList, varNewBool(false)); // pgFileChecksumPage - varLstAdd(paramList, varNewUInt64(0)); // pgFileChecksumPageLsnLimit - varLstAdd(paramList, varNewStr(missingFile)); // repoFile - varLstAdd(paramList, varNewBool(false)); // repoFileHasReference - varLstAdd(paramList, varNewUInt(compressTypeNone)); // repoFileCompress - varLstAdd(paramList, varNewInt(0)); // repoFileCompressLevel - varLstAdd(paramList, varNewStr(backupLabel)); // backupLabel - varLstAdd(paramList, varNewBool(false)); // delta - varLstAdd(paramList, varNewUInt64(cipherTypeNone)); // cipherType - varLstAdd(paramList, NULL); // cipherSubPass - - TEST_RESULT_VOID(backupFileProtocol(paramList, server), "protocol backup file - skip"); - TEST_RESULT_STR_Z(strNewBuf(serverWrite), "{\"out\":[3,0,0,null,null]}\n", " check result"); - bufUsedSet(serverWrite, 0); - // Pg file missing - ignoreMissing=false // ------------------------------------------------------------------------------------------------------------------------- TEST_ERROR_FMT( @@ -578,9 +550,9 @@ testRun(void) varBool(kvGet(result.pageChecksumResult, VARSTRDEF("valid"))), false, " pageChecksumResult valid=false"); TEST_RESULT_VOID(storageRemoveP(storageRepoWrite(), backupPathFile), " remove repo file"); - // Check protocol function directly // ------------------------------------------------------------------------------------------------------------------------- - // pgFileSize, ignoreMissing=false, backupLabel, pgFileChecksumPage, pgFileChecksumPageLsnLimit + TEST_TITLE("pgFileSize, ignoreMissing=false, backupLabel, pgFileChecksumPage, pgFileChecksumPageLsnLimit"); + paramList = varLstNew(); varLstAdd(paramList, varNewStr(pgFile)); // pgFile varLstAdd(paramList, varNewBool(false)); // pgFileIgnoreMissing @@ -598,12 +570,19 @@ testRun(void) varLstAdd(paramList, varNewUInt64(cipherTypeNone)); // cipherType varLstAdd(paramList, NULL); // cipherSubPass - TEST_RESULT_VOID(backupFileProtocol(paramList, server), "protocol backup file - pageChecksum"); - TEST_RESULT_STR_Z( - strNewBuf(serverWrite), - "{\"out\":[1,12,12,\"c3ae4687ea8ccd47bfdb190dbe7fd3b37545fdb9\",{\"align\":false,\"valid\":false}]}\n", - " check result"); - bufUsedSet(serverWrite, 0); + TEST_ASSIGN( + result, + backupFile( + pgFile, false, 8, false, NULL, true, 0xFFFFFFFFFFFFFFFF, pgFile, false, compressTypeNone, 1, backupLabel, false, + cipherTypeNone, NULL), + "backup file"); + + TEST_RESULT_UINT(result.copySize, 12, "copy size"); + TEST_RESULT_UINT(result.repoSize, 12, "repo size"); + TEST_RESULT_UINT(result.backupCopyResult, backupCopyResultCopy, "copy file"); + TEST_RESULT_STR_Z(result.copyChecksum, "c3ae4687ea8ccd47bfdb190dbe7fd3b37545fdb9", "checksum"); + TEST_RESULT_STR_Z(jsonFromKv(result.pageChecksumResult), "{\"align\":false,\"valid\":false}", "page checksum"); + TEST_STORAGE_EXISTS(storageRepo(), strZ(backupPathFile)); // ------------------------------------------------------------------------------------------------------------------------- // File exists in repo and db, checksum match, delta set, ignoreMissing false, hasReference - NOOP @@ -621,31 +600,6 @@ testRun(void) storageExistsP(storageRepo(), backupPathFile) && result.pageChecksumResult == NULL), true, " noop"); - // Check protocol function directly - // ------------------------------------------------------------------------------------------------------------------------- - // pgFileChecksum, hasReference, delta - paramList = varLstNew(); - varLstAdd(paramList, varNewStr(pgFile)); // pgFile - varLstAdd(paramList, varNewBool(false)); // pgFileIgnoreMissing - varLstAdd(paramList, varNewUInt64(12)); // pgFileSize - varLstAdd(paramList, varNewBool(false)); // pgFileCopyExactSize - varLstAdd(paramList, varNewStrZ("c3ae4687ea8ccd47bfdb190dbe7fd3b37545fdb9")); // pgFileChecksum - varLstAdd(paramList, varNewBool(false)); // pgFileChecksumPage - varLstAdd(paramList, varNewUInt64(0)); // pgFileChecksumPageLsnLimit - varLstAdd(paramList, varNewStr(pgFile)); // repoFile - varLstAdd(paramList, varNewBool(true)); // repoFileHasReference - varLstAdd(paramList, varNewUInt(compressTypeNone)); // repoFileCompress - varLstAdd(paramList, varNewInt(1)); // repoFileCompressLevel - varLstAdd(paramList, varNewStr(backupLabel)); // backupLabel - varLstAdd(paramList, varNewBool(true)); // delta - varLstAdd(paramList, varNewUInt64(cipherTypeNone)); // cipherType - varLstAdd(paramList, NULL); // cipherSubPass - - TEST_RESULT_VOID(backupFileProtocol(paramList, server), "protocol backup file - noop"); - TEST_RESULT_STR_Z( - strNewBuf(serverWrite), "{\"out\":[4,12,0,\"c3ae4687ea8ccd47bfdb190dbe7fd3b37545fdb9\",null]}\n", " check result"); - bufUsedSet(serverWrite, 0); - // ------------------------------------------------------------------------------------------------------------------------- // File exists in repo and db, pg checksum mismatch, delta set, ignoreMissing false, hasReference - COPY TEST_ASSIGN( @@ -763,31 +717,6 @@ testRun(void) result.pageChecksumResult == NULL), true, " compressed repo file matches"); - // Check protocol function directly - // ------------------------------------------------------------------------------------------------------------------------- - // compression - paramList = varLstNew(); - varLstAdd(paramList, varNewStr(pgFile)); // pgFile - varLstAdd(paramList, varNewBool(false)); // pgFileIgnoreMissing - varLstAdd(paramList, varNewUInt64(9)); // pgFileSize - varLstAdd(paramList, varNewBool(true)); // pgFileCopyExactSize - varLstAdd(paramList, varNewStrZ("9bc8ab2dda60ef4beed07d1e19ce0676d5edde67")); // pgFileChecksum - varLstAdd(paramList, varNewBool(false)); // pgFileChecksumPage - varLstAdd(paramList, varNewUInt64(0)); // pgFileChecksumPageLsnLimit - varLstAdd(paramList, varNewStr(pgFile)); // repoFile - varLstAdd(paramList, varNewBool(false)); // repoFileHasReference - varLstAdd(paramList, varNewUInt(compressTypeGz)); // repoFileCompress - varLstAdd(paramList, varNewInt(3)); // repoFileCompressLevel - varLstAdd(paramList, varNewStr(backupLabel)); // backupLabel - varLstAdd(paramList, varNewBool(false)); // delta - varLstAdd(paramList, varNewUInt64(cipherTypeNone)); // cipherType - varLstAdd(paramList, NULL); // cipherSubPass - - TEST_RESULT_VOID(backupFileProtocol(paramList, server), "protocol backup file - copy, compress"); - TEST_RESULT_STR_Z( - strNewBuf(serverWrite), "{\"out\":[0,9,29,\"9bc8ab2dda60ef4beed07d1e19ce0676d5edde67\",null]}\n", " check result"); - bufUsedSet(serverWrite, 0); - // ------------------------------------------------------------------------------------------------------------------------- // Create a zero sized file - checksum will be set but in backupManifestUpdate it will not be copied storagePutP(storageNewWriteP(storagePgWrite(), strNew("zerofile")), BUFSTRDEF("")); @@ -878,30 +807,23 @@ testRun(void) storageExistsP(storageRepo(), backupPathFile) && result.pageChecksumResult == NULL), true, " recopy file to encrypted repo success"); - // Check protocol function directly // ------------------------------------------------------------------------------------------------------------------------- - // cipherType, cipherPass - paramList = varLstNew(); - varLstAdd(paramList, varNewStr(pgFile)); // pgFile - varLstAdd(paramList, varNewBool(false)); // pgFileIgnoreMissing - varLstAdd(paramList, varNewUInt64(9)); // pgFileSize - varLstAdd(paramList, varNewBool(true)); // pgFileCopyExactSize - varLstAdd(paramList, varNewStrZ("1234567890123456789012345678901234567890")); // pgFileChecksum - varLstAdd(paramList, varNewBool(false)); // pgFileChecksumPage - varLstAdd(paramList, varNewUInt64(0)); // pgFileChecksumPageLsnLimit - varLstAdd(paramList, varNewStr(pgFile)); // repoFile - varLstAdd(paramList, varNewBool(false)); // repoFileHasReference - varLstAdd(paramList, varNewUInt(compressTypeNone)); // repoFileCompress - varLstAdd(paramList, varNewInt(0)); // repoFileCompressLevel - varLstAdd(paramList, varNewStr(backupLabel)); // backupLabel - varLstAdd(paramList, varNewBool(false)); // delta - varLstAdd(paramList, varNewUInt64(cipherTypeAes256Cbc));// cipherType - varLstAdd(paramList, varNewStrZ("12345678")); // cipherPass + TEST_TITLE("recopy, encrypt"); - TEST_RESULT_VOID(backupFileProtocol(paramList, server), "protocol backup file - recopy, encrypt"); - TEST_RESULT_STR_Z( - strNewBuf(serverWrite), "{\"out\":[2,9,32,\"9bc8ab2dda60ef4beed07d1e19ce0676d5edde67\",null]}\n", " check result"); - bufUsedSet(serverWrite, 0); + TEST_ASSIGN( + result, + backupFile( + pgFile, false, 9, true, strNew("1234567890123456789012345678901234567890"), false, 0, pgFile, false, + compressTypeNone, 0, backupLabel, false, cipherTypeAes256Cbc, strNew("12345678")), + "backup file"); + + TEST_RESULT_UINT(result.copySize, 9, " copy size set"); + TEST_RESULT_UINT(result.repoSize, 32, " repo size set"); + TEST_RESULT_UINT(result.backupCopyResult, backupCopyResultReCopy, " recopy file"); + TEST_RESULT_BOOL( + (strEqZ(result.copyChecksum, "9bc8ab2dda60ef4beed07d1e19ce0676d5edde67") && + storageExistsP(storageRepo(), backupPathFile) && result.pageChecksumResult == NULL), + true, " recopy file to encrypted repo success"); } // ***************************************************************************************************************************** diff --git a/test/src/module/command/restoreTest.c b/test/src/module/command/restoreTest.c index b3d0da598..3f8ded9b7 100644 --- a/test/src/module/command/restoreTest.c +++ b/test/src/module/command/restoreTest.c @@ -3,9 +3,6 @@ Test Restore Command ***********************************************************************************************************************************/ #include "common/compress/helper.h" #include "common/crypto/cipherBlock.h" -#include "common/io/io.h" -#include "common/io/bufferRead.h" -#include "common/io/bufferWrite.h" #include "postgres/version.h" #include "storage/posix/storage.h" #include "storage/helper.h" @@ -13,6 +10,7 @@ Test Restore Command #include "common/harnessConfig.h" #include "common/harnessInfo.h" #include "common/harnessPostgres.h" +#include "common/harnessProtocol.h" #include "common/harnessStorage.h" /*********************************************************************************************************************************** @@ -148,6 +146,10 @@ testRun(void) { FUNCTION_HARNESS_VOID(); + // Install local command handler shim + static const ProtocolServerHandler testLocalHandlerList[] = {PROTOCOL_SERVER_HANDLER_RESTORE_LIST}; + hrnProtocolLocalShimInstall(testLocalHandlerList, PROTOCOL_SERVER_HANDLER_LIST_SIZE(testLocalHandlerList)); + // Create default storage object for testing Storage *storageTest = storagePosixNewP(strNew(testPath()), .write = true); @@ -158,16 +160,6 @@ testRun(void) const String *repoFile1 = strNew("pg_data/testfile"); unsigned int repoIdx = 0; - // Start a protocol server to test the protocol directly - Buffer *serverWrite = bufNew(8192); - IoWrite *serverWriteIo = ioBufferWriteNew(serverWrite); - ioWriteOpen(serverWriteIo); - - ProtocolServer *server = protocolServerNew( - strNew("test"), strNew("test"), ioBufferReadNew(bufNew(0)), serverWriteIo); - - bufUsedSet(serverWrite, 0); - // Load Parameters StringList *argList = strLstNew(); strLstAddZ(argList, "--stanza=test1"); @@ -330,62 +322,6 @@ testRun(void) strNew("9bc8ab2dda60ef4beed07d1e19ce0676d5edde67"), false, 0, 1557432154, 0600, strNew(testUser()), strNew(testGroup()), 0, true, false, NULL), false, "sha1 delta existing, content differs"); - - // Check protocol function directly - // ------------------------------------------------------------------------------------------------------------------------- - VariantList *paramList = varLstNew(); - varLstAdd(paramList, varNewStr(repoFile1)); - varLstAdd(paramList, varNewUInt(repoIdx)); - varLstAdd(paramList, varNewStr(repoFileReferenceFull)); - varLstAdd(paramList, varNewUInt(compressTypeNone)); - varLstAdd(paramList, varNewStrZ("protocol")); - varLstAdd(paramList, varNewStrZ("9bc8ab2dda60ef4beed07d1e19ce0676d5edde67")); - varLstAdd(paramList, varNewBool(false)); - varLstAdd(paramList, varNewUInt64(9)); - varLstAdd(paramList, varNewUInt64(1557432100)); - varLstAdd(paramList, varNewStrZ("0677")); - varLstAdd(paramList, varNewStrZ(testUser())); - varLstAdd(paramList, varNewStrZ(testGroup())); - varLstAdd(paramList, varNewUInt64(1557432200)); - varLstAdd(paramList, varNewBool(false)); - varLstAdd(paramList, varNewBool(false)); - varLstAdd(paramList, NULL); - - TEST_RESULT_VOID(restoreFileProtocol(paramList, server), "protocol restore file"); - TEST_RESULT_STR_Z(strNewBuf(serverWrite), "{\"out\":true}\n", " check result"); - bufUsedSet(serverWrite, 0); - - info = storageInfoP(storagePg(), strNew("protocol")); - TEST_RESULT_BOOL(info.exists, true, " check exists"); - TEST_RESULT_UINT(info.size, 9, " check size"); - TEST_RESULT_UINT(info.mode, 0677, " check mode"); - TEST_RESULT_INT(info.timeModified, 1557432100, " check time"); - TEST_RESULT_STR_Z(info.user, testUser(), " check user"); - TEST_RESULT_STR_Z(info.group, testGroup(), " check group"); - TEST_RESULT_STR_Z( - strNewBuf(storageGetP(storageNewReadP(storagePg(), strNew("protocol")))), "atestfile", " check contents"); - - paramList = varLstNew(); - varLstAdd(paramList, varNewStr(repoFile1)); - varLstAdd(paramList, varNewUInt(repoIdx)); - varLstAdd(paramList, varNewStr(repoFileReferenceFull)); - varLstAdd(paramList, varNewUInt(compressTypeNone)); - varLstAdd(paramList, varNewStrZ("protocol")); - varLstAdd(paramList, varNewStrZ("9bc8ab2dda60ef4beed07d1e19ce0676d5edde67")); - varLstAdd(paramList, varNewBool(false)); - varLstAdd(paramList, varNewUInt64(9)); - varLstAdd(paramList, varNewUInt64(1557432100)); - varLstAdd(paramList, varNewStrZ("0677")); - varLstAdd(paramList, varNewStrZ(testUser())); - varLstAdd(paramList, varNewStrZ(testGroup())); - varLstAdd(paramList, varNewUInt64(1557432200)); - varLstAdd(paramList, varNewBool(true)); - varLstAdd(paramList, varNewBool(false)); - varLstAdd(paramList, NULL); - - TEST_RESULT_VOID(restoreFileProtocol(paramList, server), "protocol restore file"); - TEST_RESULT_STR_Z(strNewBuf(serverWrite), "{\"out\":false}\n", " check result"); - bufUsedSet(serverWrite, 0); } // ***************************************************************************************************************************** @@ -2741,7 +2677,7 @@ testRun(void) TEST_ERROR_FMT( cmdRestore(), FileMissingError, - "raised from local-1 protocol: unable to open missing file" + "raised from local-1 shim protocol: unable to open missing file" " '%s/repo/backup/test1/20161219-212741F_20161219-212918I/pg_data/global/pg_control' for read", testPath()); diff --git a/test/src/module/command/verifyTest.c b/test/src/module/command/verifyTest.c index 54d42d9da..b1c87ff38 100644 --- a/test/src/module/command/verifyTest.c +++ b/test/src/module/command/verifyTest.c @@ -2,7 +2,6 @@ Test Stanza Commands ***********************************************************************************************************************************/ #include "common/io/bufferRead.h" -#include "common/io/bufferWrite.h" #include "postgres/interface.h" #include "postgres/version.h" #include "storage/posix/storage.h" @@ -12,6 +11,8 @@ Test Stanza Commands #include "common/harnessPostgres.h" #include "common/harnessPq.h" +#include "common/harnessProtocol.h" + /*********************************************************************************************************************************** Test Run ***********************************************************************************************************************************/ @@ -20,6 +21,10 @@ testRun(void) { FUNCTION_HARNESS_VOID(); + // Install local command handler shim + static const ProtocolServerHandler testLocalHandlerList[] = {PROTOCOL_SERVER_HANDLER_VERIFY_LIST}; + hrnProtocolLocalShimInstall(testLocalHandlerList, PROTOCOL_SERVER_HANDLER_LIST_SIZE(testLocalHandlerList)); + Storage *storageTest = storagePosixNewP(strNew(testPath()), .write = true); String *stanza = strNew("db"); @@ -877,7 +882,7 @@ testRun(void) } // ***************************************************************************************************************************** - if (testBegin("verifyFile() and verifyFileProtocol()")) + if (testBegin("verifyFile()")) { // Load Parameters StringList *argList = strLstDup(argListBase); @@ -911,26 +916,6 @@ testRun(void) verifyFile( filePathName, strNew("badchecksum"), fileSize, strNew("pass")), verifyChecksumMismatch, "file encrypted compressed checksum mismatch"); - - //-------------------------------------------------------------------------------------------------------------------------- - TEST_TITLE("verifyFileProtocol()"); - - // Start a protocol server to test the protocol directly - Buffer *serverWrite = bufNew(8192); - IoWrite *serverWriteIo = ioBufferWriteNew(serverWrite); - ioWriteOpen(serverWriteIo); - ProtocolServer *server = protocolServerNew(strNew("test"), strNew("test"), ioBufferReadNew(bufNew(0)), serverWriteIo); - bufUsedSet(serverWrite, 0); - - VariantList *paramList = varLstNew(); - varLstAdd(paramList, varNewStr(filePathName)); - varLstAdd(paramList, varNewStr(fileChecksum)); - varLstAdd(paramList, varNewUInt64(fileSize)); - varLstAdd(paramList, varNewStrZ("pass")); - - TEST_RESULT_VOID(verifyFileProtocol(paramList, server), "protocol verify file"); - TEST_RESULT_STR_Z(strNewBuf(serverWrite), "{\"out\":0}\n", "check result"); - bufUsedSet(serverWrite, 0); } // ***************************************************************************************************************************** @@ -1271,7 +1256,7 @@ testRun(void) "'11-2/0000000200000007/000000020000000700000FFF-ee161f898c9012dd0c28b3fd1e7140b9cf411306'\n" "P01 ERROR: [039]: invalid result " "11-2/0000000200000008/000000020000000800000003-656817043007aa2100c44c712bcb456db705dab9: [41] raised from " - "local-1 protocol: unable to open file " + "local-1 shim protocol: unable to open file " "'%s/%s/11-2/0000000200000008/000000020000000800000003-656817043007aa2100c44c712bcb456db705dab9' for read: " "[13] Permission denied\n" "P00 WARN: unable to open missing file '%s/%s/20181119-152800F/backup.manifest' for read\n" @@ -1283,8 +1268,8 @@ testRun(void) "P01 ERROR: [028]: file missing '20181119-152900F_20181119-152909D/pg_data/testmissing'\n" "P00 WARN: unable to open missing file '%s/%s/20181119-153000F/backup.manifest' for read\n" "P00 INFO: backup '20181119-153000F' appears to be in progress, skipping\n" - "P01 ERROR: [039]: invalid result UNPROCESSEDBACKUP/pg_data/testother: [41] raised from local-1 protocol: unable " - "to open file '%s/%s/UNPROCESSEDBACKUP/pg_data/testother' for read: [13] Permission denied\n" + "P01 ERROR: [039]: invalid result UNPROCESSEDBACKUP/pg_data/testother: [41] raised from local-1 shim protocol:" + " unable to open file '%s/%s/UNPROCESSEDBACKUP/pg_data/testother' for read: [13] Permission denied\n" "P00 DETAIL: archiveId: 11-2, wal start: 000000020000000700000FFD, wal stop: 000000020000000800000000\n" "P00 DETAIL: archiveId: 11-2, wal start: 000000020000000800000002, wal stop: 000000020000000800000003\n" "P00 DETAIL: archiveId: 11-2, wal start: 000000030000000000000000, wal stop: 000000030000000000000001\n"