/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This file incorporates work covered by the following license notice:
 *
 *   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 .
 */

#include <sal/types.h>
#include <rtl/byteseq.hxx>
#include <rtl/ustring.hxx>

#include <osl/file.hxx>
#include "osl_File_Const.h"

#include <cppunit/TestFixture.h>
#include <cppunit/extensions/HelperMacros.h>

#include <memory>

#ifdef _WIN32
#include <prewin.h>
#include <postwin.h>
#include <o3tl/char16_t2wchar_t.hxx>
#include <tools/urlobj.hxx>
#endif

using namespace osl;

/** detailed wrong message.
*/
static OString errorToString(const osl::FileBase::RC _nError)
{
    OString sResult;
    switch (_nError) {
        case osl::FileBase::E_None:
            sResult = "Success"_ostr;
            break;
        case osl::FileBase::E_PERM:
            sResult = "Operation not permitted"_ostr;
            break;
        case osl::FileBase::E_NOENT:
            sResult = "No such file or directory"_ostr;
            break;
        case osl::FileBase::E_EXIST:
            sResult = "Already Exist"_ostr;
            break;
        case osl::FileBase::E_ACCES:
            sResult = "Permission denied"_ostr;
            break;
        case osl::FileBase::E_INVAL:
            sResult = "The format of the parameters was not valid"_ostr;
            break;
        case osl::FileBase::E_NOTDIR:
            sResult = "Not a directory"_ostr;
            break;
        case osl::FileBase::E_ISDIR:
            sResult = "Is a directory"_ostr;
            break;
        case osl::FileBase::E_BADF:
            sResult = "Bad file"_ostr;
            break;
        case osl::FileBase::E_NOTEMPTY:
            sResult = "The directory is not empty"_ostr;
            break;
        default:
            sResult = "Unknown Error"_ostr;
            break;
    }
    return sResult;
}

static OString errorToStr(osl::FileBase::RC const& nError)
{
    OString suBuf = "The returned error is: " +
        errorToString(nError) +
        "!\n";
    return suBuf;
}

/** compare two TimeValue, unit is "ms", since Windows time precision is better than UNX.
*/
/* FIXME: the above assertion is bogus */

#if (defined UNX)                      // precision of time in Windows is better than UNX
#   define delta 2000                    // time precision, 2000ms
#else
#   define delta 1800                    // time precision, 1.8s
#endif

static bool t_compareTime(TimeValue *m_aEndTime,  TimeValue *m_aStartTime, sal_Int32 nDelta)
{
    sal_Int32 nDeltaSeconds = m_aEndTime->Seconds - m_aStartTime->Seconds;
    sal_Int32 nDeltaNanoSec = sal_Int32(m_aEndTime->Nanosec) - sal_Int32(m_aStartTime->Nanosec);
    if (nDeltaNanoSec < 0)
    {
        nDeltaNanoSec = 1000000000 + nDeltaNanoSec;
        nDeltaSeconds--;
    }

    sal_Int32 nDeltaMilliSec = (nDeltaSeconds * 1000) + (nDeltaNanoSec / 1000000);
    return (nDeltaMilliSec < nDelta);
}

/** compare two OUString file name.
*/
static OUString normalize(const OUString& path)
{
#if defined(_WIN32)
    return path.replace('\\', '/');
#else
    return path;
#endif
}

/** simple version to judge if a file name or directory name is a URL or a system path, just to see if it
    is start with "file:///";.
*/
static bool isURL(const OUString& pathname)
{
    return pathname.startsWith(aPreURL);
}

/** concat two part to form a URL or system path, add PATH_SEPARATOR between them if necessary, add "file:///" to beginning if necessary.
*/
static void concatURL(OUString & pathname1, const OUString & pathname2)
{
    // check if pathname1 is full qualified URL;
    if (!isURL(pathname1))
    {
        OUString     aPathName   = pathname1.copy(0);
        osl::FileBase::getFileURLFromSystemPath(pathname1, aPathName); // convert if not full qualified URL
        pathname1   = aPathName.copy(0);
    }

    // check if '/' is in the end of pathname1 or at the begin of pathname2;
    if (!pathname1.endsWith(aSlashURL) && !pathname2.startsWith(aSlashURL))
        pathname1 += aSlashURL;
    pathname1 += pathname2;
}

/** create a temp test file using OUString name of full qualified URL or system path.
*/
static void createTestFile(const OUString& filename)
{
    OUString     aPathURL   = filename.copy(0);
    osl::FileBase::RC nError;

    if (!isURL(filename))
        osl::FileBase::getFileURLFromSystemPath(filename, aPathURL); // convert if not full qualified URL

    File aFile(aPathURL);
    nError = aFile.open(osl_File_OpenFlag_Read | osl_File_OpenFlag_Write | osl_File_OpenFlag_Create);
    if ((nError != osl::FileBase::E_None) && (nError != osl::FileBase::E_EXIST))
        printf("createTestFile failed!\n");

    aFile.close();

}

/** create a temp test file using OUString name of full qualified URL or system path in a base directory.
*/
static void createTestFile(const OUString& basename, const OUString& filename)
{
    OUString aBaseURL = basename.copy(0);

    concatURL(aBaseURL, filename);
    createTestFile(aBaseURL);
}

/** delete a temp test file using OUString name.
*/
static void deleteTestFile(const OUString& filename)
{
    OUString     aPathURL   = filename.copy(0);
    osl::FileBase::RC nError;

    if (!isURL(filename))
        osl::FileBase::getFileURLFromSystemPath(filename, aPathURL); // convert if not full qualified URL

    nError = File::setAttributes(aPathURL, osl_File_Attribute_GrpWrite| osl_File_Attribute_OwnWrite| osl_File_Attribute_OthWrite); // if readonly, make writable.
    CPPUNIT_ASSERT_MESSAGE("In deleteTestFile Function: set writable ", (osl::FileBase::E_None == nError) || (osl::FileBase::E_NOENT == nError));

    nError = File::remove(aPathURL);
    CPPUNIT_ASSERT_MESSAGE("In deleteTestFile Function: remove ", (osl::FileBase::E_None == nError) || (nError == osl::FileBase::E_NOENT));
}

/** delete a temp test file using OUString name of full qualified URL or system path in a base directory.
*/
static void deleteTestFile(const OUString& basename, const OUString& filename)
{
    OUString aBaseURL   = basename.copy(0);

    concatURL(aBaseURL, filename);
    deleteTestFile(aBaseURL);
}

/** create a temp test directory using OUString name of full qualified URL or system path.
*/
static void createTestDirectory(const OUString& dirname)
{
    OUString aPathURL   = dirname.copy(0);
    osl::FileBase::RC nError;

    if (!isURL(dirname))
        osl::FileBase::getFileURLFromSystemPath(dirname, aPathURL); // convert if not full qualified URL
    nError = Directory::create(aPathURL);
    if ((nError != osl::FileBase::E_None) && (nError != osl::FileBase::E_EXIST))
        printf("createTestDirectory failed: %d!\n", int(nError));
}

/** create a temp test directory using OUString name of full qualified URL or system path in a base directory.
*/
static void createTestDirectory(const OUString& basename, const OUString& dirname)
{
    OUString aBaseURL   = basename.copy(0);

    concatURL(aBaseURL, dirname);
    createTestDirectory(aBaseURL);
}

/** delete a temp test directory using OUString name of full qualified URL or system path.
*/
static void deleteTestDirectory(const OUString& dirname)
{
    OUString aPathURL = dirname.copy(0);
    if (!isURL(dirname))
        osl::FileBase::getFileURLFromSystemPath(dirname, aPathURL); // convert if not full qualified URL

    Directory testDir(aPathURL);
    if (testDir.isOpen())
        testDir.close();  // close if still open.

    osl::FileBase::RC nError = Directory::remove(aPathURL);

    OString strError = "In deleteTestDirectory function: remove Directory " +
        OUStringToOString(aPathURL, RTL_TEXTENCODING_ASCII_US) + " -> result: " + OString::number(nError);
    CPPUNIT_ASSERT_MESSAGE(strError.getStr(), (osl::FileBase::E_None == nError) || (nError == osl::FileBase::E_NOENT));
}

/** delete a temp test directory using OUString name of full qualified URL or system path in a base directory.
*/
static void deleteTestDirectory(const OUString& basename, const OUString& dirname)
{
    OUString aBaseURL   = basename.copy(0);

    concatURL(aBaseURL, dirname);
    deleteTestDirectory(aBaseURL);
}

namespace {

/** Check for the file and directory access right.
*/
enum class oslCheckMode {
    Exist,
    OpenAccess,
    ReadAccess,
    WriteAccess
};

}

/** check if the file exist
*/
static bool ifFileExist(const OUString & str)
{
    File testFile(str);
    return (testFile.open(osl_File_OpenFlag_Read) == osl::FileBase::E_None);
}

/** check if the file can be written
*/
static bool ifFileCanWrite(const OUString & str)
{
    // on Windows, the file has no write right, but can be written
#ifdef _WIN32
    bool bCheckResult = false;
    OUString aUStr = str.copy(0);
    if (isURL(str))
        osl::FileBase::getSystemPathFromFileURL(str, aUStr);

    OString aString = OUStringToOString(aUStr, RTL_TEXTENCODING_ASCII_US);
    const char *path = aString.getStr();
    if ((_access(path, 2)) != -1)
         bCheckResult = true;
     // on UNX, just test if open success with osl_File_OpenFlag_Write
#else
    File testFile(str);
    bool bCheckResult = (testFile.open(osl_File_OpenFlag_Write) == osl::FileBase::E_None);
#endif
    return bCheckResult;
}

static bool checkDirectory(const OUString& str, oslCheckMode nCheckMode)
{
    OUString aUString;
    DirectoryItem rItem;
    osl::FileBase::RC rc;
    bool bCheckResult= false;

    Directory aDir(str);
    rc = aDir.open();

    if ((rc != osl::FileBase::E_NOENT) && (rc != osl::FileBase::E_ACCES))
    {
        switch (nCheckMode)
        {
            case oslCheckMode::Exist:
                if (rc == ::osl::FileBase::E_None)
                    bCheckResult = true;
                break;
            case oslCheckMode::OpenAccess:
                if (rc == osl::FileBase::E_None)
                    bCheckResult = true;
                break;
            case oslCheckMode::ReadAccess:
                rc = aDir.getNextItem(rItem);
                bCheckResult = (rc == osl::FileBase::E_None) || (rc == osl::FileBase::E_NOENT);
                break;
            case oslCheckMode::WriteAccess:
                ((aUString += str) += aSlashURL) += aTmpName2;
                if (Directory::create(aUString) == osl::FileBase::E_None)
                {
                    bCheckResult = true;
                    rc = Directory::remove(aUString);
                    CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, rc);
                }
                else
                {
                    bCheckResult = false;
                }
                break;

            default:
                bCheckResult = false;
        }

        rc = aDir.close();
        CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, rc);
    }

    return bCheckResult;
}

/** construct error message
*/
static OString outputError(const OString & returnVal, const OString & rightVal, const char * msg = "")
{
    if (returnVal == rightVal)
        return OString();

    OString aString = msg +
        OString::Concat(": the returned value is '") +
        returnVal +
        "', but the value should be '" +
        rightVal +
        "'.";
    return aString;
}

#if (defined UNX) /* chmod() method is different in Windows */
/** Change file mode, two version in UNIX and Windows;.
*/
static void changeFileMode(OUString & filepath, sal_Int32 mode)
{
    OString aString;
    OUString aUStr = filepath.copy(0);

    if (isURL(filepath))
        osl::FileBase::getSystemPathFromFileURL(filepath, aUStr);

    aString = OUStringToOString(aUStr, RTL_TEXTENCODING_ASCII_US);
    int ret = chmod(aString.getStr(), mode);
    CPPUNIT_ASSERT_EQUAL(0, ret);
}
#else
static void hideFile(const OUString& filepath)
{
    OUString aSysPath(filepath);

    if (isURL(filepath))
        osl::FileBase::getSystemPathFromFileURL(filepath, aSysPath);

    bool ret = SetFileAttributesW(o3tl::toW(aSysPath.getStr()), FILE_ATTRIBUTE_HIDDEN);
    CPPUNIT_ASSERT(ret);
}
#endif

#if 0
#if defined UNX
static OUString getCurrentPID();
#endif
#endif

// Beginning of the test cases for osl::FileBase class

namespace osl_FileBase
{
    // testing the method
    // static inline RC getAbsoluteFileURL(const OUString& ustrBaseDirectoryURL,
    //                                      const OUString& ustrRelativeFileURL,
    //                                      OUString& ustrAbsoluteFileURL)

    class getAbsoluteFileURL : public CppUnit::TestFixture
    {
    public:
        void check_getAbsoluteFileURL(OUString const& _suBaseURL,
                                      OString const& _sRelativeURL,
                                      osl::FileBase::RC _nAssumeError,
                                      OUString const& _suAssumeResultStr);

        void getAbsoluteFileURL_001_1();
        void getAbsoluteFileURL_001_2();
        void getAbsoluteFileURL_001_3();
        void getAbsoluteFileURL_001_4();
        void getAbsoluteFileURL_001_5();
        void getAbsoluteFileURL_001_6();
        void getAbsoluteFileURL_001_7();
        void getAbsoluteFileURL_001_8();
        void getAbsoluteFileURL_002();
        void getAbsoluteFileURL_003();
        void getAbsoluteFileURL_004();

        CPPUNIT_TEST_SUITE(getAbsoluteFileURL);
            CPPUNIT_TEST(getAbsoluteFileURL_001_1);
            CPPUNIT_TEST(getAbsoluteFileURL_001_2);
            CPPUNIT_TEST(getAbsoluteFileURL_001_3);
            CPPUNIT_TEST(getAbsoluteFileURL_001_4);
            CPPUNIT_TEST(getAbsoluteFileURL_001_5);
            CPPUNIT_TEST(getAbsoluteFileURL_001_6);
            CPPUNIT_TEST(getAbsoluteFileURL_001_7);
            CPPUNIT_TEST(getAbsoluteFileURL_001_8);
            CPPUNIT_TEST(getAbsoluteFileURL_002);
            CPPUNIT_TEST(getAbsoluteFileURL_003);
            CPPUNIT_TEST(getAbsoluteFileURL_004);
        CPPUNIT_TEST_SUITE_END();
    };

    void getAbsoluteFileURL::check_getAbsoluteFileURL(OUString const& _suBaseURL,
                                                      OString const& _sRelativeURL,
                                                      osl::FileBase::RC _nAssumeError,
                                                      OUString const& _suAssumeResultStr)
    {
        OUString suRelativeURL = OStringToOUString(_sRelativeURL, RTL_TEXTENCODING_UTF8);
        OString sBaseURL = OUStringToOString(_suBaseURL, RTL_TEXTENCODING_UTF8);
        OUString suResultURL;
        osl::FileBase::RC nError = osl::FileBase::getAbsoluteFileURL(_suBaseURL, suRelativeURL, suResultURL);
        OString sResultURL = OUStringToOString(suResultURL, RTL_TEXTENCODING_UTF8);
        OString sError = errorToString(nError);
        printf("getAbsoluteFileURL('%s','%s') deliver absolute URL: '%s', error '%s'\n",
                sBaseURL.getStr(), _sRelativeURL.getStr(),sResultURL.getStr(), sError.getStr());
        CPPUNIT_ASSERT_EQUAL_MESSAGE("Assumption is wrong: error number is wrong", _nAssumeError, nError);

        if (nError == osl::FileBase::E_None)
        {
            CPPUNIT_ASSERT_EQUAL_MESSAGE("Assumption is wrong: ResultURL is not equal to expected URL ", _suAssumeResultStr, suResultURL);
        }
    }

    void getAbsoluteFileURL::getAbsoluteFileURL_001_1()
    {
        OUString suAssume = aUserDirectoryURL + "/relative/file1";
        check_getAbsoluteFileURL(aUserDirectoryURL, "relative/file1"_ostr,osl::FileBase::E_None, suAssume);
    }

    void getAbsoluteFileURL::getAbsoluteFileURL_001_2()
    {
        OUString suAssume = aUserDirectoryURL + "/relative/file2";
        check_getAbsoluteFileURL(aUserDirectoryURL, "relative/./file2"_ostr,osl::FileBase::E_None, suAssume);
    }

    void getAbsoluteFileURL::getAbsoluteFileURL_001_3()
    {
        OUString suAssume = aUserDirectoryURL + "/file3";
        check_getAbsoluteFileURL(aUserDirectoryURL, "relative/../file3"_ostr,osl::FileBase::E_None, suAssume);
    }

    void getAbsoluteFileURL::getAbsoluteFileURL_001_4()
    {
        OUString suAssume = aUserDirectoryURL + "/file4";
        check_getAbsoluteFileURL(aUserDirectoryURL, "././relative/../file4"_ostr,osl::FileBase::E_None, suAssume);
    }

    void getAbsoluteFileURL::getAbsoluteFileURL_001_5()
    {
        OUString suAssume;
        suAssume = aUserDirectoryURL + "/relative/";
        check_getAbsoluteFileURL(aUserDirectoryURL, "././relative/."_ostr,osl::FileBase::E_None, suAssume);
    }

    void getAbsoluteFileURL::getAbsoluteFileURL_001_6()
    {
        OUString suAssume = aUserDirectoryURL + "/.relative";
        check_getAbsoluteFileURL(aUserDirectoryURL, "./.relative"_ostr,osl::FileBase::E_None, suAssume);
    }

    void getAbsoluteFileURL::getAbsoluteFileURL_001_7()
    {
        OUString suAssume;
        suAssume = aUserDirectoryURL + "/.a/";
        check_getAbsoluteFileURL(aUserDirectoryURL, "./.a/mydir/.."_ostr,osl::FileBase::E_None, suAssume);
    }

    void getAbsoluteFileURL::getAbsoluteFileURL_001_8()
    {
        OUString suAssume = aUserDirectoryURL + "/tmp/ok";
        check_getAbsoluteFileURL(aUserDirectoryURL, "tmp//ok"_ostr,osl::FileBase::E_None, suAssume);
    }

    void getAbsoluteFileURL::getAbsoluteFileURL_002()
    {
#if 0
#if (defined UNX) // Link is not defined in Windows
        OUString aUStr_LnkFileSys(aTempDirectorySys), aUStr_SrcFileSys(aTempDirectorySys);
        aUStr_LnkFileSys += aSlashURL + getCurrentPID() + "/link.file";
        aUStr_SrcFileSys += aSlashURL + getCurrentPID() + "/canonical.name";

        OString strLinkFileName, strSrcFileName;
        strLinkFileName = OUStringToOString(aUStr_LnkFileSys, RTL_TEXTENCODING_ASCII_US);
        strSrcFileName =  OUStringToOString(aUStr_SrcFileSys, RTL_TEXTENCODING_ASCII_US);

        createTestFile(aCanURL1);
        sal_Int32 fd = symlink(strSrcFileName.getStr(), strLinkFileName.getStr());
        CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), fd);
        OString sLnkURL = OUStringToOString(aLnkURL1, RTL_TEXTENCODING_ASCII_US);
        OUString suAssume = aUserDirectoryURL + "/canonical.name";
        check_getAbsoluteFileURL(aUserDirectoryURL, sLnkURL, osl::FileBase::E_None, suAssume);
        deleteTestFile(aCanURL1);
        fd = remove(strLinkFileName.getStr());
        CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), fd);
#endif
#endif
    }

    // please see line# 930
    void getAbsoluteFileURL::getAbsoluteFileURL_003()
    {
    }

    void getAbsoluteFileURL::getAbsoluteFileURL_004()
    {
        // create two level directories under $Temp/PID/
        OUString aUStrUpBase = aUserDirectoryURL + "/test1";
        createTestDirectory(aUStrUpBase);
        OUString aUStrBase = aUserDirectoryURL + "/test1/dir1";
        createTestDirectory(aUStrBase);

        OUString suAssume = aUserDirectoryURL + "/mytestfile";
        check_getAbsoluteFileURL(aUStrBase, "../../mytestfile"_ostr , osl::FileBase::E_None, suAssume);
        deleteTestDirectory(aUStrBase);
        deleteTestDirectory(aUStrUpBase);
    }

    // testing two methods:
    // static inline RC getSystemPathFromFileURL(const OUString& ustrFileURL,
    //                OUString& ustrSystemPath)
    // static RC getFileURLFromSystemPath(const OUString & ustrSystemPath,
    //                OUString & ustrFileURL);

    class SystemPath_FileURL : public CppUnit::TestFixture
    {
    public:
        void getSystemPathFromFileURL_001_1();
        void getSystemPathFromFileURL_001_2();
        void getSystemPathFromFileURL_001_21();
        void getSystemPathFromFileURL_001_22();
        void getSystemPathFromFileURL_001_3();
        void getSystemPathFromFileURL_001_31();
        void getSystemPathFromFileURL_001_4();
        void getSystemPathFromFileURL_001_41();
        void getSystemPathFromFileURL_001_5();
        void getSystemPathFromFileURL_001_51();
        void getSystemPathFromFileURL_001_52();
        void getSystemPathFromFileURL_001_53();
        void getSystemPathFromFileURL_001_6();
        void getSystemPathFromFileURL_001_61();
        void getSystemPathFromFileURL_001_7();
        void getSystemPathFromFileURL_001_71();
        void getSystemPathFromFileURL_001_8();
        void getSystemPathFromFileURL_001_81();
        void getSystemPathFromFileURL_001_9();
        void getSystemPathFromFileURL_001_91();
        void getSystemPathFromFileURL_001_92();
        void getSystemPathFromFileURL_004();
        void getSystemPathFromFileURL_005();

        // test case for getFileURLFromSystemPath
        void getFileURLFromSystemPath_001();
        void getFileURLFromSystemPath_002();
        void getFileURLFromSystemPath_003();
        void getFileURLFromSystemPath_004();
        void getFileURLFromSystemPath_004_1();
        void getFileURLFromSystemPath_005();

        CPPUNIT_TEST_SUITE(SystemPath_FileURL);
            CPPUNIT_TEST(getSystemPathFromFileURL_001_1);
            CPPUNIT_TEST(getSystemPathFromFileURL_001_2);
            CPPUNIT_TEST(getSystemPathFromFileURL_001_21);
            CPPUNIT_TEST(getSystemPathFromFileURL_001_22);
            CPPUNIT_TEST(getSystemPathFromFileURL_001_3);
            CPPUNIT_TEST(getSystemPathFromFileURL_001_31);
            CPPUNIT_TEST(getSystemPathFromFileURL_001_4);
            CPPUNIT_TEST(getSystemPathFromFileURL_001_41);
            CPPUNIT_TEST(getSystemPathFromFileURL_001_5);
            CPPUNIT_TEST(getSystemPathFromFileURL_001_51);
            CPPUNIT_TEST(getSystemPathFromFileURL_001_52);
            CPPUNIT_TEST(getSystemPathFromFileURL_001_53);
            CPPUNIT_TEST(getSystemPathFromFileURL_001_6);
            CPPUNIT_TEST(getSystemPathFromFileURL_001_61);
            CPPUNIT_TEST(getSystemPathFromFileURL_001_7);
            CPPUNIT_TEST(getSystemPathFromFileURL_001_71);
            CPPUNIT_TEST(getSystemPathFromFileURL_001_8);
            CPPUNIT_TEST(getSystemPathFromFileURL_001_81);
            CPPUNIT_TEST(getSystemPathFromFileURL_001_9);
            CPPUNIT_TEST(getSystemPathFromFileURL_001_91);
            CPPUNIT_TEST(getSystemPathFromFileURL_001_92);
            CPPUNIT_TEST(getSystemPathFromFileURL_004);
            CPPUNIT_TEST(getSystemPathFromFileURL_005);
            CPPUNIT_TEST(getFileURLFromSystemPath_001);
            CPPUNIT_TEST(getFileURLFromSystemPath_002);
            CPPUNIT_TEST(getFileURLFromSystemPath_003);
            CPPUNIT_TEST(getFileURLFromSystemPath_004);
            CPPUNIT_TEST(getFileURLFromSystemPath_004_1);
            CPPUNIT_TEST(getFileURLFromSystemPath_005);
        CPPUNIT_TEST_SUITE_END();

    private:
        void check_SystemPath_FileURL(
                OString const& _sSource,
                osl::FileBase::RC _nAssumeError,
                OString const& _sAssumeResultStr,
                bool bDirection = true);

        void checkWNTBehaviour_getSystemPathFromFileURL(
                OString const& _sURL,
                osl::FileBase::RC _nAssumeError,
                OString const& _sWNTAssumeResultString);

        void checkUNXBehaviour_getSystemPathFromFileURL(
                OString const& _sURL,
                osl::FileBase::RC _nAssumeError,
                OString const& _sUnixAssumeResultString);

        void checkWNTBehaviour_getFileURLFromSystemPath(OString const& _sSysPath,
                osl::FileBase::RC _nAssumeError,
                OString const& _sWNTAssumeResultString);

        void checkUNXBehaviour_getFileURLFromSystemPath(
                OString const& _sSysPath,
                osl::FileBase::RC _nAssumeError,
                OString const& _sUnixAssumeResultString);

    };

    // if bDirection==sal_True, check getSystemPathFromFileURL
    // if bDirection==sal_False, check getFileURLFromSystemPath
    void SystemPath_FileURL::check_SystemPath_FileURL(
            OString const& _sSource,
            osl::FileBase::RC _nAssumeError,
            OString const& _sAssumeResultStr,
            bool bDirection)
    {
        // PRE: URL as String
        OUString suSource;
        OUString suStr;
        suSource = OStringToOUString(_sSource, RTL_TEXTENCODING_UTF8);
        osl::FileBase::RC nError;

        if (bDirection)
            nError = osl::FileBase::getSystemPathFromFileURL(suSource, suStr);
        else
            nError = osl::FileBase::getFileURLFromSystemPath(suSource, suStr);

        // if the given string is gt length 0,
        // we check also this string
        OString sStr = OUStringToOString(suStr, RTL_TEXTENCODING_UTF8);
        OString sError = errorToString(nError);

        if (bDirection)
            printf("getSystemPathFromFileURL('%s') deliver system path: '%s', error '%s'\n",
                    _sSource.getStr(), sStr.getStr(), sError.getStr());
        else
            printf("getFileURLFromSystemPath('%s') deliver File URL: '%s', error '%s'\n",
                    _sSource.getStr(), sStr.getStr(), sError.getStr());

        if (!_sAssumeResultStr.isEmpty())
        {
            bool bStrAreEqual = _sAssumeResultStr == sStr;
            CPPUNIT_ASSERT_EQUAL_MESSAGE("Assumption is wrong",
                                    _nAssumeError, nError);
            CPPUNIT_ASSERT_MESSAGE("Assumption is wrong",
                                    bStrAreEqual);
        }
        else
        {
            CPPUNIT_ASSERT_EQUAL_MESSAGE("Assumption is wrong", _nAssumeError, nError);
        }
    }

    void SystemPath_FileURL::checkWNTBehaviour_getSystemPathFromFileURL(
            OString const& _sURL,
            osl::FileBase::RC _nAssumeError,
            OString const& _sWNTAssumeResultString)
    {
#if defined(_WIN32)
        check_SystemPath_FileURL(_sURL, _nAssumeError, _sWNTAssumeResultString);
#else
        (void)_sURL;
        (void)_nAssumeError;
        (void)_sWNTAssumeResultString;
#endif
    }

    void SystemPath_FileURL::checkUNXBehaviour_getSystemPathFromFileURL(
            OString const& _sURL,
            osl::FileBase::RC _nAssumeError,
            OString const& _sUnixAssumeResultString)
    {
#if (defined UNX)
        check_SystemPath_FileURL(_sURL, _nAssumeError, _sUnixAssumeResultString);
#else
        (void)_sURL;
        (void)_nAssumeError;
        (void)_sUnixAssumeResultString;
#endif
    }

    void SystemPath_FileURL::checkWNTBehaviour_getFileURLFromSystemPath(
            OString const& _sSysPath,
            osl::FileBase::RC _nAssumeError,
            OString const& _sWNTAssumeResultString)
    {
#if defined(_WIN32)
        check_SystemPath_FileURL(_sSysPath, _nAssumeError, _sWNTAssumeResultString, false);
#else
        (void)_sSysPath;
        (void)_nAssumeError;
        (void)_sWNTAssumeResultString;
#endif
    }

    void SystemPath_FileURL::checkUNXBehaviour_getFileURLFromSystemPath(
            OString const& _sSysPath,
            osl::FileBase::RC _nAssumeError,
            OString const& _sUnixAssumeResultString)
    {
#if (defined UNX)
        check_SystemPath_FileURL(_sSysPath, _nAssumeError, _sUnixAssumeResultString, false);
#else
        (void)_sSysPath;
        (void)_nAssumeError;
        (void)_sUnixAssumeResultString;
#endif
    }

    /** Test for getSystemPathFromFileURL()
        this test is split into 2 different OS tests,
        the first function checkUNXBehaviour... runs only on Unix based Systems,
        the second only on windows based systems
        the first parameter are a file URL where we want to get the system path of,
        the second parameter is the assumed error of the osl_getSystemPathFromFileURL() function,
        the third parameter is the assumed result string, the string will only test, if its length is greater than 0
    */

    void SystemPath_FileURL::getSystemPathFromFileURL_001_1()
    {
        OString sURL(""_ostr);
        checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, ""_ostr);
        checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, ""_ostr);
    }

    void SystemPath_FileURL::getSystemPathFromFileURL_001_2()
    {
        OString sURL("/"_ostr);
        checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, ""_ostr);
        checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "\\"_ostr);
    }

    void SystemPath_FileURL::getSystemPathFromFileURL_001_21()
    {
        /* From RFC3986, "2.2. Reserved Characters":

           "The purpose of reserved characters is to provide a set of delimiting
           characters that are distinguishable from other data within a URI.
           URIs that differ in the replacement of a reserved character with its
           corresponding percent-encoded octet are not equivalent.  Percent-
           encoding a reserved character, or decoding a percent-encoded octet
           that corresponds to a reserved character, will change how the URI is
           interpreted by most applications.  Thus, characters in the reserved
           set are protected from normalization and are therefore safe to be
           used by scheme-specific and producer-specific algorithms for
           delimiting data subcomponents within a URI."

           In other words, %2F ("/") is NOT the same as /.
        */
        OString sURL("%2F"_ostr);
        checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, ""_ostr);
        checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, ""_ostr);
    }

    void SystemPath_FileURL::getSystemPathFromFileURL_001_22()
    {
        OString sURL("file:///tmp%2Fmydir"_ostr);
        checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, ""_ostr);
        checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, ""_ostr);
    }

    void SystemPath_FileURL::getSystemPathFromFileURL_001_3()
    {
        OString sURL("a"_ostr);
        checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "a"_ostr);
        checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "a"_ostr);
    }

    void SystemPath_FileURL::getSystemPathFromFileURL_001_31()
    {
        OString sURL("tmpname"_ostr);
        checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "tmpname"_ostr);
        checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "tmpname"_ostr);
    }

    void SystemPath_FileURL::getSystemPathFromFileURL_001_4()
    {
        OString sURL("file://"_ostr);
        checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, ""_ostr);
        checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, ""_ostr);
    }

    void SystemPath_FileURL::getSystemPathFromFileURL_001_41()
    {
        OString sURL("file://localhost/tmp"_ostr);
        checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, ""_ostr);
        checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, ""_ostr);
    }

    void SystemPath_FileURL::getSystemPathFromFileURL_001_5()
    {
        OString sURL("file:///tmp"_ostr);
        checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "/tmp"_ostr);
        checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, ""_ostr);
    }

    void SystemPath_FileURL::getSystemPathFromFileURL_001_51()
    {
        OString sURL("file://c:/tmp"_ostr);
        checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, ""_ostr);
        checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, ""_ostr);
    }

    void SystemPath_FileURL::getSystemPathFromFileURL_001_52()
    {
        OString sURL("file:///c:/tmp"_ostr);
        checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "/c:/tmp"_ostr);
        checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "c:\\tmp"_ostr);
    }

    void SystemPath_FileURL::getSystemPathFromFileURL_001_53()
    {
        OString sURL("file:///c|/tmp"_ostr);
        checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "/c|/tmp"_ostr);
        checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "c:\\tmp"_ostr);
    }

    void SystemPath_FileURL::getSystemPathFromFileURL_001_6()
    {
        OString sURL("file:///tmp/first"_ostr);
        checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "/tmp/first"_ostr);
        checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, ""_ostr);
    }

    void SystemPath_FileURL::getSystemPathFromFileURL_001_61()
    {
        OString sURL("file:///c:/tmp/first"_ostr);
        checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "/c:/tmp/first"_ostr);
        checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "c:\\tmp\\first"_ostr);
    }

    void SystemPath_FileURL::getSystemPathFromFileURL_001_7()
    {
        OString sURL("file:///tmp/../second"_ostr);
        checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "/tmp/../second"_ostr);
        checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, ""_ostr);
    }

    void SystemPath_FileURL::getSystemPathFromFileURL_001_71()
    {
        OString sURL("file:///c:/tmp/../second"_ostr);
        checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "/c:/tmp/../second"_ostr);
        checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "c:\\tmp\\..\\second"_ostr);
    }

    void SystemPath_FileURL::getSystemPathFromFileURL_001_8()
    {
        OString sURL("../tmp"_ostr);
        checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "../tmp"_ostr);
        checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "..\\tmp"_ostr);
    }

    void SystemPath_FileURL::getSystemPathFromFileURL_001_81()
    {
#if 0
        OString sURL("file://~/tmp");
        char* home_path;
        home_path = getenv("HOME");
        OString expResult(home_path ? home_path : "");
        expResult += "/tmp";
        checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, expResult);
#endif
    }

    void SystemPath_FileURL::getSystemPathFromFileURL_001_9()
    {
        OString sURL("file:///tmp/first%20second"_ostr);
        checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "/tmp/first second"_ostr);
        checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, ""_ostr);
    }

    void SystemPath_FileURL::getSystemPathFromFileURL_001_91()
    {
        OString sURL("file:///c:/tmp/first%20second"_ostr);
        checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "/c:/tmp/first second"_ostr);
        checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "c:\\tmp\\first second"_ostr);
    }

    void SystemPath_FileURL::getSystemPathFromFileURL_001_92()
    {
        OString sURL("ca@#;+.,$///78no%01ni..name"_ostr);
        checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, ""_ostr);
        checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, ""_ostr);
    }

    // normal legal case
    void SystemPath_FileURL::getSystemPathFromFileURL_004()
    {
        OUString aUStr;
        OUString aUNormalURL(aTmpName6);
        OUString aUResultURL (aSysPath4);
        osl::FileBase::RC nError = osl::FileBase::getSystemPathFromFileURL(aUNormalURL, aUStr);

        OString sError =
            "test for getSystemPathFromFileURL(' " +
            OUStringToOString(aUNormalURL, RTL_TEXTENCODING_ASCII_US) +
            " ') function:use an absolute file URL, " +
            outputError(OUStringToOString(aUStr, RTL_TEXTENCODING_ASCII_US),
                        OUStringToOString(aUResultURL, RTL_TEXTENCODING_ASCII_US));

        CPPUNIT_ASSERT_EQUAL_MESSAGE(sError.getStr(), osl::FileBase::E_None, nError);
        CPPUNIT_ASSERT_EQUAL_MESSAGE(sError.getStr(), normalize(aUResultURL), normalize(aUStr));

    }

    // CJK characters case
    void SystemPath_FileURL::getSystemPathFromFileURL_005()
    {
        OUString aUStr;
        createTestDirectory(aTmpName10);
        OUString aUNormalURL(aTmpName10);
        OUString aUResultURL (aSysPath5);

        osl::FileBase::RC nError = osl::FileBase::getSystemPathFromFileURL(aUNormalURL, aUStr);

        OString sError =
            "test for getSystemPathFromFileURL(' " +
            OUStringToOString(aUNormalURL, RTL_TEXTENCODING_ASCII_US) +
            " ') function:use a CJK coded absolute URL, " +
            outputError(OUStringToOString(aUStr, RTL_TEXTENCODING_ASCII_US),
                        OUStringToOString(aUResultURL, RTL_TEXTENCODING_ASCII_US));
        deleteTestDirectory(aTmpName10);

        CPPUNIT_ASSERT_EQUAL_MESSAGE(sError.getStr(), osl::FileBase::E_None, nError);
        CPPUNIT_ASSERT_EQUAL_MESSAGE(sError.getStr(), normalize(aUResultURL), normalize(aUStr));
    }

    void SystemPath_FileURL::getFileURLFromSystemPath_001()
    {
        OString sSysPath("~/tmp"_ostr);
        char* home_path;
        home_path = getenv("HOME");
        OString expResult(home_path ? home_path : "");
        expResult = "file://"+ expResult + "/tmp";
        checkUNXBehaviour_getFileURLFromSystemPath(sSysPath, osl::FileBase::E_None, expResult);
        checkWNTBehaviour_getFileURLFromSystemPath(sSysPath, osl::FileBase::E_None, "~/tmp"_ostr);
    }

    void SystemPath_FileURL::getFileURLFromSystemPath_002()
    {
        OString sSysPath("c:/tmp"_ostr);
        checkUNXBehaviour_getFileURLFromSystemPath(sSysPath, osl::FileBase::E_None, "c:/tmp"_ostr);
        checkWNTBehaviour_getFileURLFromSystemPath(sSysPath, osl::FileBase::E_None, "file:///c:/tmp"_ostr);
    }

    void SystemPath_FileURL::getFileURLFromSystemPath_003()
    {
        OString sSysPath("file:///temp"_ostr);
        checkUNXBehaviour_getFileURLFromSystemPath(sSysPath, osl::FileBase::E_INVAL, ""_ostr);
        checkWNTBehaviour_getFileURLFromSystemPath(sSysPath, osl::FileBase::E_INVAL, ""_ostr);
    }

    void SystemPath_FileURL::getFileURLFromSystemPath_004()
    {
        OString sSysPath("//tmp//first start"_ostr);
        checkUNXBehaviour_getFileURLFromSystemPath(sSysPath, osl::FileBase::E_None, "file:///tmp/first%20start"_ostr);
        checkWNTBehaviour_getFileURLFromSystemPath(sSysPath, osl::FileBase::E_INVAL, ""_ostr);
    }

    void SystemPath_FileURL::getFileURLFromSystemPath_004_1()
    {
        OString sSysPath("/tmp///first start"_ostr);
        checkUNXBehaviour_getFileURLFromSystemPath(sSysPath, osl::FileBase::E_None, "file:///tmp/first%20start"_ostr);
        checkWNTBehaviour_getFileURLFromSystemPath(sSysPath, osl::FileBase::E_INVAL, ""_ostr);
    }

    void SystemPath_FileURL::getFileURLFromSystemPath_005()
    {
        OString sSysPath(""_ostr);
        checkUNXBehaviour_getFileURLFromSystemPath(sSysPath, osl::FileBase::E_INVAL, ""_ostr);
        checkWNTBehaviour_getFileURLFromSystemPath(sSysPath, osl::FileBase::E_INVAL, ""_ostr);
    }

    // testing the method
    // static inline RC searchFileURL( const OUString& ustrFileName,
    //                                  const OUString& ustrSearchPath,
    //                                  OUString& ustrFileURL)

    class searchFileURL : public CppUnit::TestFixture
    {
    private:
        OUString aUStr;

    public:
        void searchFileURL_001()
        {
            /* search file is passed by system filename */
            auto nError1 = osl::FileBase::searchFileURL(aTmpName1, aUserDirectorySys, aUStr);
            /* search file is passed by full qualified file URL */
            auto nError2 = osl::FileBase::searchFileURL(aCanURL1, aUserDirectorySys, aUStr);
            /* search file is passed by relative file path */
            auto nError3 = osl::FileBase::searchFileURL(aRelURL4, aUserDirectorySys, aUStr);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for searchFileURL function: system filename/URL filename/relative path, system directory, searched files that is not exist, but it reply invalid error, did not pass in (W32) ",
                                     osl::FileBase::E_NOENT, nError1);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for searchFileURL function: system filename/URL filename/relative path, system directory, searched files that is not exist, but it reply invalid error, did not pass in (W32) ",
                                     osl::FileBase::E_NOENT, nError2);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for searchFileURL function: system filename/URL filename/relative path, system directory, searched files that is not exist, but it reply invalid error, did not pass in (W32) ",
                                    osl::FileBase::E_NOENT, nError3);
        }

         void searchFileURL_002()
        {
#ifndef UNX
            /* search file is passed by system filename */
            OUString strRootSys = INetURLObject(aTempDirectoryURL).GetLastName();
            auto nError1 = osl::FileBase::searchFileURL(aTempDirectorySys, strRootSys, aUStr);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for searchFileURL function: system filename, system directory, searched file already exist.",
                                    osl::FileBase::E_None, nError1);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for searchFileURL function: system filename, system directory, searched file already exist.",
                                         normalize(aTempDirectoryURL), normalize(aUStr));
            /* search file is passed by full qualified file URL */
            auto nError2 = osl::FileBase::searchFileURL(aTempDirectoryURL, strRootSys, aUStr);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for searchFileURL function: URL filename, system directory, searched file already exist.",
                                    osl::FileBase::E_None, nError2);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for searchFileURL function: URL filename, system directory, searched file already exist.",
                                         normalize(aTempDirectoryURL), normalize(aUStr));
#ifndef _WIN32
            /* search file is passed by relative file path */
            auto nError3 = osl::FileBase::searchFileURL(aRelURL5, strRootSys, aUStr);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for searchFileURL function: relative path, system directory, searched file already exist.",
                                    osl::FileBase::E_None, nError3);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for searchFileURL function: relative path, system directory, searched file already exist.",
                                         normalize(aTempDirectoryURL), normalize(aUStr));
#endif
            /* search file is passed by an exist file */
            createTestFile(aCanURL1);
            auto nError4 = osl::FileBase::searchFileURL(aCanURL4, aUserDirectorySys, aUStr);
            deleteTestFile(aCanURL1);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for searchFileURL function: system filename/URL filename/relative path, system directory, searched file already exist.",
                                    osl::FileBase::E_None, nError4);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for searchFileURL function: system filename/URL filename/relative path, system directory, searched file already exist.",
                                         normalize(aCanURL1), normalize(aUStr));
#endif
        }

        void searchFileURL_003()
        {
            OUString aSystemPathList(aRootSys + PATH_LIST_DELIMITER + aTempDirectorySys + PATH_LIST_DELIMITER + aRootSys + "system/path");
            auto nError1 = osl::FileBase::searchFileURL(aUserDirectoryURL, aSystemPathList, aUStr);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for searchFileURL function: search directory is a list of system paths",
                                    osl::FileBase::E_None, nError1);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for searchFileURL function: search directory is a list of system paths",
                                         normalize(aUserDirectoryURL), normalize(aUStr));
        }

        void searchFileURL_004()
        {
            OUString aSystemPathList(aRootSys + PATH_LIST_DELIMITER + aTempDirectorySys + PATH_LIST_DELIMITER + aRootSys + "system/path/../name");
            auto nError1 = osl::FileBase::searchFileURL(aUserDirectoryURL, aSystemPathList, aUStr);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for searchFileURL function: search directory is a list of system paths",
                                    osl::FileBase::E_None, nError1);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for searchFileURL function: search directory is a list of system paths",
                                         normalize(aUserDirectoryURL), normalize(aUStr));
        }

        void searchFileURL_005()
        {
            auto nError1 = osl::FileBase::searchFileURL(aUserDirectoryURL, aNullURL, aUStr);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for searchFileURL function: search directory is NULL",
                                    osl::FileBase::E_None, nError1);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for searchFileURL function: search directory is NULL",
                                         normalize(aUserDirectoryURL), normalize(aUStr));
        }

        CPPUNIT_TEST_SUITE(searchFileURL);
            CPPUNIT_TEST(searchFileURL_001);
            CPPUNIT_TEST(searchFileURL_002);
            CPPUNIT_TEST(searchFileURL_003);
            CPPUNIT_TEST(searchFileURL_004);
            CPPUNIT_TEST(searchFileURL_005);
        CPPUNIT_TEST_SUITE_END();
    };

    // testing the method
    // static inline RC getTempDirURL(OUString& ustrTempDirURL)

    class getTempDirURL : public CppUnit::TestFixture
    {
    private:
        OUString aUStr;

    public:
        void setUp() override
        {
            osl::FileBase::RC nError = osl::FileBase::getTempDirURL(aUStr);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for getTempDirURL function: execution",
                                     osl::FileBase::E_None, nError);
        }

        void getTempDirURL_002()
        {
            CPPUNIT_ASSERT_MESSAGE("test for getTempDirURL function: test for open and write access rights",
                                    checkDirectory(aUStr, oslCheckMode::OpenAccess));
            CPPUNIT_ASSERT_MESSAGE("test for getTempDirURL function: test for open and write access rights",
                                    checkDirectory(aUStr, oslCheckMode::ReadAccess));
            CPPUNIT_ASSERT_MESSAGE("test for getTempDirURL function: test for open and write access rights",
                                    checkDirectory(aUStr, oslCheckMode::WriteAccess));
        }

        CPPUNIT_TEST_SUITE(getTempDirURL);
            CPPUNIT_TEST(getTempDirURL_002);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  static inline RC createTempFile(OUString* pustrDirectoryURL,
    //                                   oslFileHandle* pHandle,
    //                                   OUString* pustrTempFileURL)

    class createTempFile : public CppUnit::TestFixture
    {
    private:
        std::unique_ptr<oslFileHandle> pHandle;
        std::unique_ptr<OUString> pUStr_DirURL;
        std::unique_ptr<OUString> pUStr_FileURL;

    public:
        void setUp() override
        {
            pHandle.reset(new oslFileHandle());
            pUStr_DirURL.reset(new OUString(aUserDirectoryURL));
            pUStr_FileURL.reset(new OUString());
        }

        void tearDown() override
        {
            pUStr_DirURL.reset();
            pUStr_FileURL.reset();
            pHandle.reset();
        }

        void createTempFile_001()
        {
            auto nError1 = osl::FileBase::createTempFile(pUStr_DirURL.get(), pHandle.get(), pUStr_FileURL.get());
            File testFile(*pUStr_FileURL);
            auto nError2 = testFile.open(osl_File_OpenFlag_Create);

            if (nError2 == osl::FileBase::E_EXIST)
            {
                osl_closeFile(*pHandle);
                deleteTestFile(*pUStr_FileURL);
            }

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for createTempFile function: create temp file and test the existence",
                                     osl::FileBase::E_None, nError1);
            CPPUNIT_ASSERT_MESSAGE("test for createTempFile function: create temp file and test the existence",
                                     (pHandle != nullptr));
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for createTempFile function: create temp file and test the existence",
                                     osl::FileBase::E_EXIST, nError2);
        }

        void createTempFile_002()
        {
            bool bOK = false;
            auto nError1 = osl::FileBase::createTempFile(pUStr_DirURL.get(), pHandle.get(), pUStr_FileURL.get());
            File testFile(*pUStr_FileURL);
            auto nError2 = testFile.open(osl_File_OpenFlag_Create);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("createTempFile function: create a temp file, but it does not exist",
                osl::FileBase::E_None, nError1);
            CPPUNIT_ASSERT_MESSAGE("createTempFile function: create a temp file, but it does not exist",
                (pHandle != nullptr));
            CPPUNIT_ASSERT_EQUAL_MESSAGE("createTempFile function: create a temp file, but it does not exist",
                osl::FileBase::E_EXIST, nError2);

            // check file if have the write permission
            if (nError2 == osl::FileBase::E_EXIST)
            {
                bOK = ifFileCanWrite(*pUStr_FileURL);
                osl_closeFile(*pHandle);
                deleteTestFile(*pUStr_FileURL);
            }

            CPPUNIT_ASSERT_MESSAGE("test for open and write access rights, in (W32), it did not have write access right, but it should be writable.",
                                     bOK);
        }

        void createTempFile_003()
        {
            auto nError1 = osl::FileBase::createTempFile(pUStr_DirURL.get(), pHandle.get(), nullptr);
            // the temp file will be removed when return from createTempFile
            bool bOK = (pHandle != nullptr && nError1 == osl::FileBase::E_None);
            if (bOK)
                osl_closeFile(*pHandle);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for createTempFile function: set pUStrFileURL to 0 to let it remove the file after call.",
                                osl::FileBase::E_None, nError1);
            CPPUNIT_ASSERT_MESSAGE("test for createTempFile function: set pUStrFileURL to 0 to let it remove the file after call.",
                                bOK);
        }

        void createTempFile_004()
        {
            auto nError1 = osl::FileBase::createTempFile(pUStr_DirURL.get(), nullptr, pUStr_FileURL.get());
            bool bOK = (pUStr_FileURL != nullptr);
            CPPUNIT_ASSERT(bOK);
            File testFile(*pUStr_FileURL);
            auto nError2 = testFile.open(osl_File_OpenFlag_Create);
            deleteTestFile(*pUStr_FileURL);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("createTempFile function: create a temp file, but it does not exist",
                osl::FileBase::E_None, nError1);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("createTempFile function: create a temp file, but it does not exist",
                osl::FileBase::E_EXIST, nError2);
            CPPUNIT_ASSERT_MESSAGE("createTempFile function: create a temp file, but it does not exist",
                bOK);

        }

        CPPUNIT_TEST_SUITE(createTempFile);
            CPPUNIT_TEST(createTempFile_001);
            CPPUNIT_TEST(createTempFile_002);
            CPPUNIT_TEST(createTempFile_003);
            CPPUNIT_TEST(createTempFile_004);
        CPPUNIT_TEST_SUITE_END();
    };

    // FIXME: remove the _disabled to enable:
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_FileBase::getAbsoluteFileURL, "osl_osl::FileBase");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_FileBase::SystemPath_FileURL, "osl_osl::FileBase");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_FileBase::searchFileURL, "osl_osl::FileBase");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_FileBase::getTempDirURL, "osl_osl::FileBase");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_FileBase::createTempFile, "osl_osl::FileBase");

    CPPUNIT_REGISTRY_ADD_TO_DEFAULT("osl_osl::FileBase");
}

namespace osl_FileStatus
{
    //  testing the method
    //  FileStatus(sal_uInt32 nMask): _nMask(nMask)
    class ctors : public CppUnit::TestFixture
    {
    private:
        OUString aUStr;
        DirectoryItem rItem;

    public:
        void setUp() override
        {
            // create a tempfile in $TEMP/tmpdir/tmpname.
            createTestDirectory(aTmpName3);
            createTestFile(aTmpName4);

            Directory aDir(aTmpName3);
            auto nError1 = aDir.open();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            nError1 = aDir.getNextItem(rItem);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            aDir.close();
        }

        void tearDown() override
        {
            // remove the tempfile in $TEMP/tmpdir/tmpname.
            deleteTestFile(aTmpName4);
            deleteTestDirectory(aTmpName3);
        }

        void ctors_001()
        {
            FileStatus rFileStatus(osl_FileStatus_Mask_All);
            auto nError1 = rItem.getFileStatus(rFileStatus);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            aUStr = rFileStatus.getFileName();

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for ctors function: mask all and see the file name",
                                         normalize(aTmpName2), normalize(aUStr));
        }

        void ctors_002()
        {
            FileStatus rFileStatus(0);
            auto nError1 = rItem.getFileStatus(rFileStatus);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            aUStr = rFileStatus.getFileName();

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for ctors function: mask is empty",
                                         normalize(aNullURL), normalize(aUStr));
        }

        CPPUNIT_TEST_SUITE(ctors);
            CPPUNIT_TEST(ctors_001);
            CPPUNIT_TEST(ctors_002);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline sal_Bool isValid(sal_uInt32 nMask) const

    class isValid : public CppUnit::TestFixture
    {
    private:
        std::unique_ptr<Directory> pDir;
        DirectoryItem rItem_file, rItem_link;

    public:
        void setUp() override
        {
            // create a tempfile in $TEMP/tmpdir/tmpname.
            createTestDirectory(aTmpName3);
            createTestFile(aTmpName4);

            pDir.reset(new Directory(aTmpName3));
            osl::FileBase::RC nError1 = pDir->open();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            nError1 = pDir->getNextItem(rItem_file, 1);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
        }

        void tearDown() override
        {
            osl::FileBase::RC nError1 = pDir->close();
            pDir.reset();
            CPPUNIT_ASSERT_EQUAL_MESSAGE(errorToStr(nError1).getStr(), osl::FileBase::E_None, nError1);

            // remove the tempfile in $TEMP/tmpdir/tmpname.
            deleteTestFile(aTmpName4);
            deleteTestDirectory(aTmpName3);
        }

        void isValid_001()
        {
            sal_uInt32 mask = 0;
            FileStatus rFileStatus(mask);
            osl::FileBase::RC nError1 = rItem_file.getFileStatus(rFileStatus);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            bool bOk = rFileStatus.isValid(mask);

            CPPUNIT_ASSERT_MESSAGE("test for isValid function: no fields specified", bOk);
        }

        void check_FileStatus(FileStatus const& _aStatus)
        {
            OString sStat;
            if (_aStatus.isValid(osl_FileStatus_Mask_Type))
                sStat += "type ";
            if (_aStatus.isValid(osl_FileStatus_Mask_Attributes))
                sStat += "attributes ";
            if (_aStatus.isValid(osl_FileStatus_Mask_CreationTime))
                sStat += "ctime ";
            if (_aStatus.isValid(osl_FileStatus_Mask_AccessTime))
                sStat += "atime ";
            if (_aStatus.isValid(osl_FileStatus_Mask_ModifyTime))
                sStat += "mtime ";
            if (_aStatus.isValid(osl_FileStatus_Mask_FileSize))
                sStat += "filesize ";
            if (_aStatus.isValid(osl_FileStatus_Mask_FileName))
                sStat += "filename ";
            if (_aStatus.isValid(osl_FileStatus_Mask_FileURL))
                sStat += "fileurl ";
            printf("mask: %s\n", sStat.getStr());
        }

        void isValid_002()
        {
            createTestFile(aTmpName6);
            sal_uInt32 mask_file = osl_FileStatus_Mask_Type |
                                   osl_FileStatus_Mask_Attributes |
                                   osl_FileStatus_Mask_CreationTime |
                                   osl_FileStatus_Mask_AccessTime |
                                   osl_FileStatus_Mask_ModifyTime |
                                   osl_FileStatus_Mask_FileSize |
                                   osl_FileStatus_Mask_FileName |
                                   osl_FileStatus_Mask_FileURL;

            FileStatus rFileStatus(mask_file);
            DirectoryItem::get(aTmpName6, rItem_file);
            osl::FileBase::RC nError1 = rItem_file.getFileStatus(rFileStatus);

            CPPUNIT_ASSERT_EQUAL_MESSAGE(errorToStr(nError1).getStr(), osl::FileBase::E_None, nError1);

            check_FileStatus(rFileStatus);
            deleteTestFile(aTmpName6);

        }

        /** Check if is a valid linked file.

            Link is not defined in Windows, and on Linux, we can not get the directory item of the linked file.
            We have to defer to filesystems, normal filesystems support links (EXT2, ...), castrated filesystems
            don't have links (FAT, FAT32) and Windows NT NTFS support links, but the Windows API doesn't :-(
        */
        void isValid_003()
        {
#if 0
#if defined (UNX)
            sal_Int32 fd;

            OUString aUStr_LnkFileSys(aTempDirectorySys), aUStr_SrcFileSys(aTempDirectorySys);
            aUStr_LnkFileSys += aSlashURL + getCurrentPID() + "/tmpdir/link.file";
            aUStr_SrcFileSys += aSlashURL + getCurrentPID() + "/tmpdir/tmpname";

            OString strLinkFileName;
            OString strSrcFileName;
            strLinkFileName = OUStringToOString(aUStr_LnkFileSys, RTL_TEXTENCODING_ASCII_US);
            strSrcFileName = OUStringToOString(aUStr_SrcFileSys, RTL_TEXTENCODING_ASCII_US);

            // create a link file and link it to file "/tmp/PID/tmpdir/tmpname"
            fd = symlink(strSrcFileName.getStr(), strLinkFileName.getStr());
            CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), fd);

            // testDirectory is "/tmp/PID/tmpdir/"
            Directory testDirectory(aTmpName3);
            testDirectory.open();
            OUString aFileName ("link.file");
            bool bOk = false;
            while (true)
            {
                osl::FileBase::RC nError1 = testDirectory.getNextItem(rItem_link, 4);

                if (nError1 == osl::FileBase::E_None)
                {
                    sal_uInt32 mask_link = osl_FileStatus_Mask_FileName | osl_FileStatus_Mask_LinkTargetURL;
                    FileStatus rFileStatus(mask_link);
                    rItem_link.getFileStatus(rFileStatus);

                    if (normalize(rFileStatus.getFileName()) == normalize(aFileName))
                    {
                        if (rFileStatus.isValid(osl_FileStatus_Mask_LinkTargetURL))
                        {
                            bOk = true;
                            break;
                        }
                    }
                }
                else
                {
                    break;
                }
            };

            fd = remove(strLinkFileName.getStr());
            CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), fd);

            CPPUNIT_ASSERT_MESSAGE("test for isValid function: link file, check for LinkTargetURL", bOk);
#endif
#endif
        }

        void isValid_004()
        {
            sal_uInt32 mask_file_all = osl_FileStatus_Mask_All;
            FileStatus   rFileStatus_all(mask_file_all);
            osl::FileBase::RC nError1 = rItem_file.getFileStatus(rFileStatus_all);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            check_FileStatus(rFileStatus_all);

            sal_uInt32 mask_file_val = osl_FileStatus_Mask_Validate;
            FileStatus   rFileStatus_val(mask_file_val);
            nError1 = rItem_file.getFileStatus(rFileStatus_val);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            check_FileStatus(rFileStatus_val);
        }

        CPPUNIT_TEST_SUITE(isValid);
            CPPUNIT_TEST(isValid_001);
            CPPUNIT_TEST(isValid_002);
            CPPUNIT_TEST(isValid_003);
            CPPUNIT_TEST(isValid_004);
        CPPUNIT_TEST_SUITE_END();
    };

    // testing the method
    // inline Type getFileType() const

    class getFileType : public CppUnit::TestFixture
    {
    private:
        DirectoryItem m_aItem_1, m_aItem_2, m_aVolumeItem, m_aFifoItem;
        DirectoryItem m_aLinkItem, m_aSocketItem, m_aSpecialItem;

    public:
        void setUp() override
        {
            // create a tempfile: $TEMP/tmpdir/tmpname.
            //        a tempdirectory: $TEMP/tmpdir/tmpdir.
            //        use $ROOT/staroffice as volume ---> use dev/fd as volume.
            // and get their directory item.
            createTestDirectory(aTmpName3);
            createTestFile(aTmpName3, aTmpName2);
            createTestDirectory(aTmpName3, aTmpName1);

            std::unique_ptr<Directory> xDir(new Directory(aTmpName3));
            auto nError1 = xDir->open();
            CPPUNIT_ASSERT_EQUAL_MESSAGE("open aTmpName3 failed!", osl::FileBase::E_None, nError1);
            // getNextItem can not assure which item retrieved
            nError1 = xDir->getNextItem(m_aItem_1, 1);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("get first item failed!", osl::FileBase::E_None, nError1);

            nError1 = xDir->getNextItem(m_aItem_2);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("get second item failed!", osl::FileBase::E_None, nError1);
            xDir->close();
            // FIXME mindy: failed on my RH9, so removed temporarily
            // nError1 = DirectoryItem::get(aVolURL2, m_aVolumeItem);
            // CPPUNIT_ASSERT_MESSAGE("get volume item failed!", osl::FileBase::E_None == nError1);
        }

        void tearDown() override
        {
            // remove all in $TEMP/tmpdir.
            deleteTestDirectory(aTmpName3, aTmpName1);
            deleteTestFile(aTmpName3, aTmpName2);
            deleteTestDirectory(aTmpName3);
        }

        void getFileType_001()
        {
            FileStatus   rFileStatus(osl_FileStatus_Mask_Type | osl_FileStatus_Mask_FileName);
            auto nError1 = m_aItem_1.getFileStatus(rFileStatus);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("getFileStatus failed", osl::FileBase::E_None, nError1);

            check_FileType(rFileStatus);
        }

        void check_FileType(osl::FileStatus const& _rFileStatus)
        {
            if (_rFileStatus.isValid(osl_FileStatus_Mask_FileName))
            {
                OUString suFilename = _rFileStatus.getFileName();

                if (_rFileStatus.isValid(osl_FileStatus_Mask_Type))
                {
                    osl::FileStatus::Type eType = _rFileStatus.getFileType();
                    bool bOK = false;

                    if (normalize(suFilename) == normalize(aTmpName2))
                        bOK = (eType == osl::FileStatus::Regular);

                    if (normalize(suFilename) == normalize(aTmpName1))
                        bOK = (eType == FileStatus::Directory);

                    CPPUNIT_ASSERT_MESSAGE("test for getFileType function: ", bOK);
                }
            }
            // LLA: it's not a bug, if a FileStatus not exist, so no else
        }

        void getFileType_002()
        {
            FileStatus rFileStatus(osl_FileStatus_Mask_Type | osl_FileStatus_Mask_FileName);
            auto nError1 = m_aItem_2.getFileStatus(rFileStatus);

            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            check_FileType(rFileStatus);
        }

        void getFileType_003()
        {
        }

        void getFileType_007()
        {
#if defined(__sun) // Special file is different in Windows
            auto nError1 = DirectoryItem::get(aTypeURL2, m_aSpecialItem);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            // check for File type
            FileStatus   rFileStatus(osl_FileStatus_Mask_Type);
            nError1 = m_aSpecialItem.getFileStatus(rFileStatus);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            if (rFileStatus.isValid(osl_FileStatus_Mask_Type))
            {
                osl::FileStatus::Type eType = rFileStatus.getFileType();

                CPPUNIT_ASSERT_MESSAGE("test for getFileType function: Special, Solaris version ",
                                        (eType == FileStatus::Special));
            }
#endif
        }

        CPPUNIT_TEST_SUITE(getFileType);
            CPPUNIT_TEST(getFileType_001);
            CPPUNIT_TEST(getFileType_002);
            CPPUNIT_TEST(getFileType_003);
            CPPUNIT_TEST(getFileType_007);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline sal_uInt64 getAttributes() const

    class getAttributes : public CppUnit::TestFixture
    {
    private:
        OUString aTypeURL, aTypeURL_Hid;
        DirectoryItem rItem, rItem_hidden;

    public:
        void setUp() override
        {
            aTypeURL = aUserDirectoryURL.copy(0);
            concatURL(aTypeURL, aTmpName2);
            createTestFile(aTypeURL);
            osl::FileBase::RC nError = DirectoryItem::get(aTypeURL, rItem);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError);

            aTypeURL_Hid = aUserDirectoryURL.copy(0);
            concatURL(aTypeURL_Hid, aHidURL1);
            createTestFile(aTypeURL_Hid);
#ifdef _WIN32
            hideFile(aTypeURL_Hid);
#endif
            nError = DirectoryItem::get(aTypeURL_Hid, rItem_hidden);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError);
        }

        void tearDown() override
        {
            deleteTestFile(aTypeURL);
            deleteTestFile(aTypeURL_Hid);
        }

#if (defined UNX)
// windows only has 3 file attributes: normal, readonly and hidden
        void getAttributes_001()
        {
            changeFileMode(aTypeURL, S_IRUSR | S_IRGRP | S_IROTH);

            FileStatus rFileStatus(osl_FileStatus_Mask_Attributes);
            osl::FileBase::RC nError = rItem.getFileStatus(rFileStatus);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError);

            if (geteuid() == 0) // as root, access(W_OK) may be true despite mode
            {
                CPPUNIT_ASSERT_EQUAL_MESSAGE("test for getAttributes function: (not ReadOnly,) GrpRead, OwnRead, OthRead(UNX version) ",
                                    static_cast<sal_uInt64>(osl_File_Attribute_GrpRead | osl_File_Attribute_OwnRead | osl_File_Attribute_OthRead),
                                    rFileStatus.getAttributes());
            }
            else
            {
                CPPUNIT_ASSERT_EQUAL_MESSAGE("test for getAttributes function: ReadOnly, GrpRead, OwnRead, OthRead(UNX version) ",
                                    static_cast<sal_uInt64>(osl_File_Attribute_ReadOnly | osl_File_Attribute_GrpRead | osl_File_Attribute_OwnRead | osl_File_Attribute_OthRead),
                                    rFileStatus.getAttributes());
            }
        }
#else // Windows version
        void getAttributes_001()
        {
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for getAttributes function: ReadOnly, GrpRead, OwnRead, OthRead(Windows version)",
                                     1, 1);
        }
#endif

        void getAttributes_002()
        {
#if (defined UNX)
            changeFileMode(aTypeURL, S_IXUSR | S_IXGRP | S_IXOTH);

            FileStatus   rFileStatus(osl_FileStatus_Mask_Attributes);
            osl::FileBase::RC nError = rItem.getFileStatus(rFileStatus);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError);

            if (geteuid() == 0) // as root, access(W_OK) may be true despite mode
            {
                CPPUNIT_ASSERT_EQUAL_MESSAGE("test for getAttributes function: Executable, GrpExe, OwnExe, OthExe, the result is (not Readonly,) Executable, GrpExe, OwnExe, OthExe, it partly not pass(Solaris version)",
                                    static_cast<sal_uInt64>(osl_File_Attribute_Executable | osl_File_Attribute_GrpExe | osl_File_Attribute_OwnExe | osl_File_Attribute_OthExe),
                                    rFileStatus.getAttributes());
            }
            else
            {
                CPPUNIT_ASSERT_EQUAL_MESSAGE("test for getAttributes function: Executable, GrpExe, OwnExe, OthExe, the result is Readonly, Executable, GrpExe, OwnExe, OthExe, it partly not pass(Solaris version)",
                                    static_cast<sal_uInt64>(osl_File_Attribute_ReadOnly | osl_File_Attribute_Executable | osl_File_Attribute_GrpExe | osl_File_Attribute_OwnExe | osl_File_Attribute_OthExe),
                                    rFileStatus.getAttributes());
            }
#endif
        }

#if (defined UNX)
        void getAttributes_003()
        {
            changeFileMode(aTypeURL, S_IWUSR | S_IWGRP | S_IWOTH);

            FileStatus   rFileStatus(osl_FileStatus_Mask_Attributes);
            osl::FileBase::RC nError = rItem.getFileStatus(rFileStatus);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for getAttributes function: GrpWrite, OwnWrite, OthWrite(Solaris version)",
                                    static_cast<sal_uInt64>(osl_File_Attribute_GrpWrite | osl_File_Attribute_OwnWrite | osl_File_Attribute_OthWrite),
                                    rFileStatus.getAttributes());
        }
#else // Windows version
        void getAttributes_003()
        {
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for getAttributes function: GrpWrite, OwnWrite, OthWrite(Windows version)",
                                     1, 1);
        }
#endif

        void getAttributes_004()
        {
            sal_Int32 test_Attributes = osl_File_Attribute_Hidden;
            FileStatus rFileStatus(osl_FileStatus_Mask_Attributes);
            osl::FileBase::RC nError = rItem_hidden.getFileStatus(rFileStatus);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError);
            test_Attributes &= rFileStatus.getAttributes();

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for getAttributes function: Hidden files",
                                    static_cast<sal_Int32>(osl_File_Attribute_Hidden), test_Attributes);
        }

        CPPUNIT_TEST_SUITE(getAttributes);
            CPPUNIT_TEST(getAttributes_001);
            CPPUNIT_TEST(getAttributes_002);
            CPPUNIT_TEST(getAttributes_003);
            CPPUNIT_TEST(getAttributes_004);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline TimeValue getAccessTime() const

    class getAccessTime : public CppUnit::TestFixture
    {
    private:
        OUString aTypeURL;
        DirectoryItem rItem;

    public:
        void setUp() override
        {
            aTypeURL = aUserDirectoryURL.copy(0);
            concatURL(aTypeURL, aTmpName2);
            createTestFile(aTypeURL);
            osl::FileBase::RC nError = DirectoryItem::get(aTypeURL, rItem);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError);

        }

        void tearDown() override
        {
            deleteTestFile(aTypeURL);
        }

        void getAccessTime_001()
        {
            TimeValue *pTV_current = nullptr;
            CPPUNIT_ASSERT((pTV_current = static_cast<TimeValue*>(malloc(sizeof(TimeValue)))) != nullptr);
            TimeValue *pTV_access = nullptr;
            CPPUNIT_ASSERT((pTV_access = static_cast<TimeValue*>(malloc(sizeof(TimeValue)))) != nullptr);

            FileStatus   rFileStatus(osl_FileStatus_Mask_AccessTime);
            osl::FileBase::RC nError = rItem.getFileStatus(rFileStatus);
            bool bOk = osl_getSystemTime(pTV_current);
            CPPUNIT_ASSERT(bOk);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError);

            *pTV_access = rFileStatus.getAccessTime();

            bool bOK = t_compareTime(pTV_access, pTV_current, delta);
            free(pTV_current);
            free(pTV_access);

            CPPUNIT_ASSERT_MESSAGE("test for getAccessTime function: This test turns out that UNX precision is no more than 1 sec, don't know how to test this function, in Windows test, it lost hour min sec, only have date time. ",
                                    bOK);
        }

        CPPUNIT_TEST_SUITE(getAccessTime);
            CPPUNIT_TEST(getAccessTime_001);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline TimeValue getModifyTime() const

    class getModifyTime : public CppUnit::TestFixture
    {
    private:
        OUString aTypeURL;
        DirectoryItem rItem;

    public:
        void getModifyTime_001()
        {
            TimeValue *pTV_current = nullptr;
            CPPUNIT_ASSERT((pTV_current = static_cast<TimeValue*>(malloc(sizeof(TimeValue)))) != nullptr);

            // create file
            aTypeURL = aUserDirectoryURL.copy(0);
            concatURL(aTypeURL, aTmpName2);
            createTestFile(aTypeURL);

            // get current time
            bool bOk = osl_getSystemTime(pTV_current);
            CPPUNIT_ASSERT(bOk);

            // get instance item and filestatus
            osl::FileBase::RC nError = DirectoryItem::get(aTypeURL, rItem);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError);
            FileStatus   rFileStatus(osl_FileStatus_Mask_ModifyTime);
            nError = rItem.getFileStatus(rFileStatus);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError);

            // get modify time
            TimeValue* pTV_modify = nullptr;
            CPPUNIT_ASSERT((pTV_modify = static_cast<TimeValue*>(malloc(sizeof(TimeValue)))) != nullptr);
            *pTV_modify = rFileStatus.getModifyTime();

            bool bOK = t_compareTime(pTV_modify, pTV_current, delta);
            // delete file
            deleteTestFile(aTypeURL);
            free(pTV_current);
            free(pTV_modify);

            CPPUNIT_ASSERT_MESSAGE("test for getModifyTime function: This test turns out that UNX precision is no more than 1 sec, don't know how to improve this function.  ",
                                    bOK);
        }

        CPPUNIT_TEST_SUITE(getModifyTime);
            CPPUNIT_TEST(getModifyTime_001);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline sal_uInt64 getFileSize() const

    class getFileSize : public CppUnit::TestFixture
    {
    private:
        OUString aTypeURL;
        DirectoryItem rItem;

    public:
        void setUp() override
        {
            aTypeURL = aUserDirectoryURL.copy(0);
            concatURL(aTypeURL, aTmpName2);
            createTestFile(aTypeURL);
            osl::FileBase::RC nError = DirectoryItem::get(aTypeURL, rItem);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError);
        }

        void tearDown() override
        {
            deleteTestFile(aTypeURL);
        }

        void getFileSize_001()
        {
            FileStatus   rFileStatus(osl_FileStatus_Mask_FileSize);
            osl::FileBase::RC nError = rItem.getFileStatus(rFileStatus);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError);

            sal_uInt64 uFileSize = rFileStatus.getFileSize();

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for getFileSize function: empty file ",
                                    static_cast<sal_uInt64>(0), uFileSize);
        }

        void getFileSize_002()
        {
            File testfile(aTypeURL);
            osl::FileBase::RC nError = testfile.open(osl_File_OpenFlag_Write | osl_File_OpenFlag_Read);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError);
            nError = testfile.setSize(TEST_FILE_SIZE);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError);

            nError = DirectoryItem::get(aTypeURL, rItem);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError);
            FileStatus   rFileStatus(osl_FileStatus_Mask_FileSize);
            nError = rItem.getFileStatus(rFileStatus);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError);
            sal_uInt64 uFileSize = rFileStatus.getFileSize();

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for getFileSize function: file with size of TEST_FILE_SIZE, did not pass in (W32). ",
                                    static_cast<sal_uInt64>(TEST_FILE_SIZE), uFileSize);
        }

        CPPUNIT_TEST_SUITE(getFileSize);
            CPPUNIT_TEST(getFileSize_001);
            CPPUNIT_TEST(getFileSize_002);
        CPPUNIT_TEST_SUITE_END();
    };

    // testing the method
    // inline OUString getFileName() const

    class getFileName : public CppUnit::TestFixture
    {
    private:
        OUString aTypeURL;
        DirectoryItem rItem;

    public:
        void setUp() override
        {
            aTypeURL = aUserDirectoryURL.copy(0);
            concatURL(aTypeURL, aTmpName2);
            createTestFile(aTypeURL);
            osl::FileBase::RC nError = DirectoryItem::get(aTypeURL, rItem);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError);
        }

        void tearDown() override
        {
            deleteTestFile(aTypeURL);
        }


        void getFileName_001()
        {
            FileStatus rFileStatus(osl_FileStatus_Mask_FileName);
            osl::FileBase::RC nError = rItem.getFileStatus(rFileStatus);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError);

            OUString aFileName = rFileStatus.getFileName();

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for getFileName function: name compare with specify",
                                         normalize(aTmpName2), normalize(aFileName));
        }

        CPPUNIT_TEST_SUITE(getFileName);
            CPPUNIT_TEST(getFileName_001);
        CPPUNIT_TEST_SUITE_END();
    };

    // testing the method
    // inline OUString getFileURL() const

    class getFileURL : public CppUnit::TestFixture
    {
        DirectoryItem rItem;

    public:
        void setUp() override
        {
            createTestFile(aTmpName6);
            osl::FileBase::RC nError = DirectoryItem::get(aTmpName6, rItem);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError);
        }

        void tearDown() override
        {
            deleteTestFile(aTmpName6);
        }


        void getFileURL_001()
        {
            FileStatus   rFileStatus(osl_FileStatus_Mask_FileURL);
            osl::FileBase::RC nError = rItem.getFileStatus(rFileStatus);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError);

            OUString aFileURL = rFileStatus.getFileURL();

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for getFileURL function: ",
                                         normalize(aTmpName6), normalize(aFileURL));
        }

        CPPUNIT_TEST_SUITE(getFileURL);
            CPPUNIT_TEST(getFileURL_001);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline OUString getLinkTargetURL() const

    class getLinkTargetURL : public CppUnit::TestFixture
    {
    private:
        OUString aTypeURL;
        DirectoryItem rItem;

    public:
        void setUp() override
        {
            aTypeURL = aUserDirectoryURL.copy(0);
            concatURL(aTypeURL, aTmpName2);
            createTestFile(aTypeURL);
        }

        void tearDown() override
        {
            deleteTestFile(aTypeURL);
        }

        void getLinkTargetURL_001()
        {
#if 0
#if (defined UNX) // Link file is not defined in Windows
            // create a link file;
            OUString aUStr_LnkFileSys(aTempDirectorySys), aUStr_SrcFileSys(aTempDirectorySys);
            aUStr_LnkFileSys += aSlashURL + getCurrentPID() + "/link.file";
            aUStr_SrcFileSys += aSlashURL + getCurrentPID() + "/tmpname";

            OString strLinkFileName, strSrcFileName;
            strLinkFileName = OUStringToOString(aUStr_LnkFileSys, RTL_TEXTENCODING_ASCII_US);
            strSrcFileName  = OUStringToOString(aUStr_SrcFileSys, RTL_TEXTENCODING_ASCII_US);

            sal_Int32 fd;
            fd = symlink(strSrcFileName.getStr(), strLinkFileName.getStr());
            CPPUNIT_ASSERT_EQUAL_MESSAGE("in creating link file",  static_cast<sal_Int32>(0), fd);

            // get linkTarget URL
            auto nError = DirectoryItem::get(aLnkURL1, rItem);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("in getting link file item", osl::FileBase::E_None, nError);

            FileStatus   rFileStatus(osl_FileStatus_Mask_LinkTargetURL);
            nError = rItem.getFileStatus(rFileStatus);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("in getting link file status", osl::FileBase::E_None, nError);
            OUString aFileURL = rFileStatus.getLinkTargetURL();

            // remove link file
            fd = remove(strLinkFileName.getStr());
            CPPUNIT_ASSERT_EQUAL_MESSAGE("in deleting link file",  static_cast<sal_Int32>(0), fd);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for getLinkTargetURL function: Solaris version, create a file, and a link file link to it, get its LinkTargetURL and compare",
                                         normalize(aTypeURL), normalize(aFileURL));
#endif
#endif
        }

        CPPUNIT_TEST_SUITE(getLinkTargetURL);
            CPPUNIT_TEST(getLinkTargetURL_001);
        CPPUNIT_TEST_SUITE_END();
    };

    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_FileStatus::ctors, "osl_FileStatus");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_FileStatus::isValid, "osl_FileStatus");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_FileStatus::getFileType, "osl_FileStatus");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_FileStatus::getAttributes, "osl_FileStatus");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_FileStatus::getAccessTime, "osl_FileStatus");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_FileStatus::getModifyTime, "osl_FileStatus");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_FileStatus::getFileSize, "osl_FileStatus");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_FileStatus::getFileName, "osl_FileStatus");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_FileStatus::getFileURL, "osl_FileStatus");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_FileStatus::getLinkTargetURL, "osl_FileStatus");

    CPPUNIT_REGISTRY_ADD_TO_DEFAULT("osl_FileStatus");
}

namespace osl_File
{

    //  testing the method
    //  File(const OUString& ustrFileURL)

    class ctors : public CppUnit::TestFixture
    {
    public:
        void setUp() override
        {
            // create a tempfile in $TEMP/tmpdir/tmpname.
            createTestDirectory(aTmpName3);
            createTestFile(aTmpName4);
        }

        void tearDown() override
        {
            // remove the tempfile in $TEMP/tmpdir/tmpname.
            deleteTestFile(aTmpName4);
            deleteTestDirectory(aTmpName3);
        }

        void ctors_001()
        {
            File testFile(aTmpName4);

            osl::FileBase::RC nError1 = testFile.open(osl_File_OpenFlag_Read | osl_File_OpenFlag_Write);
            osl::FileBase::RC nError2 = testFile.close();
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for ctors function: initialize a File and test its open and close",
                                     osl::FileBase::E_None, nError1);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for ctors function: initialize a File and test its open and close",
                                     osl::FileBase::E_None, nError2);
        }

        void ctors_002()
        {
            File testFile(aTmpName5);
            char buffer[30] = "Test for File constructor";
            sal_uInt64 nCount;

            osl::FileBase::RC nError1 = testFile.open(osl_File_OpenFlag_Read | osl_File_OpenFlag_Write);
            osl::FileBase::RC nError2 = testFile.write(buffer, 30, nCount);
            testFile.close();

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for ctors function: test relative file URL, this test show that relative file URL is also acceptable",
                                     osl::FileBase::E_None, nError1);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for ctors function: test relative file URL, this test show that relative file URL is also acceptable",
                                     osl::FileBase::E_None, nError2);
        }

        CPPUNIT_TEST_SUITE(ctors);
            CPPUNIT_TEST(ctors_001);
            CPPUNIT_TEST(ctors_002);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline RC open(sal_uInt32 uFlags)

    class open : public CppUnit::TestFixture
    {
    public:
        void setUp() override
        {
            // create a tempfile in $TEMP/tmpdir/tmpname.
            createTestDirectory(aTmpName3);
            createTestFile(aTmpName4);
        }

        void tearDown() override
        {
            // remove the tempfile in $TEMP/tmpdir/tmpname.
            deleteTestFile(aTmpName4);
            deleteTestDirectory(aTmpName3);
        }


        void open_001()
        {
            File testFile(aTmpName4);

            auto nError1 = testFile.open(osl_File_OpenFlag_Read | osl_File_OpenFlag_Write);
            auto nError2 = testFile.close();
            CPPUNIT_ASSERT_EQUAL_MESSAGE("close error", osl::FileBase::E_None, nError2);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for open function: open a regular file",
                                     osl::FileBase::E_None, nError1);
        }

        void open_002()
        {
            File testFile(aTmpName3);

            auto nError1 = testFile.open(osl_File_OpenFlag_Read);

            CPPUNIT_ASSERT_MESSAGE("test for open function: open a directory",
                                     (File::E_INVAL == nError1) || (File::E_ACCES == nError1));
        }

        void open_003()
        {
            File testFile(aCanURL1);

            auto nError1 = testFile.open(osl_File_OpenFlag_Read | osl_File_OpenFlag_Write);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for open function: open a non-exist file",
                                     File::E_NOENT, nError1);
        }

        void open_005()
        {
            File testFile(aTmpName4);

            auto nError1 = testFile.open(osl_File_OpenFlag_Create);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for open function: create an exist file",
                                     File::E_EXIST, nError1);
        }

        void open_006()
        {
            File testFile(aCanURL1);
            char buffer_write[30] = "Test for File open";
            char buffer_read[30];
            sal_uInt64 nCount_write, nCount_read;

            auto nError1 = testFile.open(osl_File_OpenFlag_Read | osl_File_OpenFlag_Write | osl_File_OpenFlag_Create);
            auto nError2 = testFile.write(buffer_write, 30, nCount_write);
            osl::FileBase::RC nError4 = testFile.setPos(osl_Pos_Absolut, 0);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError4);
            auto nError3 = testFile.read(buffer_read, 10, nCount_read);

            osl::FileBase::RC nError5 = testFile.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError5);
            osl::FileBase::RC nError6 = osl::File::remove(aCanURL1);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError6);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for open function: test for osl_File_OpenFlag_Read, osl_File_OpenFlag_Write and osl_File_OpenFlag_Create",
                                    osl::FileBase::E_None, nError1);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for open function: test for osl_File_OpenFlag_Read, osl_File_OpenFlag_Write and osl_File_OpenFlag_Create",
                                    osl::FileBase::E_None, nError2);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for open function: test for osl_File_OpenFlag_Read, osl_File_OpenFlag_Write and osl_File_OpenFlag_Create",
                                    osl::FileBase::E_None, nError3);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for open function: test for osl_File_OpenFlag_Read, osl_File_OpenFlag_Write and osl_File_OpenFlag_Create",
                                    sal_uInt64(30), nCount_write);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for open function: test for osl_File_OpenFlag_Read, osl_File_OpenFlag_Write and osl_File_OpenFlag_Create",
                                    sal_uInt64(10), nCount_read);
        }

        CPPUNIT_TEST_SUITE(open);
            CPPUNIT_TEST(open_001);
            CPPUNIT_TEST(open_002);
            CPPUNIT_TEST(open_003);
            CPPUNIT_TEST(open_005);
            CPPUNIT_TEST(open_006);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline RC close()

    class close : public CppUnit::TestFixture
    {
    public:
        void setUp() override
        {
            // create a tempfile in $TEMP/tmpdir/tmpname.
            createTestDirectory(aTmpName3);
            createTestFile(aTmpName4);
        }

        void tearDown() override
        {
            // remove the tempfile in $TEMP/tmpdir/tmpname.
            deleteTestFile(aTmpName4);
            deleteTestDirectory(aTmpName3);
        }


        void close_001()
        {
            File testFile(aTmpName4);

            auto nError1 = testFile.open(osl_File_OpenFlag_Read | osl_File_OpenFlag_Write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            auto nError2 = testFile.close();

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for close function: close a regular file",
                                     osl::FileBase::E_None, nError2);
        }

        void close_002()
        {
            File testFile(aTmpName4);

            auto nError1 = testFile.open(osl_File_OpenFlag_Read | osl_File_OpenFlag_Write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            auto nError2 = testFile.close();

            auto nError3 = testFile.setPos(osl_Pos_Absolut, 0);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for close function: manipulate a file after it has been closed",
                                     osl::FileBase::E_None, nError2);
            CPPUNIT_ASSERT_MESSAGE("test for close function: manipulate a file after it has been closed",
                                    (osl::FileBase::E_None != nError3));
        }

        CPPUNIT_TEST_SUITE(close);
            CPPUNIT_TEST(close_001);
            CPPUNIT_TEST(close_002);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline RC setPos(sal_uInt32 uHow, sal_Int64 uPos)

    class setPos : public CppUnit::TestFixture
    {
    public:
        void setUp() override
        {
            // create a tempfile in $TEMP/tmpdir/tmpname.
            createTestDirectory(aTmpName3);
            createTestFile(aTmpName4);

            // write chars into the file.
            File testFile(aTmpName4);

            auto nError1 = testFile.open(osl_File_OpenFlag_Write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            sal_uInt64 nCount_write = 0;
            nError1 = testFile.write(pBuffer_Char, sizeof(pBuffer_Char), nCount_write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            nError1 = testFile.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
        }

        void tearDown() override
        {
            // remove the tempfile in $TEMP/tmpdir/tmpname.
            deleteTestFile(aTmpName4);
            deleteTestDirectory(aTmpName3);
        }

        void setPos_001()
        {
            File testFile(aTmpName4);
            char buffer_read[2];

            auto nError1 = testFile.open(osl_File_OpenFlag_Read | osl_File_OpenFlag_Write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            nError1 = testFile.setPos(osl_Pos_Absolut, 26);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            sal_uInt64 nCount_read = 0;
            nError1 = testFile.read(buffer_read, 1, nCount_read);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            nError1 = testFile.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for setPos function: test for osl_Pos_Absolut, set the position to 26, test if the 26th char in file is correct",
                                     pBuffer_Char[26], buffer_read[0]);
        }

        void setPos_002()
        {
            File testFile(aTmpName4);
            char buffer_read[2];

            auto nError1 = testFile.open(osl_File_OpenFlag_Read | osl_File_OpenFlag_Write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            nError1 = testFile.setPos(osl_Pos_Absolut, sizeof(pBuffer_Char) - 2);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            nError1 = testFile.setPos(osl_Pos_Current, 0);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            sal_uInt64 nCount_read = 0;
            nError1 = testFile.read(buffer_read, 1, nCount_read);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            nError1 = testFile.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for setPos function: test for osl_Pos_Current, set the position to end, test if the (end -1) char in file is correct",
                                     pBuffer_Char[sizeof(pBuffer_Char) - 2], buffer_read[0]);
        }

        void setPos_003()
        {
            File testFile(aTmpName4);
            char buffer_read[2];

            auto nError1 = testFile.open(osl_File_OpenFlag_Read | osl_File_OpenFlag_Write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            // the file size is smaller than 100
            nError1 = testFile.setPos(osl_Pos_End,  -100);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("should return error", osl::FileBase::E_INVAL, nError1);

            nError1 = testFile.setPos(osl_Pos_End, -53);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            sal_uInt64 nCount_read = 0;
            nError1 = testFile.read(buffer_read, 1, nCount_read);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            nError1 = testFile.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for setPos function: test for osl_Pos_End, set the position to end, test if the first char in file is correct",
                                     pBuffer_Char[0], buffer_read[0]);
        }

        CPPUNIT_TEST_SUITE(setPos);
            CPPUNIT_TEST(setPos_001);
            CPPUNIT_TEST(setPos_002);
            CPPUNIT_TEST(setPos_003);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline RC getPos(sal_uInt64& uPos)

    class getPos : public CppUnit::TestFixture
    {
    public:
        void setUp() override
        {
            // create a tempfile in $TEMP/tmpdir/tmpname.
            createTestDirectory(aTmpName3);
            createTestFile(aTmpName4);

            // write chars into the file.
            File testFile(aTmpName4);

            auto nError1 = testFile.open(osl_File_OpenFlag_Write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            sal_uInt64 nCount_write = 0;
            nError1 = testFile.write(pBuffer_Char, sizeof(pBuffer_Char), nCount_write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            nError1 = testFile.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
        }

        void tearDown() override
        {
            // remove the tempfile in $TEMP/tmpdir/tmpname.
            deleteTestFile(aTmpName4);
            deleteTestDirectory(aTmpName3);
        }


        void getPos_001()
        {
            File testFile(aTmpName4);
            sal_uInt64 nFilePointer;

            auto nError1 = testFile.getPos(nFilePointer);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_INVAL, nError1);

            nError1 = testFile.open(osl_File_OpenFlag_Read | osl_File_OpenFlag_Write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            nError1 = testFile.setPos(osl_Pos_Absolut, 26);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            nError1 = testFile.getPos(nFilePointer);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            nError1 = testFile.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for getPos function: set the position to 26, get position and check if it is right",
                                     static_cast<sal_uInt64>(26), nFilePointer);
        }

        CPPUNIT_TEST_SUITE(getPos);
            CPPUNIT_TEST(getPos_001);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline RC isEndOfFile(sal_Bool *pIsEOF)

    class isEndOfFile : public CppUnit::TestFixture
    {
    public:
        void setUp() override
        {
            // create a tempfile in $TEMP/tmpdir/tmpname.
            createTestDirectory(aTmpName3);
            createTestFile(aTmpName4);

            // write chars into the file.
            File testFile(aTmpName4);

            auto nError1 = testFile.open(osl_File_OpenFlag_Write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            sal_uInt64 nCount_write = 0;
            nError1 = testFile.write(pBuffer_Char, sizeof(pBuffer_Char), nCount_write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            nError1 = testFile.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
        }

        void tearDown() override
        {
            // remove the tempfile in $TEMP/tmpdir/tmpname.
            deleteTestFile(aTmpName4);
            deleteTestDirectory(aTmpName3);
        }


        void isEndOfFile_001()
        {
            File testFile(aTmpName4);
            sal_Bool bEOF  = false;
            sal_Bool *pEOF = &bEOF;

            auto nError1 = testFile.open(osl_File_OpenFlag_Read | osl_File_OpenFlag_Write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            nError1 = testFile.setPos(osl_Pos_End, 0);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            nError1 = testFile.isEndOfFile(pEOF);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            nError1 = testFile.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            CPPUNIT_ASSERT_MESSAGE("test for isEndOfFile function: set the position to end, check if reach end",
                                     *pEOF);
        }

        void isEndOfFile_002()
        {
            File testFile(aTmpName4);
            sal_Bool bEOF  = false;
            sal_Bool *pEOF = &bEOF;
            sal_uInt64 nFilePointer = 0;

            auto nError1 = testFile.open(osl_File_OpenFlag_Read | osl_File_OpenFlag_Write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            nError1 = testFile.setPos(osl_Pos_Absolut, 0);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            *pEOF = false;

            while (!(*pEOF))
            {
                nError1 = testFile.isEndOfFile(pEOF);
                CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
                nError1 = testFile.setPos(osl_Pos_Current, 1);
                CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            }

            nError1 = testFile.getPos(nFilePointer);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            nError1 = testFile.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for isEndOfFile function: use isEndOfFile to move pointer step by step",
                                      static_cast<sal_uInt64>(sizeof(pBuffer_Char) + 1), nFilePointer);
        }
        CPPUNIT_TEST_SUITE(isEndOfFile);
            CPPUNIT_TEST(isEndOfFile_001);
            CPPUNIT_TEST(isEndOfFile_002);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline RC setSize(sal_uInt64 uSize)

    class setSize : public CppUnit::TestFixture
    {
    public:
        void setUp() override
        {
            // create a tempfile in $TEMP/tmpdir/tmpname.
            createTestDirectory(aTmpName3);
            createTestFile(aTmpName4);

            // write chars into the file.
            File testFile(aTmpName4);

            auto nError1 = testFile.open(osl_File_OpenFlag_Write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            sal_uInt64 nCount_write = 0;
            nError1 = testFile.write(pBuffer_Char, sizeof(pBuffer_Char), nCount_write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            nError1 = testFile.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
        }

        void tearDown() override
        {
            // remove the tempfile in $TEMP/tmpdir/tmpname.
            deleteTestFile(aTmpName4);
            deleteTestDirectory(aTmpName3);
        }


        void setSize_001()
        {
            File testFile(aTmpName4);
            sal_uInt64 nFilePointer;

            auto nError1 = testFile.open(osl_File_OpenFlag_Read | osl_File_OpenFlag_Write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            // enlarge the file to size of 100;
            nError1 = testFile.setSize(100);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            // get the file size;
            nError1 = testFile.setPos(osl_Pos_End, 0);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            nError1 = testFile.getPos(nFilePointer);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            nError1 = testFile.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for setSize function: enlarge the file ",
                                     static_cast<sal_uInt64>(100), nFilePointer);
        }

        void setSize_002()
        {
            File testFile(aTmpName4);
            sal_uInt64 nFilePointer;

            auto nError1 = testFile.open(osl_File_OpenFlag_Read | osl_File_OpenFlag_Write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            // enlarge the file to size of 100;
            nError1 = testFile.setSize(10);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            // get the file size;
            nError1 = testFile.setPos(osl_Pos_End, 0);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            nError1 = testFile.getPos(nFilePointer);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            nError1 = testFile.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for setSize function: truncate the file ",
                                     static_cast<sal_uInt64>(10), nFilePointer);
        }

        CPPUNIT_TEST_SUITE(setSize);
            CPPUNIT_TEST(setSize_001);
            CPPUNIT_TEST(setSize_002);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline RC read(void *pBuffer, sal_uInt64 uBytesRequested, sal_uInt64& rBytesRead)

    class read : public CppUnit::TestFixture
    {
    public:
        void setUp() override
        {
            // create a tempfile in $TEMP/tmpdir/tmpname.
            createTestDirectory(aTmpName3);
            createTestFile(aTmpName4);

            // write chars into the file.
            File testFile(aTmpName4);

            auto nError1 = testFile.open(osl_File_OpenFlag_Write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            sal_uInt64 nCount_write = 0;
            nError1 = testFile.write(pBuffer_Char, sizeof(pBuffer_Char), nCount_write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            nError1 = testFile.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
        }

        void tearDown() override
        {
            // remove the tempfile in $TEMP/tmpdir/tmpname.
            deleteTestFile(aTmpName4);
            deleteTestDirectory(aTmpName3);
        }


        void read_001()
        {
            File testFile(aTmpName4);
            sal_uInt64 nFilePointer;
            char buffer_read[10];

            auto nError1 = testFile.open(osl_File_OpenFlag_Read | osl_File_OpenFlag_Write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            sal_uInt64 nCount_read = 0;
            nError1 = testFile.read(buffer_read, 10, nCount_read);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            nError1 = testFile.getPos(nFilePointer);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            nError1 = testFile.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for read function: read whole content in the file to a buffer",
                                     sal_uInt64(10), nFilePointer);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for read function: read whole content in the file to a buffer",
                                     0, strncmp(buffer_read, pBuffer_Char, 10));
        }

        void read_002()
        {
            File testFile(aTmpName4);
            sal_uInt64 nFilePointer;
            char buffer_read[26];

            auto nError1 = testFile.open(osl_File_OpenFlag_Read | osl_File_OpenFlag_Write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            nError1 = testFile.setPos(osl_Pos_Absolut, 26);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            sal_uInt64 nCount_read = 0;
            nError1 = testFile.read(buffer_read, 26, nCount_read);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            nError1 = testFile.getPos(nFilePointer);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            nError1 = testFile.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for read function: read from a special position in the file",
                                     sal_uInt64(52), nFilePointer);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for read function: read from a special position in the file",
                                     sal_uInt64(26), nCount_read);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for read function: read from a special position in the file",
                                     0, strncmp(buffer_read, &pBuffer_Char[26], 26));
        }

        CPPUNIT_TEST_SUITE(read);
            CPPUNIT_TEST(read_001);
            CPPUNIT_TEST(read_002);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline RC write(const void *pBuffer, sal_uInt64 uBytesToWrite, sal_uInt64& rBytesWritten)

    class write : public CppUnit::TestFixture
    {
    public:
        void setUp() override
        {
            // create a tempfile in $TEMP/tmpname.
            createTestFile(aTmpName6);
        }

        void tearDown() override
        {
            // remove the tempfile in $TEMP/tmpname.
            deleteTestFile(aTmpName6);
        }


        void write_001()
        {
            File testFile(aTmpName6);
            sal_uInt64 nFilePointer;
            char buffer_read[10];

            auto nError1 = testFile.open(osl_File_OpenFlag_Read | osl_File_OpenFlag_Write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            sal_uInt64 nCount_write = 0, nCount_read = 0;
            // write chars into the file.
            nError1 = testFile.write(pBuffer_Char, 10, nCount_write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            // get the current pointer;
            nError1 = testFile.getPos(nFilePointer);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            // reset pointer to the beginning;
            nError1 = testFile.setPos(osl_Pos_Absolut, 0);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            nError1 = testFile.read(buffer_read, 10, nCount_read);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            nError1 = testFile.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for write function: read whole content in the file to a buffer. Note, buffer size can not smaller than the read size",
                                     sal_uInt64(10), nFilePointer);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for write function: read whole content in the file to a buffer. Note, buffer size can not smaller than the read size",
                                    0, strncmp(buffer_read, pBuffer_Char, 10));
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for write function: read whole content in the file to a buffer. Note, buffer size can not smaller than the read size",
                                    sal_uInt64(10), nCount_write);
        }

        CPPUNIT_TEST_SUITE(write);
            CPPUNIT_TEST(write_001);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline RC readLine(::ByteSequence& aSeq)

    class readLine : public CppUnit::TestFixture
    {
        rtl::ByteSequence aSequence;

    public:
        void setUp() override
        {
            // create a tempfile in $TEMP/tmpname.
            createTestFile(aTmpName6);

            // write some strings into the file.
            File testFile(aTmpName6);
            char ppStrSeq[3][27]  =  { "abcde\n",
                                        "1234567890\n",
                                        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                                      };

            auto nError1 = testFile.open(osl_File_OpenFlag_Write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            sal_uInt64 nCount_write = 0;
            for (int nCount = 0; nCount < 3; nCount++)
            {
                nError1 = testFile.write(ppStrSeq[nCount], strlen(ppStrSeq[nCount]), nCount_write);
                CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            }

            nError1 = testFile.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
        }

        void tearDown() override
        {
            // remove the tempfile in $TEMP/tmpname.
            deleteTestFile(aTmpName6);
        }


        void readLine_001()
        {
            File testFile(aTmpName6);

            auto nError1 = testFile.open(osl_File_OpenFlag_Read | osl_File_OpenFlag_Write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            nError1 = testFile.readLine(aSequence);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for readLine function: read the first line of the file.",
                                    osl::FileBase::E_None, nError1);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for readLine function: read the first line of the file.",
                                    0, strncmp(reinterpret_cast<char *>(aSequence.getArray()), pBuffer_Char, 5));
        }

        void readLine_002()
        {
            File testFile(aTmpName6);
            sal_Bool bEOF  = false;
            sal_Bool *pEOF = &bEOF;

            auto nError1 = testFile.open(osl_File_OpenFlag_Read | osl_File_OpenFlag_Write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            for (int nCount = 0; nCount < 3; nCount++)
            {
                nError1 = testFile.readLine(aSequence);
                CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            }
            nError1 = testFile.isEndOfFile(pEOF);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            CPPUNIT_ASSERT_MESSAGE("test for readLine function: read three lines of the file and check the file pointer moving.",
                                     *pEOF);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for readLine function: read three lines of the file and check the file pointer moving.",
                                    0, strncmp(reinterpret_cast<char *>(aSequence.getArray()), &pBuffer_Char[26], 26));
        }
        CPPUNIT_TEST_SUITE(readLine);
            CPPUNIT_TEST(readLine_001);
            CPPUNIT_TEST(readLine_002);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline static RC copy(const OUString& ustrSourceFileURL, const OUString& ustrDestFileURL)

    class copy : public CppUnit::TestFixture
    {
    public:
        void setUp() override
        {
            // create a tempfile in $TEMP/tmpdir/tmpname.
            createTestDirectory(aTmpName3);
            createTestFile(aTmpName4);

            // write chars into the file.
            File testFile(aTmpName4);

            auto nError1 = testFile.open(osl_File_OpenFlag_Write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            sal_uInt64 nCount_write = 0;
            nError1 = testFile.write(pBuffer_Char, sizeof(pBuffer_Char), nCount_write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            nError1 = testFile.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
        }

        void tearDown() override
        {
            // remove the tempfile in $TEMP/tmpdir/tmpname.
            deleteTestFile(aTmpName4);
            deleteTestDirectory(aTmpName3);
        }

        void copy_001()
        {
            File    testFile(aTmpName6);

            // copy $TEMP/tmpdir/tmpname to $TEMP/tmpname.
            auto nError1 = File::copy(aTmpName4, aTmpName6);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            // check
            nError1 = testFile.open(osl_File_OpenFlag_Create);
            deleteTestFile(aTmpName6);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for copy function: copy file to upper directory",
                                     osl::FileBase::E_EXIST, nError1);
        }

        void copy_002()
        {
            // copy $TEMP/tmpdir/tmpname to $TEMP/tmpdir.
            auto nError1 = File::copy(aTmpName4, aTmpName3);

            CPPUNIT_ASSERT_MESSAGE("test for copy function: use directory as destination",
                                     (osl::FileBase::E_ISDIR == nError1) ||(osl::FileBase::E_ACCES == nError1));
        }

        void copy_003()
        {
#if 0
            // copy $TEMP/tmpdir/tmpname to $ROOT/tmpname.
            auto nError1 = File::copy(aTmpName4, aTmpName7);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for copy function: copy to an illegal place",
                                     osl::FileBase::E_ACCES, nError1);
#endif
        }

        void copy_004()
        {
            // copy $TEMP/tmpname to $TEMP/tmpdir/tmpname.
            auto nError1 = File::copy(aTmpName6, aTmpName4);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for copy function: copy a not exist file",
                                     osl::FileBase::E_NOENT, nError1);
        }

        void copy_005()
        {
            // copy $TEMP/tmpname to $TEMP/system.path using system path.
            auto nError1 = File::copy(aTmpName6, aSysPath1);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for copy function: copy a file using system file path",
                                     osl::FileBase::E_INVAL, nError1);
        }

        void copy_006()
        {
            createTestFile(aTmpName6);
            File tmpFile(aTmpName6);
            tmpFile.open(osl_File_OpenFlag_Write | osl_File_OpenFlag_Read);
            tmpFile.setSize(200);
            tmpFile.close();
            // copy to new path
            auto nError1 = File::copy(aTmpName6, aTmpName4);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            // check if is the new file
            File newFile(aTmpName4);
            newFile.open(osl_File_OpenFlag_Write | osl_File_OpenFlag_Read);
            nError1 = newFile.setPos(osl_Pos_End, 0);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            sal_uInt64 nFilePointer;
            nError1 = newFile.getPos(nFilePointer);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            newFile.close();
            deleteTestFile(aTmpName6);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for copy function: the dest file exist",
                        static_cast<sal_uInt64>(200), nFilePointer);
        }

        CPPUNIT_TEST_SUITE(copy);
            CPPUNIT_TEST(copy_001);
            CPPUNIT_TEST(copy_002);
            CPPUNIT_TEST(copy_003);
            CPPUNIT_TEST(copy_004);
            CPPUNIT_TEST(copy_005);
            CPPUNIT_TEST(copy_006);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline static RC move(const OUString& ustrSourceFileURL, const OUString& ustrDestFileURL)

    class move : public CppUnit::TestFixture
    {
    public:
        void setUp() override
        {
            // create a tempfile in $TEMP/tmpdir/tmpname.
            createTestDirectory(aTmpName3);
            createTestFile(aTmpName4);

            // write chars into the file.
            File testFile(aTmpName4);

            auto nError1 = testFile.open(osl_File_OpenFlag_Write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            sal_uInt64 nCount_write = 0;
            nError1 = testFile.write(pBuffer_Char, sizeof(pBuffer_Char), nCount_write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            nError1 = testFile.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
        }

        void tearDown() override
        {
            // remove the tempfile in $TEMP/tmpdir/tmpname.
            deleteTestFile(aTmpName4);
            deleteTestDirectory(aTmpName3);
        }


        void move_001()
        {
            // rename $TEMP/tmpdir/tmpname to $TEMP/canonical.name.
            auto nError1 = File::move(aTmpName4, aCanURL1);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            // check
            File  testFile(aCanURL1);
            auto nError2 = testFile.open(osl_File_OpenFlag_Create);
            deleteTestFile(aCanURL1);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for move function: rename file to another directory",
                                     osl::FileBase::E_EXIST, nError2);
        }

        void move_002()
        {
#ifdef _WIN32
            // move $TEMP/tmpdir/tmpname to $TEMP/tmpdir.
            auto nError1 = File::move(aTmpName4, aTmpName3);
            // returned osl::FileBase::E_ACCES on WNT
            CPPUNIT_ASSERT_MESSAGE("test for move function: use directory as destination",
                 (osl::FileBase::E_ACCES == nError1 || osl::FileBase::E_ISDIR == nError1) ||(osl::FileBase::E_EXIST == nError1));
#endif
        }

        void move_003()
        {
#if 0
            // move $TEMP/tmpdir/tmpname to $ROOT/tmpname.
            auto nError1 = File::move(aTmpName4, aTmpName7);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for move function: move to an illegal place",
                                     osl::FileBase::E_ACCES, nError1);
#endif
        }

        void move_004()
        {
            // move $TEMP/tmpname to $TEMP/tmpdir/tmpname.
            auto nError1 = File::move(aTmpName6, aTmpName4);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for move function: move a not exist file",
                                     osl::FileBase::E_NOENT, nError1);
        }

        void move_005()
        {
            // move $TEMP/tmpname to $TEMP/system.path using system path.
            auto nError1 = File::move(aTmpName6, aSysPath1);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for move function: move a file using system file",
                                     osl::FileBase::E_INVAL, nError1);
        }

        void move_006()
        {
            // move directory $TEMP/tmpname to $TEMP/tmpdir/tmpname.
            createTestDirectory(aTmpName6);
            auto nError1 = File::move(aTmpName6, aTmpName4);
            // move file $TEMP/tmpdir/tmpname to $TEMP/tmpname
            auto nError2 = File::move(aTmpName4, aTmpName6);
            deleteTestDirectory(aTmpName6);
#if defined(_WIN32)
            deleteTestDirectory(aTmpName4);// in Windows, it can be moved!!!!! this is only for not influence the following test.
            deleteTestFile(aTmpName6);
            nError1 = osl::FileBase::E_NOTDIR;
            nError2 = osl::FileBase::E_ISDIR;
#endif
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for move function: move a directory to an exist file with same name, did not pass in (W32)",
                                     osl::FileBase::E_NOTDIR, nError1);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for move function: move a directory to an exist file with same name, did not pass in (W32)",
                                     osl::FileBase::E_ISDIR, nError2);
        }

        void move_007()
        {
            // create directory $TEMP/tmpname.
            createTestDirectory(aTmpName6);
            // move directory $TEMP/tmpdir to $TEMP/tmpname/tmpdir
            auto nError1 = File::move(aTmpName3, aTmpName8);
            // check
            auto nError2 = Directory::create(aTmpName8);
            File::move(aTmpName8, aTmpName3);
            deleteTestDirectory(aTmpName6);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for move function: move a directory to an exist file with same name",
                                     osl::FileBase::E_None, nError1);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for move function: move a directory to an exist file with same name",
                                    osl::FileBase::E_EXIST, nError2);
        }

        // bugid# 115420, after the bug fix, add the case
        CPPUNIT_TEST_SUITE(move);
            CPPUNIT_TEST(move_001);
            CPPUNIT_TEST(move_002);
            CPPUNIT_TEST(move_003);
            CPPUNIT_TEST(move_004);
            CPPUNIT_TEST(move_005);
            CPPUNIT_TEST(move_006);
            CPPUNIT_TEST(move_007);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline static RC remove(const OUString& ustrFileURL)

    class remove : public CppUnit::TestFixture
    {
    public:
        void setUp() override
        {
            // create a tempfile in $TEMP/tmpdir/tmpname.
            createTestDirectory(aTmpName3);
            createTestFile(aTmpName4);

            // write chars into the file.
            File testFile(aTmpName4);

            auto nError1 = testFile.open(osl_File_OpenFlag_Write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            sal_uInt64 nCount_write = 0;
            nError1 = testFile.write(pBuffer_Char, sizeof(pBuffer_Char), nCount_write);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            nError1 = testFile.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
        }

        void tearDown() override
        {
            // remove the tempfile in $TEMP/tmpdir/tmpname.
            deleteTestFile(aTmpName4);
            deleteTestDirectory(aTmpName3);
        }


        void remove_001()
        {
            // remove $TEMP/tmpdir/tmpname.
            auto nError1 = File::remove(aTmpName4);
            // check
            File    testFile(aTmpName4);
            auto nError2 = testFile.open(osl_File_OpenFlag_Create);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for remove function: remove a file",
                                    osl::FileBase::E_None, nError1);
            CPPUNIT_ASSERT_MESSAGE("test for remove function: remove a file",
                                     (osl::FileBase::E_EXIST != nError2));
        }

        void remove_002()
        {
            // remove $TEMP/tmpname.
            auto nError1 = File::remove(aTmpName6);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for remove function: remove a file not exist",
                                    osl::FileBase::E_NOENT, nError1);
        }

        void remove_003()
        {
            // remove $TEMP/system/path.
            auto nError1 = File::remove(aSysPath2);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for remove function: removing a file not using full qualified URL",
                                    osl::FileBase::E_INVAL, nError1);
        }

        void remove_004()
        {
            // remove $TEMP/tmpdir.
            auto nError1 = File::remove(aTmpName3);

            CPPUNIT_ASSERT_MESSAGE("test for remove function: remove a directory",
                                    (osl::FileBase::E_ISDIR == nError1) || (osl::FileBase::E_ACCES == nError1));
        }

        CPPUNIT_TEST_SUITE(remove);
            CPPUNIT_TEST(remove_001);
            CPPUNIT_TEST(remove_002);
            CPPUNIT_TEST(remove_003);
            CPPUNIT_TEST(remove_004);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline static RC setAttributes(const OUString& ustrFileURL, sal_uInt64 uAttributes)

    class setAttributes : public CppUnit::TestFixture
    {
    private:
        DirectoryItem rItem;

    public:
        void setUp() override
        {
            // create a tempfile in $TEMP/tmpdir/tmpname.
            createTestFile(aTmpName6);
        }

        void tearDown() override
        {
            // remove the tempfile in $TEMP/tmpdir/tmpname.
            deleteTestFile(aTmpName6);
        }


        void setAttributes_001()
        {
        // on windows, only can set 2 attributes: osl_File_Attribute_ReadOnly,  osl_File_Attribute_Hidden
#ifdef UNX
            // set the file to readonly
            auto nError2 = File::setAttributes(aTmpName6, osl_File_Attribute_ReadOnly | osl_File_Attribute_GrpRead | osl_File_Attribute_OwnRead | osl_File_Attribute_OthRead);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError2);
            auto nError1 = DirectoryItem::get(aTmpName6, rItem);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            // get the file attributes
            FileStatus   rFileStatus(osl_FileStatus_Mask_Attributes);
            nError1 = rItem.getFileStatus(rFileStatus);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            if (geteuid() == 0) // as root, access(W_OK) may be true despite mode
            {
                CPPUNIT_ASSERT_EQUAL_MESSAGE("test for setAttributes function: set file attributes and get it to verify.",
                                    static_cast<sal_uInt64>(osl_File_Attribute_GrpRead | osl_File_Attribute_OwnRead | osl_File_Attribute_OthRead),
                                    rFileStatus.getAttributes());
            }
            else
            {
                CPPUNIT_ASSERT_EQUAL_MESSAGE("test for setAttributes function: set file attributes and get it to verify.",
                                    static_cast<sal_uInt64>(osl_File_Attribute_ReadOnly | osl_File_Attribute_GrpRead | osl_File_Attribute_OwnRead | osl_File_Attribute_OthRead),
                                    rFileStatus.getAttributes());
            }
#else
            // please see GetFileAttributes
            auto nError2 = File::setAttributes(aTmpName6, osl_File_Attribute_ReadOnly);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError2);
            auto nError1 = DirectoryItem::get(aTmpName6, rItem);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            // get the file attributes
            FileStatus   rFileStatus(osl_FileStatus_Mask_Attributes);
            nError1 = rItem.getFileStatus(rFileStatus);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            // here the file has 2 Attributes: FILE_ATTRIBUTE_READONLY and FILE_ATTRIBUTE_NORMAL,
            // but FILE_ATTRIBUTE_NORMAL is valid only if used alone, so this is maybe a bug
            /*OString aString = OUStringToOString(aTmpName6, RTL_TEXTENCODING_ASCII_US);
            DWORD dwFileAttributes = GetFileAttributes(aString.getStr());
            if (dwFileAttributes & FILE_ATTRIBUTE_NORMAL)
                printf("has normal attribute");
            if (dwFileAttributes & FILE_ATTRIBUTE_READONLY)
                printf("has readonly attribute");
            */
            CPPUNIT_ASSERT_MESSAGE("test for setAttributes function: set file attributes READONLY and get it to verify.",
                                    (osl_File_Attribute_ReadOnly & rFileStatus.getAttributes()) != 0);
#endif
    }
        void setAttributes_002()
        {
        // on UNX, can not set hidden attribute to file, rename file can set the attribute
#ifdef _WIN32
            // set the file to hidden
            auto nError2 = File::setAttributes(aTmpName6, osl_File_Attribute_Hidden);

            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError2);
            auto nError1 = DirectoryItem::get(aTmpName6, rItem);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            // get the file attributes
            FileStatus rFileStatus(osl_FileStatus_Mask_Attributes);
            nError1 = rItem.getFileStatus(rFileStatus);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            CPPUNIT_ASSERT_MESSAGE("test for setAttributes function: set file attributes and get it to verify.",
                                    (osl_File_Attribute_Hidden & rFileStatus.getAttributes()) != 0);
#endif
        }

        CPPUNIT_TEST_SUITE(setAttributes);
            CPPUNIT_TEST(setAttributes_001);
            CPPUNIT_TEST(setAttributes_002);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline static RC setTime(
    //         const OUString& ustrFileURL,
    //         const TimeValue& rCreationTime,
    //         const TimeValue& rLastAccessTime,
    //         const TimeValue& rLastWriteTime)

    class setTime : public CppUnit::TestFixture
    {
    private:
        DirectoryItem rItem;

    public:
        void setUp() override
        {
            // create a tempfile in $TEMP/tmpdir/tmpname.
            createTestFile(aTmpName6);
        }

        void tearDown() override
        {
            // remove the tempfile in $TEMP/tmpdir/tmpname.
            deleteTestFile(aTmpName6);
        }


        void setTime_001()
        {
            TimeValue *pTV_current  = nullptr;
            CPPUNIT_ASSERT((pTV_current = static_cast<TimeValue*>(malloc(sizeof(TimeValue)))) != nullptr);
            TimeValue *pTV_creation = nullptr;
            CPPUNIT_ASSERT((pTV_creation = static_cast<TimeValue*>(malloc(sizeof(TimeValue)))) != nullptr);
            TimeValue *pTV_access   = nullptr;
            CPPUNIT_ASSERT((pTV_access = static_cast<TimeValue*>(malloc(sizeof(TimeValue)))) != nullptr);
            TimeValue *pTV_modify   = nullptr;
            CPPUNIT_ASSERT((pTV_modify = static_cast<TimeValue*>(malloc(sizeof(TimeValue)))) != nullptr);

            // get current time
            bool bOk = osl_getSystemTime(pTV_current);
            CPPUNIT_ASSERT(bOk);

            // set the file time
            auto nError2 = File::setTime(aTmpName6, *pTV_current, *pTV_current, *pTV_current);
            CPPUNIT_ASSERT_EQUAL_MESSAGE(errorToStr(nError2).getStr(), osl::FileBase::E_None, nError2);

             // get the file access time, creation time, modify time
            auto nError1 = DirectoryItem::get(aTmpName6, rItem);
            CPPUNIT_ASSERT_EQUAL_MESSAGE(errorToStr(nError1).getStr(), osl::FileBase::E_None, nError1);

            FileStatus   rFileStatus(osl_FileStatus_Mask_AccessTime);
            nError1 = rItem.getFileStatus(rFileStatus);
            CPPUNIT_ASSERT_EQUAL_MESSAGE(errorToStr(nError1).getStr(), osl::FileBase::E_None, nError1);
            *pTV_access = rFileStatus.getAccessTime();

            FileStatus   rFileStatus1(osl_FileStatus_Mask_CreationTime);
            nError1 = rItem.getFileStatus(rFileStatus1);
            CPPUNIT_ASSERT_EQUAL_MESSAGE(errorToStr(nError1).getStr(), osl::FileBase::E_None, nError1);
            *pTV_creation = rFileStatus1.getCreationTime();

            FileStatus   rFileStatus2(osl_FileStatus_Mask_ModifyTime);
            nError1 = rItem.getFileStatus(rFileStatus2);
            CPPUNIT_ASSERT_EQUAL_MESSAGE(errorToStr(nError1).getStr(), osl::FileBase::E_None, nError1);
            *pTV_modify = rFileStatus2.getModifyTime();

            CPPUNIT_ASSERT_MESSAGE("test for setTime function: set access time then get it. time precision is still a problem for it cut off the nanosec.",
                t_compareTime(pTV_access, pTV_current, delta));
#if defined(_WIN32)
            // Unfortunately there is no way to get the creation time of a file under Unix (it's a Windows only feature).
            // That means the flag osl_FileStatus_Mask_CreationTime should be deprecated under Unix.
            CPPUNIT_ASSERT_MESSAGE("test for setTime function: set creation time then get it. ",
                t_compareTime(pTV_creation, pTV_current, delta));
#endif
            CPPUNIT_ASSERT_MESSAGE("test for setTime function: set modify time then get it. ",
                t_compareTime(pTV_modify, pTV_current, delta));
            free(pTV_current);
            free(pTV_creation);
            free(pTV_access);
            free(pTV_modify);
        }

        CPPUNIT_TEST_SUITE(setTime);
            CPPUNIT_TEST(setTime_001);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline static RC sync()

    class sync : public CppUnit::TestFixture
    {
    private:
        DirectoryItem rItem;

    public:
        void setUp() override
        {
            // create a tempfile in $TEMP/tmpdir/tmpname.
            createTestFile(aTmpName6);

        }

        void tearDown() override
        {
            // remove the tempfile in $TEMP/tmpdir/tmpname.
            deleteTestFile(aTmpName6);
        }

        // test case: if The file is located on a read only file system.
        void sync_001()
        {
            auto nError1 = DirectoryItem::get(aTmpName6, rItem);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            File tmp_file(aTmpName6);
            osl::FileBase::RC err = tmp_file.open(osl_File_OpenFlag_Write);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("File open failed", osl::FileBase::E_None, err);

            char buffer[50000];
            sal_uInt64 written = 0;
            nError1 = tmp_file.write(static_cast<void*>(buffer), sizeof(buffer), written);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("write failed!", osl::FileBase::E_None, nError1);

            // set the file to readonly
            auto nError2 = File::setAttributes(aTmpName6, osl_File_Attribute_ReadOnly | osl_File_Attribute_GrpRead | osl_File_Attribute_OwnRead | osl_File_Attribute_OthRead);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError2);

            nError2 = tmp_file.sync();

            CPPUNIT_ASSERT_EQUAL_MESSAGE("can not sync to readonly file!", osl::FileBase::E_None, nError2);

            tmp_file.close();
        }
      // test case:no enough space, how to create such case???see test_cpy_wrt_file.cxx::test_osl_writeFile

        CPPUNIT_TEST_SUITE(sync);
            CPPUNIT_TEST(sync_001);
        CPPUNIT_TEST_SUITE_END();
    };

    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_File::ctors, "osl_File");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_File::open, "osl_File");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_File::close, "osl_File");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_File::setPos, "osl_File");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_File::getPos, "osl_File");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_File::isEndOfFile, "osl_File");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_File::setSize, "osl_File");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_File::read, "osl_File");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_File::write, "osl_File");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_File::readLine, "osl_File");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_File::copy, "osl_File");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_File::move, "osl_File");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_File::remove, "osl_File");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_File::setAttributes, "osl_File");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_File::setTime, "osl_File");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_File::sync, "osl_File");

    CPPUNIT_REGISTRY_ADD_TO_DEFAULT("osl_File");
}

