⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clienttest.cpp

📁 This SDK allows to integrate a syncml stack in a C++ application on a variety of platforms. Current
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    // => one item left on second client (the one inserted locally)
    void testOneWayFromServer() {
        // no items anywhere
        deleteAll();
        accessClientB->refreshClient();
        
        // check that everything is empty, also resets change tracking
        // in second sources of each client
        source_it it;
        for (it = sources.begin(); it != sources.end(); ++it) {
            if (it->second->config.createSourceB) {
                std::auto_ptr<SyncSource> source;
                SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->beginSync());
                SOURCE_ASSERT_EQUAL(source.get(), 0, countItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->endSync());
                CPPUNIT_ASSERT_NO_THROW(source.reset());
            }
        }
        for (it = accessClientB->sources.begin(); it != accessClientB->sources.end(); ++it) {
            if (it->second->config.createSourceB) {
                std::auto_ptr<SyncSource> source;
                SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->beginSync());
                SOURCE_ASSERT_EQUAL(source.get(), 0, countItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->endSync());
                CPPUNIT_ASSERT_NO_THROW(source.reset());
            }
        }

        // add one item on first client, copy to server, and check change tracking via second source
        for (it = sources.begin(); it != sources.end(); ++it) {
            it->second->insertManyItems(it->second->createSourceA, 1, 1);
        }
        sync(SYNC_TWO_WAY, ".send", CheckSyncReport(0,0,0, 1,0,0));
        for (it = sources.begin(); it != sources.end(); ++it) {
            if (it->second->config.createSourceB) {
                std::auto_ptr<SyncSource> source;
                SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->beginSync());
                SOURCE_ASSERT_EQUAL(source.get(), 1, countItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 1, countNewItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->endSync());
                CPPUNIT_ASSERT_NO_THROW(source.reset());
            }
        }

        // add a different item on second client, one-way-from-server
        // => one item added locally, none sent to server
        for (it = accessClientB->sources.begin(); it != accessClientB->sources.end(); ++it) {
            it->second->insertManyItems(it->second->createSourceA, 2, 1);

            if (it->second->config.createSourceB) {
                std::auto_ptr<SyncSource> source;
                SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->beginSync());
                SOURCE_ASSERT_EQUAL(source.get(), 1, countItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 1, countNewItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->endSync());
                CPPUNIT_ASSERT_NO_THROW(source.reset());
            }
        }
        accessClientB->sync(SYNC_ONE_WAY_FROM_SERVER, ".recv", CheckSyncReport(1,0,0, 0,0,0));
        for (it = accessClientB->sources.begin(); it != accessClientB->sources.end(); ++it) {
            if (it->second->config.createSourceB) {
                std::auto_ptr<SyncSource> source;
                SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->beginSync());
                SOURCE_ASSERT_EQUAL(source.get(), 2, countItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 1, countNewItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->endSync());
                CPPUNIT_ASSERT_NO_THROW(source.reset());
            }
        }

        // two-way sync with first client for verification
        // => no changes
        sync(SYNC_TWO_WAY, ".check", CheckSyncReport(0,0,0, 0,0,0));
        for (it = sources.begin(); it != sources.end(); ++it) {
            if (it->second->config.createSourceB) {
                std::auto_ptr<SyncSource> source;
                SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->beginSync());
                SOURCE_ASSERT_EQUAL(source.get(), 1, countItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->endSync());
                CPPUNIT_ASSERT_NO_THROW(source.reset());
            }
        }

        // delete items on clientA, sync to server
        for (it = sources.begin(); it != sources.end(); ++it) {
            it->second->deleteAll(it->second->createSourceA);

            if (it->second->config.createSourceB) {
                std::auto_ptr<SyncSource> source;
                SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->beginSync());
                SOURCE_ASSERT_EQUAL(source.get(), 0, countItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 1, countDeletedItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->endSync());
                CPPUNIT_ASSERT_NO_THROW(source.reset());
            }
        }
        sync(SYNC_TWO_WAY, ".delete", CheckSyncReport(0,0,0, 0,0,1));
        for (it = sources.begin(); it != sources.end(); ++it) {
            if (it->second->config.createSourceB) {
                std::auto_ptr<SyncSource> source;
                SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->beginSync());
                SOURCE_ASSERT_EQUAL(source.get(), 0, countItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->endSync());
                CPPUNIT_ASSERT_NO_THROW(source.reset());
            }
        }

        // sync the same change to second client
        // => one item left (the one inserted locally)
        accessClientB->sync(SYNC_ONE_WAY_FROM_SERVER, ".delete", CheckSyncReport(0,0,1, 0,0,0));
        for (it = accessClientB->sources.begin(); it != accessClientB->sources.end(); ++it) {
            if (it->second->config.createSourceB) {
                std::auto_ptr<SyncSource> source;
                SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->beginSync());
                SOURCE_ASSERT_EQUAL(source.get(), 1, countItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 1, countDeletedItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->endSync());
                CPPUNIT_ASSERT_NO_THROW(source.reset());
            }
        }
    }
    
    // tests one-way sync from client:
    // - get both clients and server in sync with no items anywhere
    // - add one item on first client, copy to server
    // - add a different item on second client, one-way-from-client
    // - two-way sync with first client
    // => two items on first client, one on second
    // - delete on second client, sync that to first client
    //   via one-way-from-client, two-way
    // => one item left on first client (the one inserted locally)
    void testOneWayFromClient() {
        // no items anywhere
        deleteAll();
        accessClientB->deleteAll();
        
        // check that everything is empty, also resets change tracking
        // in second sources of each client
        source_it it;
        for (it = sources.begin(); it != sources.end(); ++it) {
            if (it->second->config.createSourceB) {
                std::auto_ptr<SyncSource> source;
                SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->beginSync());
                SOURCE_ASSERT_EQUAL(source.get(), 0, countItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->endSync());
                CPPUNIT_ASSERT_NO_THROW(source.reset());
            }
        }
        for (it = accessClientB->sources.begin(); it != accessClientB->sources.end(); ++it) {
            if (it->second->config.createSourceB) {
                std::auto_ptr<SyncSource> source;
                SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->beginSync());
                SOURCE_ASSERT_EQUAL(source.get(), 0, countItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->endSync());
                CPPUNIT_ASSERT_NO_THROW(source.reset());
            }
        }

        // add one item on first client, copy to server, and check change tracking via second source
        for (it = sources.begin(); it != sources.end(); ++it) {
            it->second->insertManyItems(it->second->createSourceA, 1, 1);
        }
        sync(SYNC_TWO_WAY, ".send", CheckSyncReport(0,0,0, 1,0,0));
        for (it = sources.begin(); it != sources.end(); ++it) {
            if (it->second->config.createSourceB) {
                std::auto_ptr<SyncSource> source;
                SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->beginSync());
                SOURCE_ASSERT_EQUAL(source.get(), 1, countItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 1, countNewItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->endSync());
                CPPUNIT_ASSERT_NO_THROW(source.reset());
            }
        }

        // add a different item on second client, one-way-from-client
        // => no item added locally, one sent to server
        for (it = accessClientB->sources.begin(); it != accessClientB->sources.end(); ++it) {
            it->second->insertManyItems(it->second->createSourceA, 2, 1);

            if (it->second->config.createSourceB) {
                std::auto_ptr<SyncSource> source;
                SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->beginSync());
                SOURCE_ASSERT_EQUAL(source.get(), 1, countItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 1, countNewItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->endSync());
                CPPUNIT_ASSERT_NO_THROW(source.reset());
            }
        }
        accessClientB->sync(SYNC_ONE_WAY_FROM_CLIENT, ".send", CheckSyncReport(0,0,0, 1,0,0));
        for (it = accessClientB->sources.begin(); it != accessClientB->sources.end(); ++it) {
            if (it->second->config.createSourceB) {
                std::auto_ptr<SyncSource> source;
                SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->beginSync());
                SOURCE_ASSERT_EQUAL(source.get(), 1, countItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->endSync());
                CPPUNIT_ASSERT_NO_THROW(source.reset());
            }
        }

        // two-way sync with client A for verification
        // => receive one item
        sync(SYNC_TWO_WAY, ".check", CheckSyncReport(1,0,0, 0,0,0));
        for (it = sources.begin(); it != sources.end(); ++it) {
            if (it->second->config.createSourceB) {
                std::auto_ptr<SyncSource> source;
                SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->beginSync());
                SOURCE_ASSERT_EQUAL(source.get(), 2, countItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 1, countNewItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->endSync());
                CPPUNIT_ASSERT_NO_THROW(source.reset());
            }
        }

        // delete items on client B, sync to server
        for (it = accessClientB->sources.begin(); it != accessClientB->sources.end(); ++it) {
            it->second->deleteAll(it->second->createSourceA);

            if (it->second->config.createSourceB) {
                std::auto_ptr<SyncSource> source;
                SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->beginSync());
                SOURCE_ASSERT_EQUAL(source.get(), 0, countItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 1, countDeletedItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->endSync());
                CPPUNIT_ASSERT_NO_THROW(source.reset());
            }
        }
        accessClientB->sync(SYNC_ONE_WAY_FROM_CLIENT, ".delete", CheckSyncReport(0,0,0, 0,0,1));
        for (it = accessClientB->sources.begin(); it != accessClientB->sources.end(); ++it) {
            if (it->second->config.createSourceB) {
                std::auto_ptr<SyncSource> source;
                SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->beginSync());
                SOURCE_ASSERT_EQUAL(source.get(), 0, countItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->endSync());
                CPPUNIT_ASSERT_NO_THROW(source.reset());
            }
        }

        // sync the same change to client A
        // => one item left (the one inserted locally)
        sync(SYNC_TWO_WAY, ".delete", CheckSyncReport(0,0,1, 0,0,0));
        for (it = sources.begin(); it != sources.end(); ++it) {
            if (it->second->config.createSourceB) {
                std::auto_ptr<SyncSource> source;
                SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, source->beginSync());
                SOURCE_ASSERT_EQUAL(source.get(), 1, countItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get()));
                SOURCE_ASSERT_EQUAL(source.get(), 1, countDeletedItems(s

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -