testing: simulate remote item manipulation

Traditionally, SyncEvolution only modified remote data via syncing.
This is not enough because it does not cover data on the remote side
that SyncEvolution cannot sync.

The new tests solve this by using the command line's import/update
operations which modify data more or less directly.

Now we can test:
- downloading data created remotely
- uploading data via sync, export directly, compare
- simulate conflicts with changes made remotely

The download and upload test include full round-trips, i.e.
the initial transfer plus a change that needs to be synced back.

Because this is highly dependent on the exact data stored by the
peer, all these tests depend on per-peer test data and scripts
for modifying that data. The tests only get enabled if the test
data is found.

The initial test data covers Apple Calendar server, EDS<->EDS
and Google Contacts.
This commit is contained in:
Patrick Ohly 2014-04-23 05:53:23 -07:00
parent 9c0916bee8
commit ae84edf417
37 changed files with 2907 additions and 26 deletions

View File

@ -259,24 +259,15 @@ nodist_src_client_test_SOURCES = test/test.cpp
# -O2, because CXXFLAGS comes later in the final compile command.
@ifGNUmake@ $(foreach e, $(foreach i, $(src_client_test_SOURCES), $(dir $(i))src_client_test-$(basename $(notdir $i))), $(e).o $(e).lo $(e).obj) : CXXFLAGS = -g
# list of test file base files
# List of test files which get copied verbatim from
# $(top_srcdir)/test/testcases/ to src/testcases below. test/test.am
# has the list for inclusion in "make dist" with the original
# "test/" directory. We need to replace that here.
#
# Generated files (testcases/eds_event.ics.funambol.tem) are derived from
# the original base file ($(srcdir)/test/testcases/eds_event.ics) by
# applying a patch ($(srcdir)/test/testcases/eds_event.ics.funambol.tem.patch).
CLIENT_LIB_TEST_FILES = \
src/testcases/lcs/file1.txt \
src/testcases/lcs/file2.txt \
src/testcases/local.png \
src/testcases/templates/clients/SyncEvolution.ini \
src/testcases/templates/clients/phone/nokia/S40/7210c.ini \
src/testcases/google_event.ics \
src/testcases/yahoo_contact.vcf \
src/testcases/eds_contact.vcf \
src/testcases/eds_event.ics \
src/testcases/eds_event.ics.local \
src/testcases/eds_memo.ics \
src/testcases/eds_task.ics
CLIENT_LIB_TEST_FILES = $(subst test/,src/,$(test_testcases))
# all patch files
TEST_FILES_PATCHES = $(wildcard $(top_srcdir)/test/testcases/*.patch)

View File

@ -38,6 +38,7 @@
#include <syncevo/util.h>
#include <syncevo/SyncContext.h>
#include <VolatileConfigNode.h>
#include <syncevo/Cmdline.h>
#include <synthesis/dataconversion.h>
@ -50,6 +51,7 @@
#include <fstream>
#include <iostream>
#include <algorithm>
#include <stdarg.h>
#include <fcntl.h>
#include <sys/socket.h>
@ -128,6 +130,44 @@ void assertEquals(const A& expected,
SE_BEGIN_CXX
/**
* A command line using keyring as configured, but no interactive
* password lookup. The base Cmdline class uses a generic SyncContext
* which uses a SimpleUserInterface without keyring support.
*/
class TestCmdline : public Cmdline
{
public:
// If we could inherit the Cmdline constructor, life would be a lot
// easier... because we can't, we have to copy-and-paste the code
// and rely on protected inheritance of Cmdline members.
TestCmdline(const char *arg, ...) :
Cmdline(std::vector<std::string>())
{
va_list argList;
va_start(argList, arg);
for (const char *curr = arg;
curr;
curr = va_arg(argList, const char *)) {
m_args.push_back(curr);
}
va_end(argList);
m_argc = m_args.size();
m_argvArray.reset(new const char *[m_args.size()]);
for (int i = 0; i < m_argc; i++) {
m_argvArray[i] = m_args[i].c_str();
}
m_argv = m_argvArray.get();
}
virtual SyncContext *createSyncClient() {
std::auto_ptr<SyncContext> context(new SyncContext(m_server, true));
boost::shared_ptr<SimpleUserInterface> ui(new SimpleUserInterface(context->getKeyring()));
context->setUserInterface(ui);
return context.release();
}
};
static set<ClientTest::Cleanup_t> cleanupSet;
/**
@ -152,6 +192,74 @@ std::string currentServer()
return tmp ? tmp : "";
}
/**
* This function checks whether the data on the server is accessible
* directly. This is the case for tests where the server side is
* syncevo-http-server or the sync is local. In both cases, this
* method checks the config of <server>_1 (the first client's sync config)
* to find the peer and the uri of the given local source. The peer
* is expected to a source under that name (no alias!).
*
* CLIENT_TEST_SERVER must be set. <server>_1 must exist and (if
* syncing via HTTP) have a deviceId that matches a remoteDeviceId in
* the config used by syncevo-http-server.
*
* @return pair of <peer sync config> + <peer source name>; sync config name empty if not found
*/
std::pair<std::string, std::string> getPeerConfig(const std::string &source)
{
static const char LOCAL_SYNC[] = "local://";
SyncConfig local(currentServer() + "_1");
std::vector<std::string> syncURLs = local.getSyncURL();
boost::shared_ptr<PersistentSyncSourceConfig> sourceConfig(local.getSyncSourceConfig(source));
std::string uri = sourceConfig->getURI();
if (uri.empty()) {
uri = source;
}
std::string peerConfig;
if (syncURLs.size() == 1) {
const std::string &syncURL = syncURLs.front();
if (boost::starts_with(syncURL, LOCAL_SYNC)) {
// Local sync. "target-config" is implied and may be relevant
// later when using the peer source.
peerConfig = syncURL.substr(strlen(LOCAL_SYNC));
if (boost::starts_with(peerConfig, "@")) {
peerConfig = "target-config" + peerConfig;
}
}
}
if (peerConfig.empty()) {
// Check for local HTTP server.
std::string deviceId = local.getDevID();
BOOST_FOREACH (const StringPair &peer, SyncConfig::getConfigs()) {
SyncConfig remote(peer.first);
if (remote.getRemoteDevID() == deviceId) {
peerConfig = peer.first;
break;
}
}
}
return std::make_pair(peerConfig, uri);
}
/**
* Tests involving a specific peer use testcases/synctests/<server
* name>/<source name>/<test name>/<aspect>, where <aspect> is test
* specific. The resulting string typically references a directory
* with individual items. <aspect> can be empty.
*/
std::string getPeerTestdata(const std::string &source, const std::string &test, const std::string &aspect)
{
std::string path = StringPrintf("testcases/synctests/%s/%s/%s/%s",
currentServer().c_str(),
source.c_str(),
test.c_str(),
aspect.c_str());
return path;
}
/**
* CLIENT_TEST_NUM_ITEMS env variable or 100
*/
@ -750,8 +858,13 @@ bool LocalTests::compareDatabases(const char *refFile, TestingSyncSource &copy,
simplifyFilename(copyFile);
SOURCE_ASSERT_EQUAL(&copy, 0, config.m_dump(client, copy, copyFile));
return compareDatabases(sourceFile, copyFile);
}
bool LocalTests::compareDatabases(const std::string &refFile, const std::string &actualFile, bool raiseAssert)
{
bool equal = false;
CT_ASSERT_NO_THROW(equal = config.m_compare(client, sourceFile, copyFile));
CT_ASSERT_NO_THROW(equal = config.m_compare(client, refFile.c_str(), actualFile.c_str()));
CT_ASSERT(!raiseAssert || equal);
return equal;
@ -1455,12 +1568,12 @@ void LocalTests::testLinkedSources()
}
// clean database, import file, then export again and compare
void LocalTests::testImport() {
void LocalTests::doImport(const std::string &testcases) {
// check additional requirements
CT_ASSERT(config.m_import);
CT_ASSERT(config.m_dump);
CT_ASSERT(config.m_compare);
CT_ASSERT(!config.m_testcases.empty());
CT_ASSERT(!testcases.empty());
CT_ASSERT(config.m_createSourceA);
CT_ASSERT_NO_THROW(deleteAll(createSourceA));
@ -1469,19 +1582,19 @@ void LocalTests::testImport() {
TestingSyncSourcePtr source;
SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSourceA()));
restoreStorage(config, client);
std::string testcases;
std::string importFailures = config.m_import(client, *source.get(), config, config.m_testcases, testcases, NULL);
std::string actualData;
std::string importFailures = config.m_import(client, *source.get(), config, testcases, actualData, NULL);
backupStorage(config, client);
CT_ASSERT_NO_THROW(source.reset());
// export again and compare against original file,
// without relying on change tracking (because
// Google ActiveSync has problems with Fetch,
// which would be needed for a data dump when
// which would be needed for a data dump whenr
// using the incremental approach)
TestingSyncSourcePtr copy;
SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceA(), TestingSyncSourcePtr::SLOW));
bool equal = compareDatabases(testcases.c_str(), *copy.get(), false);
bool equal = compareDatabases(actualData.c_str(), *copy.get(), false);
CT_ASSERT_NO_THROW(source.reset());
if (importFailures.empty()) {
@ -1491,6 +1604,10 @@ void LocalTests::testImport() {
}
}
void LocalTests::testImport() {
doImport(config.m_testcases);
}
// same as testImport() with immediate delete
void LocalTests::testImportDelete() {
CT_ASSERT_NO_THROW(testImport());
@ -2840,6 +2957,22 @@ void SyncTests::addTests(bool isFirstSource) {
}
}
}
// Tests which depend on item manipulation in the peer.
// These tests get enabled if their testdata is found in
// testcases/synctests/<server name> and if we are
// currently testing only a single source. The tests will
// fail if SyncEvolution was not configured correctly for
// them (see getPeerConfig()).
if (sources.size() == 1) {
const std::string sourceName = config.m_sourceName;
#define ADD_PEER_TEST(_x) if (isDir(getPeerTestdata(sourceName, #_x, ""))) { ADD_TEST(SyncTests, _x); }
ADD_PEER_TEST(testDownload);
ADD_PEER_TEST(testUpload);
ADD_PEER_TEST(testUpdateLocalWins);
ADD_PEER_TEST(testUpdateRemoteWins);
}
}
if (config.m_retrySync &&
@ -5909,6 +6042,396 @@ void SyncTests::testTimeout()
}
}
static void UpdateLocal(const std::string &config, const std::string &source,
const std::string &actualLocalData,
const std::string &localModified,
const std::string &modifyLocal)
{
// The local side also uses the Cmdline class because then we only
// need to implement one way of updating items. But first we need to
// get the actual data.
std::auto_ptr<Cmdline> cmdline;
rm_r(actualLocalData);
mkdir_p(actualLocalData);
cmdline.reset(new TestCmdline("--daemon=no",
"--export",
actualLocalData.c_str(),
config.c_str(),
source.c_str(),
(const char *)NULL));
CT_ASSERT(cmdline->parse());
CT_ASSERT_MESSAGE("export " + currentServer() + "_1 " + source, cmdline->run());
CT_ASSERT(!system(StringPrintf("%s %s %s",
modifyLocal.c_str(),
actualLocalData.c_str(),
localModified.c_str()).c_str()));
CT_ASSERT(isDir(localModified));
cmdline.reset(new TestCmdline("--daemon=no",
"--update",
localModified.c_str(),
config.c_str(),
source.c_str(),
(const char *)NULL));
CT_ASSERT(cmdline->parse());
CT_ASSERT_MESSAGE("update " + config + " " + source, cmdline->run());
}
void SyncTests::testUpload()
{
const std::string testname = "testUpload";
CT_ASSERT_EQUAL(sources.size(), 1);
const ClientTest::Config &config(sources[0].second->config);
StringPair peerConfig = getPeerConfig(config.m_sourceName);
const std::string &peer = peerConfig.first;
const std::string &peerSource = peerConfig.second;
CT_ASSERT(!peer.empty());
CT_ASSERT(!peerSource.empty());
std::string localTestdata = getPeerTestdata(config.m_sourceName, testname, "local");
CT_ASSERT_MESSAGE(localTestdata, !access(localTestdata.c_str(), R_OK));
std::string remoteTestdata = getPeerTestdata(config.m_sourceName, testname, "remote");
CT_ASSERT_MESSAGE(remoteTestdata, !access(remoteTestdata.c_str(), R_OK));
std::string modifyRemote = getPeerTestdata(config.m_sourceName, testname, "modify-remote");
CT_ASSERT_MESSAGE(modifyRemote, !access(modifyRemote.c_str(), R_OK|X_OK));
std::string localSyncedTestdata = getPeerTestdata(config.m_sourceName, testname, "local-synced");
CT_ASSERT_MESSAGE(localSyncedTestdata, !access(localSyncedTestdata.c_str(), R_OK));
std::auto_ptr<Cmdline> cmdline;
// Import locally into empty database.
sources[0].second->deleteAll(sources[0].second->createSourceA);
sources[0].second->doImport(localTestdata);
// Sync to remote.
doSync(__FILE__, __LINE__,
"upload",
SyncOptions(RefreshFromLocalMode(),
CheckSyncReport(0,0,0, -1,0,0, true, SYNC_REFRESH_FROM_LOCAL)));
// Export from remote directly.
std::string actualData = getCurrentTest() + ".remote.test.dat";
simplifyFilename(actualData);
mkdir_p(actualData);
cmdline.reset(new TestCmdline("--daemon=no",
"--export",
actualData.c_str(),
peer.c_str(),
peerSource.c_str(),
(const char *)NULL));
CT_ASSERT(cmdline->parse());
CT_ASSERT_MESSAGE(peer + " " + peerSource, cmdline->run());
// Compare against expected result. We use the compare operation
// of the local source and apply it to data from the remote one.
// This typically works if the data has the same format.
{
ScopedEnvChange fullSyncCompare("CLIENT_TEST_SERVER", "none");
CT_ASSERT(sources[0].second->compareDatabases(remoteTestdata, actualData));
}
// Modify remotely.
std::string remoteModified = getCurrentTest() + ".remote.modified.test.dat";
simplifyFilename(remoteModified);
CT_ASSERT(!system(StringPrintf("%s %s %s",
modifyRemote.c_str(),
actualData.c_str(),
remoteModified.c_str()).c_str()));
CT_ASSERT(isDir(remoteModified));
cmdline.reset(new TestCmdline("--daemon=no",
"--update",
remoteModified.c_str(),
peer.c_str(),
peerSource.c_str(),
(const char *)NULL));
CT_ASSERT(cmdline->parse());
CT_ASSERT_MESSAGE("update " + peer + " " + peerSource, cmdline->run());
// Sync between both sides to update the local data.
doSync(__FILE__, __LINE__,
"two-way",
SyncOptions(SYNC_TWO_WAY,
CheckSyncReport(0,-1,0, 0,0,0, true, SYNC_TWO_WAY)));
// Compare against expected result.
TestingSyncSourcePtr copy;
SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(sources[0].second->createSourceA(), TestingSyncSourcePtr::SLOW));
{
ScopedEnvChange fullSyncCompare("CLIENT_TEST_SERVER", "none");
CT_ASSERT(sources[0].second->compareDatabases(localSyncedTestdata.c_str(), *copy));
}
}
void SyncTests::testDownload()
{
const std::string testname = "testDownload";
CT_ASSERT_EQUAL(sources.size(), 1);
const ClientTest::Config &config(sources[0].second->config);
StringPair peerConfig = getPeerConfig(config.m_sourceName);
const std::string &peer = peerConfig.first;
const std::string &peerSource = peerConfig.second;
CT_ASSERT(!peer.empty());
CT_ASSERT(!peerSource.empty());
std::string localTestdata = getPeerTestdata(config.m_sourceName, testname, "local");
CT_ASSERT_MESSAGE(localTestdata, !access(localTestdata.c_str(), R_OK));
std::string remoteTestdata = getPeerTestdata(config.m_sourceName, testname, "remote");
CT_ASSERT_MESSAGE(remoteTestdata, !access(remoteTestdata.c_str(), R_OK));
std::string modifyLocal = getPeerTestdata(config.m_sourceName, testname, "modify-local");
CT_ASSERT_MESSAGE(modifyLocal, !access(modifyLocal.c_str(), R_OK|X_OK));
std::string remoteSyncedTestdata = getPeerTestdata(config.m_sourceName, testname, "remote-synced");
CT_ASSERT_MESSAGE(remoteSyncedTestdata, !access(remoteSyncedTestdata.c_str(), R_OK));
std::auto_ptr<Cmdline> cmdline;
// Wipe remote directly, then import.
cmdline.reset(new TestCmdline("--daemon=no",
"--delete-items",
peer.c_str(),
peerSource.c_str(),
"*",
(const char *)NULL));
CT_ASSERT(cmdline->parse());
CT_ASSERT_MESSAGE(peer + " " + peerSource, cmdline->run());
cmdline.reset(new TestCmdline("--daemon=no",
"--import",
remoteTestdata.c_str(),
peer.c_str(),
peerSource.c_str(),
(const char *)NULL));
CT_ASSERT(cmdline->parse());
CT_ASSERT_MESSAGE(peer + " " + peerSource, cmdline->run());
// Sync into local database.
doSync(__FILE__, __LINE__,
"download",
SyncOptions(SYNC_REFRESH_FROM_REMOTE,
CheckSyncReport(-1,0,-1, 0,0,0, true, SYNC_REFRESH_FROM_REMOTE)));
// Compare against expected result.
TestingSyncSourcePtr copy;
SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(sources[0].second->createSourceA(), TestingSyncSourcePtr::SLOW));
{
ScopedEnvChange fullSyncCompare("CLIENT_TEST_SERVER", "none");
CT_ASSERT(sources[0].second->compareDatabases(localTestdata.c_str(), *copy));
}
// Modify locally.
std::string actualLocalData = getCurrentTest() + ".local.test.dat";
simplifyFilename(actualLocalData);
std::string localModified = getCurrentTest() + ".local.modified.test.dat";
simplifyFilename(localModified);
CT_ASSERT_NO_THROW(UpdateLocal(currentServer() + "_1", config.m_sourceName,
actualLocalData, localModified,
modifyLocal));
// Sync between both sides to update the remote.
doSync(__FILE__, __LINE__,
"two-way",
SyncOptions(SYNC_TWO_WAY,
CheckSyncReport(0,0,0, 0,-1,0, true, SYNC_TWO_WAY)));
// Check remote.
std::string syncedRemoteData = getCurrentTest() + ".remote.test.dat";
simplifyFilename(syncedRemoteData);
rm_r(syncedRemoteData);
mkdir_p(syncedRemoteData);
cmdline.reset(new TestCmdline("--daemon=no",
"--export",
syncedRemoteData.c_str(),
peer.c_str(),
peerSource.c_str(),
(const char *)NULL));
CT_ASSERT(cmdline->parse());
CT_ASSERT_MESSAGE("export " + peer + " " + peerSource, cmdline->run());
// Compare against expected result. We use the compare operation
// of the local source and apply it to data from the remote one.
// This typically works if the data has the same format.
{
ScopedEnvChange fullSyncCompare("CLIENT_TEST_SERVER", "none");
CT_ASSERT(sources[0].second->compareDatabases(remoteSyncedTestdata, syncedRemoteData));
}
}
void SyncTests::doUpdateConflict(const std::string &testname, bool localWins)
{
CT_ASSERT_EQUAL(sources.size(), 1);
const ClientTest::Config &config(sources[0].second->config);
StringPair peerConfig = getPeerConfig(config.m_sourceName);
const std::string &peer = peerConfig.first;
const std::string &peerSource = peerConfig.second;
CT_ASSERT(!peer.empty());
CT_ASSERT(!peerSource.empty());
std::string localTestdata = getPeerTestdata(config.m_sourceName, testname, "local");
CT_ASSERT_MESSAGE(localTestdata, !access(localTestdata.c_str(), R_OK));
std::string localSyncedTestdata = getPeerTestdata(config.m_sourceName, testname, "local-synced");
CT_ASSERT_MESSAGE(localSyncedTestdata, !access(localSyncedTestdata.c_str(), R_OK));
std::string remoteSyncedTestdata = getPeerTestdata(config.m_sourceName, testname, "remote-synced");
CT_ASSERT_MESSAGE(remoteSyncedTestdata, !access(remoteSyncedTestdata.c_str(), R_OK));
std::string modifyLocal = getPeerTestdata(config.m_sourceName, testname, "modify-local");
CT_ASSERT_MESSAGE(modifyLocal, !access(modifyLocal.c_str(), R_OK|X_OK));
std::string modifyRemote = getPeerTestdata(config.m_sourceName, testname, "modify-remote");
CT_ASSERT_MESSAGE(modifyRemote, !access(modifyRemote.c_str(), R_OK|X_OK));
// Import locally into empty database.
sources[0].second->deleteAll(sources[0].second->createSourceA);
sources[0].second->doImport(localTestdata);
// Sync to remote.
doSync(__FILE__, __LINE__,
"upload",
SyncOptions(RefreshFromLocalMode(),
CheckSyncReport(0,0,0, -1,0,0, true, SYNC_REFRESH_FROM_LOCAL)));
// Export from remote directly.
std::string actualRemoteData = getCurrentTest() + ".remote.test.dat";
simplifyFilename(actualRemoteData);
std::auto_ptr<Cmdline> cmdline;
rm_r(actualRemoteData);
mkdir_p(actualRemoteData);
cmdline.reset(new TestCmdline("--daemon=no",
"--export",
actualRemoteData.c_str(),
peer.c_str(),
peerSource.c_str(),
(const char *)NULL));
CT_ASSERT(cmdline->parse());
CT_ASSERT_MESSAGE("export " + peer + " " + peerSource, cmdline->run());
// Modify all items on both sides. In both cases the modification
// is done with a shell script which must make a copy of the data.
// The shell scripts can be used to cause one or the other side
// to have a modified version of an item or both at the same time,
// which will trigger merging in the engine. The shell script
// needs to create an entry for each item which is meant to be
// updated, using the same file name (= luid) as in the input
// directory.
//
// The order and timing of updating matters for the test because
// the engine will look at time stamps (REV resp. LAST-MODIFIED)
// to determine which side has the more recent change.
for (int i = 0; i < 2; i++) {
if (localWins ? i == 0 : i == 1) {
// The remote side can use the data downloaded earlier.
std::string remoteModified = getCurrentTest() + ".remote.modified.test.dat";
simplifyFilename(remoteModified);
CT_ASSERT(!system(StringPrintf("%s %s %s",
modifyRemote.c_str(),
actualRemoteData.c_str(),
remoteModified.c_str()).c_str()));
CT_ASSERT(isDir(remoteModified));
cmdline.reset(new TestCmdline("--daemon=no",
"--update",
remoteModified.c_str(),
peer.c_str(),
peerSource.c_str(),
(const char *)NULL));
CT_ASSERT(cmdline->parse());
CT_ASSERT_MESSAGE("update " + peer + " " + peerSource, cmdline->run());
// Check remote after update.
std::string remoteActualModified = getCurrentTest() + ".remote.actual.test.dat";
simplifyFilename(remoteActualModified);
rm_r(remoteActualModified);
mkdir_p(remoteActualModified);
cmdline.reset(new TestCmdline("--daemon=no",
"--export",
remoteActualModified.c_str(),
peer.c_str(),
peerSource.c_str(),
(const char *)NULL));
CT_ASSERT(cmdline->parse());
CT_ASSERT_MESSAGE("export " + peer + " " + peerSource, cmdline->run());
// Copy all unmodified items before the comparison.
ReadDir dir(remoteModified);
std::set<std::string> modified(dir.begin(), dir.end());
BOOST_FOREACH(const std::string &luid, ReadDir(actualRemoteData)) {
if (modified.find(luid) == modified.end()) {
std::string content;
CT_ASSERT(ReadFile(actualRemoteData + "/" + luid, content));
std::ofstream((remoteModified + "/" + luid).c_str()).write(content.c_str(), content.size());
}
}
// Compare against expected result. We use the compare operation
// of the local source and apply it to data from the remote one.
// This typically works if the data has the same format.
{
ScopedEnvChange fullSyncCompare("CLIENT_TEST_SERVER", "none");
CT_ASSERT(sources[0].second->compareDatabases(remoteModified, remoteActualModified));
}
} else {
std::string actualLocalData = getCurrentTest() + ".local.test.dat";
simplifyFilename(actualLocalData);
std::string localModified = getCurrentTest() + ".local.modified.test.dat";
simplifyFilename(localModified);
CT_ASSERT_NO_THROW(UpdateLocal(currentServer() + "_1", config.m_sourceName,
actualLocalData, localModified,
modifyLocal));
}
// System time must be synchronized with the remote side for the
// test to pass reliably. Wait here and/or check that
// loosing side's time is in the past (TODO).
sleep(5);
}
// Sync between both sides.
doSync(__FILE__, __LINE__,
"two-way",
SyncOptions(SYNC_TWO_WAY,
CheckSyncReport(0,-1,-1, 0,-1,0, true, SYNC_TWO_WAY)));
// Check remote.
std::string syncedRemoteData = getCurrentTest() + ".remote.test.dat";
simplifyFilename(syncedRemoteData);
rm_r(syncedRemoteData);
mkdir_p(syncedRemoteData);
cmdline.reset(new TestCmdline("--daemon=no",
"--export",
syncedRemoteData.c_str(),
peer.c_str(),
peerSource.c_str(),
(const char *)NULL));
CT_ASSERT(cmdline->parse());
CT_ASSERT_MESSAGE("export " + peer + " " + peerSource, cmdline->run());
// Compare against expected result. We use the compare operation
// of the local source and apply it to data from the remote one.
// This typically works if the data has the same format.
{
ScopedEnvChange fullSyncCompare("CLIENT_TEST_SERVER", "none");
CT_ASSERT(sources[0].second->compareDatabases(remoteSyncedTestdata, syncedRemoteData));
}
// Check local.
TestingSyncSourcePtr copy;
SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(sources[0].second->createSourceA(), TestingSyncSourcePtr::SLOW));
{
ScopedEnvChange fullSyncCompare("CLIENT_TEST_SERVER", "none");
CT_ASSERT(sources[0].second->compareDatabases(localSyncedTestdata.c_str(), *copy));
}
}
void SyncTests::testUpdateRemoteWins()
{
// Local side gets updated first, then remote -> remote wins during merge conflict.
doUpdateConflict("testUpdateRemoteWins", false);
}
void SyncTests::testUpdateLocalWins()
{
// Remote side gets updated first, then local -> local wins during merge conflict.
doUpdateConflict("testUpdateLocalWins", true);
}
void SyncTests::doSync(const SyncOptions &options)
{
int res = 0;

View File

@ -551,6 +551,16 @@ public:
*/
virtual bool compareDatabases(const char *refFile, TestingSyncSource &copy, bool raiseAssert = true);
/**
* compares data using synccompare
*
* @param refFile existing file with source reference items
* @param actualFile existing file with actual items which are expected to match
* @param raiseAssert raise assertion if comparison yields differences (defaults to true)
* @return true if the two databases are equal
*/
bool compareDatabases(const std::string &refFile, const std::string &actualFile, bool raiseAssert = true);
/**
* compare data in source with set of items
*/
@ -632,6 +642,7 @@ public:
virtual void testChanges();
virtual void testChangesMultiCycles();
virtual void testLinkedSources();
void doImport(const std::string &testcases);
virtual void testImport();
virtual void testImportDelete();
virtual void testRemoveProperties();
@ -872,6 +883,13 @@ protected:
virtual void testTimeout();
virtual void testUpload();
virtual void testDownload();
void doUpdateConflict(const std::string &testname, bool localWins);
virtual void testUpdateLocalWins();
virtual void testUpdateRemoteWins();
/**
* implements testMaxMsg(), testLargeObject(), testLargeObjectEncoded()
* using a sequence of items with varying sizes

View File

@ -15,11 +15,7 @@ dist_noinst_SCRIPTS += \
test/log2html.py \
test/run_src_client_test.sh
dist_noinst_DATA += \
test/COPYING \
test/Algorithm/Artistic \
test/Algorithm/COPYING \
test/Algorithm/README \
test_testcases = \
test/testcases/eds_event.ics \
test/testcases/eds_event.ics.local \
test/testcases/eds_task.ics \
@ -34,6 +30,40 @@ dist_noinst_DATA += \
test/testcases/local.png \
test/testcases/templates/clients/phone/nokia/S40/7210c.ini \
test/testcases/templates/clients/SyncEvolution.ini \
test/testcases/synctests/apple/eds_contact/testUpload/local-synced \
test/testcases/synctests/apple/eds_contact/testUpload/local \
test/testcases/synctests/apple/eds_contact/testUpload/modify-remote \
test/testcases/synctests/apple/eds_contact/testUpload/remote \
test/testcases/synctests/apple/eds_contact/testDownload/modify-local \
test/testcases/synctests/apple/eds_contact/testDownload/local \
test/testcases/synctests/apple/eds_contact/testDownload/remote \
test/testcases/synctests/apple/eds_contact/testDownload/remote-synced \
test/testcases/synctests/googlecontacts/eds_contact/testUpload/local-synced \
test/testcases/synctests/googlecontacts/eds_contact/testUpload/local \
test/testcases/synctests/googlecontacts/eds_contact/testUpload/modify-remote \
test/testcases/synctests/googlecontacts/eds_contact/testUpload/remote \
test/testcases/synctests/googlecontacts/eds_contact/testDownload/modify-local \
test/testcases/synctests/googlecontacts/eds_contact/testDownload/local \
test/testcases/synctests/googlecontacts/eds_contact/testDownload/remote \
test/testcases/synctests/googlecontacts/eds_contact/testDownload/remote-synced \
test/testcases/synctests/googlecontacts/eds_contact/testUpdateRemoteWins/modify-local \
test/testcases/synctests/googlecontacts/eds_contact/testUpdateRemoteWins/local-synced \
test/testcases/synctests/googlecontacts/eds_contact/testUpdateRemoteWins/local \
test/testcases/synctests/googlecontacts/eds_contact/testUpdateRemoteWins/modify-remote \
test/testcases/synctests/googlecontacts/eds_contact/testUpdateRemoteWins/remote-synced \
test/testcases/synctests/googlecontacts/eds_contact/testUpdateLocalWins/modify-local \
test/testcases/synctests/googlecontacts/eds_contact/testUpdateLocalWins/local-synced \
test/testcases/synctests/googlecontacts/eds_contact/testUpdateLocalWins/local \
test/testcases/synctests/googlecontacts/eds_contact/testUpdateLocalWins/modify-remote \
test/testcases/synctests/googlecontacts/eds_contact/testUpdateLocalWins/remote-synced \
$(NOP)
dist_noinst_DATA += \
$(test_testcases) \
test/COPYING \
test/Algorithm/Artistic \
test/Algorithm/COPYING \
test/Algorithm/README \
test/syncevo-http-server-logging.conf \
$(wildcard test/testcases/*.patch)

View File

@ -0,0 +1,7 @@
BEGIN:VCARD
VERSION:3.0
FN:simple contact
N:contact;simple;;;
UID:foo-bar-1234
X-EVOLUTION-FILE-AS:contact\, simple
END:VCARD

View File

@ -0,0 +1,20 @@
#! /bin/sh
set -ex
IN=$1
OUT=$2
rm -rf $OUT
mkdir $OUT
[ -d $IN ] || (echo >&2 "$IN not a directory"; false)
for i in $IN/*; do
perl -e '$_ = join("", <>); if (1) {' \
-e 's/END:VCARD/EMAIL:new local email\r\nEND:VCARD/;' \
-e 'print;' \
-e '}' \
<$i >$OUT/$(basename $i)
done
find $OUT -size 0 -delete

View File

@ -0,0 +1,6 @@
BEGIN:VCARD
VERSION:3.0
FN:simple contact
N:contact;simple;;;
UID:foo-bar-1234
END:VCARD

View File

@ -0,0 +1,8 @@
BEGIN:VCARD
VERSION:3.0
FN:simple contact
N:contact;simple;;;
UID:foo-bar-1234
EMAIL:new local email
X-EVOLUTION-FILE-AS:contact\, simple
END:VCARD

View File

@ -0,0 +1,7 @@
BEGIN:VCARD
VERSION:3.0
FN:simple contact
N:contact;simple;;;
UID:foo-bar-1234
X-EVOLUTION-FILE-AS:contact\, simple
END:VCARD

View File

@ -0,0 +1,8 @@
BEGIN:VCARD
VERSION:3.0
FN:simple contact
N:contact;simple;;;
UID:foo-bar-1234
EMAIL:new remote email
X-EVOLUTION-FILE-AS:contact\, simple
END:VCARD

View File

@ -0,0 +1,20 @@
#! /bin/sh
set -ex
IN=$1
OUT=$2
rm -rf $OUT
mkdir $OUT
[ -d $IN ] || (echo >&2 "$IN not a directory"; false)
for i in $IN/*; do
perl -e '$_ = join("", <>); if (1) {' \
-e 's/END:VCARD/EMAIL:new remote email\r\nEND:VCARD/;' \
-e 'print;' \
-e '}' \
<$i >$OUT/$(basename $i)
done
find $OUT -size 0 -delete

View File

@ -0,0 +1,7 @@
BEGIN:VCARD
VERSION:3.0
FN:simple contact
N:contact;simple;;;
UID:foo-bar-1234
X-EVOLUTION-FILE-AS:contact\, simple
END:VCARD

View File

@ -0,0 +1 @@
../../../../eds_contact.vcf

View File

@ -0,0 +1 @@
../../../../eds_contact.vcf

View File

@ -0,0 +1 @@
../../../../eds_event.ics

View File

@ -0,0 +1 @@
../../../../eds_event.ics

View File

@ -0,0 +1,16 @@
The test data was adapted to cope with some bugs:
- An X-ABLabel for an ADR gets generated by Google CardDAV,
but when sending it back, the connection to ADR gets ignored
and the X-ABLabel becomes a stand-alone property.
Reported to Google, bug gets tracked.
- The double \\ at the end of the custom-label6 property gets
encoded as a single backslash by the Google encoder, in
contrast to the backslash in the middle of the custom-label5.
This is a minor bug, not reported.
The libsynthesis parser then discards the backslash and
finally the Google parser strips the trailing white space.
- Google swallows one space before the \n in custom-label5.

View File

@ -0,0 +1,73 @@
BEGIN:VCARD
VERSION:3.0
UID:pas-id-5363657E0000002F
PRODID:-//Synthesis AG//NONSGML SyncML Engine V3.4.0.47//EN
REV:20140502T092918Z
N:Doe;John;1;Mr.;Sr.
FN:Mr. John 1 Doe Sr.
X-EVOLUTION-FILE-AS:Doe\, John
NICKNAME:Johnny
TITLE:tester
ORG:at company;;;
TEL;TYPE=WORK,VOICE:business 1
TEL;TYPE=CELL:mobile
TEL;TYPE=HOME,VOICE:home
TEL:main
TEL;TYPE=WORK,FAX:work fax
TEL;TYPE=HOME,FAX:home fax
TEL;TYPE=PAGER:pager
TEL;X-ABLabel="Google Voice":google voice
TEL;X-ABLabel="custom-label4":custom
EMAIL;TYPE=HOME:john.doe@home.com
EMAIL;TYPE=WORK:doe@work.com
EMAIL;X-ABLabel="custom-label2":john@custom.com
URL;X-ABLabel=Profile:http://profile.com
URL;X-ABLabel=Blog:http://blog.com
URL;X-ABLabel=HomePage:http://homepage.com
URL;X-ABLabel=Work:http://company.com
URL;X-ABLabel="Custom-label6 Backslash ":http://custom.com
X-EVOLUTION-MANAGER:manager
X-EVOLUTION-ASSISTANT:assistant
X-ABRELATEDNAMES;X-ABLabel=Child:child
X-ABRELATEDNAMES;X-ABLabel=Mother:mother
X-ABRELATEDNAMES;X-ABLabel=Father:father
X-ABRELATEDNAMES;X-ABLabel=Parent:parent
X-ABRELATEDNAMES;X-ABLabel=Brother:brother
X-ABRELATEDNAMES;X-ABLabel=Sister:sister
X-ABRELATEDNAMES;X-ABLabel=Friend:friend
X-ABRELATEDNAMES;X-ABLabel=relative:relative
X-ABRELATEDNAMES;X-ABLabel="referred-by-label":referred-by
X-ABRELATEDNAMES;X-ABLabel=Partner:partner
X-ABRELATEDNAMES;X-ABLabel="domestic-partner-label":domestic partner
X-ABRELATEDNAMES;X-ABLabel="custom-label5 Umlaut ä Semicolon ; Backslash \ newline tab end of label":custom relationship
X-EVOLUTION-SPOUSE:spouse
X-EVOLUTION-ANNIVERSARY:19710101
X-ABDATE;X-ABLabel="custom-label3":20000201
IMPP;X-SERVICE-TYPE=GoogleTalk:xmpp:google%20talk
IMPP;X-SERVICE-TYPE=QQ:x-apple:QQ
IMPP;X-SERVICE-TYPE="Chat-label":x-apple:custom%20chat
X-AIM:aim
X-ICQ:ICQ
X-YAHOO:yahoo
X-SKYPE:skype
X-MSN:MSN
X-JABBER:Jabber
X-MOZILLA-HTML:FALSE
ADR;TYPE=HOME:PO;neighborhood;home address\n;City;State;ZIP;Country
ADR;TYPE=WORK:;;work address;;;;
ADR:;;custom address;;;;
BDAY:19701230
NOTE:A test contact.
PHOTO;TYPE=png;ENCODING=b:iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAYAAABj7u2bAAAAB
mJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gEICjgdiWkBOQA
AAB10RVh0Q29tbWVudABDcmVhdGVkIHdpdGggVGhlIEdJTVDvZCVuAAABaElEQVRIx+3Wu0tcU
RAG8F98gRKTYGORRqwksJV/QOqFFIFgKgsRYbHV1larDQQCKQxpUscyhUmXJuCSNpYWPsAU6wP
xHW6aWbgsu+ve3RUs7geHc+fON3O+M4c5HHLkyHG/eISkg5heIGmUr++hVWigyY6THlejbWSt0
Bv8QBXX2MF7jKU4IyjjJ45xg31sYKZuw7Xv9Gh6vvXO9QbBtbGNJ8Ert+AlTURkFjQX9g5e4yk
GUcBm+FaDexx2MUQOYhIL2Lpj09oV9CvsQgPuePj+hP037BL6M6yRSdDZHWVOcBHcEv7FvyN8x
xqmeynovA1Baf4UVvANhyn/Uq8E/Q57ssNufhvx1QZrDHfS9p9i3sQsnscdNowXWEQlOBXMYyI
4j3EavqFUzpOYl4OTqUJ9+NzmkbXyb6Ryfumm7Wso4it2cYXL6K6PeBmcV8E5iEvxPDjv8CyVa
xQfsIfbqGIlf17k6Bb/Ae0cnahfg6KuAAAAAElFTkSuQmCC
X-PHONETIC-FIRST-NAME:John
X-PHONETIC-LAST-NAME:Doe
END:VCARD

View File

@ -0,0 +1,20 @@
#! /bin/sh
set -ex
IN=$1
OUT=$2
rm -rf $OUT
mkdir $OUT
[ -d $IN ] || (echo >&2 "$IN not a directory"; false)
for i in $IN/*; do
perl -e '$_ = join("", <>); if (1) {' \
-e 's/END:VCARD/EMAIL:new local email\r\nEND:VCARD/;' \
-e 'print;' \
-e '}' \
<$i >$OUT/$(basename $i)
done
find $OUT -size 0 -delete

View File

@ -0,0 +1,106 @@
BEGIN:VCARD
VERSION:3.0
N:Doe;John;1;Mr.;Sr.
FN:Mr. John 1 Doe Sr.
NICKNAME:Johnny
TITLE:tester
ORG:at company
REV:2014-04-11T08:43:42Z
UID:6f354d698b7ccd22
BDAY;VALUE=DATE:1970-12-30
ADR;TYPE=HOME:PO;neighborhood;home address\n;City;State;ZIP;Country
ADR;TYPE=WORK:;;work address;;;;
ADR:;;custom address;;;;
TEL;TYPE=WORK:business 1
TEL;TYPE=CELL:mobile
TEL;TYPE=HOME:home
TEL:main
TEL;TYPE=FAX,WORK:work fax
TEL;TYPE=FAX,HOME:home fax
item14.TEL:google voice
TEL;TYPE=PAGER:pager
item15.TEL:custom
EMAIL;TYPE=HOME,PREF:john.doe@home.com
EMAIL;TYPE=WORK:doe@work.com
item2.EMAIL:john@custom.com
NOTE:A test contact.
PHOTO;ENCODING=b;TYPE=PNG:iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAYAAABj7u2bAAAAB
mJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gEICjgdiWkBO
QAAAB10RVh0Q29tbWVudABDcmVhdGVkIHdpdGggVGhlIEdJTVDvZCVuAAABaElEQVRIx+3Wu
0tcURAG8F98gRKTYGORRqwksJV/QOqFFIFgKgsRYbHV1larDQQCKQxpUscyhUmXJuCSNpYWP
sAU6wPxHW6aWbgsu+ve3RUs7geHc+fON3O+M4c5HHLkyHG/eISkg5heIGmUr++hVWigyY6TH
lejbWSt0Bv8QBXX2MF7jKU4IyjjJ45xg31sYKZuw7Xv9Gh6vvXO9QbBtbGNJ8Ert+AlTURkF
jQX9g5e4ykGUcBm+FaDexx2MUQOYhIL2Lpj09oV9CvsQgPuePj+hP037BL6M6yRSdDZHWVOc
BHcEv7FvyN8xxqmeynovA1Baf4UVvANhyn/Uq8E/Q57ssNufhvx1QZrDHfS9p9i3sQsnscdN
owXWEQlOBXMYyI4j3EavqFUzpOYl4OTqUJ9+NzmkbXyb6Ryfumm7Wso4it2cYXL6K6PeBmcV
8E5iEvxPDjv8CyVaxQfsIfbqGIlf17k6Bb/Ae0cnahfg6KuAAAAAElFTkSuQmCC
item5.IMPP;X-SERVICE-TYPE=GoogleTalk:xmpp:google%20talk
item6.IMPP;X-SERVICE-TYPE=AIM:aim:aim
item7.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:yahoo
item8.IMPP;X-SERVICE-TYPE=Skype:skype:skype
item9.IMPP;X-SERVICE-TYPE=QQ:x-apple:QQ
item10.IMPP;X-SERVICE-TYPE=MSN:msnim:MSN
item11.IMPP;X-SERVICE-TYPE=ICQ:aim:ICQ
item12.IMPP;X-SERVICE-TYPE=Jabber:xmpp:Jabber
item13.IMPP;X-SERVICE-TYPE=chat-label:x-apple:custom%20chat
X-EVOLUTION-FILE-AS:Doe\, John
X-MOZILLA-HTML:FALSE
X-PHONETIC-FIRST-NAME:John
X-PHONETIC-LAST-NAME:Doe
item2.X-ABLabel:custom-label2
item3.X-ABDATE:1971-01-01
item3.X-ABLabel:Anniversary
item4.X-ABDATE:2000-02-01
item4.X-ABLabel:custom-label3
item5.X-ABLabel:Other
item6.X-ABLabel:Other
item7.X-ABLabel:Other
item8.X-ABLabel:Other
item9.X-ABLabel:Other
item10.X-ABLabel:Other
item11.X-ABLabel:Other
item12.X-ABLabel:Other
item13.X-ABLabel:Other
item14.X-ABLabel:Google Voice
item15.X-ABLabel:custom-label4
item16.X-ABRELATEDNAMES:spouse
item16.X-ABLabel:Spouse
item17.X-ABRELATEDNAMES:child
item17.X-ABLabel:Child
item18.X-ABRELATEDNAMES:mother
item18.X-ABLabel:Mother
item19.X-ABRELATEDNAMES:father
item19.X-ABLabel:Father
item20.X-ABRELATEDNAMES:parent
item20.X-ABLabel:Parent
item21.X-ABRELATEDNAMES:brother
item21.X-ABLabel:Brother
item22.X-ABRELATEDNAMES:sister
item22.X-ABLabel:Sister
item23.X-ABRELATEDNAMES:friend
item23.X-ABLabel:Friend
item24.X-ABRELATEDNAMES:relative
item24.X-ABLabel:relative
item25.X-ABRELATEDNAMES:manager
item25.X-ABLabel:Manager
item26.X-ABRELATEDNAMES:assistant
item26.X-ABLabel:Assistant
item27.X-ABRELATEDNAMES:referred-by
item27.X-ABLabel:referred-by-label
item28.X-ABRELATEDNAMES:partner
item28.X-ABLabel:Partner
item29.X-ABRELATEDNAMES:domestic partner
item29.X-ABLabel:domestic-partner-label
item30.X-ABRELATEDNAMES:custom relationship
item30.X-ABLabel:custom-label5\nUmlaut ä\nSemicolon \; Backslash \\ newline \n tab end of label
item31.URL:http\://profile.com
item31.X-ABLabel:Profile
item32.URL:http\://blog.com
item32.X-ABLabel:Blog
item33.URL:http\://homepage.com
item33.X-ABLabel:HomePage
item34.URL:http\://company.com
item34.X-ABLabel:Work
item35.URL:http\://custom.com
item35.X-ABLabel:Custom-label6 Backslash \\
END:VCARD

View File

@ -0,0 +1,107 @@
BEGIN:VCARD
VERSION:3.0
N:Doe;John;1;Mr.;Sr.
FN:Mr. John 1 Doe Sr.
NICKNAME:Johnny
TITLE:tester
ORG:at company
REV:2014-04-11T08:43:42Z
UID:6f354d698b7ccd22
BDAY;VALUE=DATE:19701230
ADR;TYPE=HOME:PO;neighborhood;home address\n;City;State;ZIP;Country
ADR;TYPE=WORK:;;work address;;;;
ADR:;;custom address;;;;
TEL;TYPE=WORK:business 1
TEL;TYPE=CELL:mobile
TEL;TYPE=HOME:home
TEL:main
TEL;TYPE=FAX,WORK:work fax
TEL;TYPE=FAX,HOME:home fax
item14.TEL:google voice
TEL;TYPE=PAGER:pager
item15.TEL:custom
EMAIL;TYPE=HOME,PREF:john.doe@home.com
EMAIL;TYPE=WORK:doe@work.com
item2.EMAIL:john@custom.com
EMAIL:new local email
NOTE:A test contact.
PHOTO;ENCODING=b;TYPE=PNG:iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAYAAABj7u2bAAAAB
mJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gEICjgdiWkBO
QAAAB10RVh0Q29tbWVudABDcmVhdGVkIHdpdGggVGhlIEdJTVDvZCVuAAABaElEQVRIx+3Wu
0tcURAG8F98gRKTYGORRqwksJV/QOqFFIFgKgsRYbHV1larDQQCKQxpUscyhUmXJuCSNpYWP
sAU6wPxHW6aWbgsu+ve3RUs7geHc+fON3O+M4c5HHLkyHG/eISkg5heIGmUr++hVWigyY6TH
lejbWSt0Bv8QBXX2MF7jKU4IyjjJ45xg31sYKZuw7Xv9Gh6vvXO9QbBtbGNJ8Ert+AlTURkF
jQX9g5e4ykGUcBm+FaDexx2MUQOYhIL2Lpj09oV9CvsQgPuePj+hP037BL6M6yRSdDZHWVOc
BHcEv7FvyN8xxqmeynovA1Baf4UVvANhyn/Uq8E/Q57ssNufhvx1QZrDHfS9p9i3sQsnscdN
owXWEQlOBXMYyI4j3EavqFUzpOYl4OTqUJ9+NzmkbXyb6Ryfumm7Wso4it2cYXL6K6PeBmcV
8E5iEvxPDjv8CyVaxQfsIfbqGIlf17k6Bb/Ae0cnahfg6KuAAAAAElFTkSuQmCC
item5.IMPP;X-SERVICE-TYPE=GoogleTalk:xmpp:google%20talk
item6.IMPP;X-SERVICE-TYPE=AIM:aim:aim
item7.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:yahoo
item8.IMPP;X-SERVICE-TYPE=Skype:skype:skype
item9.IMPP;X-SERVICE-TYPE=QQ:x-apple:QQ
item10.IMPP;X-SERVICE-TYPE=MSN:msnim:MSN
item11.IMPP;X-SERVICE-TYPE=ICQ:aim:ICQ
item12.IMPP;X-SERVICE-TYPE=Jabber:xmpp:Jabber
item13.IMPP;X-SERVICE-TYPE=Chat-label:x-apple:custom%20chat
X-EVOLUTION-FILE-AS:Doe\, John
X-MOZILLA-HTML:FALSE
X-PHONETIC-FIRST-NAME:John
X-PHONETIC-LAST-NAME:Doe
item2.X-ABLabel:custom-label2
item3.X-ABDATE:1971-01-01
item3.X-ABLabel:Anniversary
item4.X-ABDATE:20000201
item4.X-ABLabel:custom-label3
item5.X-ABLabel:Other
item6.X-ABLabel:Other
item7.X-ABLabel:Other
item8.X-ABLabel:Other
item9.X-ABLabel:Other
item10.X-ABLabel:Other
item11.X-ABLabel:Other
item12.X-ABLabel:Other
item13.X-ABLabel:Other
item14.X-ABLabel:Google Voice
item15.X-ABLabel:custom-label4
item16.X-ABRELATEDNAMES:spouse
item16.X-ABLabel:Spouse
item17.X-ABRELATEDNAMES:child
item17.X-ABLabel:Child
item18.X-ABRELATEDNAMES:mother
item18.X-ABLabel:Mother
item19.X-ABRELATEDNAMES:father
item19.X-ABLabel:Father
item20.X-ABRELATEDNAMES:parent
item20.X-ABLabel:Parent
item21.X-ABRELATEDNAMES:brother
item21.X-ABLabel:Brother
item22.X-ABRELATEDNAMES:sister
item22.X-ABLabel:Sister
item23.X-ABRELATEDNAMES:friend
item23.X-ABLabel:Friend
item24.X-ABRELATEDNAMES:relative
item24.X-ABLabel:relative
item25.X-ABRELATEDNAMES:manager
item25.X-ABLabel:Manager
item26.X-ABRELATEDNAMES:assistant
item26.X-ABLabel:Assistant
item27.X-ABRELATEDNAMES:referred-by
item27.X-ABLabel:referred-by-label
item28.X-ABRELATEDNAMES:partner
item28.X-ABLabel:Partner
item29.X-ABRELATEDNAMES:domestic partner
item29.X-ABLabel:domestic-partner-label
item30.X-ABRELATEDNAMES:custom relationship
item30.X-ABLabel:custom-label5 Umlaut ä Semicolon \; Backslash \\ newline tab end of label
item31.URL:http\://profile.com
item31.X-ABLabel:Profile
item32.URL:http\://blog.com
item32.X-ABLabel:Blog
item33.URL:http\://homepage.com
item33.X-ABLabel:HomePage
item34.URL:http\://company.com
item34.X-ABLabel:Work
item35.URL:http\://custom.com
item35.X-ABLabel:Custom-label6 Backslash
END:VCARD

View File

@ -0,0 +1,201 @@
BEGIN:VCARD
VERSION:3.0
URL:http://john.doe.com
TITLE:Senior Tester
ORG:Test Inc.;Testing
X-EVOLUTION-MANAGER:John Doe Senior
X-EVOLUTION-ASSISTANT:John Doe Junior
NICKNAME:user1
X-EVOLUTION-ANNIVERSARY:2006-01-09
X-EVOLUTION-SPOUSE:Joan Doe
NOTE:This is a test case which uses almost all Evolution fields.
FN:John 1 Doe
N:Doe;John;1;;
X-EVOLUTION-FILE-AS:Doe\, John
X-EVOLUTION-BLOG-URL:web log
X-EVOLUTION-VIDEO-URL:chat
X-MOZILLA-HTML:TRUE
ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O
ld Testovia
LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo
x #2\nOld Testovia
ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234
5;Testovia
LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest
Box #1\nTestovia
ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia
LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box
#3\nNew Testonia
UID:pas-id-43C0ED3900000001
EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:john.doe@work.com
EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:john.doe@home.priv
EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=3:john.doe@other.world
EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=4:john.doe@yet.another.world
TEL;TYPE=work;TYPE=Voice;X-EVOLUTION-UI-SLOT=1:business 1
TEL;TYPE=homE;TYPE=VOICE;X-EVOLUTION-UI-SLOT=2:home 2
TEL;TYPE=CELL;X-EVOLUTION-UI-SLOT=3:mobile 3
TEL;TYPE=WORK;TYPE=FAX;X-EVOLUTION-UI-SLOT=4:businessfax 4
TEL;TYPE=HOME;TYPE=FAX;X-EVOLUTION-UI-SLOT=5:homefax 5
TEL;TYPE=PAGER;X-EVOLUTION-UI-SLOT=6:pager 6
TEL;TYPE=CAR;X-EVOLUTION-UI-SLOT=7:car 7
TEL;TYPE=PREF;X-EVOLUTION-UI-SLOT=8:primary 8
X-AIM;X-EVOLUTION-UI-SLOT=1:AIM JOHN
X-YAHOO;X-EVOLUTION-UI-SLOT=2:YAHOO JDOE
X-ICQ;X-EVOLUTION-UI-SLOT=3:ICQ JD
X-GROUPWISE;X-EVOLUTION-UI-SLOT=4:GROUPWISE DOE
X-GADUGADU:GADUGADU DOE
X-JABBER:JABBER DOE
X-MSN:MSN DOE
X-SKYPE:SKYPE DOE
X-SIP:SIP DOE
PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA
AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM
CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF
BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e
Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE
Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/
xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR
AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V
fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um
hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ
YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk
GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2
JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth
VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z
/VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q==
END:VCARD
BEGIN:VCARD
VERSION:3.0
URL:http://john.doe.com
TITLE:Senior Tester
ORG:Test Inc.;Testing
X-EVOLUTION-MANAGER:John Doe Senior
X-EVOLUTION-ASSISTANT:John Doe Junior
NICKNAME:user1
X-EVOLUTION-ANNIVERSARY:2006-01-09
X-EVOLUTION-SPOUSE:Joan Doe
NOTE:This is a test case which uses almost all Evolution fields.
FN:John 2 Doe
N:Doe;John;2;;
X-EVOLUTION-FILE-AS:Doe\, John
X-EVOLUTION-BLOG-URL:web log
X-EVOLUTION-VIDEO-URL:chat
X-MOZILLA-HTML:TRUE
ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O
ld Testovia
LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo
x #2\nOld Testovia
ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234
5;Testovia
LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest
Box #1\nTestovia
ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia
LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box
#3\nNew Testonia
UID:pas-id-43C0ED3900000002
EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:john.doe@work.com
EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:john.doe@home.priv
EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=3:john.doe@other.world
EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=4:john.doe@yet.another.world
TEL;TYPE=work;TYPE=Voice;X-EVOLUTION-UI-SLOT=1:business 1
TEL;TYPE=homE;TYPE=VOICE;X-EVOLUTION-UI-SLOT=2:home 2
TEL;TYPE=CELL;X-EVOLUTION-UI-SLOT=3:mobile 3
TEL;TYPE=WORK;TYPE=FAX;X-EVOLUTION-UI-SLOT=4:businessfax 4
TEL;TYPE=HOME;TYPE=FAX;X-EVOLUTION-UI-SLOT=5:homefax 5
TEL;TYPE=PAGER;X-EVOLUTION-UI-SLOT=6:pager 6
TEL;TYPE=CAR;X-EVOLUTION-UI-SLOT=7:car 7
TEL;TYPE=PREF;X-EVOLUTION-UI-SLOT=8:primary 8
X-AIM;X-EVOLUTION-UI-SLOT=1:AIM JOHN
X-YAHOO;X-EVOLUTION-UI-SLOT=2:YAHOO JDOE
X-ICQ;X-EVOLUTION-UI-SLOT=3:ICQ JD
X-GROUPWISE;X-EVOLUTION-UI-SLOT=4:GROUPWISE DOE
X-GADUGADU:GADUGADU DOE
X-JABBER:JABBER DOE
X-MSN:MSN DOE
X-SKYPE:SKYPE DOE
X-SIP:SIP DOE
PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA
AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM
CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF
BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e
Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE
Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/
xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR
AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V
fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um
hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ
YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk
GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2
JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth
VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z
/VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q==
END:VCARD
BEGIN:VCARD
VERSION:3.0
URL:http://john.doe.com
TITLE:Senior Tester
ORG:Test Inc.;Testing
X-EVOLUTION-MANAGER:John Doe Senior
X-EVOLUTION-ASSISTANT:John Doe Junior
NICKNAME:user1
X-EVOLUTION-ANNIVERSARY:2006-01-09
X-EVOLUTION-SPOUSE:Joan Doe
NOTE:This is a test case which uses almost all Evolution fields.
FN:John 3 Doe
N:Doe;John;3;;
X-EVOLUTION-FILE-AS:Doe\, John
X-EVOLUTION-BLOG-URL:web log
X-EVOLUTION-VIDEO-URL:chat
X-MOZILLA-HTML:TRUE
ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O
ld Testovia
LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo
x #2\nOld Testovia
ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234
5;Testovia
LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest
Box #1\nTestovia
ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia
LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box
#3\nNew Testonia
UID:pas-id-43C0ED3900000003
EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:john.doe@work.com
EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:john.doe@home.priv
EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=3:john.doe@other.world
EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=4:john.doe@yet.another.world
TEL;TYPE=work;TYPE=Voice;X-EVOLUTION-UI-SLOT=1:business 1
TEL;TYPE=homE;TYPE=VOICE;X-EVOLUTION-UI-SLOT=2:home 2
TEL;TYPE=CELL;X-EVOLUTION-UI-SLOT=3:mobile 3
TEL;TYPE=WORK;TYPE=FAX;X-EVOLUTION-UI-SLOT=4:businessfax 4
TEL;TYPE=HOME;TYPE=FAX;X-EVOLUTION-UI-SLOT=5:homefax 5
TEL;TYPE=PAGER;X-EVOLUTION-UI-SLOT=6:pager 6
TEL;TYPE=CAR;X-EVOLUTION-UI-SLOT=7:car 7
TEL;TYPE=PREF;X-EVOLUTION-UI-SLOT=8:primary 8
X-AIM;X-EVOLUTION-UI-SLOT=1:AIM JOHN
X-YAHOO;X-EVOLUTION-UI-SLOT=2:YAHOO JDOE
X-ICQ;X-EVOLUTION-UI-SLOT=3:ICQ JD
X-GROUPWISE;X-EVOLUTION-UI-SLOT=4:GROUPWISE DOE
X-GADUGADU:GADUGADU DOE
X-JABBER:JABBER DOE
X-MSN:MSN DOE
X-SKYPE:SKYPE DOE
X-SIP:SIP DOE
PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA
AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM
CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF
BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e
Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE
Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/
xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR
AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V
fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um
hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ
YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk
GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2
JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth
VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z
/VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q==
END:VCARD

View File

@ -0,0 +1,241 @@
BEGIN:VCARD
VERSION:3.0
URL:http://john.doe.com
TITLE:Senior Tester
ORG:Test Inc.;Testing
X-EVOLUTION-MANAGER:John Doe Senior
X-EVOLUTION-ASSISTANT:John Doe Junior
NICKNAME:user1
BDAY:2006-01-08
X-EVOLUTION-ANNIVERSARY:2006-01-09
X-EVOLUTION-SPOUSE:Joan Doe
NOTE:This is a test case which uses almost all Evolution fields.
FN:John 1 Doe
N:Doe;John;1;;
X-EVOLUTION-FILE-AS:Doe\, John
X-EVOLUTION-BLOG-URL:web log
X-EVOLUTION-VIDEO-URL:chat
X-MOZILLA-HTML:TRUE
ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O
ld Testovia
LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo
x #2\nOld Testovia
ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234
5;Testovia
LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest
Box #1\nTestovia
ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia
LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box
#3\nNew Testonia
UID:pas-id-43C0ED3900000001
EMAIL;TYPE=WORK:john.doe@work.com
EMAIL;TYPE=HOME:john.doe@home.priv
EMAIL;TYPE=OTHER:john.doe@other.world
EMAIL;TYPE=OTHER:john.doe@yet.another.world
TEL;TYPE=work;TYPE=Voice:business 1
TEL;TYPE=homE;TYPE=VOICE:home 2
TEL;TYPE=CELL:mobile 3
TEL;TYPE=WORK;TYPE=FAX:businessfax 4
TEL;TYPE=HOME;TYPE=FAX:homefax 5
TEL;TYPE=PAGER:pager 6
TEL;TYPE=CAR:car 7
TEL;TYPE=PREF:primary 80
X-AIM:AIM JOHN
X-YAHOO:YAHOO JDOE
X-ICQ:ICQ JD
X-GROUPWISE:GROUPWISE DOE
X-GADUGADU:GADUGADU DOE
X-JABBER:JABBER DOE
X-MSN:MSN DOE
X-SKYPE:SKYPE DOE
X-SIP:SIP DOE
PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA
AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM
CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF
BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e
Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE
Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/
xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR
AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V
fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um
hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ
YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk
GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2
JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth
VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z
/VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q==
TEL;TYPE=HOME:new remote tel 1
TEL;X-ABLabel=new-remote-tel-label:new remote tel 2
EMAIL;X-ABLabel=new-remote-email-label:new remote email 1
EMAIL;TYPE=HOME:new remote email 2
X-ABDATE;X-ABLabel=date-label-2014:2014-01-01
URL;X-ABLabel=example-url-label:http://www.example.com/foobar
X-AIM:new-aim
X-GADUGADU:new-gadugadu
X-GROUPWISE:new-groupwise
X-ICQ:new-icq
X-JABBER:new-jabber
X-MSN:new-MSN
X-YAHOO:new-yahoo
X-SKYPE:new-skype
X-SIP:new-sip
IMPP;X-SERVICE-TYPE=Abc:x-apple:new-abc
X-ABRELATEDNAMES;X-ABLabel=cousin:new person
ADR;TYPE=WORK:box;;street;town;county;12346;country
END:VCARD
BEGIN:VCARD
VERSION:3.0
URL:http://john.doe.com
TITLE:Senior Tester
ORG:Test Inc.;Testing
X-EVOLUTION-MANAGER:John Doe Senior
X-EVOLUTION-ASSISTANT:John Doe Junior
NICKNAME:user1
BDAY:2006-01-01
X-EVOLUTION-ANNIVERSARY:2006-01-09
X-EVOLUTION-SPOUSE:Joan Doe
NOTE:This is a test case which uses almost all Evolution fields.
FN:John 2 Doe
N:Doe;John;2;;
X-EVOLUTION-FILE-AS:Doe\, John
X-EVOLUTION-BLOG-URL:web log
X-EVOLUTION-VIDEO-URL:chat
X-MOZILLA-HTML:TRUE
ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O
ld Testovia
LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo
x #2\nOld Testovia
ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234
5;Testovia
LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest
Box #1\nTestovia
ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia
LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box
#3\nNew Testonia
UID:pas-id-43C0ED3900000002
EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:john.doe@work.com
EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:john.doe@home.priv
EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=3:john.doe@other.world
EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=4:john.doe@yet.another.world
EMAIL:new local email
TEL;TYPE=work;TYPE=Voice;X-EVOLUTION-UI-SLOT=1:business 1
TEL;TYPE=homE;TYPE=VOICE;X-EVOLUTION-UI-SLOT=2:home 2
TEL;TYPE=CELL;X-EVOLUTION-UI-SLOT=3:mobile 3
TEL;TYPE=WORK;TYPE=FAX;X-EVOLUTION-UI-SLOT=4:businessfax 4
TEL;TYPE=HOME;TYPE=FAX;X-EVOLUTION-UI-SLOT=5:homefax 5
TEL;TYPE=PAGER;X-EVOLUTION-UI-SLOT=6:pager 6
TEL;TYPE=CAR;X-EVOLUTION-UI-SLOT=7:car 7
TEL;TYPE=PREF;X-EVOLUTION-UI-SLOT=8:primary 80
X-AIM;X-EVOLUTION-UI-SLOT=1:AIM JOHN
X-YAHOO;X-EVOLUTION-UI-SLOT=2:YAHOO JDOE
X-ICQ;X-EVOLUTION-UI-SLOT=3:ICQ JD
X-GROUPWISE;X-EVOLUTION-UI-SLOT=4:GROUPWISE DOE
X-GADUGADU:GADUGADU DOE
X-JABBER:JABBER DOE
X-MSN:MSN DOE
X-SKYPE:SKYPE DOE
X-SIP:SIP DOE
PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA
AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM
CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF
BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e
Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE
Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/
xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR
AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V
fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um
hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ
YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk
GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2
JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth
VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z
/VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q==
TEL;TYPE=HOME:new remote tel 1
TEL;X-ABLabel=new-remote-tel-label:new remote tel 2
EMAIL;X-ABLabel=new-remote-email-label:new remote email 1
EMAIL;TYPE=HOME:new remote email 2
X-ABDATE;X-ABLabel=date-label-2014:2014-01-01
URL;X-ABLabel=example-url-label:http://www.example.com/foobar
X-AIM:new-aim
X-GADUGADU:new-gadugadu
X-GROUPWISE:new-groupwise
X-ICQ:new-icq
X-JABBER:new-jabber
X-MSN:new-MSN
X-YAHOO:new-yahoo
X-SKYPE:new-skype
X-SIP:new-sip
IMPP;X-SERVICE-TYPE=Abc:x-apple:new-abc
X-ABRELATEDNAMES;X-ABLabel=cousin:new person
ADR;TYPE=WORK:box;;street;town;county;12346;country
END:VCARD
BEGIN:VCARD
VERSION:3.0
URL:http://john.doe.com
TITLE:Senior Tester
ORG:Test Inc.;Testing
X-EVOLUTION-MANAGER:John Doe Senior
X-EVOLUTION-ASSISTANT:John Doe Junior
NICKNAME:user1
X-EVOLUTION-ANNIVERSARY:2006-01-09
X-EVOLUTION-SPOUSE:Joan Doe
NOTE:This is a test case which uses almost all Evolution fields.
FN:John 3 Doe
N:Doe;John;3;;
X-EVOLUTION-FILE-AS:Doe\, John
X-EVOLUTION-BLOG-URL:web log
X-EVOLUTION-VIDEO-URL:chat
X-MOZILLA-HTML:TRUE
ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O
ld Testovia
LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo
x #2\nOld Testovia
ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234
5;Testovia
LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest
Box #1\nTestovia
ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia
LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box
#3\nNew Testonia
UID:pas-id-43C0ED3900000003
EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:john.doe@work.com
EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:john.doe@home.priv
EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=3:john.doe@other.world
EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=4:john.doe@yet.another.world
EMAIL:new local email
TEL;TYPE=work;TYPE=Voice;X-EVOLUTION-UI-SLOT=1:business 1
TEL;TYPE=homE;TYPE=VOICE;X-EVOLUTION-UI-SLOT=2:home 2
TEL;TYPE=CELL;X-EVOLUTION-UI-SLOT=3:mobile 3
TEL;TYPE=WORK;TYPE=FAX;X-EVOLUTION-UI-SLOT=4:businessfax 4
TEL;TYPE=HOME;TYPE=FAX;X-EVOLUTION-UI-SLOT=5:homefax 5
TEL;TYPE=PAGER;X-EVOLUTION-UI-SLOT=6:pager 6
TEL;TYPE=CAR;X-EVOLUTION-UI-SLOT=7:car 7
TEL;TYPE=PREF;X-EVOLUTION-UI-SLOT=8:primary 80
X-AIM;X-EVOLUTION-UI-SLOT=1:AIM JOHN
X-YAHOO;X-EVOLUTION-UI-SLOT=2:YAHOO JDOE
X-ICQ;X-EVOLUTION-UI-SLOT=3:ICQ JD
X-GROUPWISE;X-EVOLUTION-UI-SLOT=4:GROUPWISE DOE
X-GADUGADU:GADUGADU DOE
X-JABBER:JABBER DOE
X-MSN:MSN DOE
X-SKYPE:SKYPE DOE
X-SIP:SIP DOE
PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA
AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM
CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF
BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e
Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE
Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/
xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR
AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V
fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um
hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ
YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk
GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2
JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth
VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z
/VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q==
BDAY:2006-01-01
END:VCARD

View File

@ -0,0 +1,23 @@
#! /bin/sh
set -ex
IN=$1
OUT=$2
rm -rf $OUT
mkdir $OUT
[ -d $IN ] || (echo >&2 "$IN not a directory"; false)
for i in $IN/*; do
# Modify second and third contact by changing a field.
# The second contact will also get modified locally.
perl -e '$_ = join("", <>); if (/John [23] Doe/) {' \
-e 's/primary 8/primary 80/;' \
-e 's/END:VCARD/BDAY:2006-01-01\r\nEMAIL:new local email\r\nEND:VCARD/;' \
-e 'print;' \
-e '}' \
<$i >$OUT/$(basename $i)
done
find $OUT -size 0 -delete

View File

@ -0,0 +1,64 @@
#! /bin/sh
set -ex
IN=$1
OUT=$2
rm -rf $OUT
mkdir $OUT
[ -d $IN ] || (echo >&2 "$IN not a directory"; false)
# TODO: X-SERVICE-TYPE, one for each kind, etc.
for i in $IN/*; do
# Modify first and second contact by changing a field.
# The second contact will also get modified locally.
# We add a new BDAY property here, too, that will be added to
# the local side during the merge by the engine, and
# new array entries, that need special handling by the merge script.
#
# Each -e generates a line break, so no \n is necessary inside the expanded vCard.
perl -e '$_ = join("", <>); if (/John [12] Doe/) {' \
-e 's/primary 8/primary 80/;' \
-e 's!END:VCARD!BDAY:2006-01-08\r' \
-e 'TEL;TYPE=HOME:new remote tel 1\r' \
-e 'tel2.TEL:new remote tel 2\r' \
-e 'tel2.X-ABLabel:new-remote-tel-label\r' \
-e 'email1.EMAIL:new remote email 1\r' \
-e 'email1.X-ABLabel:new-remote-email-label\r' \
-e 'EMAIL;TYPE=HOME:new remote email 2\r' \
-e 'date1.X-ABDATE:2014-01-01\r' \
-e 'date1.X-ABLabel:date-label-2014\r' \
-e 'url1.URL:http\\://www.example.com/foobar\r' \
-e 'url1.X-ABLabel:example-url-label\r' \
-e 'impp1.IMPP;X-SERVICE-TYPE=AIM:aim:new-aim\r' \
-e 'impp1.X-ABLabel:Other\r' \
-e 'impp2.IMPP;X-SERVICE-TYPE=Gadugadu:x-apple:new-gadugadu\r' \
-e 'impp2.X-ABLabel:Other\r' \
-e 'impp3.IMPP;X-SERVICE-TYPE=Groupwise:x-apple:new-groupwise\r' \
-e 'impp3.X-ABLabel:Other\r' \
-e 'impp4.IMPP;X-SERVICE-TYPE=ICQ:aim:new-icq\r' \
-e 'impp4.X-ABLabel:Other\r' \
-e 'impp5.IMPP;X-SERVICE-TYPE=Jabber:xmpp:new-jabber\r' \
-e 'impp5.X-ABLabel:Other\r' \
-e 'impp6.IMPP;X-SERVICE-TYPE=MSN:msnim:new-MSN\r' \
-e 'impp6.X-ABLabel:Other\r' \
-e 'impp7.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:new-yahoo\r' \
-e 'impp7.X-ABLabel:Other\r' \
-e 'impp8.IMPP;X-SERVICE-TYPE=Skype:skype:new-skype\r' \
-e 'impp8.X-ABLabel:Other\r' \
-e 'impp9.IMPP;X-SERVICE-TYPE=Sip:x-apple:new-sip\r' \
-e 'impp9.X-ABLabel:Other\r' \
-e 'impp10.IMPP;X-SERVICE-TYPE=Abc:x-apple:new-abc\r' \
-e 'impp10.X-ABLabel:Other\r' \
-e 'name1.X-ABRELATEDNAMES:new person\r' \
-e 'name1.X-ABLabel:cousin\r' \
-e 'ADR;TYPE=WORK:box;;street;town;county;12346;country\r' \
-e 'END:VCARD!;' \
-e 'print;' \
-e '}' \
<$i >$OUT/$(basename $i)
done
find $OUT -size 0 -delete

View File

@ -0,0 +1,301 @@
BEGIN:VCARD
VERSION:3.0
N:Doe;John;1;;
FN:John 1 Doe
NICKNAME:user1
TITLE:Senior Tester
ORG:Test Inc.;Testing
REV:2014-05-07T11:26:32Z
UID:33a304690a6719e0
BDAY;VALUE=DATE:2006-01-08
ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O
ld Testovia
ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234
5;Testovia
ADR;TYPE=OTHER:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;Ne
w Testonia
TEL;TYPE=WORK:business 1
TEL;TYPE=HOME:home 2
TEL;TYPE=CELL:mobile 3
TEL;TYPE=FAX,WORK:businessfax 4
TEL;TYPE=FAX,HOME:homefax 5
TEL;TYPE=PAGER:pager 6
TEL;TYPE=CAR:car 7
TEL;TYPE=PREF:primary 80
EMAIL;TYPE=WORK:john.doe@work.com
EMAIL;TYPE=HOME:john.doe@home.priv
EMAIL:john.doe@other.world
EMAIL:john.doe@yet.another.world
NOTE:This is a test case which uses almost all Evolution fields.
PHOTO;ENCODING=B:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAAAAgAAAAAAA
D//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJD
BEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQR
FB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQg
AFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgEBf/EADIQAAECBQMCAwQLAA
AAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/xAAUAQEAAAAAAAAAAAAAAAAAA
AAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AuX6UehP45/aXv9MTPTLVKxNS
vMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2VfmTR/wCaKlu6+blu/Ui72zxWtUmmUOr
TaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2umhWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHK
lJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJYV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7
N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUkGZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICw
L/sqlXp7v+aOHsnyGttq218MtKd8+Ru2JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2
qqZl0UjAMwYKScfPAJ+cIQHHP0DthVFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28d
znqo+hdksbQuS3Hs6tVtNzdM1Z/VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQL
oWkISOAkBKAABCEID//2Q==
item2.IMPP;X-SERVICE-TYPE=AIM:aim:AIM%20JOHN
item3.IMPP;X-SERVICE-TYPE=Gadugadu:x-apple:GADUGADU%20DOE
item4.IMPP;X-SERVICE-TYPE=Groupwise:x-apple:GROUPWISE%20DOE
item5.IMPP;X-SERVICE-TYPE=ICQ:aim:ICQ%20JD
item6.IMPP;X-SERVICE-TYPE=Jabber:xmpp:JABBER%20DOE
item7.IMPP;X-SERVICE-TYPE=MSN:msnim:MSN%20DOE
item8.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:YAHOO%20JDOE
item9.IMPP;X-SERVICE-TYPE=Skype:skype:SKYPE%20DOE
item10.IMPP;X-SERVICE-TYPE=Sip:x-apple:SIP%20DOE
X-EVOLUTION-FILE-AS:Doe\, John
X-EVOLUTION-BLOG-URL:web log
X-EVOLUTION-VIDEO-URL:chat
X-MOZILLA-HTML:TRUE
item1.X-ABDATE:2006-01-09
item1.X-ABLabel:Anniversary
item2.X-ABLabel:Other
item3.X-ABLabel:Other
item4.X-ABLabel:Other
item5.X-ABLabel:Other
item6.X-ABLabel:Other
item7.X-ABLabel:Other
item8.X-ABLabel:Other
item9.X-ABLabel:Other
item10.X-ABLabel:Other
item11.X-ABRELATEDNAMES:John Doe Junior
item11.X-ABLabel:Assistant
item12.X-ABRELATEDNAMES:John Doe Senior
item12.X-ABLabel:Manager
item13.X-ABRELATEDNAMES:Joan Doe
item13.X-ABLabel:Spouse
item14.URL:http\://john.doe.com
item14.X-ABLabel:Other
TEL;TYPE=HOME:new remote tel 1
tel2.TEL:new remote tel 2
tel2.X-ABLabel:new-remote-tel-label
email1.EMAIL:new remote email 1
email1.X-ABLabel:new-remote-email-label
EMAIL;TYPE=HOME:new remote email 2
date1.X-ABDATE:2014-01-01
date1.X-ABLabel:date-label-2014
url1.URL:http\://www.example.com/foobar
url1.X-ABLabel:example-url-label
impp1.IMPP;X-SERVICE-TYPE=AIM:aim:new-aim
impp1.X-ABLabel:Other
impp2.IMPP;X-SERVICE-TYPE=Gadugadu:x-apple:new-gadugadu
impp2.X-ABLabel:Other
impp3.IMPP;X-SERVICE-TYPE=Groupwise:x-apple:new-groupwise
impp3.X-ABLabel:Other
impp4.IMPP;X-SERVICE-TYPE=ICQ:aim:new-icq
impp4.X-ABLabel:Other
impp5.IMPP;X-SERVICE-TYPE=Jabber:xmpp:new-jabber
impp5.X-ABLabel:Other
impp6.IMPP;X-SERVICE-TYPE=MSN:msnim:new-MSN
impp6.X-ABLabel:Other
impp7.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:new-yahoo
impp7.X-ABLabel:Other
impp8.IMPP;X-SERVICE-TYPE=Skype:skype:new-skype
impp8.X-ABLabel:Other
impp9.IMPP;X-SERVICE-TYPE=Sip:x-apple:new-sip
impp9.X-ABLabel:Other
impp10.IMPP;X-SERVICE-TYPE=Abc:x-apple:new-abc
impp10.X-ABLabel:Other
name1.X-ABRELATEDNAMES:new person
name1.X-ABLabel:cousin
ADR;TYPE=WORK:box;;street;town;county;12346;country
END:VCARD
BEGIN:VCARD
VERSION:3.0
N:Doe;John;2;;
FN:John 2 Doe
NICKNAME:user1
TITLE:Senior Tester
ORG:Test Inc.;Testing
REV:2014-05-07T11:26:32Z
UID:33a304690a6719e0
BDAY;VALUE=DATE:2006-01-01
ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O
ld Testovia
ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234
5;Testovia
ADR;TYPE=OTHER:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;Ne
w Testonia
TEL;TYPE=WORK:business 1
TEL;TYPE=HOME:home 2
TEL;TYPE=CELL:mobile 3
TEL;TYPE=FAX,WORK:businessfax 4
TEL;TYPE=FAX,HOME:homefax 5
TEL;TYPE=PAGER:pager 6
TEL;TYPE=CAR:car 7
TEL;TYPE=PREF:primary 80
EMAIL;TYPE=WORK:john.doe@work.com
EMAIL;TYPE=HOME:john.doe@home.priv
EMAIL:john.doe@other.world
EMAIL:john.doe@yet.another.world
EMAIL:new local email
NOTE:This is a test case which uses almost all Evolution fields.
PHOTO;ENCODING=B:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAAAAgAAAAAAA
D//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJD
BEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQR
FB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQg
AFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgEBf/EADIQAAECBQMCAwQLAA
AAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/xAAUAQEAAAAAAAAAAAAAAAAAA
AAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AuX6UehP45/aXv9MTPTLVKxNS
vMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2VfmTR/wCaKlu6+blu/Ui72zxWtUmmUOr
TaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2umhWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHK
lJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJYV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7
N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUkGZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICw
L/sqlXp7v+aOHsnyGttq218MtKd8+Ru2JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2
qqZl0UjAMwYKScfPAJ+cIQHHP0DthVFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28d
znqo+hdksbQuS3Hs6tVtNzdM1Z/VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQL
oWkISOAkBKAABCEID//2Q==
item2.IMPP;X-SERVICE-TYPE=AIM:aim:AIM%20JOHN
item3.IMPP;X-SERVICE-TYPE=Gadugadu:x-apple:GADUGADU%20DOE
item4.IMPP;X-SERVICE-TYPE=Groupwise:x-apple:GROUPWISE%20DOE
item5.IMPP;X-SERVICE-TYPE=ICQ:aim:ICQ%20JD
item6.IMPP;X-SERVICE-TYPE=Jabber:xmpp:JABBER%20DOE
item7.IMPP;X-SERVICE-TYPE=MSN:msnim:MSN%20DOE
item8.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:YAHOO%20JDOE
item9.IMPP;X-SERVICE-TYPE=Skype:skype:SKYPE%20DOE
item10.IMPP;X-SERVICE-TYPE=Sip:x-apple:SIP%20DOE
X-EVOLUTION-FILE-AS:Doe\, John
X-EVOLUTION-BLOG-URL:web log
X-EVOLUTION-VIDEO-URL:chat
X-MOZILLA-HTML:TRUE
item1.X-ABDATE:2006-01-09
item1.X-ABLabel:Anniversary
item2.X-ABLabel:Other
item3.X-ABLabel:Other
item4.X-ABLabel:Other
item5.X-ABLabel:Other
item6.X-ABLabel:Other
item7.X-ABLabel:Other
item8.X-ABLabel:Other
item9.X-ABLabel:Other
item10.X-ABLabel:Other
item11.X-ABRELATEDNAMES:John Doe Junior
item11.X-ABLabel:Assistant
item12.X-ABRELATEDNAMES:John Doe Senior
item12.X-ABLabel:Manager
item13.X-ABRELATEDNAMES:Joan Doe
item13.X-ABLabel:Spouse
item14.URL:http\://john.doe.com
item14.X-ABLabel:Other
TEL;TYPE=HOME:new remote tel 1
tel2.TEL:new remote tel 2
tel2.X-ABLabel:new-remote-tel-label
email1.EMAIL:new remote email 1
email1.X-ABLabel:new-remote-email-label
EMAIL;TYPE=HOME:new remote email 2
date1.X-ABDATE:2014-01-01
date1.X-ABLabel:date-label-2014
url1.URL:http\://www.example.com/foobar
url1.X-ABLabel:example-url-label
impp1.IMPP;X-SERVICE-TYPE=AIM:aim:new-aim
impp1.X-ABLabel:Other
impp2.IMPP;X-SERVICE-TYPE=Gadugadu:x-apple:new-gadugadu
impp2.X-ABLabel:Other
impp3.IMPP;X-SERVICE-TYPE=Groupwise:x-apple:new-groupwise
impp3.X-ABLabel:Other
impp4.IMPP;X-SERVICE-TYPE=ICQ:aim:new-icq
impp4.X-ABLabel:Other
impp5.IMPP;X-SERVICE-TYPE=Jabber:xmpp:new-jabber
impp5.X-ABLabel:Other
impp6.IMPP;X-SERVICE-TYPE=MSN:msnim:new-MSN
impp6.X-ABLabel:Other
impp7.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:new-yahoo
impp7.X-ABLabel:Other
impp8.IMPP;X-SERVICE-TYPE=Skype:skype:new-skype
impp8.X-ABLabel:Other
impp9.IMPP;X-SERVICE-TYPE=Sip:x-apple:new-sip
impp9.X-ABLabel:Other
impp10.IMPP;X-SERVICE-TYPE=Abc:x-apple:new-abc
impp10.X-ABLabel:Other
name1.X-ABRELATEDNAMES:new person
name1.X-ABLabel:cousin
ADR;TYPE=WORK:box;;street;town;county;12346;country
END:VCARD
BEGIN:VCARD
VERSION:3.0
N:Doe;John;3;;
FN:John 3 Doe
NICKNAME:user1
TITLE:Senior Tester
ORG:Test Inc.;Testing
REV:2014-05-07T11:26:32Z
UID:33a304690a6719e0
ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O
ld Testovia
ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234
5;Testovia
ADR;TYPE=OTHER:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;Ne
w Testonia
TEL;TYPE=WORK:business 1
TEL;TYPE=HOME:home 2
TEL;TYPE=CELL:mobile 3
TEL;TYPE=FAX,WORK:businessfax 4
TEL;TYPE=FAX,HOME:homefax 5
TEL;TYPE=PAGER:pager 6
TEL;TYPE=CAR:car 7
TEL;TYPE=PREF:primary 80
EMAIL;TYPE=WORK:john.doe@work.com
EMAIL;TYPE=HOME:john.doe@home.priv
EMAIL:john.doe@other.world
EMAIL:john.doe@yet.another.world
EMAIL:new local email
NOTE:This is a test case which uses almost all Evolution fields.
PHOTO;ENCODING=B:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAAAAgAAAAAAA
D//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJD
BEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQR
FB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQg
AFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgEBf/EADIQAAECBQMCAwQLAA
AAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/xAAUAQEAAAAAAAAAAAAAAAAAA
AAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AuX6UehP45/aXv9MTPTLVKxNS
vMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2VfmTR/wCaKlu6+blu/Ui72zxWtUmmUOr
TaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2umhWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHK
lJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJYV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7
N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUkGZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICw
L/sqlXp7v+aOHsnyGttq218MtKd8+Ru2JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2
qqZl0UjAMwYKScfPAJ+cIQHHP0DthVFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28d
znqo+hdksbQuS3Hs6tVtNzdM1Z/VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQL
oWkISOAkBKAABCEID//2Q==
item2.IMPP;X-SERVICE-TYPE=AIM:aim:AIM%20JOHN
item3.IMPP;X-SERVICE-TYPE=Gadugadu:x-apple:GADUGADU%20DOE
item4.IMPP;X-SERVICE-TYPE=Groupwise:x-apple:GROUPWISE%20DOE
item5.IMPP;X-SERVICE-TYPE=ICQ:aim:ICQ%20JD
item6.IMPP;X-SERVICE-TYPE=Jabber:xmpp:JABBER%20DOE
item7.IMPP;X-SERVICE-TYPE=MSN:msnim:MSN%20DOE
item8.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:YAHOO%20JDOE
item9.IMPP;X-SERVICE-TYPE=Skype:skype:SKYPE%20DOE
item10.IMPP;X-SERVICE-TYPE=Sip:x-apple:SIP%20DOE
X-EVOLUTION-FILE-AS:Doe\, John
X-EVOLUTION-BLOG-URL:web log
X-EVOLUTION-VIDEO-URL:chat
X-MOZILLA-HTML:TRUE
item1.X-ABDATE:2006-01-09
item1.X-ABLabel:Anniversary
item2.X-ABLabel:Other
item3.X-ABLabel:Other
item4.X-ABLabel:Other
item5.X-ABLabel:Other
item6.X-ABLabel:Other
item7.X-ABLabel:Other
item8.X-ABLabel:Other
item9.X-ABLabel:Other
item10.X-ABLabel:Other
item11.X-ABRELATEDNAMES:John Doe Junior
item11.X-ABLabel:Assistant
item12.X-ABRELATEDNAMES:John Doe Senior
item12.X-ABLabel:Manager
item13.X-ABRELATEDNAMES:Joan Doe
item13.X-ABLabel:Spouse
item14.URL:http\://john.doe.com
item14.X-ABLabel:Other
BDAY:2006-01-01
END:VCARD

View File

@ -0,0 +1,5 @@
Because the remote side wins and replaces values for common
properties, the X-EVOLUTION-UI-SLOT gets lost when receiving a remote
update or having the remote side win an update conflict.
local-synced takes that into account.

View File

@ -0,0 +1,201 @@
BEGIN:VCARD
VERSION:3.0
URL:http://john.doe.com
TITLE:Senior Tester
ORG:Test Inc.;Testing
X-EVOLUTION-MANAGER:John Doe Senior
X-EVOLUTION-ASSISTANT:John Doe Junior
NICKNAME:user1
X-EVOLUTION-ANNIVERSARY:2006-01-09
X-EVOLUTION-SPOUSE:Joan Doe
NOTE:This is a test case which uses almost all Evolution fields.
FN:John 1 Doe
N:Doe;John;1;;
X-EVOLUTION-FILE-AS:Doe\, John
X-EVOLUTION-BLOG-URL:web log
X-EVOLUTION-VIDEO-URL:chat
X-MOZILLA-HTML:TRUE
ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O
ld Testovia
LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo
x #2\nOld Testovia
ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234
5;Testovia
LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest
Box #1\nTestovia
ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia
LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box
#3\nNew Testonia
UID:pas-id-43C0ED3900000001
EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:john.doe@work.com
EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:john.doe@home.priv
EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=3:john.doe@other.world
EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=4:john.doe@yet.another.world
TEL;TYPE=work;TYPE=Voice;X-EVOLUTION-UI-SLOT=1:business 1
TEL;TYPE=homE;TYPE=VOICE;X-EVOLUTION-UI-SLOT=2:home 2
TEL;TYPE=CELL;X-EVOLUTION-UI-SLOT=3:mobile 3
TEL;TYPE=WORK;TYPE=FAX;X-EVOLUTION-UI-SLOT=4:businessfax 4
TEL;TYPE=HOME;TYPE=FAX;X-EVOLUTION-UI-SLOT=5:homefax 5
TEL;TYPE=PAGER;X-EVOLUTION-UI-SLOT=6:pager 6
TEL;TYPE=CAR;X-EVOLUTION-UI-SLOT=7:car 7
TEL;TYPE=PREF;X-EVOLUTION-UI-SLOT=8:primary 8
X-AIM;X-EVOLUTION-UI-SLOT=1:AIM JOHN
X-YAHOO;X-EVOLUTION-UI-SLOT=2:YAHOO JDOE
X-ICQ;X-EVOLUTION-UI-SLOT=3:ICQ JD
X-GROUPWISE;X-EVOLUTION-UI-SLOT=4:GROUPWISE DOE
X-GADUGADU:GADUGADU DOE
X-JABBER:JABBER DOE
X-MSN:MSN DOE
X-SKYPE:SKYPE DOE
X-SIP:SIP DOE
PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA
AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM
CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF
BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e
Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE
Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/
xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR
AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V
fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um
hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ
YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk
GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2
JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth
VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z
/VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q==
END:VCARD
BEGIN:VCARD
VERSION:3.0
URL:http://john.doe.com
TITLE:Senior Tester
ORG:Test Inc.;Testing
X-EVOLUTION-MANAGER:John Doe Senior
X-EVOLUTION-ASSISTANT:John Doe Junior
NICKNAME:user1
X-EVOLUTION-ANNIVERSARY:2006-01-09
X-EVOLUTION-SPOUSE:Joan Doe
NOTE:This is a test case which uses almost all Evolution fields.
FN:John 2 Doe
N:Doe;John;2;;
X-EVOLUTION-FILE-AS:Doe\, John
X-EVOLUTION-BLOG-URL:web log
X-EVOLUTION-VIDEO-URL:chat
X-MOZILLA-HTML:TRUE
ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O
ld Testovia
LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo
x #2\nOld Testovia
ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234
5;Testovia
LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest
Box #1\nTestovia
ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia
LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box
#3\nNew Testonia
UID:pas-id-43C0ED3900000002
EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:john.doe@work.com
EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:john.doe@home.priv
EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=3:john.doe@other.world
EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=4:john.doe@yet.another.world
TEL;TYPE=work;TYPE=Voice;X-EVOLUTION-UI-SLOT=1:business 1
TEL;TYPE=homE;TYPE=VOICE;X-EVOLUTION-UI-SLOT=2:home 2
TEL;TYPE=CELL;X-EVOLUTION-UI-SLOT=3:mobile 3
TEL;TYPE=WORK;TYPE=FAX;X-EVOLUTION-UI-SLOT=4:businessfax 4
TEL;TYPE=HOME;TYPE=FAX;X-EVOLUTION-UI-SLOT=5:homefax 5
TEL;TYPE=PAGER;X-EVOLUTION-UI-SLOT=6:pager 6
TEL;TYPE=CAR;X-EVOLUTION-UI-SLOT=7:car 7
TEL;TYPE=PREF;X-EVOLUTION-UI-SLOT=8:primary 8
X-AIM;X-EVOLUTION-UI-SLOT=1:AIM JOHN
X-YAHOO;X-EVOLUTION-UI-SLOT=2:YAHOO JDOE
X-ICQ;X-EVOLUTION-UI-SLOT=3:ICQ JD
X-GROUPWISE;X-EVOLUTION-UI-SLOT=4:GROUPWISE DOE
X-GADUGADU:GADUGADU DOE
X-JABBER:JABBER DOE
X-MSN:MSN DOE
X-SKYPE:SKYPE DOE
X-SIP:SIP DOE
PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA
AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM
CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF
BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e
Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE
Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/
xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR
AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V
fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um
hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ
YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk
GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2
JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth
VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z
/VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q==
END:VCARD
BEGIN:VCARD
VERSION:3.0
URL:http://john.doe.com
TITLE:Senior Tester
ORG:Test Inc.;Testing
X-EVOLUTION-MANAGER:John Doe Senior
X-EVOLUTION-ASSISTANT:John Doe Junior
NICKNAME:user1
X-EVOLUTION-ANNIVERSARY:2006-01-09
X-EVOLUTION-SPOUSE:Joan Doe
NOTE:This is a test case which uses almost all Evolution fields.
FN:John 3 Doe
N:Doe;John;3;;
X-EVOLUTION-FILE-AS:Doe\, John
X-EVOLUTION-BLOG-URL:web log
X-EVOLUTION-VIDEO-URL:chat
X-MOZILLA-HTML:TRUE
ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O
ld Testovia
LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo
x #2\nOld Testovia
ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234
5;Testovia
LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest
Box #1\nTestovia
ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia
LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box
#3\nNew Testonia
UID:pas-id-43C0ED3900000003
EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:john.doe@work.com
EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:john.doe@home.priv
EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=3:john.doe@other.world
EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=4:john.doe@yet.another.world
TEL;TYPE=work;TYPE=Voice;X-EVOLUTION-UI-SLOT=1:business 1
TEL;TYPE=homE;TYPE=VOICE;X-EVOLUTION-UI-SLOT=2:home 2
TEL;TYPE=CELL;X-EVOLUTION-UI-SLOT=3:mobile 3
TEL;TYPE=WORK;TYPE=FAX;X-EVOLUTION-UI-SLOT=4:businessfax 4
TEL;TYPE=HOME;TYPE=FAX;X-EVOLUTION-UI-SLOT=5:homefax 5
TEL;TYPE=PAGER;X-EVOLUTION-UI-SLOT=6:pager 6
TEL;TYPE=CAR;X-EVOLUTION-UI-SLOT=7:car 7
TEL;TYPE=PREF;X-EVOLUTION-UI-SLOT=8:primary 8
X-AIM;X-EVOLUTION-UI-SLOT=1:AIM JOHN
X-YAHOO;X-EVOLUTION-UI-SLOT=2:YAHOO JDOE
X-ICQ;X-EVOLUTION-UI-SLOT=3:ICQ JD
X-GROUPWISE;X-EVOLUTION-UI-SLOT=4:GROUPWISE DOE
X-GADUGADU:GADUGADU DOE
X-JABBER:JABBER DOE
X-MSN:MSN DOE
X-SKYPE:SKYPE DOE
X-SIP:SIP DOE
PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA
AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM
CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF
BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e
Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE
Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/
xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR
AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V
fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um
hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ
YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk
GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2
JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth
VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z
/VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q==
END:VCARD

View File

@ -0,0 +1,242 @@
BEGIN:VCARD
VERSION:3.0
URL:http://john.doe.com
TITLE:Senior Tester
ORG:Test Inc.;Testing
X-EVOLUTION-MANAGER:John Doe Senior
X-EVOLUTION-ASSISTANT:John Doe Junior
NICKNAME:user1
BDAY:2006-01-08
X-EVOLUTION-ANNIVERSARY:2006-01-09
X-EVOLUTION-SPOUSE:Joan Doe
NOTE:This is a test case which uses almost all Evolution fields.
FN:John 1 Doe
N:Doe;John;1;;
X-EVOLUTION-FILE-AS:Doe\, John
X-EVOLUTION-BLOG-URL:web log
X-EVOLUTION-VIDEO-URL:chat
X-MOZILLA-HTML:TRUE
ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O
ld Testovia
LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo
x #2\nOld Testovia
ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234
5;Testovia
LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest
Box #1\nTestovia
ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia
LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box
#3\nNew Testonia
UID:pas-id-43C0ED3900000001
EMAIL;TYPE=WORK:john.doe@work.com
EMAIL;TYPE=HOME:john.doe@home.priv
EMAIL;TYPE=OTHER:john.doe@other.world
EMAIL;TYPE=OTHER:john.doe@yet.another.world
TEL;TYPE=work;TYPE=Voice:business 1
TEL;TYPE=homE;TYPE=VOICE:home 2
TEL;TYPE=CELL:mobile 3
TEL;TYPE=WORK;TYPE=FAX:businessfax 4
TEL;TYPE=HOME;TYPE=FAX:homefax 5
TEL;TYPE=PAGER:pager 6
TEL;TYPE=CAR:car 7
TEL;TYPE=PREF:primary 80
X-AIM:AIM JOHN
X-YAHOO:YAHOO JDOE
X-ICQ:ICQ JD
X-GROUPWISE:GROUPWISE DOE
X-GADUGADU:GADUGADU DOE
X-JABBER:JABBER DOE
X-MSN:MSN DOE
X-SKYPE:SKYPE DOE
X-SIP:SIP DOE
PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA
AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM
CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF
BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e
Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE
Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/
xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR
AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V
fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um
hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ
YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk
GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2
JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth
VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z
/VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q==
TEL;TYPE=HOME:new remote tel 1
TEL;X-ABLabel=new-remote-tel-label:new remote tel 2
EMAIL;X-ABLabel=new-remote-email-label:new remote email 1
EMAIL;TYPE=HOME:new remote email 2
X-ABDATE;X-ABLabel=date-label-2014:2014-01-01
URL;X-ABLabel=example-url-label:http://www.example.com/foobar
X-AIM:new-aim
X-GADUGADU:new-gadugadu
X-GROUPWISE:new-groupwise
X-ICQ:new-icq
X-JABBER:new-jabber
X-MSN:new-MSN
X-YAHOO:new-yahoo
X-SKYPE:new-skype
X-SIP:new-sip
IMPP;X-SERVICE-TYPE=Abc:x-apple:new-abc
X-ABRELATEDNAMES;X-ABLabel=cousin:new person
ADR;TYPE=WORK:box;;street;town;county;12346;country
END:VCARD
BEGIN:VCARD
VERSION:3.0
URL:http://john.doe.com
TITLE:Senior Tester
ORG:Test Inc.;Testing
X-EVOLUTION-MANAGER:John Doe Senior
X-EVOLUTION-ASSISTANT:John Doe Junior
NICKNAME:user1
BDAY:2006-01-08
X-EVOLUTION-ANNIVERSARY:2006-01-09
X-EVOLUTION-SPOUSE:Joan Doe
NOTE:This is a test case which uses almost all Evolution fields.
FN:John 2 Doe
N:Doe;John;2;;
X-EVOLUTION-FILE-AS:Doe\, John
X-EVOLUTION-BLOG-URL:web log
X-EVOLUTION-VIDEO-URL:chat
X-MOZILLA-HTML:TRUE
ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O
ld Testovia
LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo
x #2\nOld Testovia
ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234
5;Testovia
LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest
Box #1\nTestovia
ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia
LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box
#3\nNew Testonia
UID:pas-id-43C0ED3900000002
EMAIL;TYPE=WORK:john.doe@work.com
EMAIL;TYPE=HOME:john.doe@home.priv
EMAIL;TYPE=OTHER:john.doe@other.world
EMAIL;TYPE=OTHER:john.doe@yet.another.world
EMAIL:new local email
TEL;TYPE=work;TYPE=Voice:business 1
TEL;TYPE=homE;TYPE=VOICE:home 2
TEL;TYPE=CELL:mobile 3
TEL;TYPE=WORK;TYPE=FAX:businessfax 4
TEL;TYPE=HOME;TYPE=FAX:homefax 5
TEL;TYPE=PAGER:pager 6
TEL;TYPE=CAR:car 7
TEL;TYPE=PREF:primary 80
X-AIM:AIM JOHN
X-YAHOO:YAHOO JDOE
X-ICQ:ICQ JD
X-GROUPWISE:GROUPWISE DOE
X-GADUGADU:GADUGADU DOE
X-JABBER:JABBER DOE
X-MSN:MSN DOE
X-SKYPE:SKYPE DOE
X-SIP:SIP DOE
PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA
AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM
CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF
BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e
Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE
Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/
xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR
AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V
fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um
hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ
YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk
GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2
JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth
VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z
/VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q==
TEL;TYPE=HOME:new remote tel 1
TEL;X-ABLabel=new-remote-tel-label:new remote tel 2
EMAIL;X-ABLabel=new-remote-email-label:new remote email 1
EMAIL;TYPE=HOME:new remote email 2
X-ABDATE;X-ABLabel=date-label-2014:2014-01-01
URL;X-ABLabel=example-url-label:http://www.example.com/foobar
X-AIM:new-aim
X-GADUGADU:new-gadugadu
X-GROUPWISE:new-groupwise
X-ICQ:new-icq
X-JABBER:new-jabber
X-MSN:new-MSN
X-YAHOO:new-yahoo
X-SKYPE:new-skype
X-SIP:new-sip
IMPP;X-SERVICE-TYPE=Abc:x-apple:new-abc
X-ABRELATEDNAMES;X-ABLabel=cousin:new person
ADR;TYPE=WORK:box;;street;town;county;12346;country
END:VCARD
BEGIN:VCARD
VERSION:3.0
URL:http://john.doe.com
TITLE:Senior Tester
ORG:Test Inc.;Testing
X-EVOLUTION-MANAGER:John Doe Senior
X-EVOLUTION-ASSISTANT:John Doe Junior
NICKNAME:user1
X-EVOLUTION-ANNIVERSARY:2006-01-09
X-EVOLUTION-SPOUSE:Joan Doe
NOTE:This is a test case which uses almost all Evolution fields.
FN:John 3 Doe
N:Doe;John;3;;
X-EVOLUTION-FILE-AS:Doe\, John
X-EVOLUTION-BLOG-URL:web log
X-EVOLUTION-VIDEO-URL:chat
X-MOZILLA-HTML:TRUE
ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O
ld Testovia
LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo
x #2\nOld Testovia
ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234
5;Testovia
LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest
Box #1\nTestovia
ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia
LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box
#3\nNew Testonia
UID:pas-id-43C0ED3900000003
EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:john.doe@work.com
EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:john.doe@home.priv
EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=3:john.doe@other.world
EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=4:john.doe@yet.another.world
EMAIL:new local email
TEL;TYPE=work;TYPE=Voice;X-EVOLUTION-UI-SLOT=1:business 1
TEL;TYPE=homE;TYPE=VOICE;X-EVOLUTION-UI-SLOT=2:home 2
TEL;TYPE=CELL;X-EVOLUTION-UI-SLOT=3:mobile 3
TEL;TYPE=WORK;TYPE=FAX;X-EVOLUTION-UI-SLOT=4:businessfax 4
TEL;TYPE=HOME;TYPE=FAX;X-EVOLUTION-UI-SLOT=5:homefax 5
TEL;TYPE=PAGER;X-EVOLUTION-UI-SLOT=6:pager 6
TEL;TYPE=CAR;X-EVOLUTION-UI-SLOT=7:car 7
TEL;TYPE=PREF;X-EVOLUTION-UI-SLOT=8:primary 80
X-AIM;X-EVOLUTION-UI-SLOT=1:AIM JOHN
X-YAHOO;X-EVOLUTION-UI-SLOT=2:YAHOO JDOE
X-ICQ;X-EVOLUTION-UI-SLOT=3:ICQ JD
X-GROUPWISE;X-EVOLUTION-UI-SLOT=4:GROUPWISE DOE
X-GADUGADU:GADUGADU DOE
X-JABBER:JABBER DOE
X-MSN:MSN DOE
X-SKYPE:SKYPE DOE
X-SIP:SIP DOE
PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA
AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM
CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF
BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e
Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE
Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/
xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR
AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V
fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um
hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ
YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk
GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2
JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth
VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z
/VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q==
BDAY:2006-01-01
END:VCARD

View File

@ -0,0 +1,24 @@
#! /bin/sh
set -ex
IN=$1
OUT=$2
rm -rf $OUT
mkdir $OUT
[ -d $IN ] || (echo >&2 "$IN not a directory"; false)
for i in $IN/*; do
# Modify second and third contact by changing a field.
# The second contact will also get modified locally.
# Add a different BDAY than the peer.
perl -e '$_ = join("", <>); if (/John [23] Doe/) {' \
-e 's/primary 8/primary 80/;' \
-e 's/END:VCARD/BDAY:2006-01-01\r\nEMAIL:new local email\r\nEND:VCARD/;' \
-e 'print;' \
-e '}' \
<$i >$OUT/$(basename $i)
done
find $OUT -size 0 -delete

View File

@ -0,0 +1,64 @@
#! /bin/sh
set -ex
IN=$1
OUT=$2
rm -rf $OUT
mkdir $OUT
[ -d $IN ] || (echo >&2 "$IN not a directory"; false)
# TODO: X-SERVICE-TYPE, one for each kind, etc.
for i in $IN/*; do
# Modify first and second contact by changing a field.
# The second contact will also get modified locally.
# We add a new BDAY property here, too, that will be added to
# the local side during the merge by the engine, and
# new array entries, that need special handling by the merge script.
#
# Each -e generates a line break, so no \n is necessary inside the expanded vCard.
perl -e '$_ = join("", <>); if (/John [12] Doe/) {' \
-e 's/primary 8/primary 80/;' \
-e 's!END:VCARD!BDAY:2006-01-08\r' \
-e 'TEL;TYPE=HOME:new remote tel 1\r' \
-e 'tel2.TEL:new remote tel 2\r' \
-e 'tel2.X-ABLabel:new-remote-tel-label\r' \
-e 'email1.EMAIL:new remote email 1\r' \
-e 'email1.X-ABLabel:new-remote-email-label\r' \
-e 'EMAIL;TYPE=HOME:new remote email 2\r' \
-e 'date1.X-ABDATE:2014-01-01\r' \
-e 'date1.X-ABLabel:date-label-2014\r' \
-e 'url1.URL:http\\://www.example.com/foobar\r' \
-e 'url1.X-ABLabel:example-url-label\r' \
-e 'impp1.IMPP;X-SERVICE-TYPE=AIM:aim:new-aim\r' \
-e 'impp1.X-ABLabel:Other\r' \
-e 'impp2.IMPP;X-SERVICE-TYPE=Gadugadu:x-apple:new-gadugadu\r' \
-e 'impp2.X-ABLabel:Other\r' \
-e 'impp3.IMPP;X-SERVICE-TYPE=Groupwise:x-apple:new-groupwise\r' \
-e 'impp3.X-ABLabel:Other\r' \
-e 'impp4.IMPP;X-SERVICE-TYPE=ICQ:aim:new-icq\r' \
-e 'impp4.X-ABLabel:Other\r' \
-e 'impp5.IMPP;X-SERVICE-TYPE=Jabber:xmpp:new-jabber\r' \
-e 'impp5.X-ABLabel:Other\r' \
-e 'impp6.IMPP;X-SERVICE-TYPE=MSN:msnim:new-MSN\r' \
-e 'impp6.X-ABLabel:Other\r' \
-e 'impp7.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:new-yahoo\r' \
-e 'impp7.X-ABLabel:Other\r' \
-e 'impp8.IMPP;X-SERVICE-TYPE=Skype:skype:new-skype\r' \
-e 'impp8.X-ABLabel:Other\r' \
-e 'impp9.IMPP;X-SERVICE-TYPE=Sip:x-apple:new-sip\r' \
-e 'impp9.X-ABLabel:Other\r' \
-e 'impp10.IMPP;X-SERVICE-TYPE=Abc:x-apple:new-abc\r' \
-e 'impp10.X-ABLabel:Other\r' \
-e 'name1.X-ABRELATEDNAMES:new person\r' \
-e 'name1.X-ABLabel:cousin\r' \
-e 'ADR;TYPE=WORK:box;;street;town;county;12346;country\r' \
-e 'END:VCARD!;' \
-e 'print;' \
-e '}' \
<$i >$OUT/$(basename $i)
done
find $OUT -size 0 -delete

View File

@ -0,0 +1,301 @@
BEGIN:VCARD
VERSION:3.0
N:Doe;John;1;;
FN:John 1 Doe
NICKNAME:user1
TITLE:Senior Tester
ORG:Test Inc.;Testing
REV:2014-05-07T11:26:32Z
UID:33a304690a6719e0
BDAY;VALUE=DATE:2006-01-08
ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O
ld Testovia
ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234
5;Testovia
ADR;TYPE=OTHER:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;Ne
w Testonia
TEL;TYPE=WORK:business 1
TEL;TYPE=HOME:home 2
TEL;TYPE=CELL:mobile 3
TEL;TYPE=FAX,WORK:businessfax 4
TEL;TYPE=FAX,HOME:homefax 5
TEL;TYPE=PAGER:pager 6
TEL;TYPE=CAR:car 7
TEL;TYPE=PREF:primary 80
EMAIL;TYPE=WORK:john.doe@work.com
EMAIL;TYPE=HOME:john.doe@home.priv
EMAIL:john.doe@other.world
EMAIL:john.doe@yet.another.world
NOTE:This is a test case which uses almost all Evolution fields.
PHOTO;ENCODING=B:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAAAAgAAAAAAA
D//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJD
BEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQR
FB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQg
AFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgEBf/EADIQAAECBQMCAwQLAA
AAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/xAAUAQEAAAAAAAAAAAAAAAAAA
AAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AuX6UehP45/aXv9MTPTLVKxNS
vMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2VfmTR/wCaKlu6+blu/Ui72zxWtUmmUOr
TaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2umhWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHK
lJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJYV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7
N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUkGZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICw
L/sqlXp7v+aOHsnyGttq218MtKd8+Ru2JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2
qqZl0UjAMwYKScfPAJ+cIQHHP0DthVFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28d
znqo+hdksbQuS3Hs6tVtNzdM1Z/VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQL
oWkISOAkBKAABCEID//2Q==
item2.IMPP;X-SERVICE-TYPE=AIM:aim:AIM%20JOHN
item3.IMPP;X-SERVICE-TYPE=Gadugadu:x-apple:GADUGADU%20DOE
item4.IMPP;X-SERVICE-TYPE=Groupwise:x-apple:GROUPWISE%20DOE
item5.IMPP;X-SERVICE-TYPE=ICQ:aim:ICQ%20JD
item6.IMPP;X-SERVICE-TYPE=Jabber:xmpp:JABBER%20DOE
item7.IMPP;X-SERVICE-TYPE=MSN:msnim:MSN%20DOE
item8.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:YAHOO%20JDOE
item9.IMPP;X-SERVICE-TYPE=Skype:skype:SKYPE%20DOE
item10.IMPP;X-SERVICE-TYPE=Sip:x-apple:SIP%20DOE
X-EVOLUTION-FILE-AS:Doe\, John
X-EVOLUTION-BLOG-URL:web log
X-EVOLUTION-VIDEO-URL:chat
X-MOZILLA-HTML:TRUE
item1.X-ABDATE:2006-01-09
item1.X-ABLabel:Anniversary
item2.X-ABLabel:Other
item3.X-ABLabel:Other
item4.X-ABLabel:Other
item5.X-ABLabel:Other
item6.X-ABLabel:Other
item7.X-ABLabel:Other
item8.X-ABLabel:Other
item9.X-ABLabel:Other
item10.X-ABLabel:Other
item11.X-ABRELATEDNAMES:John Doe Junior
item11.X-ABLabel:Assistant
item12.X-ABRELATEDNAMES:John Doe Senior
item12.X-ABLabel:Manager
item13.X-ABRELATEDNAMES:Joan Doe
item13.X-ABLabel:Spouse
item14.URL:http\://john.doe.com
item14.X-ABLabel:Other
TEL;TYPE=HOME:new remote tel 1
tel2.TEL:new remote tel 2
tel2.X-ABLabel:new-remote-tel-label
email1.EMAIL:new remote email 1
email1.X-ABLabel:new-remote-email-label
EMAIL;TYPE=HOME:new remote email 2
date1.X-ABDATE:2014-01-01
date1.X-ABLabel:date-label-2014
url1.URL:http\://www.example.com/foobar
url1.X-ABLabel:example-url-label
impp1.IMPP;X-SERVICE-TYPE=AIM:aim:new-aim
impp1.X-ABLabel:Other
impp2.IMPP;X-SERVICE-TYPE=Gadugadu:x-apple:new-gadugadu
impp2.X-ABLabel:Other
impp3.IMPP;X-SERVICE-TYPE=Groupwise:x-apple:new-groupwise
impp3.X-ABLabel:Other
impp4.IMPP;X-SERVICE-TYPE=ICQ:aim:new-icq
impp4.X-ABLabel:Other
impp5.IMPP;X-SERVICE-TYPE=Jabber:xmpp:new-jabber
impp5.X-ABLabel:Other
impp6.IMPP;X-SERVICE-TYPE=MSN:msnim:new-MSN
impp6.X-ABLabel:Other
impp7.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:new-yahoo
impp7.X-ABLabel:Other
impp8.IMPP;X-SERVICE-TYPE=Skype:skype:new-skype
impp8.X-ABLabel:Other
impp9.IMPP;X-SERVICE-TYPE=Sip:x-apple:new-sip
impp9.X-ABLabel:Other
impp10.IMPP;X-SERVICE-TYPE=Abc:x-apple:new-abc
impp10.X-ABLabel:Other
name1.X-ABRELATEDNAMES:new person
name1.X-ABLabel:cousin
ADR;TYPE=WORK:box;;street;town;county;12346;country
END:VCARD
BEGIN:VCARD
VERSION:3.0
N:Doe;John;2;;
FN:John 2 Doe
NICKNAME:user1
TITLE:Senior Tester
ORG:Test Inc.;Testing
REV:2014-05-07T11:26:32Z
UID:33a304690a6719e0
BDAY;VALUE=DATE:2006-01-08
ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O
ld Testovia
ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234
5;Testovia
ADR;TYPE=OTHER:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;Ne
w Testonia
TEL;TYPE=WORK:business 1
TEL;TYPE=HOME:home 2
TEL;TYPE=CELL:mobile 3
TEL;TYPE=FAX,WORK:businessfax 4
TEL;TYPE=FAX,HOME:homefax 5
TEL;TYPE=PAGER:pager 6
TEL;TYPE=CAR:car 7
TEL;TYPE=PREF:primary 80
EMAIL;TYPE=WORK:john.doe@work.com
EMAIL;TYPE=HOME:john.doe@home.priv
EMAIL:john.doe@other.world
EMAIL:john.doe@yet.another.world
EMAIL:new local email
NOTE:This is a test case which uses almost all Evolution fields.
PHOTO;ENCODING=B:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAAAAgAAAAAAA
D//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJD
BEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQR
FB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQg
AFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgEBf/EADIQAAECBQMCAwQLAA
AAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/xAAUAQEAAAAAAAAAAAAAAAAAA
AAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AuX6UehP45/aXv9MTPTLVKxNS
vMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2VfmTR/wCaKlu6+blu/Ui72zxWtUmmUOr
TaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2umhWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHK
lJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJYV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7
N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUkGZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICw
L/sqlXp7v+aOHsnyGttq218MtKd8+Ru2JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2
qqZl0UjAMwYKScfPAJ+cIQHHP0DthVFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28d
znqo+hdksbQuS3Hs6tVtNzdM1Z/VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQL
oWkISOAkBKAABCEID//2Q==
item2.IMPP;X-SERVICE-TYPE=AIM:aim:AIM%20JOHN
item3.IMPP;X-SERVICE-TYPE=Gadugadu:x-apple:GADUGADU%20DOE
item4.IMPP;X-SERVICE-TYPE=Groupwise:x-apple:GROUPWISE%20DOE
item5.IMPP;X-SERVICE-TYPE=ICQ:aim:ICQ%20JD
item6.IMPP;X-SERVICE-TYPE=Jabber:xmpp:JABBER%20DOE
item7.IMPP;X-SERVICE-TYPE=MSN:msnim:MSN%20DOE
item8.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:YAHOO%20JDOE
item9.IMPP;X-SERVICE-TYPE=Skype:skype:SKYPE%20DOE
item10.IMPP;X-SERVICE-TYPE=Sip:x-apple:SIP%20DOE
X-EVOLUTION-FILE-AS:Doe\, John
X-EVOLUTION-BLOG-URL:web log
X-EVOLUTION-VIDEO-URL:chat
X-MOZILLA-HTML:TRUE
item1.X-ABDATE:2006-01-09
item1.X-ABLabel:Anniversary
item2.X-ABLabel:Other
item3.X-ABLabel:Other
item4.X-ABLabel:Other
item5.X-ABLabel:Other
item6.X-ABLabel:Other
item7.X-ABLabel:Other
item8.X-ABLabel:Other
item9.X-ABLabel:Other
item10.X-ABLabel:Other
item11.X-ABRELATEDNAMES:John Doe Junior
item11.X-ABLabel:Assistant
item12.X-ABRELATEDNAMES:John Doe Senior
item12.X-ABLabel:Manager
item13.X-ABRELATEDNAMES:Joan Doe
item13.X-ABLabel:Spouse
item14.URL:http\://john.doe.com
item14.X-ABLabel:Other
TEL;TYPE=HOME:new remote tel 1
tel2.TEL:new remote tel 2
tel2.X-ABLabel:new-remote-tel-label
email1.EMAIL:new remote email 1
email1.X-ABLabel:new-remote-email-label
EMAIL;TYPE=HOME:new remote email 2
date1.X-ABDATE:2014-01-01
date1.X-ABLabel:date-label-2014
url1.URL:http\://www.example.com/foobar
url1.X-ABLabel:example-url-label
impp1.IMPP;X-SERVICE-TYPE=AIM:aim:new-aim
impp1.X-ABLabel:Other
impp2.IMPP;X-SERVICE-TYPE=Gadugadu:x-apple:new-gadugadu
impp2.X-ABLabel:Other
impp3.IMPP;X-SERVICE-TYPE=Groupwise:x-apple:new-groupwise
impp3.X-ABLabel:Other
impp4.IMPP;X-SERVICE-TYPE=ICQ:aim:new-icq
impp4.X-ABLabel:Other
impp5.IMPP;X-SERVICE-TYPE=Jabber:xmpp:new-jabber
impp5.X-ABLabel:Other
impp6.IMPP;X-SERVICE-TYPE=MSN:msnim:new-MSN
impp6.X-ABLabel:Other
impp7.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:new-yahoo
impp7.X-ABLabel:Other
impp8.IMPP;X-SERVICE-TYPE=Skype:skype:new-skype
impp8.X-ABLabel:Other
impp9.IMPP;X-SERVICE-TYPE=Sip:x-apple:new-sip
impp9.X-ABLabel:Other
impp10.IMPP;X-SERVICE-TYPE=Abc:x-apple:new-abc
impp10.X-ABLabel:Other
name1.X-ABRELATEDNAMES:new person
name1.X-ABLabel:cousin
ADR;TYPE=WORK:box;;street;town;county;12346;country
END:VCARD
BEGIN:VCARD
VERSION:3.0
N:Doe;John;3;;
FN:John 3 Doe
NICKNAME:user1
TITLE:Senior Tester
ORG:Test Inc.;Testing
REV:2014-05-07T11:26:32Z
UID:33a304690a6719e0
ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O
ld Testovia
ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234
5;Testovia
ADR;TYPE=OTHER:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;Ne
w Testonia
TEL;TYPE=WORK:business 1
TEL;TYPE=HOME:home 2
TEL;TYPE=CELL:mobile 3
TEL;TYPE=FAX,WORK:businessfax 4
TEL;TYPE=FAX,HOME:homefax 5
TEL;TYPE=PAGER:pager 6
TEL;TYPE=CAR:car 7
TEL;TYPE=PREF:primary 80
EMAIL;TYPE=WORK:john.doe@work.com
EMAIL;TYPE=HOME:john.doe@home.priv
EMAIL:john.doe@other.world
EMAIL:john.doe@yet.another.world
EMAIL:new local email
NOTE:This is a test case which uses almost all Evolution fields.
PHOTO;ENCODING=B:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAAAAgAAAAAAA
D//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJD
BEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQR
FB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQg
AFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgEBf/EADIQAAECBQMCAwQLAA
AAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/xAAUAQEAAAAAAAAAAAAAAAAAA
AAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AuX6UehP45/aXv9MTPTLVKxNS
vMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2VfmTR/wCaKlu6+blu/Ui72zxWtUmmUOr
TaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2umhWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHK
lJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJYV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7
N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUkGZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICw
L/sqlXp7v+aOHsnyGttq218MtKd8+Ru2JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2
qqZl0UjAMwYKScfPAJ+cIQHHP0DthVFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28d
znqo+hdksbQuS3Hs6tVtNzdM1Z/VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQL
oWkISOAkBKAABCEID//2Q==
item2.IMPP;X-SERVICE-TYPE=AIM:aim:AIM%20JOHN
item3.IMPP;X-SERVICE-TYPE=Gadugadu:x-apple:GADUGADU%20DOE
item4.IMPP;X-SERVICE-TYPE=Groupwise:x-apple:GROUPWISE%20DOE
item5.IMPP;X-SERVICE-TYPE=ICQ:aim:ICQ%20JD
item6.IMPP;X-SERVICE-TYPE=Jabber:xmpp:JABBER%20DOE
item7.IMPP;X-SERVICE-TYPE=MSN:msnim:MSN%20DOE
item8.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:YAHOO%20JDOE
item9.IMPP;X-SERVICE-TYPE=Skype:skype:SKYPE%20DOE
item10.IMPP;X-SERVICE-TYPE=Sip:x-apple:SIP%20DOE
X-EVOLUTION-FILE-AS:Doe\, John
X-EVOLUTION-BLOG-URL:web log
X-EVOLUTION-VIDEO-URL:chat
X-MOZILLA-HTML:TRUE
item1.X-ABDATE:2006-01-09
item1.X-ABLabel:Anniversary
item2.X-ABLabel:Other
item3.X-ABLabel:Other
item4.X-ABLabel:Other
item5.X-ABLabel:Other
item6.X-ABLabel:Other
item7.X-ABLabel:Other
item8.X-ABLabel:Other
item9.X-ABLabel:Other
item10.X-ABLabel:Other
item11.X-ABRELATEDNAMES:John Doe Junior
item11.X-ABLabel:Assistant
item12.X-ABRELATEDNAMES:John Doe Senior
item12.X-ABLabel:Manager
item13.X-ABRELATEDNAMES:Joan Doe
item13.X-ABLabel:Spouse
item14.URL:http\://john.doe.com
item14.X-ABLabel:Other
BDAY:2006-01-01
END:VCARD

View File

@ -0,0 +1,6 @@
The test data was adapted to cope with some bugs/limitations:
- ROLE, CALURL, FBURL, CATEGORIES, GEO are not stored by Google
and get lost.
- ORG department and unit get merged.

View File

@ -0,0 +1,72 @@
BEGIN:VCARD
VERSION:3.0
URL:http://john.doe.com
TITLE:Senior Tester
ORG:Test Inc.;Testing;test#1
ROLE:professional test case
X-EVOLUTION-MANAGER:John Doe Senior
X-EVOLUTION-ASSISTANT:John Doe Junior
NICKNAME:user1
BDAY:2006-01-08
X-EVOLUTION-ANNIVERSARY:2006-01-09
X-EVOLUTION-SPOUSE:Joan Doe
NOTE:This is a test case which uses almost all Evolution fields.
FN:John Doe
N:Doe;John;;;
X-EVOLUTION-FILE-AS:Doe\, John
CATEGORIES:TEST
X-EVOLUTION-BLOG-URL:web log
GEO:30.12;-130.34
CALURI:calender
FBURL:free/busy
X-EVOLUTION-VIDEO-URL:chat
X-MOZILLA-HTML:TRUE
ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O
ld Testovia
LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo
x #2\nOld Testovia
ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234
5;Testovia
LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest
Box #1\nTestovia
ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia
LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box
#3\nNew Testonia
UID:pas-id-43C0ED3900000001
EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:john.doe@work.com
EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:john.doe@home.priv
EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=3:john.doe@other.world
EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=4:john.doe@yet.another.world
TEL;TYPE=work;TYPE=Voice;X-EVOLUTION-UI-SLOT=1:business 1
TEL;TYPE=homE;TYPE=VOICE;X-EVOLUTION-UI-SLOT=2:home 2
TEL;TYPE=CELL;X-EVOLUTION-UI-SLOT=3:mobile 3
TEL;TYPE=WORK;TYPE=FAX;X-EVOLUTION-UI-SLOT=4:businessfax 4
TEL;TYPE=HOME;TYPE=FAX;X-EVOLUTION-UI-SLOT=5:homefax 5
TEL;TYPE=PAGER;X-EVOLUTION-UI-SLOT=6:pager 6
TEL;TYPE=CAR;X-EVOLUTION-UI-SLOT=7:car 7
TEL;TYPE=PREF;X-EVOLUTION-UI-SLOT=8:primary 8
X-AIM;X-EVOLUTION-UI-SLOT=1:AIM JOHN
X-YAHOO;X-EVOLUTION-UI-SLOT=2:YAHOO JDOE
X-ICQ;X-EVOLUTION-UI-SLOT=3:ICQ JD
X-GROUPWISE;X-EVOLUTION-UI-SLOT=4:GROUPWISE DOE
X-GADUGADU:GADUGADU DOE
X-JABBER:JABBER DOE
X-MSN:MSN DOE
X-SKYPE:SKYPE DOE
X-SIP:SIP DOE
PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA
AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM
CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF
BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e
Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE
Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/
xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR
AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V
fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um
hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ
YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk
GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2
JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth
VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z
/VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q==
END:VCARD

View File

@ -0,0 +1,68 @@
BEGIN:VCARD
VERSION:3.0
URL:http://john.doe.com
TITLE:Senior Tester
ORG:Test Inc.;Testing\, test#1
X-EVOLUTION-MANAGER:John Doe Senior
X-EVOLUTION-ASSISTANT:John Doe Junior
NICKNAME:user1
BDAY:2006-01-08
X-EVOLUTION-ANNIVERSARY:2006-01-09
X-EVOLUTION-SPOUSE:Joan Doe
NOTE:This is a test case which uses almost all Evolution fields.
FN:John Doe
N:Doe;John;;;
X-EVOLUTION-FILE-AS:Doe\, John
X-EVOLUTION-BLOG-URL:web log
X-EVOLUTION-VIDEO-URL:chat
X-MOZILLA-HTML:TRUE
ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O
ld Testovia
LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo
x #2\nOld Testovia
ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234
5;Testovia
LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest
Box #1\nTestovia
ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia
LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box
#3\nNew Testonia
UID:pas-id-43C0ED3900000001
EMAIL;TYPE=WORK:john.doe@work.com
EMAIL;TYPE=HOME:john.doe@home.priv
EMAIL;TYPE=OTHER:john.doe@other.world
EMAIL;TYPE=OTHER:john.doe@yet.another.world
EMAIL:new remote email
TEL;TYPE=work;TYPE=Voice:business 1
TEL;TYPE=homE;TYPE=VOICE:home 2
TEL;TYPE=CELL:mobile 3
TEL;TYPE=WORK;TYPE=FAX:businessfax 4
TEL;TYPE=HOME;TYPE=FAX:homefax 5
TEL;TYPE=PAGER:pager 6
TEL;TYPE=CAR:car 7
TEL;TYPE=PREF:primary 8
X-AIM:AIM JOHN
X-YAHOO:YAHOO JDOE
X-ICQ:ICQ JD
X-GROUPWISE:GROUPWISE DOE
X-GADUGADU:GADUGADU DOE
X-JABBER:JABBER DOE
X-MSN:MSN DOE
X-SKYPE:SKYPE DOE
X-SIP:SIP DOE
PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA
AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM
CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF
BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e
Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE
Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/
xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR
AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V
fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um
hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ
YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk
GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2
JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth
VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z
/VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q==
END:VCARD

View File

@ -0,0 +1,20 @@
#! /bin/sh
set -ex
IN=$1
OUT=$2
rm -rf $OUT
mkdir $OUT
[ -d $IN ] || (echo >&2 "$IN not a directory"; false)
for i in $IN/*; do
perl -e '$_ = join("", <>); if (1) {' \
-e 's/END:VCARD/EMAIL:new remote email\r\nEND:VCARD/;' \
-e 'print;' \
-e '}' \
<$i >$OUT/$(basename $i)
done
find $OUT -size 0 -delete

View File

@ -0,0 +1,77 @@
BEGIN:VCARD
VERSION:3.0
N:Doe;John;;;
FN:John Doe
NICKNAME:user1
TITLE:Senior Tester
ORG:Test Inc.;Testing\, test#1
REV:2014-05-07T11:26:32Z
UID:33a304690a6719e0
BDAY;VALUE=DATE:2006-01-08
ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O
ld Testovia
ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234
5;Testovia
ADR;TYPE=OTHER:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;Ne
w Testonia
TEL;TYPE=WORK:business 1
TEL;TYPE=HOME:home 2
TEL;TYPE=CELL:mobile 3
TEL;TYPE=FAX,WORK:businessfax 4
TEL;TYPE=FAX,HOME:homefax 5
TEL;TYPE=PAGER:pager 6
TEL;TYPE=CAR:car 7
TEL;TYPE=PREF:primary 8
EMAIL;TYPE=WORK:john.doe@work.com
EMAIL;TYPE=HOME:john.doe@home.priv
EMAIL:john.doe@other.world
EMAIL:john.doe@yet.another.world
NOTE:This is a test case which uses almost all Evolution fields.
PHOTO;ENCODING=B:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAAAAgAAAAAAA
D//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJD
BEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQR
FB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQg
AFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgEBf/EADIQAAECBQMCAwQLAA
AAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/xAAUAQEAAAAAAAAAAAAAAAAAA
AAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AuX6UehP45/aXv9MTPTLVKxNS
vMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2VfmTR/wCaKlu6+blu/Ui72zxWtUmmUOr
TaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2umhWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHK
lJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJYV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7
N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUkGZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICw
L/sqlXp7v+aOHsnyGttq218MtKd8+Ru2JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2
qqZl0UjAMwYKScfPAJ+cIQHHP0DthVFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28d
znqo+hdksbQuS3Hs6tVtNzdM1Z/VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQL
oWkISOAkBKAABCEID//2Q==
item2.IMPP;X-SERVICE-TYPE=AIM:aim:AIM%20JOHN
item3.IMPP;X-SERVICE-TYPE=Gadugadu:x-apple:GADUGADU%20DOE
item4.IMPP;X-SERVICE-TYPE=Groupwise:x-apple:GROUPWISE%20DOE
item5.IMPP;X-SERVICE-TYPE=ICQ:aim:ICQ%20JD
item6.IMPP;X-SERVICE-TYPE=Jabber:xmpp:JABBER%20DOE
item7.IMPP;X-SERVICE-TYPE=MSN:msnim:MSN%20DOE
item8.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:YAHOO%20JDOE
item9.IMPP;X-SERVICE-TYPE=Skype:skype:SKYPE%20DOE
item10.IMPP;X-SERVICE-TYPE=Sip:x-apple:SIP%20DOE
X-EVOLUTION-FILE-AS:Doe\, John
X-EVOLUTION-BLOG-URL:web log
X-EVOLUTION-VIDEO-URL:chat
X-MOZILLA-HTML:TRUE
item1.X-ABDATE:2006-01-09
item1.X-ABLabel:Anniversary
item2.X-ABLabel:Other
item3.X-ABLabel:Other
item4.X-ABLabel:Other
item5.X-ABLabel:Other
item6.X-ABLabel:Other
item7.X-ABLabel:Other
item8.X-ABLabel:Other
item9.X-ABLabel:Other
item10.X-ABLabel:Other
item11.X-ABRELATEDNAMES:John Doe Junior
item11.X-ABLabel:Assistant
item12.X-ABRELATEDNAMES:John Doe Senior
item12.X-ABLabel:Manager
item13.X-ABRELATEDNAMES:Joan Doe
item13.X-ABLabel:Spouse
item14.URL:http\://john.doe.com
item14.X-ABLabel:Other
END:VCARD