Skip to content

Commit

Permalink
Allow CFString code testing on non-Apple systems
Browse files Browse the repository at this point in the history
  • Loading branch information
stephen-webb committed Aug 2, 2023
1 parent f0473b5 commit d3d5d49
Show file tree
Hide file tree
Showing 6 changed files with 127 additions and 4 deletions.
8 changes: 8 additions & 0 deletions src/main/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,14 @@ target_include_directories(log4cxx PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
)

if(LOG4CXX_CFSTRING)
if(APPLE)
target_link_libraries(log4cxx PUBLIC "-framework CoreFoundation")
else()
add_subdirectory(mock-apple)
endif()
endif()

if(LOG4CXX_QT_SUPPORT)
target_include_directories(log4cxx-qt PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
Expand Down
4 changes: 0 additions & 4 deletions src/main/cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -216,10 +216,6 @@ if(${ENABLE_FMT_LAYOUT})
target_link_libraries(log4cxx PUBLIC fmt::fmt)
endif()

if (LOG4CXX_CFSTRING)
target_link_libraries(log4cxx PRIVATE "-framework CoreFoundation")
endif()

if(LOG4CXX_ABI_CHECK)
message("Getting dependencies for ABI compatability check...")
# Get the latest version of abi-dumper and abi-compliance-checker
Expand Down
66 changes: 66 additions & 0 deletions src/main/mock-apple/CFString.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/* Mocked CFString implementation
*/
#include "CoreFoundation/CFString.h"
#include <apr_pools.h>
#include <exception>

namespace {
int throw_out_of_mem(int status)
{
throw std::bad_alloc();
return status;
}
apr_pool_t* getStringPool()
{
static struct cfstring_pool
{
apr_pool_t* ptr = 0;
cfstring_pool()
{
apr_pool_create_core_ex(&ptr, throw_out_of_mem, NULL);
}
~cfstring_pool()
{
apr_pool_destroy(ptr);
}
} pool;
return pool.ptr;
}
} // namespace

extern "C" {

CFRange CFRangeMake(CFIndex loc, CFIndex len) {
CFRange result;
result.location = loc;
result.length = len;
return result;
}

CFIndex CFStringGetLength(CFStringRef theString) {
UniChar* data = (UniChar*)theString;
CFIndex result = 0;
while (data[result])
++result;
return result;
}
void CFStringGetCharacters(CFStringRef theString, CFRange range, UniChar *buffer) {
UniChar* data = (UniChar*)theString;
CFIndex index = 0;
while (index < range.length) {
*buffer = data[range.location + index];
++index;
++buffer;
}
}
CFStringRef CFStringCreateWithCharacters(CFAllocatorRef alloc, const UniChar *chars, CFIndex numChars) {
return (CFStringRef)apr_palloc(getStringPool(), (numChars + 1) * sizeof(UniChar));
}
CFStringRef CFStringCreateWithCString(CFAllocatorRef alloc, const char *cStr, CFStringEncoding encoding) {
UniChar* result = (UniChar*)apr_palloc(getStringPool(), (strlen(cStr) + 1) * sizeof(UniChar));
for (UniChar *p = result; *p++ = *cStr++;)
;
return (CFStringRef)result;
}

} // extern "C"
25 changes: 25 additions & 0 deletions src/main/mock-apple/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# Build the MockCoreFoundation library
add_library(MockCoreFoundation STATIC CFString.cpp)
target_compile_definitions(MockCoreFoundation PRIVATE ${APR_COMPILE_DEFINITIONS})
target_include_directories(MockCoreFoundation INTERFACE PRIVATE ${APR_INCLUDE_DIR})

# Add to log4cxx as a dependency
target_link_libraries(log4cxx PRIVATE MockCoreFoundation)
target_include_directories(log4cxx INTERFACE PRIVATE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)
24 changes: 24 additions & 0 deletions src/main/mock-apple/CoreFoundation/CFString.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/* Mocked CFString.h
*/
#include <stdint.h>
#if !defined(__COREFOUNDATION_CFSTRING__)
#define __COREFOUNDATION_CFSTRING__ 1
extern "C" {
typedef unsigned short UniChar;
typedef long CFIndex;
typedef struct __CFRange {
CFIndex location;
CFIndex length;
} CFRange;
typedef const struct __CFString* CFStringRef;
typedef const struct __CFAllocator* CFAllocatorRef;
typedef uint32_t CFStringEncoding;
CFRange CFRangeMake(CFIndex loc, CFIndex len);
CFIndex CFStringGetLength(CFStringRef theString);
void CFStringGetCharacters(CFStringRef theString, CFRange range, UniChar *buffer);
CFStringRef CFStringCreateWithCharacters(CFAllocatorRef alloc, const UniChar *chars, CFIndex numChars);
CFStringRef CFStringCreateWithCString(CFAllocatorRef alloc, const char *cStr, CFStringEncoding encoding);
#define kCFAllocatorDefault 0
#define CFSTR(cStr) CFStringCreateWithCString(kCFAllocatorDefault, cStr, 0)
}
#endif /* ! __COREFOUNDATION_CFSTRING__ */
4 changes: 4 additions & 0 deletions src/test/cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,12 @@ if(LOG4CXX_CFSTRING)
endif()
foreach(testName IN LISTS ALL_LOG4CXX_TESTS)
if (${testName} IN_LIST CFSTR_TESTS)
if(APPLE)
target_compile_options(${testName} PRIVATE "-fconstant-cfstrings")
target_link_libraries(${testName} PRIVATE "-framework CoreFoundation")
else()
target_link_libraries(${testName} PRIVATE MockCoreFoundation)
endif()
endif()
target_compile_definitions(${testName} PRIVATE ${TEST_COMPILE_DEFINITIONS} ${LOG4CXX_COMPILE_DEFINITIONS} ${APR_COMPILE_DEFINITIONS} ${APR_UTIL_COMPILE_DEFINITIONS} )
target_include_directories(${testName} PRIVATE ${CMAKE_CURRENT_LIST_DIR} $<TARGET_PROPERTY:log4cxx,INCLUDE_DIRECTORIES>)
Expand Down

0 comments on commit d3d5d49

Please sign in to comment.