// Beginning of the test cases for DirectoryItem class

namespace osl_DirectoryItem
{
    //  testing the method
    //  DirectoryItem(): _pData(NULL)

    class ctors : public CppUnit::TestFixture
    {
    public:
        void setUp() override
        {
            // create a tempfile in $TEMP/tmpname.
            createTestFile(aTmpName6);
        }

        void tearDown() override
        {
            // remove the tempfile in $TEMP/tmpname.
            deleteTestFile(aTmpName6);
        }

        void ctors_001()
        {
            File testFile(aTmpName6);
            DirectoryItem rItem;  // constructor

             // get the DirectoryItem.
            auto nError1 = DirectoryItem::get(aTmpName6, rItem);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for ctors function: initialize a new instance of DirectoryItem and get an item to check.",
                                      osl::FileBase::E_None, nError1);
        }

        CPPUNIT_TEST_SUITE(ctors);
            CPPUNIT_TEST(ctors_001);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  DirectoryItem(const DirectoryItem& rItem): _pData(rItem._pData)

    class copy_assin_Ctors : public CppUnit::TestFixture
    {
    public:
        void setUp() override
        {
            // create a tempfile in $TEMP/tmpname.
            createTestFile(aTmpName6);
        }

        void tearDown() override
        {
            // remove the tempfile in $TEMP/tmpname.
            deleteTestFile(aTmpName6);
        }


        void copy_assin_Ctors_001()
        {
            DirectoryItem rItem;  // constructor
             // get the DirectoryItem.
            auto nError1 = DirectoryItem::get(aTmpName6, rItem);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            DirectoryItem copyItem(rItem); // copy constructor
            FileStatus rFileStatus(osl_FileStatus_Mask_FileName);
            nError1 = copyItem.getFileStatus(rFileStatus);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for copy_assin_Ctors function: use copy constructor to get an item and check filename.",
                                         normalize(aTmpName2), normalize(rFileStatus.getFileName()));
        }

