blob: 37c00a45adb6185de49963b5d05ad652f995f34f [file] [log] [blame]
/*
* 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.
*/
#include <string>
#include <log4cxx/helpers/charsetdecoder.h>
#include <log4cxx/helpers/exception.h>
#include <log4cxx/helpers/fileinputstream.h>
#include <log4cxx/helpers/inputstreamreader.h>
#include <log4cxx/helpers/pool.h>
#include <log4cxx/helpers/transcoder.h>
#include <log4cxx/logstring.h>
#include "logunit.h"
//
// If there is no support for wchar_t logging then
// there is not a consistent way to get the test characters compared.
//
#if LOG4CXX_WCHAR_T_API
using namespace log4cxx;
using namespace log4cxx::helpers;
/**
* Tests support for decoding specification.
*
* The lib provides multiple different decoders and decides which to use by default on compile time.
* This test uses the same checks like {@link CharsetDecoder#createDefaultDecoder} to decide which
* checks to run actually, so that some input file with some encoded text according to the decoder
* in use is read and the contents compared to some witness. Because of different decoders not all
* files have the same content, e.g. the ASCII-only decoder can't deal with Unicode chars obviously.
*
* This test is based on encodingtest and uses that witnesses, especially the hard coded strings for
* greeting and pi. We only combine it into one in the former mentioned order, divided by a space.
*
* @see LOGCXX-369
* @see LOGCXX-399
*/
LOGUNIT_CLASS(DecodingTest)
{
LOGUNIT_TEST_SUITE(DecodingTest);
#if LOG4CXX_CHARSET_USASCII
LOGUNIT_TEST(testASCII);
#elif LOG4CXX_CHARSET_ISO88591 || defined(_WIN32_WCE)
LOGUNIT_TEST(testLatin1);
#elif LOG4CXX_CHARSET_UTF8
LOGUNIT_TEST(testUtf8);
#elif LOG4CXX_LOGCHAR_IS_WCHAR && LOG4CXX_HAS_MBSRTOWCS
LOGUNIT_TEST(testUtf16);
LOGUNIT_TEST(testUtf16LE);
LOGUNIT_TEST(testUtf16BE);
#else
// LocaleCharsetDecoder, so it's difficult to provide a file working for e.g. windows-1252
// as well as something completely different.
LOGUNIT_TEST(testASCII);
#endif
LOGUNIT_TEST_SUITE_END();
public:
/**
* Test us-ascii decoding.
*/
void testASCII()
{
const wchar_t witness[] = { L'A', 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x0020, 0x003F, 0 };
testImpl(LOG4CXX_STR("ascii.txt"), witness);
}
/**
* Test iso-8859-1 decoding.
*/
void testLatin1()
{
const wchar_t witness[] = { L'A', 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x0020, 0x00B9, 0 };
testImpl(LOG4CXX_STR("latin1.txt"), witness);
}
/**
* Test utf-8 decoding.
*/
void testUtf8()
{
const wchar_t witness[] = { L'A', 0x0605, 0x0530, 0x986, 0x4E03, 0x0400, 0x0020, 0x00B9, 0 };
testImpl(LOG4CXX_STR("UTF-8.txt"), witness);
}
/**
* Test utf-16 decoding.
*/
void testUtf16()
{
const wchar_t witness[] = { L'A', 0x0605, 0x0530, 0x986, 0x4E03, 0x0400, 0x0020, 0x00B9, 0 };
testImpl(LOG4CXX_STR("UTF-16.txt"), witness);
}
/**
* Test utf-16be decoding.
*/
void testUtf16BE()
{
const wchar_t witness[] = { L'A', 0x0605, 0x0530, 0x986, 0x4E03, 0x0400, 0x0020, 0x00B9, 0 };
testImpl(LOG4CXX_STR("UTF-16BE.txt"), witness);
}
/**
* Test utf16-le decoding.
*/
void testUtf16LE()
{
const wchar_t witness[] = { L'A', 0x0605, 0x0530, 0x986, 0x4E03, 0x0400, 0x0020, 0x00B9, 0 };
testImpl(LOG4CXX_STR("UTF-16LE.txt"), witness);
}
private:
void testImpl(
const LogString & fileName,
const wchar_t* witness)
{
CharsetDecoderPtr decoder(CharsetDecoder::getDefaultDecoder());
LogString lsContent;
std::wstring wsContent;
LogString path(LOG4CXX_STR("input/decoding/") + fileName);
Pool pool;
FileInputStreamPtr fis( new FileInputStream(path));
InputStreamReaderPtr isReader(new InputStreamReader(fis, decoder));
lsContent.assign(isReader->read(pool));
Transcoder::encode(lsContent, wsContent);
LOGUNIT_ASSERT_EQUAL((std::wstring) witness, wsContent);
}
};
LOGUNIT_TEST_SUITE_REGISTRATION(DecodingTest);
#endif