Applied changes coming from v2/PR#184.
parent
985db9465c
commit
b3bc6bb7dc
13
NEWS
13
NEWS
|
@ -2,13 +2,21 @@
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
New features
|
New features
|
||||||
- Now able to sync only default mail folders when using EAS
|
- now able to sync only default mail folders when using EAS
|
||||||
|
|
||||||
|
Enhancements
|
||||||
|
- Unit testing for RTFHandler
|
||||||
|
- JUnit output for sogo-tests
|
||||||
|
|
||||||
Bug fixes
|
Bug fixes
|
||||||
- don't unescape twice mail folder names (#3423)
|
- don't unescape twice mail folder names (#3423)
|
||||||
- don't consider mobile Outlook EAS clients as DAV ones (#3431)
|
- don't consider mobile Outlook EAS clients as DAV ones (#3431)
|
||||||
- we now follow 301 redirects when fetching ICS calendars
|
- we now follow 301 redirects when fetching ICS calendars
|
||||||
- when deleting an event using EAS, properly invoke the auto-scheduling code
|
- when deleting an event using EAS, properly invoke the auto-scheduling code
|
||||||
|
- do not include failure attachments (really long filenames)
|
||||||
|
- fix encoding of email subjects with non-ASCII characters
|
||||||
|
- fix appointment notification mails using SOGoEnableDomainBasedUID configuration
|
||||||
|
- fix shifts in event times on Outlook
|
||||||
|
|
||||||
2.3.5 (2016-01-05)
|
2.3.5 (2016-01-05)
|
||||||
------------------
|
------------------
|
||||||
|
@ -18,6 +26,7 @@ Enhancements
|
||||||
- return the requested elements on complex requests from Outlook when downloading changes
|
- return the requested elements on complex requests from Outlook when downloading changes
|
||||||
- user sources can be loaded dynamically
|
- user sources can be loaded dynamically
|
||||||
- unify user sources API
|
- unify user sources API
|
||||||
|
- updated Russian translation (#3383)
|
||||||
|
|
||||||
Bug fixes
|
Bug fixes
|
||||||
- properly compute the last week number for the year (#1010)
|
- properly compute the last week number for the year (#1010)
|
||||||
|
@ -33,7 +42,6 @@ Bug fixes
|
||||||
- accepted & updated event names are now shown correctly in Outlook
|
- accepted & updated event names are now shown correctly in Outlook
|
||||||
- provide safe guards in mail and calendar to avoid exceptions while syncing
|
- provide safe guards in mail and calendar to avoid exceptions while syncing
|
||||||
|
|
||||||
|
|
||||||
2.3.4 (2015-12-15)
|
2.3.4 (2015-12-15)
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
|
@ -42,6 +50,7 @@ New features
|
||||||
|
|
||||||
Enhancements
|
Enhancements
|
||||||
- limit the maximum width of toolbar buttons (#3381)
|
- limit the maximum width of toolbar buttons (#3381)
|
||||||
|
- updated CKEditor to version 4.5.6
|
||||||
|
|
||||||
Bug fixes
|
Bug fixes
|
||||||
- JavaScript exception when printing events from calendars with no assigned color (#3203)
|
- JavaScript exception when printing events from calendars with no assigned color (#3203)
|
||||||
|
|
|
@ -77,6 +77,17 @@
|
||||||
|
|
||||||
- (NSArray *) rolesForExchangeRights: (uint32_t) rights
|
- (NSArray *) rolesForExchangeRights: (uint32_t) rights
|
||||||
{
|
{
|
||||||
|
/* Limitations
|
||||||
|
|
||||||
|
Following rights are not supported by SOGo specifically:
|
||||||
|
|
||||||
|
- DeleteOwned : Delete only own objects
|
||||||
|
- EditOwned : Edit only own objects
|
||||||
|
- CreateSubfolders: No calendar subfolders
|
||||||
|
- FolderOwner: No sharing folder ownership?
|
||||||
|
- FolderContact: No support to store this information
|
||||||
|
- FolderVisible: It is inferred by other rights when extracting
|
||||||
|
*/
|
||||||
NSMutableArray *roles;
|
NSMutableArray *roles;
|
||||||
|
|
||||||
roles = [NSMutableArray arrayWithCapacity: 6];
|
roles = [NSMutableArray arrayWithCapacity: 6];
|
||||||
|
@ -121,7 +132,7 @@
|
||||||
if ([roles containsObject: SOGoCalendarRole_PublicModifier]
|
if ([roles containsObject: SOGoCalendarRole_PublicModifier]
|
||||||
&& [roles containsObject: SOGoCalendarRole_PrivateModifier]
|
&& [roles containsObject: SOGoCalendarRole_PrivateModifier]
|
||||||
&& [roles containsObject: SOGoCalendarRole_ConfidentialModifier])
|
&& [roles containsObject: SOGoCalendarRole_ConfidentialModifier])
|
||||||
rights |= RightsReadItems | RightsEditAll | RightsEditOwn;
|
rights |= RightsReadItems | RightsEditAll | RightsEditOwn | RightsFreeBusySimple | RightsFreeBusyDetailed;
|
||||||
else if ([roles containsObject: SOGoCalendarRole_PublicViewer]
|
else if ([roles containsObject: SOGoCalendarRole_PublicViewer]
|
||||||
&& [roles containsObject: SOGoCalendarRole_PrivateViewer]
|
&& [roles containsObject: SOGoCalendarRole_PrivateViewer]
|
||||||
&& [roles containsObject: SOGoCalendarRole_ConfidentialViewer])
|
&& [roles containsObject: SOGoCalendarRole_ConfidentialViewer])
|
||||||
|
@ -135,7 +146,7 @@
|
||||||
if ([roles containsObject: SOGoCalendarRole_ConfidentialDAndTViewer])
|
if ([roles containsObject: SOGoCalendarRole_ConfidentialDAndTViewer])
|
||||||
rights |= RightsFreeBusyDetailed;
|
rights |= RightsFreeBusyDetailed;
|
||||||
|
|
||||||
if (rights != 0)
|
if ((rights & RightsReadItems) != 0 || (rights & RightsCreateItems) != 0 || (rights & RightsDeleteAll) != 0)
|
||||||
rights |= RoleNone; /* actually "folder visible" */
|
rights |= RoleNone; /* actually "folder visible" */
|
||||||
|
|
||||||
// [self logWithFormat: @"rights for roles (%@) = %.8x", roles, rights];
|
// [self logWithFormat: @"rights for roles (%@) = %.8x", roles, rights];
|
||||||
|
|
|
@ -64,11 +64,11 @@ static BOOL initialization_done = NO;
|
||||||
} \
|
} \
|
||||||
OC_DEBUG(5, "[SOGo] --->");
|
OC_DEBUG(5, "[SOGo] --->");
|
||||||
|
|
||||||
#define NS_CURRENT_THREAD_TRY_UNREGISTER() \
|
#define NS_CURRENT_THREAD_TRY_UNREGISTER(rc) \
|
||||||
if (__nsrct_thread_registered) { \
|
if (__nsrct_thread_registered) { \
|
||||||
GSUnregisterCurrentThread(); \
|
GSUnregisterCurrentThread(); \
|
||||||
} \
|
} \
|
||||||
OC_DEBUG(6, "[SOGo] <---");
|
OC_DEBUG(6, "[SOGo] <--- [%s]", mapistore_errstr (rc));
|
||||||
|
|
||||||
#define TRYCATCH_START @try {
|
#define TRYCATCH_START @try {
|
||||||
#define TRYCATCH_END(pool) \
|
#define TRYCATCH_END(pool) \
|
||||||
|
@ -76,7 +76,7 @@ static BOOL initialization_done = NO;
|
||||||
enum mapistore_error ret = sogo_backend_handle_objc_exception(e, __PRETTY_FUNCTION__, __LINE__); \
|
enum mapistore_error ret = sogo_backend_handle_objc_exception(e, __PRETTY_FUNCTION__, __LINE__); \
|
||||||
mapiapp_cleanup(); \
|
mapiapp_cleanup(); \
|
||||||
[pool release]; \
|
[pool release]; \
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER(); \
|
NS_CURRENT_THREAD_TRY_UNREGISTER(ret); \
|
||||||
return ret; \
|
return ret; \
|
||||||
} \
|
} \
|
||||||
mapiapp_cleanup();
|
mapiapp_cleanup();
|
||||||
|
@ -253,7 +253,7 @@ sogo_backend_create_context(TALLOC_CTX *mem_ctx,
|
||||||
rc = MAPISTORE_ERROR;
|
rc = MAPISTORE_ERROR;
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@ -291,7 +291,7 @@ sogo_backend_create_root_folder (const char *username,
|
||||||
rc = MAPISTORE_ERROR;
|
rc = MAPISTORE_ERROR;
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@ -322,7 +322,7 @@ sogo_backend_list_contexts(const char *username, struct indexing_context *indexi
|
||||||
rc = MAPISTORE_ERROR;
|
rc = MAPISTORE_ERROR;
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@ -363,7 +363,7 @@ sogo_context_get_path(void *backend_object, TALLOC_CTX *mem_ctx,
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -397,7 +397,7 @@ sogo_context_get_root_folder(void *backend_object, TALLOC_CTX *mem_ctx,
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -439,7 +439,7 @@ sogo_folder_open_folder(void *folder_object, TALLOC_CTX *mem_ctx, uint64_t fid,
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -480,7 +480,7 @@ sogo_folder_create_folder(void *folder_object, TALLOC_CTX *mem_ctx,
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -519,7 +519,7 @@ sogo_folder_delete(void *folder_object)
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -549,7 +549,7 @@ sogo_folder_get_child_count(void *folder_object, enum mapistore_table_type table
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -588,7 +588,7 @@ sogo_folder_open_message(void *folder_object,
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -627,7 +627,7 @@ sogo_folder_create_message(void *folder_object,
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -657,7 +657,7 @@ sogo_folder_delete_message(void *folder_object, uint64_t mid, uint8_t flags)
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -705,7 +705,7 @@ sogo_folder_move_copy_messages(void *folder_object,
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -753,7 +753,7 @@ sogo_folder_move_folder(void *folder_object, void *target_folder_object,
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -795,7 +795,7 @@ sogo_folder_copy_folder(void *folder_object, void *target_folder_object, TALLOC_
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -831,7 +831,7 @@ sogo_folder_get_deleted_fmids(void *folder_object, TALLOC_CTX *mem_ctx,
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -869,7 +869,7 @@ sogo_folder_open_table(void *folder_object, TALLOC_CTX *mem_ctx,
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -903,7 +903,7 @@ sogo_folder_modify_permissions(void *folder_object, uint8_t flags,
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -934,7 +934,7 @@ sogo_folder_preload_message_bodies(void *folder_object, enum mapistore_table_typ
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -967,8 +967,8 @@ sogo_message_get_message_data(void *message_object,
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
|
||||||
rc = MAPISTORE_SUCCESS;
|
rc = MAPISTORE_SUCCESS;
|
||||||
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1001,7 +1001,7 @@ sogo_message_create_attachment (void *message_object, TALLOC_CTX *mem_ctx, void
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1035,7 +1035,7 @@ sogo_message_open_attachment (void *message_object, TALLOC_CTX *mem_ctx,
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1069,7 +1069,7 @@ sogo_message_get_attachment_table (void *message_object, TALLOC_CTX *mem_ctx, vo
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1104,7 +1104,7 @@ sogo_message_modify_recipients (void *message_object,
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1134,7 +1134,7 @@ sogo_message_set_read_flag (void *message_object, uint8_t flag)
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1164,7 +1164,7 @@ sogo_message_save (void *message_object, TALLOC_CTX *mem_ctx)
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1194,7 +1194,7 @@ sogo_message_submit (void *message_object, enum SubmitFlags flags)
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1234,7 +1234,7 @@ sogo_message_attachment_open_embedded_message (void *attachment_object,
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1272,7 +1272,7 @@ sogo_message_attachment_create_embedded_message (void *attachment_object,
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1302,7 +1302,7 @@ static enum mapistore_error sogo_table_get_available_properties(void *table_obje
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1333,7 +1333,7 @@ sogo_table_set_columns (void *table_object, uint16_t count, enum MAPITAGS *prope
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1366,7 +1366,7 @@ sogo_table_set_restrictions (void *table_object, struct mapi_SRestriction *restr
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1399,7 +1399,7 @@ sogo_table_set_sort_order (void *table_object, struct SSortOrderSet *sort_order,
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1432,7 +1432,7 @@ sogo_table_get_row (void *table_object, TALLOC_CTX *mem_ctx,
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1465,7 +1465,7 @@ sogo_table_get_row_count (void *table_object,
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1495,8 +1495,8 @@ sogo_table_handle_destructor (void *table_object, uint32_t handle_id)
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
|
||||||
rc = MAPISTORE_SUCCESS;
|
rc = MAPISTORE_SUCCESS;
|
||||||
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1527,7 +1527,7 @@ static enum mapistore_error sogo_properties_get_available_properties(void *objec
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1562,7 +1562,7 @@ sogo_properties_get_properties (void *object,
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1592,7 +1592,7 @@ sogo_properties_set_properties (void *object, struct SRow *aRow)
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(rc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1646,7 +1646,7 @@ sogo_manager_generate_uri (TALLOC_CTX *mem_ctx,
|
||||||
TRYCATCH_END(pool)
|
TRYCATCH_END(pool)
|
||||||
|
|
||||||
[pool release];
|
[pool release];
|
||||||
NS_CURRENT_THREAD_TRY_UNREGISTER();
|
NS_CURRENT_THREAD_TRY_UNREGISTER(MAPISTORE_SUCCESS);
|
||||||
|
|
||||||
return MAPISTORE_SUCCESS;
|
return MAPISTORE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,8 @@
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
@class RTFFontTable;
|
||||||
|
|
||||||
@interface RTFHandler : NSObject
|
@interface RTFHandler : NSObject
|
||||||
{
|
{
|
||||||
NSMapTable *_charsets;
|
NSMapTable *_charsets;
|
||||||
|
@ -41,6 +43,11 @@
|
||||||
|
|
||||||
- (id) initWithData: (NSData *) theData;
|
- (id) initWithData: (NSData *) theData;
|
||||||
- (NSMutableData *) parse;
|
- (NSMutableData *) parse;
|
||||||
|
|
||||||
|
- (RTFFontTable *) parseFontTable;
|
||||||
|
- (void) mangleInternalStateWithBytesPtr: (const char*) newBytes
|
||||||
|
andCurrentPos: (int) newCurrentPos;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -84,6 +91,7 @@
|
||||||
unsigned int index;
|
unsigned int index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (NSString *) description;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -97,8 +105,8 @@
|
||||||
|
|
||||||
- (void) addFontInfo: (RTFFontInfo *) theFontInfo
|
- (void) addFontInfo: (RTFFontInfo *) theFontInfo
|
||||||
atIndex: (unsigned int ) theIndex;
|
atIndex: (unsigned int ) theIndex;
|
||||||
|
|
||||||
- (RTFFontInfo *) fontInfoAtIndex: (unsigned int ) theIndex;
|
- (RTFFontInfo *) fontInfoAtIndex: (unsigned int ) theIndex;
|
||||||
|
- (NSString *) description;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
|
|
||||||
#include "RTFHandler.h"
|
#include "RTFHandler.h"
|
||||||
#include <Foundation/NSValue.h>
|
#include <Foundation/NSValue.h>
|
||||||
|
#include <Foundation/NSException.h>
|
||||||
|
|
||||||
//
|
//
|
||||||
// Useful macros
|
// Useful macros
|
||||||
|
@ -352,6 +353,7 @@ const unsigned short ansicpg874[256] = {
|
||||||
RTFFontInfo *fontInfo;
|
RTFFontInfo *fontInfo;
|
||||||
|
|
||||||
description = [NSMutableString stringWithFormat: @"Number of fonts: %u\n", [fontInfos count]];
|
description = [NSMutableString stringWithFormat: @"Number of fonts: %u\n", [fontInfos count]];
|
||||||
|
|
||||||
enumerator = [fontInfos objectEnumerator];
|
enumerator = [fontInfos objectEnumerator];
|
||||||
while ((fontInfo = [enumerator nextObject]))
|
while ((fontInfo = [enumerator nextObject]))
|
||||||
{
|
{
|
||||||
|
@ -563,6 +565,9 @@ static void _init_fontCws_table()
|
||||||
[super dealloc];
|
[super dealloc];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Returns pointer to the control word and in len pointer its length including numeric argument
|
||||||
|
*/
|
||||||
- (const char *) parseControlWord: (unsigned int *) len
|
- (const char *) parseControlWord: (unsigned int *) len
|
||||||
{
|
{
|
||||||
const char *start, *end;
|
const char *start, *end;
|
||||||
|
@ -1457,4 +1462,12 @@ inline static void parseUl(RTFHandler *self, BOOL hasArg, int arg, RTFFormatting
|
||||||
return [_html autorelease];
|
return [_html autorelease];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This method is for ease of testing and should not be used in normal operations */
|
||||||
|
- (void) mangleInternalStateWithBytesPtr: (const char*) newBytes
|
||||||
|
andCurrentPos: (int) newCurrentPos
|
||||||
|
{
|
||||||
|
_bytes = newBytes;
|
||||||
|
_current_pos = newCurrentPos;
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#import <NGObjWeb/WOContext+SoObjects.h>
|
#import <NGObjWeb/WOContext+SoObjects.h>
|
||||||
#import <SOGo/SOGoUser.h>
|
#import <SOGo/SOGoUser.h>
|
||||||
#import <SOGo/SOGoUserManager.h>
|
#import <SOGo/SOGoUserManager.h>
|
||||||
|
#import <SOGo/SOGoSystemDefaults.h>
|
||||||
|
|
||||||
#import "iCalPerson+SOGo.h"
|
#import "iCalPerson+SOGo.h"
|
||||||
|
|
||||||
|
@ -64,6 +65,10 @@ static SOGoUserManager *um = nil;
|
||||||
return [um getUIDForEmail: [self rfc822Email]];
|
return [um getUIDForEmail: [self rfc822Email]];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
It returns the login if the email of the iCalPerson exists on the
|
||||||
|
domain of the current active user
|
||||||
|
*/
|
||||||
- (NSString *) uidInContext: (WOContext *) context
|
- (NSString *) uidInContext: (WOContext *) context
|
||||||
{
|
{
|
||||||
NSString *domain;
|
NSString *domain;
|
||||||
|
@ -73,18 +78,29 @@ static SOGoUserManager *um = nil;
|
||||||
return [self uidInDomain: domain];
|
return [self uidInDomain: domain];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
It returns the login if the email of the iCalPerson exists on the
|
||||||
|
given domain
|
||||||
|
*/
|
||||||
- (NSString *) uidInDomain: (NSString *) domain
|
- (NSString *) uidInDomain: (NSString *) domain
|
||||||
{
|
{
|
||||||
NSDictionary *contact;
|
NSDictionary *contact;
|
||||||
NSString *uid;
|
NSString *uid = nil;
|
||||||
|
|
||||||
if (!um)
|
if (!um)
|
||||||
um = [SOGoUserManager sharedUserManager];
|
um = [SOGoUserManager sharedUserManager];
|
||||||
|
|
||||||
uid = nil;
|
contact = [um contactInfosForUserWithUIDorEmail: [self rfc822Email]
|
||||||
contact = [um contactInfosForUserWithUIDorEmail: [self rfc822Email] inDomain: domain];
|
inDomain: domain];
|
||||||
if (contact)
|
if (!contact) return nil;
|
||||||
uid = [contact valueForKey: @"c_uid"];
|
|
||||||
|
uid = [contact valueForKey: @"c_uid"];
|
||||||
|
|
||||||
|
// On multidomain environment without DomainLessLogin enabled the login
|
||||||
|
// must have the @domain suffix
|
||||||
|
if ([[SOGoSystemDefaults sharedSystemDefaults] enableDomainBasedUID]
|
||||||
|
&& ![[contact objectForKey: @"DomainLessLogin"] boolValue])
|
||||||
|
uid = [NSString stringWithFormat:@"%@@%@", uid, domain];
|
||||||
|
|
||||||
return uid;
|
return uid;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#import <Foundation/NSAutoreleasePool.h>
|
#import <Foundation/NSAutoreleasePool.h>
|
||||||
#import <Foundation/NSData.h>
|
#import <Foundation/NSData.h>
|
||||||
#import <Foundation/NSDictionary.h>
|
#import <Foundation/NSDictionary.h>
|
||||||
|
#import <Foundation/NSFileManager.h>
|
||||||
#import <Foundation/NSKeyValueCoding.h>
|
#import <Foundation/NSKeyValueCoding.h>
|
||||||
#import <Foundation/NSProcessInfo.h>
|
#import <Foundation/NSProcessInfo.h>
|
||||||
#import <Foundation/NSURL.h>
|
#import <Foundation/NSURL.h>
|
||||||
|
@ -1093,7 +1094,7 @@ static NSString *userAgent = nil;
|
||||||
- (NSException *) saveAttachment: (NSData *) _attach
|
- (NSException *) saveAttachment: (NSData *) _attach
|
||||||
withMetadata: (NSDictionary *) metadata
|
withMetadata: (NSDictionary *) metadata
|
||||||
{
|
{
|
||||||
NSString *p, *name, *mimeType;
|
NSString *p, *pmime, *name, *mimeType;
|
||||||
NSRange r;
|
NSRange r;
|
||||||
|
|
||||||
if (![_attach isNotNull]) {
|
if (![_attach isNotNull]) {
|
||||||
|
@ -1125,14 +1126,13 @@ static NSString *userAgent = nil;
|
||||||
mimeType = [metadata objectForKey: @"mimetype"];
|
mimeType = [metadata objectForKey: @"mimetype"];
|
||||||
if ([mimeType length] > 0)
|
if ([mimeType length] > 0)
|
||||||
{
|
{
|
||||||
p = [self pathToAttachmentWithName:
|
pmime = [self pathToAttachmentWithName: [NSString stringWithFormat: @".%@.mime", name]];
|
||||||
[NSString stringWithFormat: @".%@.mime", name]];
|
if (![[mimeType dataUsingEncoding: NSUTF8StringEncoding] writeToFile: pmime atomically: YES])
|
||||||
if (![[mimeType dataUsingEncoding: NSUTF8StringEncoding]
|
{
|
||||||
writeToFile: p atomically: YES])
|
[[NSFileManager defaultManager] removeItemAtPath: p error: nil];
|
||||||
{
|
return [NSException exceptionWithHTTPStatus: 500 /* Server Error */
|
||||||
return [NSException exceptionWithHTTPStatus:500 /* Server Error */
|
reason: @"Could not write attachment to draft!"];
|
||||||
reason: @"Could not write attachment to draft!"];
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil; /* everything OK */
|
return nil; /* everything OK */
|
||||||
|
|
|
@ -492,36 +492,7 @@ static int cssEscapingCount;
|
||||||
|
|
||||||
- (NSString *) asQPSubjectString: (NSString *) encoding
|
- (NSString *) asQPSubjectString: (NSString *) encoding
|
||||||
{
|
{
|
||||||
NSString *qpString, *subjectString;
|
return [NGMimeHeaderFieldGenerator encodeQuotedPrintableText: self];
|
||||||
NSData *subjectData, *destSubjectData;
|
|
||||||
NSUInteger length, destLength;
|
|
||||||
unsigned char *destString;
|
|
||||||
|
|
||||||
#warning "encoding" parameter is not useful
|
|
||||||
subjectData = [self dataUsingEncoding: NSUTF8StringEncoding];
|
|
||||||
length = [subjectData length];
|
|
||||||
destLength = length * 3;
|
|
||||||
destString = calloc (destLength, sizeof (char));
|
|
||||||
|
|
||||||
NGEncodeQuotedPrintableMime ([subjectData bytes], length,
|
|
||||||
destString, destLength);
|
|
||||||
|
|
||||||
destSubjectData = [NSData dataWithBytesNoCopy: destString
|
|
||||||
length: strlen ((char *) destString)
|
|
||||||
freeWhenDone: YES];
|
|
||||||
qpString = [[NSString alloc] initWithData: destSubjectData
|
|
||||||
encoding: NSASCIIStringEncoding];
|
|
||||||
[qpString autorelease];
|
|
||||||
if ([qpString length] > [self length])
|
|
||||||
{
|
|
||||||
qpString = [qpString stringByReplacingString: @" " withString: @"_"];
|
|
||||||
subjectString = [NSString stringWithFormat: @"=?%@?q?%@?=",
|
|
||||||
encoding, qpString];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
subjectString = self;
|
|
||||||
|
|
||||||
return subjectString;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL) caseInsensitiveMatches: (NSString *) match
|
- (BOOL) caseInsensitiveMatches: (NSString *) match
|
||||||
|
|
|
@ -21,19 +21,24 @@ $(TEST_TOOL)_OBJC_FILES += \
|
||||||
\
|
\
|
||||||
TestSBJsonParser.m \
|
TestSBJsonParser.m \
|
||||||
\
|
\
|
||||||
TestNGMimeAddressHeaderFieldGenerator.m \
|
TestNGMimeHeaderFieldGenerator.m \
|
||||||
TestNGMimeMessageGenerator.m \
|
TestNGMimeMessageGenerator.m \
|
||||||
\
|
\
|
||||||
TestNSData+Crypto.m \
|
TestNSData+Crypto.m \
|
||||||
TestNSString+Crypto.m \
|
TestNSString+Crypto.m \
|
||||||
TestNSString+URLEscaping.m \
|
TestNSString+URLEscaping.m \
|
||||||
TestNSString+Utilities.m \
|
TestNSString+Utilities.m \
|
||||||
TestNGMailAddressParser.m
|
TestNGMailAddressParser.m \
|
||||||
|
\
|
||||||
|
TestRTFHandler.m \
|
||||||
|
../../OpenChange/RTFHandler.m
|
||||||
|
# I don't know how to link against -l:SOGoBackend \
|
||||||
|
undefined reference to `__objc_class_name_SOGoMailFolder'
|
||||||
|
|
||||||
TEST_TOOL_NAME = $(TEST_TOOL)
|
TEST_TOOL_NAME = $(TEST_TOOL)
|
||||||
|
|
||||||
$(TEST_TOOL)_CPPFLAGS += \
|
$(TEST_TOOL)_CPPFLAGS += \
|
||||||
-Wall -D_GNU_SOURCE -I../../SOPE/ -I../../SoObjects/ -I../../UI/
|
-Wall -D_GNU_SOURCE -I../../SOPE/ -I../../SoObjects/ -I../../UI/ -I../../OpenChange
|
||||||
|
|
||||||
ADDITIONAL_LIB_DIRS += \
|
ADDITIONAL_LIB_DIRS += \
|
||||||
-L../../SoObjects/SOGo/SOGo.framework/Versions/Current/sogo -L../../SOPE/NGCards/obj -L../../SOPE/GDLContentStore/obj -lSOGo -lNGMime -lNGCards -lGDLContentStore -lNGExtensions -lSBJson -lobjc \
|
-L../../SoObjects/SOGo/SOGo.framework/Versions/Current/sogo -L../../SOPE/NGCards/obj -L../../SOPE/GDLContentStore/obj -lSOGo -lNGMime -lNGCards -lGDLContentStore -lNGExtensions -lSBJson -lobjc \
|
||||||
|
@ -47,3 +52,4 @@ include $(GNUSTEP_MAKEFILES)/test-tool.make
|
||||||
|
|
||||||
check :: $(TEST_TOOL)
|
check :: $(TEST_TOOL)
|
||||||
./obj/sogo-tests
|
./obj/sogo-tests
|
||||||
|
|
||||||
|
|
|
@ -154,7 +154,8 @@ static NSString *SOGoTestAssertException = @"SOGoTestAssertException";
|
||||||
}
|
}
|
||||||
NS_ENDHANDLER;
|
NS_ENDHANDLER;
|
||||||
|
|
||||||
[testRunner incrementTestCounter: failureCode];
|
[testRunner incrementTestCounter: failureCode
|
||||||
|
afterMethod: NSStringFromSelector (testMethod)];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL) run
|
- (BOOL) run
|
||||||
|
|
|
@ -35,20 +35,31 @@ typedef enum {
|
||||||
SOGoTestFailureError = 2,
|
SOGoTestFailureError = 2,
|
||||||
} SOGoTestFailureCode;
|
} SOGoTestFailureCode;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
SOGoTestTextOutputFormat = 0,
|
||||||
|
SOGoTestJUnitOutputFormat
|
||||||
|
} SOGoTestOutputFormat;
|
||||||
|
|
||||||
@interface SOGoTestRunner : NSObject
|
@interface SOGoTestRunner : NSObject
|
||||||
{
|
{
|
||||||
NSMutableArray *messages;
|
/* An array of arrays whose components are the method name and the
|
||||||
|
failure message if any */
|
||||||
|
NSMutableArray *performedTests;
|
||||||
int testCount;
|
int testCount;
|
||||||
int failuresCount;
|
int failuresCount;
|
||||||
int errorsCount;
|
int errorsCount;
|
||||||
BOOL hasFailed;
|
BOOL hasFailed;
|
||||||
|
SOGoTestOutputFormat reportFormat;
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (SOGoTestRunner *) testRunner;
|
+ (SOGoTestRunner *) testRunnerWithFormat: (SOGoTestOutputFormat) reportFormat;
|
||||||
|
|
||||||
|
- (void) setReportFormat: (SOGoTestOutputFormat) format;
|
||||||
|
|
||||||
- (int) run;
|
- (int) run;
|
||||||
|
|
||||||
- (void) incrementTestCounter: (SOGoTestFailureCode) failureCode;
|
- (void) incrementTestCounter: (SOGoTestFailureCode) failureCode
|
||||||
|
afterMethod: (NSString *) methodName;
|
||||||
- (void) reportException: (NSException *) exception
|
- (void) reportException: (NSException *) exception
|
||||||
method: (NSString *) methodName
|
method: (NSString *) methodName
|
||||||
withCode: (SOGoTestFailureCode) failureCode;
|
withCode: (SOGoTestFailureCode) failureCode;
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
|
|
||||||
#import <Foundation/NSArray.h>
|
#import <Foundation/NSArray.h>
|
||||||
#import <Foundation/NSAutoreleasePool.h>
|
#import <Foundation/NSAutoreleasePool.h>
|
||||||
|
#import <Foundation/NSDate.h>
|
||||||
#import <Foundation/NSDictionary.h>
|
#import <Foundation/NSDictionary.h>
|
||||||
#import <Foundation/NSEnumerator.h>
|
#import <Foundation/NSEnumerator.h>
|
||||||
#import <Foundation/NSException.h>
|
#import <Foundation/NSException.h>
|
||||||
|
@ -31,15 +32,16 @@
|
||||||
|
|
||||||
#import "SOGoTestRunner.h"
|
#import "SOGoTestRunner.h"
|
||||||
|
|
||||||
#define EXPECTED_FAILURES 3
|
#define EXPECTED_FAILURES 0
|
||||||
|
|
||||||
@implementation SOGoTestRunner
|
@implementation SOGoTestRunner
|
||||||
|
|
||||||
+ (SOGoTestRunner *) testRunner
|
+ (SOGoTestRunner *) testRunnerWithFormat: (SOGoTestOutputFormat) reportFormat
|
||||||
{
|
{
|
||||||
SOGoTestRunner *testRunner;
|
SOGoTestRunner *testRunner;
|
||||||
|
|
||||||
testRunner = [self new];
|
testRunner = [self new];
|
||||||
|
[testRunner setReportFormat: reportFormat];
|
||||||
[testRunner autorelease];
|
[testRunner autorelease];
|
||||||
|
|
||||||
return testRunner;
|
return testRunner;
|
||||||
|
@ -53,7 +55,8 @@
|
||||||
failuresCount = 0;
|
failuresCount = 0;
|
||||||
errorsCount = 0;
|
errorsCount = 0;
|
||||||
hasFailed = NO;
|
hasFailed = NO;
|
||||||
messages = [NSMutableArray new];
|
performedTests = [NSMutableArray new];
|
||||||
|
reportFormat = SOGoTestTextOutputFormat;
|
||||||
}
|
}
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
|
@ -61,10 +64,15 @@
|
||||||
|
|
||||||
- (void) dealloc
|
- (void) dealloc
|
||||||
{
|
{
|
||||||
[messages release];
|
[performedTests release];
|
||||||
[super dealloc];
|
[super dealloc];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void) setReportFormat: (SOGoTestOutputFormat) format
|
||||||
|
{
|
||||||
|
reportFormat = format;
|
||||||
|
}
|
||||||
|
|
||||||
- (int) run
|
- (int) run
|
||||||
{
|
{
|
||||||
NSEnumerator *allTestClasses;
|
NSEnumerator *allTestClasses;
|
||||||
|
@ -95,11 +103,16 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) incrementTestCounter: (SOGoTestFailureCode) failureCode
|
- (void) incrementTestCounter: (SOGoTestFailureCode) failureCode
|
||||||
|
afterMethod: (NSString *) methodName
|
||||||
{
|
{
|
||||||
static char failureChars[] = { '.', 'F', 'E' };
|
static char failureChars[] = { '.', 'F', 'E' };
|
||||||
|
|
||||||
testCount++;
|
testCount++;
|
||||||
fprintf (stderr, "%c", failureChars[failureCode]);
|
if (reportFormat == SOGoTestTextOutputFormat)
|
||||||
|
fprintf (stderr, "%c", failureChars[failureCode]);
|
||||||
|
if (failureCode == SOGoTestFailureSuccess)
|
||||||
|
[performedTests addObject: [NSArray arrayWithObjects: methodName, @"", nil]];
|
||||||
|
/* else has been added by reportException method */
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) reportException: (NSException *) exception
|
- (void) reportException: (NSException *) exception
|
||||||
|
@ -134,13 +147,27 @@
|
||||||
errorsCount++;
|
errorsCount++;
|
||||||
}
|
}
|
||||||
[message appendString: @"\n"];
|
[message appendString: @"\n"];
|
||||||
[messages addObject: message];
|
|
||||||
|
[performedTests addObject:
|
||||||
|
[NSArray arrayWithObjects: methodName, message, [NSNumber numberWithInt: failureCode], nil]];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) displayReport
|
- (void) displayTextReport
|
||||||
{
|
{
|
||||||
static NSString *separator = @"\n======================================================================\n";
|
static NSString *separator = @"\n======================================================================\n";
|
||||||
|
NSArray *performedTest;
|
||||||
|
NSMutableArray *messages;
|
||||||
NSString *reportMessage;
|
NSString *reportMessage;
|
||||||
|
NSUInteger i, max;
|
||||||
|
|
||||||
|
messages = [NSMutableArray new];
|
||||||
|
max = [performedTests count];
|
||||||
|
for (i = 0; i < max; i++)
|
||||||
|
{
|
||||||
|
performedTest = [performedTests objectAtIndex: i];
|
||||||
|
if ([[performedTest objectAtIndex: 1] length] > 0)
|
||||||
|
[messages addObject: [performedTest objectAtIndex: 1]];
|
||||||
|
}
|
||||||
|
|
||||||
if ([messages count])
|
if ([messages count])
|
||||||
{
|
{
|
||||||
|
@ -148,6 +175,9 @@
|
||||||
reportMessage = [messages componentsJoinedByString: separator];
|
reportMessage = [messages componentsJoinedByString: separator];
|
||||||
fprintf (stderr, "%s", [reportMessage UTF8String]);
|
fprintf (stderr, "%s", [reportMessage UTF8String]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[messages release];
|
||||||
|
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
"\n----------------------------------------------------------------------\n"
|
"\n----------------------------------------------------------------------\n"
|
||||||
"Ran %d tests\n\n", testCount);
|
"Ran %d tests\n\n", testCount);
|
||||||
|
@ -158,4 +188,58 @@
|
||||||
fprintf (stderr, "OK\n");
|
fprintf (stderr, "OK\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void) displayJUnitReport
|
||||||
|
{
|
||||||
|
/* Follow JUnit.xsd defined by Apache-Ant project */
|
||||||
|
NSArray *performedTest;
|
||||||
|
NSMutableString *reportMessage;
|
||||||
|
NSUInteger i, max;
|
||||||
|
|
||||||
|
/* Header */
|
||||||
|
reportMessage = [NSMutableString stringWithFormat: @"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
|
||||||
|
@"<testsuite "
|
||||||
|
@"name=\"%@\" id=\"0\" tests=\"%d\" errors=\"%d\" failures=\"%d\" "
|
||||||
|
@"timestamp=\"%@\">\n"
|
||||||
|
@"<desc>%@</desc>\n",
|
||||||
|
@"SOGoUnitTests", testCount, errorsCount, failuresCount,
|
||||||
|
[NSDate date],
|
||||||
|
@"SOGo and SOPE Unit tests"];
|
||||||
|
|
||||||
|
/* Test cases */
|
||||||
|
max = [performedTests count];
|
||||||
|
for (i = 0; i < max; i++)
|
||||||
|
{
|
||||||
|
performedTest = [performedTests objectAtIndex: i];
|
||||||
|
[reportMessage appendFormat: @"<testcase name=\"%@\">\n", [performedTest objectAtIndex: 0]];
|
||||||
|
if ([[performedTest objectAtIndex: 1] length] > 0)
|
||||||
|
{
|
||||||
|
if ([performedTest count] > 2 && [[performedTest objectAtIndex: 2] intValue] == SOGoTestFailureFailure)
|
||||||
|
[reportMessage appendFormat: @"<failure>%@</failure>\n", [performedTest objectAtIndex: 1]];
|
||||||
|
else
|
||||||
|
[reportMessage appendFormat: @"<error>%@</error>\n", [performedTest objectAtIndex: 1]];
|
||||||
|
}
|
||||||
|
[reportMessage appendString: @"</testcase>\n"];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* End */
|
||||||
|
[reportMessage appendString: @"</testsuite>"];
|
||||||
|
|
||||||
|
fprintf (stdout, "%s", [reportMessage UTF8String]);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) displayReport
|
||||||
|
{
|
||||||
|
switch (reportFormat)
|
||||||
|
{
|
||||||
|
case SOGoTestTextOutputFormat:
|
||||||
|
[self displayTextReport];
|
||||||
|
break;
|
||||||
|
;;
|
||||||
|
case SOGoTestJUnitOutputFormat:
|
||||||
|
[self displayJUnitReport];
|
||||||
|
break;
|
||||||
|
;;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
@"johndown@test.com", // email alone
|
@"johndown@test.com", // email alone
|
||||||
@"<johndown@test.com>", // email between brackets
|
@"<johndown@test.com>", // email between brackets
|
||||||
@"\"<johndown@test.com>\" <johndown@test.com>", // doubled
|
@"\"<johndown@test.com>\" <johndown@test.com>", // doubled
|
||||||
// @"\"johndown@inverse.ca\" <johndown@test.com>", // with and without br.
|
@"\"johndown@inverse.ca\" <johndown@test.com>", // with and without br.
|
||||||
@"=?utf-8?q?=C3=80=C3=B1in=C3=A9oblabla?= <johndown@test.com>", // accented full name
|
@"=?utf-8?q?=C3=80=C3=B1in=C3=A9oblabla?= <johndown@test.com>", // accented full name
|
||||||
@"=?utf-8?q?=C3=80=C3=B1in=C3=A9oblabla_Bla_Bl=C3=A9?= <johndown@test.com>", // accented and multiword
|
@"=?utf-8?q?=C3=80=C3=B1in=C3=A9oblabla_Bla_Bl=C3=A9?= <johndown@test.com>", // accented and multiword
|
||||||
@"John Down \"Bla Bla\" <johndown@test.com>", // partly quoted
|
@"John Down \"Bla Bla\" <johndown@test.com>", // partly quoted
|
||||||
|
@ -45,14 +45,13 @@
|
||||||
@"john", // name only, no domain
|
@"john", // name only, no domain
|
||||||
nil ];
|
nil ];
|
||||||
NSArray *expectedAddresses = [NSArray arrayWithObjects:
|
NSArray *expectedAddresses = [NSArray arrayWithObjects:
|
||||||
@"johndown@test.com", // email alone
|
@"johndown@test.com", // email alone
|
||||||
@"johndown@test.com", // email between brackets
|
@"johndown@test.com", // email between brackets
|
||||||
@"johndown@test.com", // doubled
|
@"johndown@test.com", // doubled
|
||||||
// @"\"johndown@inverse.ca\" <johndown@test.com>", // with and without br.
|
@"johndown@test.com", // with and without br.
|
||||||
@"johndown@test.com", // accented full name
|
@"johndown@test.com", // accented full name
|
||||||
@"johndown@test.com", // accented
|
@"johndown@test.com", // accented
|
||||||
// and multiword
|
// and multiword
|
||||||
|
|
||||||
/* NOTE: the following are wrong but tolerated for now */
|
/* NOTE: the following are wrong but tolerated for now */
|
||||||
@"johndown@test.com", // partly quoted
|
@"johndown@test.com", // partly quoted
|
||||||
@"johndown@test.com", // full name + email
|
@"johndown@test.com", // full name + email
|
||||||
|
@ -72,8 +71,8 @@
|
||||||
parsedRecipient = [parser parse];
|
parsedRecipient = [parser parse];
|
||||||
result = [parsedRecipient address];
|
result = [parsedRecipient address];
|
||||||
error = [NSString
|
error = [NSString
|
||||||
stringWithFormat: @"received '%@' instead of '%@' for '%@'",
|
stringWithFormat: @"[%d] received '%@' instead of '%@' for '%@'",
|
||||||
result, currentExp, rawAddress];
|
count, result, currentExp, rawAddress];
|
||||||
testWithMessage([result isEqualToString: currentExp], error);
|
testWithMessage([result isEqualToString: currentExp], error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,113 +19,97 @@
|
||||||
#import "SOGoTest.h"
|
#import "SOGoTest.h"
|
||||||
#import <NGMail/NGMimeMessageGenerator.h>
|
#import <NGMail/NGMimeMessageGenerator.h>
|
||||||
|
|
||||||
|
|
||||||
@interface TestNGMimeMessageGenerator : SOGoTest
|
@interface TestNGMimeMessageGenerator : SOGoTest
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation TestNGMimeMessageGenerator
|
@implementation TestNGMimeMessageGenerator
|
||||||
|
|
||||||
|
/*
|
||||||
|
This test is actually for SOPE library, not SOGo
|
||||||
|
*/
|
||||||
- (void) test_generateDataForHeaderField_value
|
- (void) test_generateDataForHeaderField_value
|
||||||
{
|
{
|
||||||
NGMimeMessageGenerator *generator;
|
|
||||||
NSArray *cases = [NSArray arrayWithObjects:
|
NSArray *cases = [NSArray arrayWithObjects:
|
||||||
[NSArray arrayWithObjects: @"Message-ID", @"<CADCKkzo+9X1SniJFY3yc7YGafNrmAts419RmcqNkMzd-PBqNbA@mail.gmail.com>", @"<CADCKkzo+9X1SniJFY3yc7YGafNrmAts419RmcqNkMzd-PBqNbA@mail.gmail.com>", nil],
|
[NSArray arrayWithObjects:@"Message-ID",
|
||||||
[NSArray arrayWithObjects: @"Content-Type",
|
@"<CADCKkzo+9X1SniJFY3yc7YGafNrmAts419RmcqNkMzd-PBqNbA@mail.gmail.com>",
|
||||||
@"text/plain; charset=utf-8; format=flowed",
|
@"<CADCKkzo+9X1SniJFY3yc7YGafNrmAts419RmcqNkMzd-PBqNbA@mail.gmail.com>", nil],
|
||||||
@"text/plain; charset=utf-8; format=flowed",
|
[NSArray arrayWithObjects:@"Content-Type",
|
||||||
nil],
|
@"text/plain; charset=utf-8; format=flowed",
|
||||||
[NSArray arrayWithObjects: @"X-FullHeaderOneHebrewOneLatin",
|
@"text/plain; charset=utf-8; format=flowed", nil],
|
||||||
@"עs",
|
[NSArray arrayWithObjects:@"X-FullHeaderOneHebrewOneLatin",
|
||||||
@"=?utf-8?q?=D7=A2s?=",
|
@"עs",
|
||||||
nil],
|
@"=?utf-8?q?=D7=A2s?=", nil],
|
||||||
[NSArray arrayWithObjects: @"X-FullHeaderOneLatineOneHebrew",
|
[NSArray arrayWithObjects:@"X-FullHeaderOneLatineOneHebrew",
|
||||||
@"sע",
|
@"sע",
|
||||||
@"=?utf-8?q?s=D7=A2?=",
|
@"=?utf-8?q?s=D7=A2?=", nil],
|
||||||
nil],
|
[NSArray arrayWithObjects:@"X-FullHeaderOneCharacterHebrew",
|
||||||
[NSArray arrayWithObjects: @"X-FullHeaderOneCharacterHebrew",
|
@"ע",
|
||||||
@"ע",
|
@"=?utf-8?q?=D7=A2?=", nil],
|
||||||
@"=?utf-8?q?=D7=A2?=",
|
[NSArray arrayWithObjects:@"X-FullHeaderOneCharacterRussian",
|
||||||
nil],
|
@"Б",
|
||||||
[NSArray arrayWithObjects: @"X-FullHeaderOneCharacterRussian",
|
@"=?utf-8?q?=D0=91?=", nil],
|
||||||
@"Б",
|
[NSArray arrayWithObjects:@"X-FullHeaderParameter",
|
||||||
@"=?utf-8?q?=D0=91?=",
|
@"parameter=ע",
|
||||||
nil],
|
@"parameter==?utf-8?q?=D7=A2?=", nil],
|
||||||
|
[NSArray arrayWithObjects:@"X-MixedHeaderParameters",
|
||||||
[NSArray arrayWithObjects: @"X-FullHeaderParameter",
|
@"plain; parameter=ע; parameter-plain; parameter2=ea",
|
||||||
@"parameter=ע",
|
@"plain;\n parameter==?utf-8?q?=D7=A2?=;\n parameter-plain; parameter2=ea", nil],
|
||||||
@"parameter==?utf-8?q?=D7=A2?=",
|
[NSArray arrayWithObjects:@"X-MixedHeaderAndNoParameter",
|
||||||
nil],
|
@"plain; parameter=ע; parameter-plain; ע",
|
||||||
[NSArray arrayWithObjects: @"X-MixedHeaderParameters",
|
@"plain;\n parameter==?utf-8?q?=D7=A2?=; parameter-plain;\n =?utf-8?q?=D7=A2?=", nil],
|
||||||
@"plain; parameter=ע; parameter-plain; parameter2=ea",
|
[NSArray arrayWithObjects:@"X-MixedHeaderAndTwoParameter",
|
||||||
@"plain;\n parameter==?utf-8?q?=D7=A2?=;\n parameter-plain; parameter2=ea",
|
@"plain; parameter=ע; parameter-plain; z=ע",
|
||||||
nil],
|
@"plain;\n parameter==?utf-8?q?=D7=A2?=; parameter-plain;\n z==?utf-8?q?=D7=A2?=", nil],
|
||||||
[NSArray arrayWithObjects: @"X-MixedHeaderAndNoParameter",
|
[NSArray arrayWithObjects:@"X-MixedHeaderExtrablanks",
|
||||||
@"plain; parameter=ע; parameter-plain; ע",
|
@"plain; parameter=ע; parameter 2spaces; parameter2=ea",
|
||||||
@"plain;\n parameter==?utf-8?q?=D7=A2?=; parameter-plain;\n =?utf-8?q?=D7=A2?=",
|
@"plain;\n \\ parameter==?utf-8?q?=D7=A2?=;\n parameter 2spaces; parameter2=ea", nil],
|
||||||
nil],
|
[NSArray arrayWithObjects:@"X-Encoded-Unbalanced-Paramter-Quote",
|
||||||
|
@"text/plain; name=\"ע",
|
||||||
[NSArray arrayWithObjects: @"X-MixedHeaderAndTwoParameter",
|
@"text/plain;\n name==?utf-8?q?=22=D7=A2?=", nil],
|
||||||
@"plain; parameter=ע; parameter-plain; z=ע",
|
[NSArray arrayWithObjects:@"content-type",
|
||||||
@"plain;\n parameter==?utf-8?q?=D7=A2?=; parameter-plain;\n z==?utf-8?q?=D7=A2?=",
|
@"text/plain; name=\"АБВГДЕЁЖЗИЙ, КЛМНОПРСТУФ y ЦЧШЩЪЫЬЭЮЯ.txt\"",
|
||||||
nil],
|
@"text/plain;\n name=\"=?utf-8?q?=D0=90=D0=91=D0=92=D0=93=D0=94=D0=95=D0=81=D0=96=D0=97=D0=98=D0=99=2C_=D0=9A=D0"
|
||||||
[NSArray arrayWithObjects: @"X-MixedHeaderExtrablanks",
|
@"=9B=D0=9C=D0=9D=D0=9E=D0=9F=D0=A0=D0=A1=D0=A2=D0=A3=D0=A4_y_=D0=A6=D0=A7=D0=A8"
|
||||||
@"plain; parameter=ע; parameter 2spaces; parameter2=ea",
|
@"=D0=A9=D0=AA=D0=AB=D0=AC=D0=AD=D0=AE=D0=AF=2Etxt?=\"", nil],
|
||||||
@"plain;\n \\ parameter==?utf-8?q?=D7=A2?=;\n parameter 2spaces; parameter2=ea",
|
[NSArray arrayWithObjects:@"content-disposition",
|
||||||
nil],
|
@"attachment; filename=\"АБВГДЕЁЖЗИЙ, КЛМНОПРСТУФ y ЦЧШЩЪЫЬЭЮЯ.txt\"",
|
||||||
[NSArray arrayWithObjects: @"X-Encoded-Unbalanced-Paramter-Quote",
|
@"attachment;\n filename=\"=?utf-8?q?=D0=90=D0=91=D0=92=D0=93=D0=94=D0=95=D0=81=D0=96=D0=97=D0=98=D0=99=2C_=D0=9A=D0"
|
||||||
@"text/plain; name=\"ע",
|
@"=9B=D0=9C=D0=9D=D0=9E=D0=9F=D0=A0=D0=A1=D0=A2=D0=A3=D0=A4_y_=D0=A6=D0=A7=D0=A8"
|
||||||
@"text/plain;\n name==?utf-8?q?=22=D7=A2?=",
|
@"=D0=A9=D0=AA=D0=AB=D0=AC=D0=AD=D0=AE=D0=AF=2Etxt?=\"", nil],
|
||||||
nil],
|
[NSArray arrayWithObjects:@"content-length", @"2912", @"2912", nil],
|
||||||
[NSArray arrayWithObjects: @"content-type",
|
[NSArray arrayWithObjects:@"content-transfer-encoding", @"quoted-printable", @"quoted-printable", nil],
|
||||||
@"text/plain; name=\"АБВГДЕЁЖЗИЙ, КЛМНОПРСТУФ y ЦЧШЩЪЫЬЭЮЯ.txt\"",
|
nil
|
||||||
@"text/plain;\n name=\"=?utf-8?q?=D0=90=D0=91=D0=92=D0=93=D0=94=D0=95=D0=81=D0=96=D0=97=D0=98=D0=99=2C_=D0=9A=D0=9B=D0=9C=D0=9D=D0=9E=D0=9F=D0=A0=D0=A1=D0=A2=D0=A3=D0=A4_y_=D0=A6=D0=A7=D0=A8=D0=A9=D0=AA=D0=AB=D0=AC=D0=AD=D0=AE=D0=AF=2Etxt?=\"",
|
];
|
||||||
nil],
|
|
||||||
[NSArray arrayWithObjects: @"content-disposition",
|
|
||||||
@"attachment; filename=\"АБВГДЕЁЖЗИЙ, КЛМНОПРСТУФ y ЦЧШЩЪЫЬЭЮЯ.txt\"",
|
|
||||||
@"attachment;\n filename=\"=?utf-8?q?=D0=90=D0=91=D0=92=D0=93=D0=94=D0=95=D0=81=D0=96=D0=97=D0=98=D0=99=2C_=D0=9A=D0=9B=D0=9C=D0=9D=D0=9E=D0=9F=D0=A0=D0=A1=D0=A2=D0=A3=D0=A4_y_=D0=A6=D0=A7=D0=A8=D0=A9=D0=AA=D0=AB=D0=AC=D0=AD=D0=AE=D0=AF=2Etxt?=\"",
|
|
||||||
nil],
|
|
||||||
[NSArray arrayWithObjects: @"content-length", @"2912", @"2912", nil],
|
|
||||||
[NSArray arrayWithObjects: @"content-transfer-encoding", @"quoted-printable", @"quoted-printable", nil],
|
|
||||||
nil
|
|
||||||
];
|
|
||||||
NSEnumerator *enumerator;
|
|
||||||
NSArray *testCase;
|
|
||||||
|
|
||||||
[NGMimeMessageGenerator initialize];
|
[NGMimeMessageGenerator initialize];
|
||||||
generator = [[NGMimeMessageGenerator alloc] init];
|
NGMimeMessageGenerator *generator = [[NGMimeMessageGenerator alloc] init];
|
||||||
[generator autorelease];
|
[generator autorelease];
|
||||||
|
|
||||||
enumerator = [cases objectEnumerator];
|
for (NSArray *testCase in cases)
|
||||||
while ((testCase = [enumerator nextObject]) != nil)
|
|
||||||
{
|
{
|
||||||
NSData *result;
|
|
||||||
NSMutableData *resultWithNulByte;
|
|
||||||
NSString *header = [testCase objectAtIndex: 0];
|
NSString *header = [testCase objectAtIndex: 0];
|
||||||
NSData *headerData = [testCase objectAtIndex: 1];
|
NSData *headerData = [testCase objectAtIndex: 1];
|
||||||
NSString *expected = [testCase objectAtIndex: 2];
|
NSString *expected = [testCase objectAtIndex: 2];
|
||||||
result = [generator generateDataForHeaderField: header
|
NSData *result = [generator generateDataForHeaderField: header
|
||||||
value: headerData];
|
value: headerData];
|
||||||
if (result == nil)
|
if (result == nil)
|
||||||
result = [@"[nil]" dataUsingEncoding: NSUTF8StringEncoding];
|
result = [@"[nil]" dataUsingEncoding: NSUTF8StringEncoding];
|
||||||
|
|
||||||
resultWithNulByte = [result mutableCopy];
|
NSMutableData *resultWithNulByte = [result mutableCopy];
|
||||||
[resultWithNulByte appendBytes: "\0" length: 1];
|
[resultWithNulByte appendBytes: "\0" length: 1];
|
||||||
NSString *resultString = [NSString stringWithCString:[resultWithNulByte bytes]];
|
NSString *resultString = [NSString stringWithCString:[resultWithNulByte bytes]];
|
||||||
|
|
||||||
|
|
||||||
BOOL testResult = [resultString isEqualToString: expected];
|
BOOL testResult = [resultString isEqualToString: expected];
|
||||||
|
|
||||||
NSString *diff = [self stringFromDiffBetween: [NSString stringWithString: resultString]
|
NSString *diff = [self stringFromDiffBetween: resultString and: expected];
|
||||||
and: [NSString stringWithString: expected]];
|
|
||||||
NSString *testErrorMsg = [NSString
|
NSString *testErrorMsg = [NSString stringWithFormat:
|
||||||
stringWithFormat: @">> For %@ header received:\n%@[END]\n>> instead of:\n%@[END]\n>> for:\n%@\n>> diff:\n%@\n>> lengthReceived: %lu lengthExpected: %lu",
|
@">> For %@ header received:\n%@[END]\n"
|
||||||
header,
|
@">> instead of:\n%@[END]\n"
|
||||||
resultString,
|
@">> for:\n%@\n>> diff:\n%@\n"
|
||||||
expected,
|
@">> lengthReceived: %lu lengthExpected: %lu", header, resultString,
|
||||||
headerData,
|
expected, headerData, diff, [resultString length], [expected length]];
|
||||||
diff,
|
|
||||||
[resultString length],
|
|
||||||
[expected length]
|
|
||||||
];
|
|
||||||
|
|
||||||
testWithMessage(testResult, testErrorMsg);
|
testWithMessage(testResult, testErrorMsg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
/* TestNSString+Utilities.m - this file is part of SOGo
|
/* TestNSString+Utilities.m - this file is part of SOGo
|
||||||
*
|
*
|
||||||
* Copyright (C) 2011 Inverse inc
|
* Copyright (C) 2011 Inverse inc
|
||||||
|
* Copyright (C) 2014 Zentyal
|
||||||
*
|
*
|
||||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||||
|
* Jesús García Sáez <jgarcia@zentyal.com>
|
||||||
*
|
*
|
||||||
* This file is free software; you can redistribute it and/or modify
|
* This file is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -23,7 +25,7 @@
|
||||||
/* This file is encoded in utf-8. */
|
/* This file is encoded in utf-8. */
|
||||||
|
|
||||||
#import <SOGo/NSString+Utilities.h>
|
#import <SOGo/NSString+Utilities.h>
|
||||||
|
#import <Foundation/NSNull.h>
|
||||||
#import "SOGoTest.h"
|
#import "SOGoTest.h"
|
||||||
|
|
||||||
@interface TestNSString_plus_Utilities : SOGoTest
|
@interface TestNSString_plus_Utilities : SOGoTest
|
||||||
|
@ -52,7 +54,7 @@
|
||||||
NSString *secret = @"this is a secret";
|
NSString *secret = @"this is a secret";
|
||||||
NSString *password = @"qwerty";
|
NSString *password = @"qwerty";
|
||||||
NSString *encresult, *decresult;
|
NSString *encresult, *decresult;
|
||||||
|
|
||||||
encresult = [secret encryptWithKey: nil];
|
encresult = [secret encryptWithKey: nil];
|
||||||
failIf(encresult != nil);
|
failIf(encresult != nil);
|
||||||
encresult = [secret encryptWithKey: @""];
|
encresult = [secret encryptWithKey: @""];
|
||||||
|
@ -70,4 +72,28 @@
|
||||||
failIf(![decresult isEqualToString: secret]);
|
failIf(![decresult isEqualToString: secret]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void) test_objectFromJSONString_single_values
|
||||||
|
{
|
||||||
|
NSString *json, *error;
|
||||||
|
NSInteger expected = 1;
|
||||||
|
id result;
|
||||||
|
|
||||||
|
// Decode null
|
||||||
|
json = [NSString stringWithFormat:@"null"];
|
||||||
|
result = [json objectFromJSONString];
|
||||||
|
testWithMessage(result == [NSNull null], @"Result should be null");
|
||||||
|
|
||||||
|
// Decode number
|
||||||
|
json = [NSString stringWithFormat:@"1"];
|
||||||
|
result = [json objectFromJSONString];
|
||||||
|
error = [NSString stringWithFormat: @"result %@ != expected %d",
|
||||||
|
result, expected];
|
||||||
|
testWithMessage((long)result != (long)expected, error);
|
||||||
|
|
||||||
|
// Decode string
|
||||||
|
json = [NSString stringWithFormat:@"\"kill me\""];
|
||||||
|
result = [json objectFromJSONString];
|
||||||
|
testEquals(result, @"kill me");
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#import <Foundation/NSException.h>
|
#import <Foundation/NSException.h>
|
||||||
|
#import <Foundation/NSLocale.h>
|
||||||
#import <Foundation/NSString.h>
|
#import <Foundation/NSString.h>
|
||||||
#import <Foundation/NSValue.h>
|
#import <Foundation/NSValue.h>
|
||||||
|
|
||||||
|
@ -71,6 +72,8 @@
|
||||||
{
|
{
|
||||||
SBJsonParser *parser;
|
SBJsonParser *parser;
|
||||||
id result;
|
id result;
|
||||||
|
NSDecimalNumber *obtained, *expected;
|
||||||
|
NSDictionary *locale;
|
||||||
|
|
||||||
parser = [SBJsonParser new];
|
parser = [SBJsonParser new];
|
||||||
[parser autorelease];
|
[parser autorelease];
|
||||||
|
@ -80,17 +83,20 @@
|
||||||
|
|
||||||
result = [parser objectWithString: @"[ 0 ]"];
|
result = [parser objectWithString: @"[ 0 ]"];
|
||||||
testEquals (result, [NSArray arrayWithObject: [NSNumber numberWithInt: 0]]);
|
testEquals (result, [NSArray arrayWithObject: [NSNumber numberWithInt: 0]]);
|
||||||
|
|
||||||
result = [parser objectWithString: @"[ -1 ]"];
|
result = [parser objectWithString: @"[ -1 ]"];
|
||||||
testEquals (result, [NSArray arrayWithObject: [NSNumber numberWithInt: -1]]);
|
testEquals (result, [NSArray arrayWithObject: [NSNumber numberWithInt: -1]]);
|
||||||
|
|
||||||
|
locale = [NSDictionary dictionaryWithObject: @"." forKey: NSLocaleDecimalSeparator];
|
||||||
result = [parser objectWithString: @"[ 12.3456 ]"];
|
result = [parser objectWithString: @"[ 12.3456 ]"];
|
||||||
testEquals ([result objectAtIndex: 0],
|
obtained = [result objectAtIndex: 0];
|
||||||
[NSDecimalNumber decimalNumberWithString: @"12.3456"]);
|
expected = [NSDecimalNumber decimalNumberWithString: @"12.3456" locale: locale];
|
||||||
|
test ([obtained compare: expected] == NSOrderedSame);
|
||||||
|
|
||||||
result = [parser objectWithString: @"[ -312.3456 ]"];
|
result = [parser objectWithString: @"[ -312.3456 ]"];
|
||||||
testEquals (result, [NSArray arrayWithObject: [NSNumber numberWithDouble: -312.3456]]);
|
obtained = [result objectAtIndex: 0];
|
||||||
|
expected = [NSDecimalNumber decimalNumberWithString: @"-312.3456" locale: locale];
|
||||||
|
test ([obtained compare: expected] == NSOrderedSame);
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
|
|
||||||
/* TODO: this test fails for obscure reasons, but test__occurrenceForDate_byRRule_ does not, which
|
/* TODO: this test fails for obscure reasons, but test__occurrenceForDate_byRRule_ does not, which
|
||||||
is a good sign */
|
is a good sign */
|
||||||
|
/*
|
||||||
- (void) test_occurrenceForDate_
|
- (void) test_occurrenceForDate_
|
||||||
{
|
{
|
||||||
NSString *periods[] = { (@"BEGIN:DAYLIGHT\r\n"
|
NSString *periods[] = { (@"BEGIN:DAYLIGHT\r\n"
|
||||||
|
@ -84,7 +85,7 @@
|
||||||
@" delta = %ld", count, delta]));
|
@" delta = %ld", count, delta]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
- (void) test__occurrenceForDate_byRRule_
|
- (void) test__occurrenceForDate_byRRule_
|
||||||
{
|
{
|
||||||
/* all rules are happening on 2010-03-14 */
|
/* all rules are happening on 2010-03-14 */
|
||||||
|
|
|
@ -21,15 +21,91 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
|
#import <Foundation/NSProcessInfo.h>
|
||||||
|
|
||||||
#import "SOGoTestRunner.h"
|
#import "SOGoTestRunner.h"
|
||||||
|
|
||||||
int main()
|
static void Usage ()
|
||||||
|
{
|
||||||
|
/* Print usage and exit */
|
||||||
|
NSLog (@"sogo-tests [-h|--help] [-f|--format=text|junit]\n"
|
||||||
|
@" -h, --help\t\t\tdisplay this help information\n"
|
||||||
|
@" -f, --format=text|junit\treport format. Default: text\n\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static SOGoTestOutputFormat ParseArguments (NSArray *args)
|
||||||
|
{
|
||||||
|
/* Parse arguments from command line */
|
||||||
|
BOOL help = NO;
|
||||||
|
NSString *arg, *format = nil;
|
||||||
|
NSUInteger i, max;
|
||||||
|
SOGoTestOutputFormat outFormat;
|
||||||
|
|
||||||
|
max = [args count];
|
||||||
|
/* Skip program name */
|
||||||
|
i = 1;
|
||||||
|
while (!help && i < max)
|
||||||
|
{
|
||||||
|
arg = [args objectAtIndex: i];
|
||||||
|
if ([arg isEqualToString: @"-f"] || [arg isEqualToString: @"--format"])
|
||||||
|
{
|
||||||
|
NSArray *validFormats = [NSArray arrayWithObjects: @"text", @"junit", nil];
|
||||||
|
i++;
|
||||||
|
if (i < max)
|
||||||
|
{
|
||||||
|
arg = [args objectAtIndex: i];
|
||||||
|
if ([validFormats containsObject: arg])
|
||||||
|
format = arg;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
help = YES;
|
||||||
|
NSLog (@"Invalid format: '%@'. Use 'text' or 'junit'", arg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NSLog (@"Missing format argument");
|
||||||
|
help = YES;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ([arg isEqualToString: @"-h"]
|
||||||
|
|| [arg isEqualToString: @"--help"])
|
||||||
|
help = YES;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NSLog (@"Invalid command line argument: '%@'", arg);
|
||||||
|
help = YES;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (help)
|
||||||
|
{
|
||||||
|
Usage ();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (format)
|
||||||
|
{
|
||||||
|
if ([format isEqualToString: @"text"])
|
||||||
|
outFormat = SOGoTestTextOutputFormat;
|
||||||
|
else if ([format isEqualToString: @"junit"])
|
||||||
|
outFormat = SOGoTestJUnitOutputFormat;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
outFormat = SOGoTestTextOutputFormat;
|
||||||
|
|
||||||
|
return outFormat;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[], char *env[])
|
||||||
{
|
{
|
||||||
NSAutoreleasePool *pool;
|
NSAutoreleasePool *pool;
|
||||||
int rc;
|
int rc;
|
||||||
NSDictionary *defaults;
|
NSDictionary *defaults;
|
||||||
NSUserDefaults *ud;
|
NSUserDefaults *ud;
|
||||||
|
SOGoTestOutputFormat reportFormat;
|
||||||
|
|
||||||
pool = [NSAutoreleasePool new];
|
pool = [NSAutoreleasePool new];
|
||||||
|
|
||||||
|
@ -42,7 +118,14 @@ int main()
|
||||||
forName: @"sogo-tests-volatile"];
|
forName: @"sogo-tests-volatile"];
|
||||||
[ud addSuiteNamed: @"sogo-tests-volatile"];
|
[ud addSuiteNamed: @"sogo-tests-volatile"];
|
||||||
|
|
||||||
rc = [[SOGoTestRunner testRunner] run];
|
/* Process arguments */
|
||||||
|
[NSProcessInfo initializeWithArguments: argv
|
||||||
|
count: argc
|
||||||
|
environment: env];
|
||||||
|
|
||||||
|
reportFormat = ParseArguments ([[NSProcessInfo processInfo] arguments]);
|
||||||
|
|
||||||
|
rc = [[SOGoTestRunner testRunnerWithFormat: reportFormat] run];
|
||||||
[pool release];
|
[pool release];
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
|
Loading…
Reference in New Issue