        void copy_assin_Ctors_002()
        {
            DirectoryItem rItem;  // constructor
             // get the DirectoryItem.
            auto nError1 = DirectoryItem::get(aTmpName6, rItem);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            DirectoryItem copyItem;
            copyItem = rItem;               // assignment operator
            FileStatus rFileStatus(osl_FileStatus_Mask_FileName);
            nError1 = copyItem.getFileStatus(rFileStatus);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for copy_assin_Ctors function: test assignment operator here since it is same as copy constructor in test way.",
                                         normalize(aTmpName2), normalize(rFileStatus.getFileName()));
        }

        CPPUNIT_TEST_SUITE(copy_assin_Ctors);
            CPPUNIT_TEST(copy_assin_Ctors_001);
            CPPUNIT_TEST(copy_assin_Ctors_002);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline sal_Bool is()

    class is : public CppUnit::TestFixture
    {
    public:
        void setUp() override
        {
            // create a tempfile in $TEMP/tmpname.
            createTestFile(aTmpName6);
        }

        void tearDown() override
        {
            // remove the tempfile in $TEMP/tmpname.
            deleteTestFile(aTmpName6);
        }

        void is_001()
        {
            DirectoryItem rItem;  // constructor

            CPPUNIT_ASSERT_MESSAGE("test for is function: use an uninitialized instance.",
                                    !rItem.is());
        }

        void is_002()
        {
            DirectoryItem    rItem;  // constructor
             // get the DirectoryItem.
            auto nError1 = DirectoryItem::get(aTmpName6, rItem);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            CPPUNIT_ASSERT_MESSAGE("test for is function: use an uninitialized instance.",
                                    rItem.is());
        }

        CPPUNIT_TEST_SUITE(is);
            CPPUNIT_TEST(is_001);
            CPPUNIT_TEST(is_002);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  static inline RC get(const OUString& ustrFileURL, DirectoryItem& rItem)

    class get : public CppUnit::TestFixture
    {
    public:
        void setUp() override
        {
            // create a tempfile in $TEMP/tmpname.
            createTestFile(aTmpName6);
        }

        void tearDown() override
        {
            // remove the tempfile in $TEMP/tmpname.
            deleteTestFile(aTmpName6);
        }


        void get_001()
        {
            DirectoryItem rItem;
            auto nError2 = DirectoryItem::get(aTmpName6, rItem);

            // check the file name
            FileStatus   rFileStatus(osl_FileStatus_Mask_FileName);
            auto nError1 = rItem.getFileStatus(rFileStatus);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for get function: use copy constructor to get an item and check filename.",
                                    osl::FileBase::E_None, nError2);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for get function: use copy constructor to get an item and check filename.",
                                         normalize(aTmpName2), normalize(rFileStatus.getFileName()));
        }

        void get_002()
        {
            DirectoryItem rItem;
            auto nError1 = DirectoryItem::get(aSysPath1, rItem);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for get function: use a system name instead of a URL.",
                                    osl::FileBase::E_INVAL, nError1);
        }

        void get_003()
        {
            DirectoryItem rItem;

            auto nError1 = DirectoryItem::get(aTmpName3, rItem);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for get function: use a non existed file URL.",
                                    osl::FileBase::E_NOENT, nError1);
        }

        CPPUNIT_TEST_SUITE(get);
            CPPUNIT_TEST(get_001);
            CPPUNIT_TEST(get_002);
            CPPUNIT_TEST(get_003);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline RC getFileStatus(FileStatus& rStatus)

    class getFileStatus : public CppUnit::TestFixture
    {
    public:
        void setUp() override
        {
            // create a tempfile in $TEMP/tmpdir/tmpname.
            createTestDirectory(aTmpName3);
            createTestFile(aTmpName4);
        }

        void tearDown() override
        {
            // remove the tempfile in $TEMP/tmpdir/tmpname.
            deleteTestFile(aTmpName4);
            deleteTestDirectory(aTmpName3);
        }


        void getFileStatus_001()
        {
            DirectoryItem rItem;
             // get the DirectoryItem.
            auto nError1 = DirectoryItem::get(aTmpName4, rItem);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            // check the file name
            FileStatus rFileStatus(osl_FileStatus_Mask_FileName);
            auto nError2 = rItem.getFileStatus(rFileStatus);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for getFileStatus function: get file status and check filename",
                                    osl::FileBase::E_None, nError2);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for getFileStatus function: get file status and check filename",
                                         normalize(aTmpName2), normalize(rFileStatus.getFileName()));
        }

        void getFileStatus_002()
        {
            DirectoryItem rItem;  // constructor
             // get the DirectoryItem.
            auto nError1 = DirectoryItem::get(aTmpName6, rItem);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_NOENT, nError1);

            // check the file name
            FileStatus rFileStatus(osl_FileStatus_Mask_FileName);
            auto nError2 = rItem.getFileStatus(rFileStatus);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for getFileStatus function: file not existed",
                                    osl::FileBase::E_INVAL, nError2);
        }

        void getFileStatus_003()
        {
            DirectoryItem    rItem;  // constructor
             // get the DirectoryItem.
            auto nError1 = DirectoryItem::get(aTmpName3, rItem);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            // check the file name
            FileStatus rFileStatus(osl_FileStatus_Mask_FileName);
            auto nError2 = rItem.getFileStatus(rFileStatus);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for getFileStatus function: get directory information",
                                    osl::FileBase::E_None, nError2);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for getFileStatus function: get directory information",
                                         normalize(aTmpName1), normalize(rFileStatus.getFileName()));
        }

        CPPUNIT_TEST_SUITE(getFileStatus);
            CPPUNIT_TEST(getFileStatus_001);
            CPPUNIT_TEST(getFileStatus_002);
            CPPUNIT_TEST(getFileStatus_003);
        CPPUNIT_TEST_SUITE_END();
    };

    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_DirectoryItem::ctors, "osl_DirectoryItem");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_DirectoryItem::copy_assin_Ctors, "osl_DirectoryItem");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_DirectoryItem::is, "osl_DirectoryItem");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_DirectoryItem::get, "osl_DirectoryItem");
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_DirectoryItem::getFileStatus, "osl_DirectoryItem");

    CPPUNIT_REGISTRY_ADD_TO_DEFAULT("osl_DirectoryItem");
}

// Beginning of the test cases for Directory class

namespace osl_Directory
{
    //  testing the method
    //  Directory(const OUString& strPath): _pData(0), _aPath(strPath)

    class ctors : public CppUnit::TestFixture
    {
    public:
        void setUp() override
        {
            // create a tempfile in $TEMP/tmpdir/tmpname.
            createTestDirectory(aTmpName3);
            createTestFile(aTmpName4);
        }

        void tearDown() override
        {
            // remove the tempfile in $TEMP/tmpdir/tmpname.
            deleteTestFile(aTmpName4);
            deleteTestDirectory(aTmpName3);
            // LLA: t_print("tearDown done.\n");
        }


        void ctors_001()
        {
            Directory testDirectory(aTmpName3); // constructor

            // open a directory
            auto nError1 = testDirectory.open();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            // close a directory
            auto nError2 = testDirectory.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError2);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for ctors function: create an instance and check open and close",
                                     osl::FileBase::E_None, nError1);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for ctors function: create an instance and check open and close",
                                    osl::FileBase::E_None, nError2);
        }

        void ctors_002()
        {
            Directory testDirectory(aTmpName9); // constructor

            // open a directory
            auto nError1 = testDirectory.open();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            // close a directory
            auto nError2 = testDirectory.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError2);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for ctors function: relative URL, :-), it is also worked",
                                     osl::FileBase::E_None, nError1);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for ctors function: relative URL, :-), it is also worked",
                                    osl::FileBase::E_None, nError2);
        }

        CPPUNIT_TEST_SUITE(ctors);
            CPPUNIT_TEST(ctors_001);
            CPPUNIT_TEST(ctors_002);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline RC open()

    class open : public CppUnit::TestFixture
    {
    public:
        void setUp() override
        {
            // create a tempfile in $TEMP/tmpdir/tmpname.
            createTestDirectory(aTmpName3);
            createTestFile(aTmpName4);
        }

        void tearDown() override
        {
            // remove the tempfile in $TEMP/tmpdir/tmpname.
            deleteTestFile(aTmpName4);
            deleteTestDirectory(aTmpName3);
        }

        void open_001()
        {
            Directory testDirectory(aTmpName3);

            // open a directory
            auto nError1 = testDirectory.open();
            // check if directory is opened.
            bool bOk = testDirectory.isOpen();
            // close a directory
            auto nError2 = testDirectory.close();

            CPPUNIT_ASSERT_MESSAGE("test for open function: open a directory and check for open",
                                    bOk);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for open function: open a directory and check for open",
                                     osl::FileBase::E_None, nError1);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for open function: open a directory and check for open",
                                    osl::FileBase::E_None, nError2);
        }

        void open_002()
        {
            Directory testDirectory(aTmpName6);

            auto nError1 = testDirectory.open();
            if (nError1 == osl::FileBase::E_None)
            {
                auto nError2 = testDirectory.close();
                CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError2);
            }

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for open function: open a file that is not existed",
                                     osl::FileBase::E_NOENT, nError1);
        }

        void open_003()
        {
            Directory testDirectory(aUserDirectorySys);

            auto nError1 = testDirectory.open();
            if (nError1 == osl::FileBase::E_None)
            {
                auto nError2 = testDirectory.close();
                CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError2);
            }

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for open function: using system path",
                                     osl::FileBase::E_INVAL, nError1);
        }

        void open_004()
        {
            Directory testDirectory(aTmpName4);

            auto nError1 = testDirectory.open();
            if (nError1 == osl::FileBase::E_None)
            {
                auto nError2 = testDirectory.close();
                CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError2);
            }

            CPPUNIT_ASSERT_MESSAGE("test for open function: open a file instead of a directory",
                                     (osl::FileBase::E_NOTDIR == nError1) || (osl::FileBase::E_ACCES == nError1));
        }

        CPPUNIT_TEST_SUITE(open);
            CPPUNIT_TEST(open_001);
            CPPUNIT_TEST(open_002);
            CPPUNIT_TEST(open_003);
            CPPUNIT_TEST(open_004);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline sal_Bool isOpen() { return _pData != NULL; };

    class isOpen : public CppUnit::TestFixture
    {
    public:
        void setUp() override
        {
            // create a tempfile in $TEMP/tmpdir/tmpname.
            createTestDirectory(aTmpName3);
            createTestFile(aTmpName4);
        }

        void tearDown() override
        {
            // remove the tempfile in $TEMP/tmpdir/tmpname.
            deleteTestFile(aTmpName4);
            deleteTestDirectory(aTmpName3);
        }


        void isOpen_001()
        {
            Directory testDirectory(aTmpName3); // constructor

            // open a directory
            auto nError1 = testDirectory.open();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            // check if directory is opened.
            bool bOk = testDirectory.isOpen();
            // close a directory
            auto nError2 = testDirectory.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError2);
            CPPUNIT_ASSERT_MESSAGE("test for isOpen function: open a directory and check for open",
                                    bOk);
        }

        void isOpen_002()
        {
            Directory testDirectory(aTmpName3); // constructor

            // check if directory is opened.
            bool bOk = testDirectory.isOpen();

            CPPUNIT_ASSERT_MESSAGE("test for isOpen function: do not open a directory and check for open",
                                    !bOk);
        }

        CPPUNIT_TEST_SUITE(isOpen);
            CPPUNIT_TEST(isOpen_001);
            CPPUNIT_TEST(isOpen_002);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline RC close()

    class close : public CppUnit::TestFixture
    {
    public:
        void setUp() override
        {
            // create a tempdirectory : $TEMP/tmpdir.
            createTestDirectory(aTmpName3);
        }

        void tearDown() override
        {
            // remove a tempdirectory : $TEMP/tmpdir.
            deleteTestDirectory(aTmpName3);
        }

        void close_001()
        {
            Directory testDirectory(aTmpName3);

            // open a directory
            auto nError1 = testDirectory.open();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            // close a directory
            auto nError2 = testDirectory.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError2);
            // check if directory is opened.
            bool bOk = testDirectory.isOpen();

            CPPUNIT_ASSERT_MESSAGE("test for isOpen function: close a directory and check for open",
                                    !bOk);
        }

        void close_002()
        {
            Directory testDirectory(aTmpName3);

            // close a directory
            auto nError1 = testDirectory.close();

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for isOpen function: close a not opened directory",
                                    osl::FileBase::E_BADF, nError1);
        }

        CPPUNIT_TEST_SUITE(close);
            CPPUNIT_TEST(close_001);
            CPPUNIT_TEST(close_002);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline RC reset()

    class reset : public CppUnit::TestFixture
    {
    private:
        DirectoryItem    rItem;

    public:
        void setUp() override
        {
            // create a tempdirectory : $TEMP/tmpdir.
            createTestDirectory(aTmpName3);
            // create three files : $TEMP/tmpdir/tmpname, $TEMP/tmpdir/tmpdir, $TEMP/tmpdir/hiddenfile,
            createTestFile(aTmpName3, aTmpName2);
            createTestFile(aTmpName3, aTmpName1);
            createTestFile(aTmpName3, aHidURL1);
        }

        void tearDown() override
        {
            // remove three files : $TEMP/tmpdir/tmpname, $TEMP/tmpdir/tmpdir, $TEMP/tmpdir/hiddenfile,
            deleteTestFile(aTmpName3, aHidURL1);
            deleteTestFile(aTmpName3, aTmpName1);
            deleteTestFile(aTmpName3, aTmpName2);
            // remove a tempdirectory : $TEMP/tmpdir.
            deleteTestDirectory(aTmpName3);
        }


        void reset_001()
        {
            Directory testDirectory(aTmpName3); // constructor

            // open a directory
            auto nError1 = testDirectory.open();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            // get first Item
            nError1 = testDirectory.getNextItem(rItem, 1);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            // check the file name of first Item
            FileStatus   rFileStatusFirst(osl_FileStatus_Mask_FileName);
            nError1 = rItem.getFileStatus(rFileStatusFirst);

            // get second Item
            // mindy: nError1 = testDirectory.getNextItem(rItem, 0);
            // mindy: CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            // reset enumeration
            auto nError2 = testDirectory.reset();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError2);
            // get reset Item, if reset does not work, getNextItem() should return the second Item (aTmpName1)
            nError1 = testDirectory.getNextItem(rItem);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            // check the file name again
            FileStatus   rFileStatus(osl_FileStatus_Mask_FileName);
            nError1 = rItem.getFileStatus(rFileStatus);
            // close a directory
            nError1 = testDirectory.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            bool bOK1,bOK2,bOK3;
            bOK1 = normalize(rFileStatus.getFileName()) == normalize(aTmpName2);
            bOK2 = normalize(rFileStatus.getFileName()) == normalize(aHidURL1);
            bOK3 = normalize(rFileStatus.getFileName()) == normalize(rFileStatusFirst.getFileName());
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for reset function: get two directory item, reset it, then get again, check the filename",
                                    osl::FileBase::E_None, nError2);
            CPPUNIT_ASSERT_MESSAGE("test for reset function: get two directory item, reset it, then get again, check the filename",
                                    (bOK1 || bOK2 || bOK3));
        }

        void reset_002()
        {
            Directory testDirectory(aTmpName6); // constructor

            // close a directory
            auto nError1 = testDirectory.reset();

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for reset function: reset a non existed directory",
                                    osl::FileBase::E_NOENT, nError1);
        }

        void reset_003()
        {
            Directory testDirectory(aTmpName4); // constructor

            // close a directory
            auto nError1 = testDirectory.reset();

            CPPUNIT_ASSERT_MESSAGE("test for reset function: reset a file instead of a directory",
                                    (osl::FileBase::E_NOTDIR == nError1) || (osl::FileBase::E_NOENT == nError1));
        }

        void reset_004()
        {
            Directory testDirectory(aUserDirectorySys); // constructor

            // close a directory
            auto nError1 = testDirectory.reset();

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for reset function: use a system path",
                                    osl::FileBase::E_INVAL, nError1);
        }

        CPPUNIT_TEST_SUITE(reset);
            CPPUNIT_TEST(reset_001);
            CPPUNIT_TEST(reset_002);
            CPPUNIT_TEST(reset_003);
            CPPUNIT_TEST(reset_004);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline RC getNextItem(DirectoryItem& rItem, sal_uInt32 nHint = 0)

    class getNextItem : public CppUnit::TestFixture
    {
    private:
        DirectoryItem rItem;

    public:
        void setUp() override
        {
            // create a tempdirectory : $TEMP/tmpdir.
            createTestDirectory(aTmpName3);
            // create three files : $TEMP/tmpdir/tmpname, $TEMP/tmpdir/tmpdir, $TEMP/tmpdir/hiddenfile,
            createTestFile(aTmpName3, aTmpName2);
            createTestFile(aTmpName3, aTmpName1);
            createTestFile(aTmpName3, aHidURL1);

        }

        void tearDown() override
        {
            // remove three files : $TEMP/tmpdir/tmpname, $TEMP/tmpdir/tmpdir, $TEMP/tmpdir/hiddenfile,
            deleteTestFile(aTmpName3, aHidURL1);
            deleteTestFile(aTmpName3, aTmpName1);
            deleteTestFile(aTmpName3, aTmpName2);
            // remove a tempdirectory : $TEMP/tmpdir.
            deleteTestDirectory(aTmpName3);
        }


        void getNextItem_001()
        {
            Directory testDirectory(aTmpName3); // constructor

            // open a directory
            auto nError1 = testDirectory.open();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            // check the file name
            bool bOk1 = false;
            bool bOk2 = false;
            bool bOk3 = false;
            FileStatus rFileStatus(osl_FileStatus_Mask_FileName);

            for (int nCount = 0; nCount < 3; nCount++)
            {
                // get three Items
                nError1 = testDirectory.getNextItem(rItem, 2);
                CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
                nError1 = rItem.getFileStatus(rFileStatus);
                CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

                // a special order is not guaranteed. So any file may occur on any time.
                // But every file name should occur only once.
                if (!bOk1 && normalize(rFileStatus.getFileName()) == normalize(aTmpName1))
                {
                    bOk1 = true;
                }

                if (!bOk2 && normalize(rFileStatus.getFileName()) == normalize(aTmpName2))
                {
                    bOk2 = true;
                }

                if (!bOk3 && normalize(rFileStatus.getFileName()) == normalize(aHidURL1))
                {
                    bOk3 = true;
                }
            }

            // close a directory
            nError1 = testDirectory.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            CPPUNIT_ASSERT_MESSAGE("test for getNextItem function: retrieve three items and check their names.",
                                    bOk1);
            CPPUNIT_ASSERT_MESSAGE("test for getNextItem function: retrieve three items and check their names.",
                                    bOk2);
            CPPUNIT_ASSERT_MESSAGE("test for getNextItem function: retrieve three items and check their names.",
                                    bOk3);
        }

        void getNextItem_002()
        {
            Directory testDirectory(aTmpName3); // constructor
            auto nError1 = testDirectory.getNextItem(rItem);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for getNextItem function: retrieve an item in a directory which is not opened, also test for nHint's default value.",
                                    osl::FileBase::E_INVAL, nError1);
        }

        void getNextItem_003()
        {
            Directory testDirectory(aTmpName3); // constructor

            // open a directory
            auto nError1 = testDirectory.open();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            osl::FileBase::RC nError2 = osl::FileBase::E_None;
            for (int nCount = 0; nCount < 4; nCount++)
            {
                nError2 = testDirectory.getNextItem(rItem, 3);
            }

            // close a directory
            nError1 = testDirectory.close();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for getNextItem function: retrieve 4 times in a directory which contain only 3 files.",
                                    osl::FileBase::E_NOENT, nError2);
        }

        void getNextItem_004()
        {
        // create a link file(can not on Windows), then check if getNextItem can get it.
#ifdef UNX
            bool bLnkOK = false;
            bool bFoundOK = false;

            OUString aUStr_LnkFileSys(aTempDirectorySys), aUStr_SrcFileSys(aTempDirectorySys);
            aUStr_LnkFileSys += aSlashURL + "/tmpdir/link.file";
            aUStr_SrcFileSys += aSlashURL + "/tmpdir/tmpname";

            OString strLinkFileName, strSrcFileName;
            strLinkFileName = OUStringToOString(aUStr_LnkFileSys, RTL_TEXTENCODING_ASCII_US);
            strSrcFileName  = OUStringToOString(aUStr_SrcFileSys, RTL_TEXTENCODING_ASCII_US);

            // create a link file and link it to file "/tmp/PID/tmpdir/tmpname"
            sal_Int32 fd = symlink(strSrcFileName.getStr(), strLinkFileName.getStr());
            CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), fd);
            Directory testDirectory(aTmpName3);

            // open a directory
            auto nError1 = testDirectory.open();
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            OUString aFileName (u"link.file"_ustr);

            while (true) {
                nError1 = testDirectory.getNextItem(rItem, 4);
                if (nError1 == osl::FileBase::E_None) {
                    FileStatus   rFileStatus(osl_FileStatus_Mask_FileName | osl_FileStatus_Mask_Type);
                    rItem.getFileStatus(rFileStatus);
                    if (normalize(rFileStatus.getFileName()) == normalize(aFileName))
                    {
                        bFoundOK = true;
                        if (rFileStatus.getFileType() == FileStatus::Link)
                        {
                            bLnkOK = true;
                            break;
                        }
                    }
                }
                else
                    break;
            }
            fd = std::remove(strLinkFileName.getStr());
            CPPUNIT_ASSERT_EQUAL_MESSAGE("remove link file failed", static_cast<sal_Int32>(0), fd);
            CPPUNIT_ASSERT_MESSAGE("test for getNextItem function: check if can retrieve the link file name",
                                    bFoundOK);
            CPPUNIT_ASSERT_MESSAGE("test for getNextItem function: check if link file has file type link",
                                    bLnkOK);
