| /* |
| * 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 <log4cxx/helpers/optionconverter.h> |
| #include <log4cxx/helpers/properties.h> |
| #include <log4cxx/helpers/system.h> |
| #include <log4cxx/helpers/transcoder.h> |
| #include <log4cxx/helpers/pool.h> |
| #include "../testchar.h" |
| #include "../insertwide.h" |
| #include "../logunit.h" |
| #include <stdlib.h> |
| #include <apr_pools.h> |
| #include <apr_file_io.h> |
| #include <apr_user.h> |
| #include <apr_env.h> |
| |
| |
| using namespace log4cxx; |
| using namespace log4cxx::helpers; |
| using namespace log4cxx::spi; |
| |
| #define MAX 1000 |
| |
| LOGUNIT_CLASS(OptionConverterTestCase) |
| { |
| LOGUNIT_TEST_SUITE(OptionConverterTestCase); |
| LOGUNIT_TEST(varSubstTest1); |
| LOGUNIT_TEST(varSubstTest2); |
| LOGUNIT_TEST(varSubstTest3); |
| LOGUNIT_TEST(varSubstTest4); |
| LOGUNIT_TEST(varSubstTest5); |
| LOGUNIT_TEST(testTmpDir); |
| #if APR_HAS_USER |
| LOGUNIT_TEST(testUserHome); |
| LOGUNIT_TEST(testUserName); |
| #endif |
| LOGUNIT_TEST(testUserDir); |
| LOGUNIT_TEST_SUITE_END(); |
| |
| Properties props; |
| Properties nullProperties; |
| |
| public: |
| void setUp() |
| { |
| } |
| |
| void tearDown() |
| { |
| } |
| |
| /** |
| * Checks that environment variables were properly set |
| * before invoking tests. ::putenv not reliable. |
| */ |
| void envCheck() |
| { |
| Pool p; |
| char* toto; |
| apr_status_t stat = apr_env_get(&toto, "TOTO", |
| p.getAPRPool()); |
| LOGUNIT_ASSERT_EQUAL(APR_SUCCESS, stat); |
| LOGUNIT_ASSERT_EQUAL("wonderful", toto); |
| char* key1; |
| stat = apr_env_get(&key1, "key1", |
| p.getAPRPool()); |
| LOGUNIT_ASSERT_EQUAL(APR_SUCCESS, stat); |
| LOGUNIT_ASSERT_EQUAL("value1", key1); |
| char* key2; |
| stat = apr_env_get(&key2, "key2", |
| p.getAPRPool()); |
| LOGUNIT_ASSERT_EQUAL(APR_SUCCESS, stat); |
| LOGUNIT_ASSERT_EQUAL("value2", key2); |
| } |
| |
| void varSubstTest1() |
| { |
| envCheck(); |
| LogString r(OptionConverter::substVars(LOG4CXX_STR("hello world."), nullProperties)); |
| LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("hello world."), r); |
| |
| r = OptionConverter::substVars(LOG4CXX_STR("hello ${TOTO} world."), nullProperties); |
| |
| LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("hello wonderful world."), r); |
| } |
| |
| |
| void varSubstTest2() |
| { |
| envCheck(); |
| LogString r(OptionConverter::substVars(LOG4CXX_STR("Test2 ${key1} mid ${key2} end."), |
| nullProperties)); |
| LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("Test2 value1 mid value2 end."), r); |
| } |
| |
| |
| void varSubstTest3() |
| { |
| envCheck(); |
| LogString r(OptionConverter::substVars( |
| LOG4CXX_STR("Test3 ${unset} mid ${key1} end."), nullProperties)); |
| LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("Test3 mid value1 end."), r); |
| } |
| |
| |
| void varSubstTest4() |
| { |
| LogString res; |
| LogString val(LOG4CXX_STR("Test4 ${incomplete ")); |
| |
| try |
| { |
| res = OptionConverter::substVars(val, nullProperties); |
| } |
| catch (IllegalArgumentException& e) |
| { |
| std::string witness("\"Test4 ${incomplete \" has no closing brace. Opening brace at position 6."); |
| LOGUNIT_ASSERT_EQUAL(witness, (std::string) e.what()); |
| } |
| } |
| |
| |
| void varSubstTest5() |
| { |
| Properties props1; |
| props1.setProperty(LOG4CXX_STR("p1"), LOG4CXX_STR("x1")); |
| props1.setProperty(LOG4CXX_STR("p2"), LOG4CXX_STR("${p1}")); |
| LogString res = OptionConverter::substVars(LOG4CXX_STR("${p2}"), props1); |
| LOGUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("x1"), res); |
| } |
| |
| void testTmpDir() |
| { |
| LogString actual(OptionConverter::substVars( |
| LOG4CXX_STR("${java.io.tmpdir}"), nullProperties)); |
| Pool p; |
| const char* tmpdir = NULL; |
| apr_status_t stat = apr_temp_dir_get(&tmpdir, p.getAPRPool()); |
| LOGUNIT_ASSERT_EQUAL(APR_SUCCESS, stat); |
| LogString expected; |
| Transcoder::decode(tmpdir, expected); |
| |
| LOGUNIT_ASSERT_EQUAL(expected, actual); |
| } |
| |
| #if APR_HAS_USER |
| void testUserHome() |
| { |
| LogString actual(OptionConverter::substVars( |
| LOG4CXX_STR("${user.home}"), nullProperties)); |
| Pool p; |
| |
| apr_uid_t userid; |
| apr_gid_t groupid; |
| apr_status_t stat = apr_uid_current(&userid, &groupid, p.getAPRPool()); |
| |
| if (stat == APR_SUCCESS) |
| { |
| char* username = NULL; |
| stat = apr_uid_name_get(&username, userid, p.getAPRPool()); |
| |
| if (stat == APR_SUCCESS) |
| { |
| char* dirname = NULL; |
| stat = apr_uid_homepath_get(&dirname, username, p.getAPRPool()); |
| |
| if (stat == APR_SUCCESS) |
| { |
| LogString expected; |
| Transcoder::decode(dirname, expected); |
| LOGUNIT_ASSERT_EQUAL(expected, actual); |
| } |
| } |
| } |
| |
| } |
| |
| void testUserName() |
| { |
| LogString actual(OptionConverter::substVars( |
| LOG4CXX_STR("${user.name}"), nullProperties)); |
| Pool p; |
| apr_uid_t userid; |
| apr_gid_t groupid; |
| apr_status_t stat = apr_uid_current(&userid, &groupid, p.getAPRPool()); |
| |
| if (stat == APR_SUCCESS) |
| { |
| char* username = NULL; |
| stat = apr_uid_name_get(&username, userid, p.getAPRPool()); |
| |
| if (stat == APR_SUCCESS) |
| { |
| LogString expected; |
| Transcoder::decode(username, expected); |
| LOGUNIT_ASSERT_EQUAL(expected, actual); |
| } |
| } |
| } |
| #endif |
| |
| void testUserDir() |
| { |
| LogString actual(OptionConverter::substVars( |
| LOG4CXX_STR("${user.dir}"), nullProperties)); |
| Pool p; |
| |
| char* dirname = NULL; |
| apr_status_t stat = apr_filepath_get(&dirname, APR_FILEPATH_NATIVE, p.getAPRPool()); |
| LOGUNIT_ASSERT_EQUAL(APR_SUCCESS, stat); |
| |
| LogString expected; |
| Transcoder::decode(dirname, expected); |
| |
| LOGUNIT_ASSERT_EQUAL(expected, actual); |
| } |
| }; |
| |
| LOGUNIT_TEST_SUITE_REGISTRATION(OptionConverterTestCase); |