2
# -*- coding: utf-8 -*-
6
import openchange.mapistoredb as mapistoredb
7
import openchange.mapistore as mapistore
8
import openchange.mapi as mapi
13
folder_list = [ (mapistore.MDB_ROOT_FOLDER, mapistore.MDB_DEFERRED_ACTIONS),
14
(mapistore.MDB_ROOT_FOLDER, mapistore.MDB_SPOOLER_QUEUE),
15
(mapistore.MDB_ROOT_FOLDER, mapistore.MDB_IPM_SUBTREE),
16
(mapistore.MDB_IPM_SUBTREE, mapistore.MDB_INBOX),
17
(mapistore.MDB_IPM_SUBTREE, mapistore.MDB_OUTBOX),
18
(mapistore.MDB_IPM_SUBTREE, mapistore.MDB_SENT_ITEMS),
19
(mapistore.MDB_IPM_SUBTREE, mapistore.MDB_DELETED_ITEMS),
20
(mapistore.MDB_IPM_SUBTREE, mapistore.MDB_CALENDAR),
21
(mapistore.MDB_IPM_SUBTREE, mapistore.MDB_CONTACTS),
22
(mapistore.MDB_IPM_SUBTREE, mapistore.MDB_JOURNAL),
23
(mapistore.MDB_IPM_SUBTREE, mapistore.MDB_NOTES),
24
(mapistore.MDB_IPM_SUBTREE, mapistore.MDB_TASKS),
25
(mapistore.MDB_IPM_SUBTREE, mapistore.MDB_DRAFTS),
26
(mapistore.MDB_IPM_SUBTREE, mapistore.MDB_SYNC_ISSUES),
27
(mapistore.MDB_ROOT_FOLDER, mapistore.MDB_COMMON_VIEWS),
28
(mapistore.MDB_ROOT_FOLDER, mapistore.MDB_SCHEDULE),
29
(mapistore.MDB_ROOT_FOLDER, mapistore.MDB_SEARCH),
30
(mapistore.MDB_ROOT_FOLDER, mapistore.MDB_VIEWS),
31
(mapistore.MDB_ROOT_FOLDER, mapistore.MDB_SHORTCUTS),
32
(mapistore.MDB_ROOT_FOLDER, mapistore.MDB_REMINDERS) ]
35
class TestMAPIStoreDB(unittest.TestCase):
38
self.username = "jkerihuel"
39
self.working_directory = tempfile.mkdtemp(prefix="TestMAPIStoreDB")
40
self.MAPIStoreDB = mapistoredb.mapistoredb()
41
self.assert_(self.MAPIStoreDB)
42
retval = self.MAPIStoreDB.initialize(self.working_directory)
43
self.assertEqual(retval, 0)
44
retval = self.MAPIStoreDB.provision(netbiosname = "server", firstorg = "OpenChange Project", firstou = "OpenChange Development Unit")
45
self.assertEqual(retval, 0)
46
retval = self.MAPIStoreDB.provision_named_properties()
47
self.assertEqual(retval, 0) # success
48
(retval,npid) = self.MAPIStoreDB.namedprops_get_default_id(mapistoredb.MAPISTORE_NAMEDPROPS_EXTERNAL)
49
self.assertEqual(retval, 0) # success
50
self.assertNotEqual(npid, 0) # we have at least one external property id
51
(retval,npid) = self.MAPIStoreDB.namedprops_get_default_id(mapistoredb.MAPISTORE_NAMEDPROPS_INTERNAL)
52
self.assertEqual(retval, 0) # success
53
self.assertNotEqual(npid, 0) # we have at least one internal property id
54
retval = self.MAPIStoreDB.namedprops_provision_backends()
55
self.assertEqual(retval, 0) # success
56
retval = self.MAPIStoreDB.namedprops_provision_user(self.username)
57
self.assertEqual(retval, 0) # success
58
self.mailbox_root = self.MAPIStoreDB.get_mapistore_uri(folder=mapistoredb.MDB_ROOT_FOLDER, username=self.username, namespace="mstoredb://")
60
def test_get_parameters(self):
61
netbiosname = self.MAPIStoreDB.netbiosname
62
self.assertEqual(netbiosname, "server")
63
firstorg = self.MAPIStoreDB.firstorg
64
self.assertEqual(firstorg, "OpenChange Project")
65
firstou = self.MAPIStoreDB.firstou
66
self.assertEqual(firstou, "OpenChange Development Unit")
68
def test_allocation_range(self):
69
retval = self.MAPIStoreDB.new_mailbox(self.username, self.mailbox_root)
70
self.assertEqual(retval, 0) # success
71
(retval, rstart, rend) = self.MAPIStoreDB.get_new_allocation_range(self.username, 0x1000)
72
self.assertEqual(retval, 0) # success
73
self.assertNotEqual(rstart, 0) # should be greater than zero
74
self.assertEqual(rend-rstart, (0x1000 - 1) << 16) # because ranges are inclusive
75
retval = self.MAPIStoreDB.set_mailbox_allocation_range(self.username, rstart, rend)
76
self.assertEqual(retval, 0) # success
78
def test_get_new_fid(self):
79
retval = self.MAPIStoreDB.new_mailbox(self.username, self.mailbox_root)
80
self.assertEqual(retval, 0) # success
81
fid = self.MAPIStoreDB.get_new_fid(self.username)
82
self.assertNotEqual(fid, 0)
84
def test_dump_config(self):
85
retval = self.MAPIStoreDB.dump_configuration()
86
self.assertEqual(retval, 0) # success
88
def test_folder_context(self):
89
mapistore.set_mapping_path(os.path.join(self.working_directory, "mapistore"))
90
self.MAPIStore = mapistore.mapistore()
91
retval = self.MAPIStoreDB.new_mailbox(self.username, self.mailbox_root)
92
self.assertEqual(retval, 0) # success
93
(context_id, mailbox_fid) = self.MAPIStore.add_context(self.username, self.mailbox_root)
94
self.assertNotEqual(context_id, 0)
95
self.assertNotEqual(mailbox_fid, 0)
96
for (parent, index) in folder_list:
97
retval = self.MAPIStore.root_mkdir(context_id=context_id, parent_index=parent, index=index, folder_name="")
98
self.assertEqual(retval, 0, mapistore.errstr(retval))
99
ipm_subtree_fid = self.MAPIStore.get_folder_identifier(context_id=context_id, index=mapistore.MDB_IPM_SUBTREE, uri=None)
100
self.assertNotEqual(ipm_subtree_fid, 0)
101
sync_fid = self.MAPIStore.get_folder_identifier(context_id=context_id, index=mapistore.MDB_SYNC_ISSUES, uri=None)
102
self.assertNotEqual(sync_fid, 0)
103
retval = self.MAPIStore.opendir(context_id=context_id, parent_fid=ipm_subtree_fid, fid=sync_fid)
104
self.assertEqual(retval, 0)
105
conflicts_fid = self.MAPIStore.mkdir(context_id, sync_fid, "Conflicts", None, mapistore.FOLDER_GENERIC)
106
self.assertNotEqual(conflicts_fid, 0)
107
inbox_uri = self.MAPIStore.get_mapistore_uri(mapistore.MDB_INBOX, self.username, "fsocpf://")
108
retval = self.MAPIStore.set_mapistore_uri(context_id, mapistore.MDB_INBOX, inbox_uri)
109
self.assertEqual(retval, 0)
110
(inbox_context_id, inbox_fid) = self.MAPIStore.add_context(self.username, inbox_uri)
111
self.assertNotEqual(inbox_context_id, 0)
112
self.assertNotEqual(inbox_fid, 0)
113
num_folders = self.MAPIStore.get_folder_count(inbox_context_id, inbox_fid)
114
self.assertEqual(num_folders, 0)
115
test_subfolder_fid = self.MAPIStore.mkdir(inbox_context_id, inbox_fid, "Test Folder", "This is a test folder", mapistore.FOLDER_GENERIC)
116
self.assertNotEqual(test_subfolder_fid, 0)
117
num_folders = self.MAPIStore.get_folder_count(inbox_context_id, inbox_fid)
118
self.assertEqual(num_folders, 1)
119
num_folders = self.MAPIStore.get_folder_count(inbox_context_id, test_subfolder_fid)
120
self.assertEqual(num_folders, 0)
121
num_messages = self.MAPIStore.get_message_count(inbox_context_id, inbox_fid)
122
self.assertEqual(num_messages, 0)
123
num_messages = self.MAPIStore.get_message_count(inbox_context_id, test_subfolder_fid)
124
self.assertEqual(num_messages, 0)
125
test_no_comment_folder_fid = self.MAPIStore.mkdir(inbox_context_id, inbox_fid, "Another Test Folder", None, mapistore.FOLDER_GENERIC)
126
self.assertNotEqual(test_no_comment_folder_fid, 0)
127
num_folders = self.MAPIStore.get_folder_count(inbox_context_id, inbox_fid)
128
self.assertEqual(num_folders, 2)
129
retval = self.MAPIStore.opendir(context_id = inbox_context_id, parent_fid = inbox_fid, fid = test_subfolder_fid)
130
self.assertEqual(retval, 0)
131
# TODO: add getprops support, and check return values.
132
SPropValue = mapi.SPropValue()
133
SPropValue.add(mapi.PidTagComment, "different comment")
134
SPropValue.add(mapi.PidTagGeneration, "doesn't already exist")
135
retval = self.MAPIStore.setprops(inbox_context_id, test_subfolder_fid, mapistore.MAPISTORE_FOLDER, SPropValue)
136
self.assertEqual(retval, 0, self.MAPIStoreDB.errstr(retval))
137
SPropValue = mapi.SPropValue()
138
SPropValue.add(mapi.PidTagGeneration, "the first")
139
retval = self.MAPIStore.setprops(inbox_context_id, inbox_fid, mapistore.MAPISTORE_FOLDER, SPropValue)
140
self.assertEqual(retval, 0, self.MAPIStoreDB.errstr(retval))
141
SPropValue = mapi.SPropValue()
142
SPropValue.add(mapi.PidTagComment, "Inbox comment")
143
SPropValue.add(mapi.PidTagGeneration, "the second")
144
retval = self.MAPIStore.setprops(inbox_context_id, inbox_fid, mapistore.MAPISTORE_FOLDER, SPropValue)
145
self.assertEqual(retval, 0, self.MAPIStoreDB.errstr(retval))
146
retval = self.MAPIStore.closedir(inbox_context_id, test_subfolder_fid)
147
self.assertEqual(retval, 0, self.MAPIStoreDB.errstr(retval))
148
dbg_level = self.MAPIStore.debuglevel
149
self.MAPIStore.debuglevel = dbg_level + 1
150
self.assertEqual(dbg_level + 1, self.MAPIStore.debuglevel)
151
self.MAPIStore.debuglevel = dbg_level
152
self.assertEqual(dbg_level, self.MAPIStore.debuglevel)
153
retval = self.MAPIStore.closedir(inbox_context_id, inbox_fid)
154
self.assertEqual(retval, 0, self.MAPIStoreDB.errstr(retval))
155
retval = self.MAPIStore.rmdir(inbox_context_id, inbox_fid, test_subfolder_fid, mapistore.DEL_FOLDERS)
156
self.assertEqual(retval, 0, self.MAPIStoreDB.errstr(retval))
158
def test_duplicate_folders(self):
159
mapistore.set_mapping_path(os.path.join(self.working_directory, "mapistore"))
160
self.MAPIStore = mapistore.mapistore()
161
retval = self.MAPIStoreDB.new_mailbox(self.username, self.mailbox_root)
162
self.assertEqual(retval, 0) # success
163
(context_id, mailbox_fid) = self.MAPIStore.add_context(self.username, self.mailbox_root)
164
self.assertNotEqual(context_id, 0)
165
self.assertNotEqual(mailbox_fid, 0)
166
for (parent, index) in folder_list:
167
retval = self.MAPIStore.root_mkdir(context_id=context_id, parent_index=parent, index=index, folder_name="")
168
self.assertEqual(retval, 0, mapistore.errstr(retval))
169
inbox_uri = self.MAPIStore.get_mapistore_uri(mapistore.MDB_INBOX, self.username, "fsocpf://")
170
retval = self.MAPIStore.set_mapistore_uri(context_id, mapistore.MDB_INBOX, inbox_uri)
171
self.assertEqual(retval, 0)
172
(inbox_context_id, inbox_fid) = self.MAPIStore.add_context(self.username, inbox_uri)
173
self.assertNotEqual(inbox_context_id, 0)
174
self.assertNotEqual(inbox_fid, 0)
175
test_subfolder_fid = self.MAPIStore.mkdir(inbox_context_id, inbox_fid, "Test Folder", "This is a test folder", mapistore.FOLDER_GENERIC)
176
self.assertNotEqual(test_subfolder_fid, 0)
177
self.assertRaises(TypeError, self.MAPIStore.mkdir, inbox_context_id, inbox_fid, "Test Folder", None, mapistore.FOLDER_GENERIC)
178
num_folders = self.MAPIStore.get_folder_count(inbox_context_id, inbox_fid)
179
self.assertEqual(num_folders, 1)
181
def test_folder_props(self):
182
mapistore.set_mapping_path(os.path.join(self.working_directory, "mapistore"))
183
self.MAPIStore = mapistore.mapistore()
184
retval = self.MAPIStoreDB.new_mailbox(self.username, self.mailbox_root)
185
self.assertEqual(retval, 0) # success
186
(context_id, mailbox_fid) = self.MAPIStore.add_context(self.username, self.mailbox_root)
187
self.assertNotEqual(context_id, 0)
188
self.assertNotEqual(mailbox_fid, 0)
189
self.MAPIStore.debuglevel = 9
190
SPropValue = mapi.SPropValue()
191
SPropValue.add(mapi.PidTagAttachMethod, 1)
192
SPropValue.add(mapi.PidTagGender, 2)
193
SPropValue.add(mapi.PidTagInstID, 0x12345678L)
194
SPropValue.add(0x8F010005, 3.1415) # PT_DOUBLE
195
SPropValue.add(mapi.PidTagProcessed, True)
196
SPropValue.add(mapi.PidTagRecipientProposed, False)
197
SPropValue.add(mapi.PidTagAddressBookHierarchicalRootDepartment, "Development")
198
SPropValue.add(mapi.PidTagReplyRecipientNames, "Joe,Virginia")
199
retval = self.MAPIStore.setprops(context_id, mailbox_fid, mapistore.MAPISTORE_FOLDER, SPropValue)
200
self.assertEqual(retval, 0) # success
202
def test_errstr(self):
203
self.assertEqual(self.MAPIStoreDB.errstr(0), "Success")
204
self.assertEqual(self.MAPIStoreDB.errstr(1), "Non-specific error")
205
self.assertEqual(self.MAPIStoreDB.errstr(2), "No memory available")
206
self.assertEqual(self.MAPIStoreDB.errstr(16), "Already exists")
209
self.MAPIStoreDB.release()
210
# shutil.rmtree(self.working_directory)
212
if __name__ == '__main__':