#endif
        }

        CPPUNIT_TEST_SUITE(getNextItem);
            CPPUNIT_TEST(getNextItem_001);
            CPPUNIT_TEST(getNextItem_002);
            CPPUNIT_TEST(getNextItem_003);
            CPPUNIT_TEST(getNextItem_004);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline static RC getVolumeInfo(const OUString& ustrDirectoryURL, VolumeInfo& rInfo)

    class getVolumeInfo : public CppUnit::TestFixture
    {
    public:
        void checkValidMask(osl::VolumeInfo const& _aVolumeInfo, sal_Int32 _nMask)
        {
            if (_nMask == osl_VolumeInfo_Mask_FileSystemName)
            {
                // get file system name
                OUString aFileSysName = _aVolumeInfo.getFileSystemName();

                bool bRes2 = normalize(aFileSysName) == normalize(aNullURL);
                CPPUNIT_ASSERT_MESSAGE("test for getVolumeInfo function: getVolumeInfo of root directory.",
                                        !bRes2);
            }

            if (_nMask == osl_VolumeInfo_Mask_Attributes)
            {
                bool b1 = _aVolumeInfo.getRemoteFlag();
                bool b2 = _aVolumeInfo.getRemoveableFlag();
                bool b3 = _aVolumeInfo.getCompactDiscFlag();
                bool b4 = _aVolumeInfo.getFloppyDiskFlag();
                bool b5 = _aVolumeInfo.getFixedDiskFlag();
                bool b6 = _aVolumeInfo.getRAMDiskFlag();

                OString sAttr;
                if (b1) sAttr =  "Remote"_ostr;
                if (b2) sAttr += " Removeable";
                if (b3) sAttr += " CDROM";
                if (b4) sAttr += " Floppy";
                if (b5) sAttr += " FixedDisk";
                if (b6) sAttr += " RAMDisk";

                printf("Attributes: %s\n", sAttr.getStr());
            }
            if (_nMask == osl_VolumeInfo_Mask_TotalSpace)
            {
                // within Linux, df / * 1024 bytes is the result
                sal_uInt64 nSize = _aVolumeInfo.getTotalSpace();
                printf("Total space: %" SAL_PRIuUINT64 "\n", nSize);
            }
            if (_nMask == osl_VolumeInfo_Mask_UsedSpace)
            {
                sal_uInt64 nSize = _aVolumeInfo.getUsedSpace();
                printf(" Used space: %" SAL_PRIuUINT64 "\n", nSize);
            }
            if (_nMask == osl_VolumeInfo_Mask_FreeSpace)
            {
                sal_uInt64 nSize = _aVolumeInfo.getFreeSpace();
                printf(" Free space: %" SAL_PRIuUINT64 "\n", nSize);
            }
            if (_nMask == osl_VolumeInfo_Mask_MaxNameLength)
            {
                sal_uInt32 nLength = _aVolumeInfo.getMaxNameLength();
                printf("max name length: %" SAL_PRIuUINT32 "\n", nLength);
            }
            if (_nMask == osl_VolumeInfo_Mask_MaxPathLength)
            {
                sal_uInt32 nLength = _aVolumeInfo.getMaxPathLength();
                printf("max path length: %" SAL_PRIuUINT32 "\n", nLength);
            }
            if (_nMask == osl_VolumeInfo_Mask_FileSystemCaseHandling)
            {
                bool bIsCase = _aVolumeInfo.isCaseSensitiveFileSystem();
                printf("filesystem case sensitive: %s\n", bIsCase ? "yes" : "no");
            }
        }

        void checkVolumeInfo(sal_Int32 _nMask)
        {
            VolumeInfo aVolumeInfo(_nMask);
            // call getVolumeInfo here
            auto nError1 = Directory::getVolumeInfo(aVolURL1, aVolumeInfo);
            CPPUNIT_ASSERT_EQUAL_MESSAGE(
                "test for getVolumeInfo function: getVolumeInfo of root directory.",
                osl::FileBase::E_None, nError1);
            // LLA: IMHO it's not a bug, if VolumeInfo is not valid, it's a feature
            // LLA: CPPUNIT_ASSERT_MESSAGE("mask is not valid", sal_True == aVolumeInfo.isValid(_nMask));
            if (aVolumeInfo.isValid(_nMask))
                checkValidMask(aVolumeInfo, _nMask);
        }

        void getVolumeInfo_001_1()
        {
            sal_Int32 mask = osl_VolumeInfo_Mask_FileSystemName;
            checkVolumeInfo(mask);
        }

        void getVolumeInfo_001_2()
        {
            sal_Int32 mask = osl_VolumeInfo_Mask_Attributes;
            checkVolumeInfo(mask);
        }

        void getVolumeInfo_001_3()
        {
            sal_Int32 mask = osl_VolumeInfo_Mask_TotalSpace;
            checkVolumeInfo(mask);
        }

        void getVolumeInfo_001_4()
        {
            sal_Int32 mask = osl_VolumeInfo_Mask_UsedSpace;
            checkVolumeInfo(mask);
        }

        void getVolumeInfo_001_5()
        {
            sal_Int32 mask = osl_VolumeInfo_Mask_FreeSpace;
            checkVolumeInfo(mask);
        }

        void getVolumeInfo_001_6()
        {
            sal_Int32 mask = osl_VolumeInfo_Mask_MaxNameLength;
            checkVolumeInfo(mask);
        }

        void getVolumeInfo_001_7()
        {
            sal_Int32 mask = osl_VolumeInfo_Mask_MaxPathLength;
            checkVolumeInfo(mask);
        }

        void getVolumeInfo_001_8()
        {
            sal_Int32 mask = osl_VolumeInfo_Mask_FileSystemCaseHandling;
            checkVolumeInfo(mask);
        }

        void getVolumeInfo_002()
        {
            sal_Int32 mask = osl_VolumeInfo_Mask_FileSystemName;
            VolumeInfo aVolumeInfo(mask);
            // call getVolumeInfo here

            OUString aRootSysURL;
            auto nError1 = osl::File::getFileURLFromSystemPath(aRootSys, aRootSysURL);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("can't convert root path to file url", osl::FileBase::E_None, nError1);

            nError1 = Directory::getVolumeInfo(aRootSys, aVolumeInfo);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for getVolumeInfo function: use system path as parameter.",
                                    osl::FileBase::E_INVAL, nError1);
        }

        void getVolumeInfo_003()
        {
// LLA: in Windows, it reply no error, it did not pass in (W32).
#if defined(UNX) && !defined(IOS)
            sal_Int32 mask = osl_VolumeInfo_Mask_FileSystemName;
            VolumeInfo aVolumeInfo(mask);
            // call getVolumeInfo here
            auto nError1 = Directory::getVolumeInfo(aTmpName3, aVolumeInfo);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for getVolumeInfo function: non-existence test. ",
                                    osl::FileBase::E_NOENT, nError1);
#endif
        }

        CPPUNIT_TEST_SUITE(getVolumeInfo);
            CPPUNIT_TEST(getVolumeInfo_001_1);
            CPPUNIT_TEST(getVolumeInfo_001_2);
            CPPUNIT_TEST(getVolumeInfo_001_3);
            CPPUNIT_TEST(getVolumeInfo_001_4);
            CPPUNIT_TEST(getVolumeInfo_001_5);
            CPPUNIT_TEST(getVolumeInfo_001_6);
            CPPUNIT_TEST(getVolumeInfo_001_7);
            CPPUNIT_TEST(getVolumeInfo_001_8);
            CPPUNIT_TEST(getVolumeInfo_002);
            CPPUNIT_TEST(getVolumeInfo_003);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline static RC create(const OUString& ustrDirectoryURL)

    class create : public CppUnit::TestFixture
    {
    public:
        void create_001()
        {
            // create directory in $TEMP/tmpdir
            auto nError1 = Directory::create(aTmpName3);
            // check for existence
            auto nError2 = Directory::create(aTmpName3);
            // remove it
            deleteTestDirectory(aTmpName3);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for create function: create a directory and check its existence.",
                                    osl::FileBase::E_None, nError1);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for create function: create a directory and check its existence.",
                                    osl::FileBase::E_EXIST, nError2);
        }

        void create_002()
        {
#if !defined(_WIN32) && !defined(MACOSX) && defined(SAL_UNX)
            if (geteuid() == 0) // don't test if building as root
                return;

            OUString aTmpDir;
            auto nError1 = osl::FileBase::createTempFile(nullptr, nullptr, &aTmpDir);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("temp File creation failed", osl::FileBase::E_None, nError1);

            nError1 = File::remove(aTmpDir);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("temp File removal failed", osl::FileBase::E_None, nError1);

            nError1 = Directory::create(aTmpDir);
            OString sError = "test for create function: create a directory '" +
                OUStringToOString(aTmpDir, RTL_TEXTENCODING_ASCII_US) +
                "' and check its existence.";
            CPPUNIT_ASSERT_EQUAL_MESSAGE(sError.getStr(), osl::FileBase::E_None, nError1);
            osl_setFileAttributes(aTmpDir.pData, 0); // no access allowed now

            // Shouldn't be possible now to create a dir underneath it
            OUString aTmpSubLevel = aTmpDir + "/notallowedhere";
            nError1 = Directory::create(aTmpSubLevel);

            // allow removal
            osl_setFileAttributes(aTmpDir.pData,
                osl_File_Attribute_OwnRead |
                osl_File_Attribute_OwnWrite |
                osl_File_Attribute_OwnExe);
            deleteTestDirectory(aTmpDir);
            sError = "test for create function: create a directory under '" +
                OUStringToOString(aTmpDir, RTL_TEXTENCODING_ASCII_US) +
                "' for access test.";
            CPPUNIT_ASSERT_EQUAL_MESSAGE(sError.getStr(), osl::FileBase::E_ACCES, nError1);
#endif
        }

        void create_003()
        {
            // create directory in /tmpname
            auto nError1 = Directory::create(aSysPath1);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for create function: create a directory using system path.",
                                    osl::FileBase::E_INVAL, nError1);
        }

        CPPUNIT_TEST_SUITE(create);
            CPPUNIT_TEST(create_001);
            CPPUNIT_TEST(create_002);
            CPPUNIT_TEST(create_003);
        CPPUNIT_TEST_SUITE_END();
    };

    //  testing the method
    //  inline static RC remove(const OUString& ustrDirectoryURL)

    class remove : public CppUnit::TestFixture
    {
    public:
        void remove_001()
        {
            // create directory in $TEMP/tmpdir
            auto nError1 = Directory::create(aTmpName3);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            // remove it
            nError1 = Directory::remove(aTmpName3);
            // check for existence
            Directory rDirectory(aTmpName3);
            auto nError2 = rDirectory.open();

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for remove function: remove a directory and check its existence.",
                                    osl::FileBase::E_None, nError1);
            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for remove function: remove a directory and check its existence.",
                                    osl::FileBase::E_NOENT, nError2);
        }

        void remove_002()
        {
            // create directory in $TEMP/tmpdir
            auto nError1 = Directory::create(aTmpName3);
            CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, nError1);
            // try to remove it by system path
            nError1 = Directory::remove(aSysPath3);
             // check for existence
            Directory rDirectory(aTmpName3);
            auto nError2 = rDirectory.open();

            if (nError2 != osl::FileBase::E_NOENT)
                Directory::remove(aTmpName3);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for remove function: remove a directory by its system path, and check its existence.",
                                    osl::FileBase::E_INVAL, nError1);
        }

        void remove_003()
        {
            // try to remove a non-existed directory
            auto nError1 = Directory::remove(aTmpName6);

            CPPUNIT_ASSERT_EQUAL_MESSAGE("test for remove function: try to remove a non-existed directory.",
                                    osl::FileBase::E_NOENT, nError1);
        }

        void remove_004()
        {
            createTestFile(aTmpName6);
            bool bExist = ifFileExist(aTmpName6);
            // try to remove file.
            auto nError1 = Directory::remove(aTmpName6);
            deleteTestFile(aTmpName6);

            CPPUNIT_ASSERT_MESSAGE("test for remove function: try to remove a file but not directory.",
                                    bExist);
            CPPUNIT_ASSERT_MESSAGE("test for remove function: try to remove a file but not directory.",
                                    (osl::FileBase::E_NOTDIR == nError1) || (osl::FileBase::E_NOENT == nError1));
        }

        void remove_005()
        {
            createTestDirectory(aTmpName3);
            createTestFile(aTmpName4);
            auto nError1 = Directory::remove(aTmpName3);
            deleteTestFile(aTmpName4);
            deleteTestDirectory(aTmpName3);
            OString sError = "test for remove function: try to remove a directory that is not empty." +
                errorToStr(nError1);
#if defined(__sun)
            // on UNX, the implementation uses rmdir(), which EEXIST is thrown on Solaris when the directory is not empty, refer to: 'man -s 2 rmdir', while on linux, ENOTEMPTY is thrown.
            // EEXIST The directory contains entries other than those for "." and "..".
            printf("#Solaris test\n");
            CPPUNIT_ASSERT_MESSAGE(sError.getStr(), (osl::FileBase::E_EXIST == nError1));
#else
            CPPUNIT_ASSERT_EQUAL_MESSAGE(sError.getStr(), osl::FileBase::E_NOTEMPTY, nError1);
#endif
        }

        CPPUNIT_TEST_SUITE(remove);
            CPPUNIT_TEST(remove_001);
            CPPUNIT_TEST(remove_002);
            CPPUNIT_TEST(remove_003);
            CPPUNIT_TEST(remove_004);
            CPPUNIT_TEST(remove_005);
        CPPUNIT_TEST_SUITE_END();
    };

    // TEST Directory::createPath

    #ifdef _WIN32
    #   define PATH_BUFFER_SIZE MAX_PATH
    #else
    #   define PATH_BUFFER_SIZE PATH_MAX
    #endif

#define TEST_PATH_POSTFIX "hello/world"

    static OUString const & get_test_path()
    {
        static OUString test_path = []()
        {
            OUString tmp;
            osl::FileBase::RC rc = osl::FileBase::getTempDirURL(tmp);

            CPPUNIT_ASSERT_EQUAL_MESSAGE
            (
             "Getting the location of TMP dir failed",
             osl::FileBase::E_None, rc
          );

            OUString system_path;
            rc = osl::FileBase::getSystemPathFromFileURL(tmp, system_path);

            CPPUNIT_ASSERT_EQUAL_MESSAGE
            (
             "Cannot convert the TMP dir to system path",
             osl::FileBase::E_None, rc
          );

            OString tmp_x(OUStringToOString(system_path, RTL_TEXTENCODING_UTF8));
            if (tmp_x.lastIndexOf('/') != (tmp_x.getLength() - 1))
                tmp_x += "/";

#if !defined(_WIN32) && !defined(ANDROID)
            // FIXME would be nice to create unique dir even on Windows
            tmp_x += "XXXXXX";
            char *out = mkdtemp(const_cast<char*>(tmp_x.getStr()));

            CPPUNIT_ASSERT_MESSAGE
            (
             "mkdtemp call failed",
             out != nullptr
          );

            tmp_x += "/";
#endif
            tmp_x += TEST_PATH_POSTFIX;

            OUString tmpTestPath;
            rc = osl::FileBase::getFileURLFromSystemPath(OStringToOUString(tmp_x, RTL_TEXTENCODING_UTF8), tmpTestPath);

            CPPUNIT_ASSERT_EQUAL_MESSAGE
            (
             "Cannot convert the system path back to a URL",
             osl::FileBase::E_None, rc
            );
            return tmpTestPath;
        }();
        return test_path;
    }

    static void rm_test_path(const OUString& path)
    {
        sal_Unicode buffer[PATH_BUFFER_SIZE];
        memcpy(buffer, path.getStr(), (path.getLength() + 1) * sizeof(sal_Unicode));

        sal_Int32 i = rtl_ustr_lastIndexOfChar(buffer, '/');
        if (i == path.getLength())
            buffer[i] = 0;

        Directory::remove(OUString(buffer));

        i = rtl_ustr_lastIndexOfChar(buffer, '/');
        assert(i != -1);
        if (i != -1)
        {
            buffer[i] = 0;
            Directory::remove(OUString(buffer));
        }
    }

    namespace {

    class DirCreatedObserver : public DirectoryCreationObserver
    {
    public:
        DirCreatedObserver() : i(0) {}
        virtual void DirectoryCreated(const OUString&) override { i++; };

        int number_of_dirs_created() const { return i; }

    private:
        int i;
    };

    }

    class createPath : public CppUnit::TestFixture
    {
    public:
        createPath()
        {}

        void with_relative_path()
        {
            osl::FileBase::RC rc = Directory::createPath(u"" TEST_PATH_POSTFIX ""_ustr);

            CPPUNIT_ASSERT_EQUAL_MESSAGE
            (
                "osl_createDirectoryPath contract broken",
                osl::FileBase::E_INVAL, rc
          );
        }

        void without_callback()
        {
            OUString tp_url = get_test_path();

            rm_test_path(tp_url);

            osl::FileBase::RC rc = Directory::createPath(tp_url);

            rm_test_path(tp_url);

            CPPUNIT_ASSERT_EQUAL_MESSAGE
            (
                "osl_createDirectoryPath failed",
                osl::FileBase::E_None, rc
          );
        }

        void with_callback()
        {
            OUString tp_url = get_test_path();

            rm_test_path(tp_url);

            DirCreatedObserver* observer = new DirCreatedObserver;
            osl::FileBase::RC rc = Directory::createPath(tp_url, observer);
            int nDirs = observer->number_of_dirs_created();
            delete observer;

            rm_test_path(tp_url);

            CPPUNIT_ASSERT_EQUAL_MESSAGE
            (
                "osl_createDirectoryPath failed",
                osl::FileBase::E_None, rc
          );
            CPPUNIT_ASSERT_MESSAGE
            (
                "osl_createDirectoryPath failed",
                nDirs > 0
          );

        }

#ifdef _WIN32

        const char* get_unused_drive_letter()
        {
            static const char m_aBuff[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

            DWORD ld = GetLogicalDrives();
            DWORD i = 4;
            DWORD j = 2;

            while ((ld & i) && (i > 1))
            { i = i << 1; j++; }

            if (i > 2)
                return m_aBuff + j;

            return nullptr;
        }

        void at_invalid_logical_drive()
        {
            const char* drv = get_unused_drive_letter();
            char buff[PATH_BUFFER_SIZE];
            memset(buff, 0, sizeof(buff));

            strncpy(buff, drv, 1);
            strcat(buff, ":\\");
            strcat(buff, TEST_PATH_POSTFIX);

            OUString path = OUString::createFromAscii(buff);
            OUString tp_url;
            osl::FileBase::getFileURLFromSystemPath(path, tp_url);

            osl::FileBase::RC rc = Directory::createPath(tp_url);

            CPPUNIT_ASSERT_MESSAGE
            (
                "osl_createDirectoryPath doesn't fail on unused logical drive letters",
                rc != osl::FileBase::E_None
          );
        }
#endif /* _WIN32 */

    CPPUNIT_TEST_SUITE(createPath);
        CPPUNIT_TEST(with_relative_path);
        CPPUNIT_TEST(without_callback);
        CPPUNIT_TEST(with_callback);
#ifdef _WIN32
        CPPUNIT_TEST(at_invalid_logical_drive);
#endif
    CPPUNIT_TEST_SUITE_END();

    };

    CPPUNIT_TEST_SUITE_REGISTRATION(osl_Directory::ctors);
    CPPUNIT_TEST_SUITE_REGISTRATION(osl_Directory::open);
    CPPUNIT_TEST_SUITE_REGISTRATION(osl_Directory::isOpen);
    CPPUNIT_TEST_SUITE_REGISTRATION(osl_Directory::close);
    CPPUNIT_TEST_SUITE_REGISTRATION(osl_Directory::reset);
    CPPUNIT_TEST_SUITE_REGISTRATION(osl_Directory::getNextItem);
    CPPUNIT_TEST_SUITE_REGISTRATION(osl_Directory::getVolumeInfo);
    CPPUNIT_TEST_SUITE_REGISTRATION(osl_Directory::create);
    CPPUNIT_TEST_SUITE_REGISTRATION(osl_Directory::remove);
    CPPUNIT_TEST_SUITE_REGISTRATION(osl_Directory::createPath);
}

#if 0
#if defined UNX
/** get Current PID.
*/
OUString getCurrentPID()
{
    //~ Get current PID and turn it into OUString;
    int nPID = 0;
#ifdef _WIN32
    nPID = GetCurrentProcessId();
#else
    nPID = getpid();
#endif
    return OUString::number(nPID);
}
#endif
#endif

namespace {

//~ do some clean up work after all test completed.
class GlobalObject
{
public:
    ~GlobalObject()
    {
        try
        {
            //~ special clean up task in Windows and Unix separately;
#if (defined UNX)
            //~ some clean up task  for UNIX OS
            ;
#else
            //~ some clean up task  for Windows OS
            //~ check if some files are in the way, remove them if necessary.
            if (ifFileExist(aTmpName6))
                deleteTestFile(aTmpName6);
            if (ifFileExist(aTmpName4))
                deleteTestFile(aTmpName4);
            if (checkDirectory(aTmpName4, oslCheckMode::Exist))
                deleteTestDirectory(aTmpName4);
            if (ifFileExist(aTmpName3))
                deleteTestFile(aTmpName3);
            if (checkDirectory(aTmpName3, oslCheckMode::Exist))
                deleteTestDirectory(aTmpName3);

            OUString aUStr(aUserDirectoryURL);
            concatURL(aUStr, aHidURL1);
            if (ifFileExist(aUStr))
                deleteTestFile(aUStr);

            OUString aUStr1(aRootURL);
            concatURL(aUStr1, aTmpName2);
            if (ifFileExist(aUStr1))
                deleteTestFile(aUStr1);
#endif
        }
        catch (const CppUnit::Exception &e)
        {
            printf("Exception caught in GlobalObject dtor(). Exception message: '%s'. Source line: %d\n", e.what(), e.sourceLine().lineNumber());
        }
        catch (...)
        {
            printf("Exception caught (...) in GlobalObject dtor()\n");
        }
    }
};

}

static GlobalObject theGlobalObject;

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
