X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=test%2FT610-message-property.sh;h=53a0be3bdf3c3cb170ad59fe9c8fc6b9dffa780e;hp=0217950f35dc16ee7473f3dd2ee8203c11ea4dfc;hb=c61e22d5cb9a7e5b03f9fcdb9911b4b4a641af2b;hpb=b8bb6d796458732622f80464dd808b3e02f57d9d diff --git a/test/T610-message-property.sh b/test/T610-message-property.sh index 0217950f..53a0be3b 100755 --- a/test/T610-message-property.sh +++ b/test/T610-message-property.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash test_description="message property API" -. ./test-lib.sh || exit 1 +. $(dirname "$0")/test-lib.sh || exit 1 add_email_corpus @@ -9,8 +9,18 @@ cat < c_head #include #include #include +#include #include +void print_properties (notmuch_message_t *message, const char *prefix, notmuch_bool_t exact) { + notmuch_message_properties_t *list; + for (list = notmuch_message_get_properties (message, prefix, exact); + notmuch_message_properties_valid (list); notmuch_message_properties_move_to_next (list)) { + printf("%s\n", notmuch_message_properties_value(list)); + } + notmuch_message_properties_destroy (list); +} + int main (int argc, char** argv) { notmuch_database_t *db; @@ -79,6 +89,265 @@ testkey2 = NULL EOF test_expect_equal_file EXPECTED OUTPUT +test_begin_subtest "notmuch_message_remove_all_properties" +cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} +EXPECT0(notmuch_message_remove_all_properties (message, NULL)); +print_properties (message, "", FALSE); +EOF +cat <<'EOF' >EXPECTED +== stdout == +== stderr == +EOF +test_expect_equal_file EXPECTED OUTPUT + +test_begin_subtest "testing string map binary search (via message properties)" +cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} +{ + char *keys[] = {"a", "b", "c", "d", "e", NULL}; + for (int i=0; keys[i]; i++) + EXPECT0(notmuch_message_add_property (message, keys[i], keys[i])); + + for (int i=0; keys[i]; i++) { + EXPECT0(notmuch_message_get_property (message, keys[i], &val)); + printf("%s = %s\n", keys[i], val); + } + + for (int i=0; keys[i]; i++) { + EXPECT0(notmuch_message_remove_property (message, keys[i], keys[i])); + EXPECT0(notmuch_message_get_property (message, keys[i], &val)); + printf("%s = %s\n", keys[i], val == NULL ? "NULL" : val); + } +} +EOF +cat < EXPECTED +== stdout == +a = a +b = b +c = c +d = d +e = e +a = NULL +b = NULL +c = NULL +d = NULL +e = NULL +== stderr == +EOF +test_expect_equal_file EXPECTED OUTPUT + +test_begin_subtest "notmuch_message_get_properties: empty list" +cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} +{ + notmuch_message_properties_t *list; + list = notmuch_message_get_properties (message, "nonexistent", TRUE); + printf("valid = %d\n", notmuch_message_properties_valid (list)); + notmuch_message_properties_destroy (list); +} +EOF +cat <<'EOF' >EXPECTED +== stdout == +valid = 0 +== stderr == +EOF +test_expect_equal_file EXPECTED OUTPUT + +test_begin_subtest "notmuch_message_properties: one value" +cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} +print_properties (message, "testkey1", TRUE); +EOF +cat <<'EOF' >EXPECTED +== stdout == +testvalue1 +== stderr == +EOF +test_expect_equal_file EXPECTED OUTPUT + +test_begin_subtest "notmuch_message_properties: multiple values" +cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} +EXPECT0(notmuch_message_add_property (message, "testkey1", "bob")); +EXPECT0(notmuch_message_add_property (message, "testkey1", "testvalue2")); +EXPECT0(notmuch_message_add_property (message, "testkey1", "alice")); +print_properties (message, "testkey1", TRUE); +EOF +cat <<'EOF' >EXPECTED +== stdout == +alice +bob +testvalue1 +testvalue2 +== stderr == +EOF +test_expect_equal_file EXPECTED OUTPUT + +test_begin_subtest "notmuch_message_properties: prefix" +cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} +EXPECT0(notmuch_message_add_property (message, "testkey3", "bob3")); +EXPECT0(notmuch_message_add_property (message, "testkey3", "testvalue3")); +EXPECT0(notmuch_message_add_property (message, "testkey3", "alice3")); +print_properties (message, "testkey", FALSE); +EOF +cat <<'EOF' >EXPECTED +== stdout == +alice +bob +testvalue1 +testvalue2 +alice3 +bob3 +testvalue3 +== stderr == +EOF +test_expect_equal_file EXPECTED OUTPUT + +test_begin_subtest "notmuch_message_properties: modify during iteration" +cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} +{ + const char *keys[1000] = {NULL}; + const char *vals[1000] = {NULL}; + notmuch_message_properties_t *properties; + int i; + + for (properties = notmuch_message_get_properties (message, "", FALSE), i=0; + notmuch_message_properties_valid (properties); + notmuch_message_properties_move_to_next (properties), i++) + { + const char *key, *value; + keys[i]=talloc_strdup(message, + notmuch_message_properties_key (properties)); + vals[i]=talloc_strdup(message, + notmuch_message_properties_value (properties)); + + EXPECT0(notmuch_message_remove_property (message, keys[i], vals[i])); + } + + print_properties (message, "", FALSE); + + for (i = 0; keys[i] && vals[i]; i++) { + EXPECT0(notmuch_message_add_property (message, keys[i], vals[i])); + } +} +EOF +cat <<'EOF' >EXPECTED +== stdout == +== stderr == +EOF +test_expect_equal_file EXPECTED OUTPUT + +test_begin_subtest "dump message properties" +cat < PROPERTIES +#= 4EFC743A.3060609@april.org fancy%20key%20with%20%c3%a1cc%c3%a8nts=import%20value%20with%20= testkey1=alice testkey1=bob testkey1=testvalue1 testkey1=testvalue2 testkey3=alice3 testkey3=bob3 testkey3=testvalue3 +EOF +cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} +EXPECT0(notmuch_message_add_property (message, "fancy key with áccènts", "import value with =")); +EOF +notmuch dump | grep '^#=' > OUTPUT +test_expect_equal_file PROPERTIES OUTPUT + +test_begin_subtest "dump _only_ message properties" +cat < EXPECTED +#notmuch-dump batch-tag:3 properties +#= 4EFC743A.3060609@april.org fancy%20key%20with%20%c3%a1cc%c3%a8nts=import%20value%20with%20= testkey1=alice testkey1=bob testkey1=testvalue1 testkey1=testvalue2 testkey3=alice3 testkey3=bob3 testkey3=testvalue3 +EOF +notmuch dump --include=properties > OUTPUT +test_expect_equal_file EXPECTED OUTPUT + + +test_begin_subtest "restore missing message property (single line)" +notmuch dump | grep '^#=' > BEFORE1 +cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} +EXPECT0(notmuch_message_remove_property (message, "testkey1", "bob")); +EOF +notmuch restore < BEFORE1 +notmuch dump | grep '^#=' > OUTPUT +test_expect_equal_file PROPERTIES OUTPUT + + +test_begin_subtest "restore missing message property (full dump)" +notmuch dump > BEFORE2 +cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} +EXPECT0(notmuch_message_remove_property (message, "testkey1", "bob")); +EOF +notmuch restore < BEFORE2 +notmuch dump | grep '^#=' > OUTPUT +test_expect_equal_file PROPERTIES OUTPUT + +test_begin_subtest "restore clear extra message property" +cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} +EXPECT0(notmuch_message_add_property (message, "testkey1", "charles")); +EOF +notmuch restore < BEFORE2 +notmuch dump | grep '^#=' > OUTPUT +test_expect_equal_file PROPERTIES OUTPUT + +test_begin_subtest "test 'property:' queries: empty" +notmuch search property:testkey1=charles > OUTPUT +test_expect_equal_file /dev/null OUTPUT + +test_begin_subtest "test 'property:' queries: single message" +notmuch search --output=messages property:testkey1=alice > OUTPUT +cat <EXPECTED +id:4EFC743A.3060609@april.org +EOF +test_expect_equal_file EXPECTED OUTPUT + +test_begin_subtest "msg.get_property (python)" +test_python <<'EOF' +import notmuch +db = notmuch.Database(mode=notmuch.Database.MODE.READ_WRITE) +msg = db.find_message("4EFC743A.3060609@april.org") +print("testkey1 = {0}".format(msg.get_property("testkey1"))) +print("testkey3 = {0}".format(msg.get_property("testkey3"))) +EOF +cat <<'EOF' > EXPECTED +testkey1 = alice +testkey3 = alice3 +EOF +test_expect_equal_file EXPECTED OUTPUT + +test_begin_subtest "msg.get_properties (python)" +test_python <<'EOF' +import notmuch +db = notmuch.Database(mode=notmuch.Database.MODE.READ_ONLY) +msg = db.find_message("4EFC743A.3060609@april.org") +for (key,val) in msg.get_properties("testkey1"): + print("{0} = {1}".format(key,val)) +EOF +cat <<'EOF' > EXPECTED +testkey1 = alice +testkey1 = bob +testkey1 = testvalue1 +testkey1 = testvalue2 +EOF +test_expect_equal_file EXPECTED OUTPUT + +test_begin_subtest "msg.get_properties (python, prefix)" +test_python <<'EOF' +import notmuch +db = notmuch.Database(mode=notmuch.Database.MODE.READ_ONLY) +msg = db.find_message("4EFC743A.3060609@april.org") +for (key,val) in msg.get_properties("testkey"): + print("{0} = {1}".format(key,val)) +EOF +cat <<'EOF' > EXPECTED +testkey1 = alice +testkey1 = bob +testkey1 = testvalue1 +testkey1 = testvalue2 +testkey3 = alice3 +testkey3 = bob3 +testkey3 = testvalue3 +EOF +test_expect_equal_file EXPECTED OUTPUT + +test_begin_subtest "msg.get_properties (python, exact)" +test_python <<'EOF' +import notmuch +db = notmuch.Database(mode=notmuch.Database.MODE.READ_ONLY) +msg = db.find_message("4EFC743A.3060609@april.org") +for (key,val) in msg.get_properties("testkey",True): + print("{0} = {1}".format(key,val)) +EOF +test_expect_equal_file /dev/null OUTPUT test_done