blob: eca836296e390a27a29fd019c048facd94eab8ab [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#include "sal/main.h"
#include "osl/file.hxx"
#include "typelib/typedescription.hxx"
#include "cppuhelper/bootstrap.hxx"
#include "cppuhelper/shlib.hxx"
#include <com/sun/star/lang/XComponent.hpp>
#include "uno/environment.hxx"
#include "cppu/EnvDcp.hxx"
#include "cppu/EnvGuards.hxx"
#include <iostream>
#ifndef SAL_DLLPREFIX
# define SAL_DLLPREFIX ""
#endif
using namespace com::sun::star;
static rtl::OUString s_comment;
static bool s_check_object_is_in(void * pObject)
{
uno::Environment currentEnv(uno::Environment::getCurrent());
rtl_uString * pOId = NULL;
currentEnv.get()->pExtEnv->getObjectIdentifier(currentEnv.get()->pExtEnv, &pOId, pObject);
uno::TypeDescription typeDescription(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.uno.XInterface")));
void * pRegisteredObject = NULL;
currentEnv.get()->pExtEnv->getRegisteredInterface(currentEnv.get()->pExtEnv,
&pRegisteredObject,
pOId,
(typelib_InterfaceTypeDescription *)typeDescription.get());
if (pOId) rtl_uString_release(pOId);
bool result = pRegisteredObject != NULL;
if (result)
currentEnv.get()->pExtEnv->releaseInterface(currentEnv.get()->pExtEnv, pRegisteredObject);
return result;
}
static void s_test__loadSharedLibComponentFactory(rtl::OUString const & clientPurpose,
rtl::OUString const & servicePurpose)
{
cppu::EnvGuard envGuard(uno::Environment(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(UNO_LB_UNO))
+ clientPurpose, NULL));
if (clientPurpose.getLength() && !envGuard.is())
{
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tcouldn't get purpose env: \""));
s_comment += clientPurpose;
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\" - FAILURE\n"));
return;
}
rtl::OString os_clientPurpose(rtl::OUStringToOString(clientPurpose, RTL_TEXTENCODING_ASCII_US));
uno::Reference<uno::XInterface> xItf(
cppu::loadSharedLibComponentFactory(
rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SAL_DLLPREFIX "TestComponent.uno" SAL_DLLEXTENSION)),
#ifdef WIN32
rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("")),
#else
rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("file://../lib/")),
#endif
rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("impl.test.TestComponent")) + servicePurpose,
uno::Reference<lang::XMultiServiceFactory>(),
uno::Reference<registry::XRegistryKey>()
)
);
if (!xItf.is())
{
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tgot no object - FAILURE\n"));
return;
}
if (!clientPurpose.equals(servicePurpose) && !s_check_object_is_in(xItf.get()))
{
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tcouldn't find object in current purpose \""));
s_comment += clientPurpose;
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\" - FAILURE\n"));
}
if (!cppu::EnvDcp::getPurpose(uno::Environment::getCurrent().getTypeName()).equals(clientPurpose))
{
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tdid not enter client purpose \""));
s_comment += clientPurpose;
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\" - FAILURE\n"));
}
}
static void s_test__loadSharedLibComponentFactory__free_free()
{
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\ts_test__loadSharedLibComponentFactory__free_free\n"));
s_test__loadSharedLibComponentFactory(rtl::OUString(), rtl::OUString());
}
static void s_test__loadSharedLibComponentFactory__free_purpose()
{
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\ts_test__loadSharedLibComponentFactory__free_purpose\n"));
s_test__loadSharedLibComponentFactory(rtl::OUString(),
rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(":testenv")));
}
static void s_test__loadSharedLibComponentFactory__purpose_free()
{
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\ts_test__loadSharedLibComponentFactory__purpose_free\n"));
s_test__loadSharedLibComponentFactory(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(":testenv")),
rtl::OUString());
}
static void s_test__loadSharedLibComponentFactory__purpose_purpose()
{
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\ts_test__loadSharedLibComponentFactory__purpose_purpose\n"));
s_test__loadSharedLibComponentFactory(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(":testenv")),
rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(":testenv")));
}
static rtl::OUString s_getSDrive(void)
{
rtl::OUString path;//(RTL_CONSTASCII_USTRINGPARAM("file://"));
char const * tmp = getenv("SOLARVER");
path += rtl::OUString(tmp, rtl_str_getLength(tmp), RTL_TEXTENCODING_ASCII_US);
path += rtl::OUString(SAL_PATHDELIMITER);
tmp = getenv("INPATH");
path += rtl::OUString(tmp, rtl_str_getLength(tmp), RTL_TEXTENCODING_ASCII_US);
path += rtl::OUString(SAL_PATHDELIMITER);
#ifdef WIN32
path += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("bin"));
#else
path += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("lib"));
#endif
tmp = getenv("UPDMINOREXT");
if (tmp)
path += rtl::OUString(tmp, rtl_str_getLength(tmp), RTL_TEXTENCODING_ASCII_US);
osl::FileBase::getFileURLFromSystemPath(path, path);
return path;
}
static void s_test__createSimpleRegistry(rtl::OUString const & clientPurpose)
{
cppu::EnvGuard envGuard(uno::Environment(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(UNO_LB_UNO))
+ clientPurpose, NULL));
if (clientPurpose.getLength() && !envGuard.is())
{
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tcouldn't get purpose env: \""));
s_comment += clientPurpose;
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\" - FAILURE\n"));
return;
}
uno::Reference<registry::XSimpleRegistry> registry(cppu::createSimpleRegistry(
s_getSDrive()));
if (!registry.is())
{
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tgot no object - FAILURE\n"));
return;
}
if (clientPurpose.getLength() != 0 && !s_check_object_is_in(registry.get()))
{
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tcouldn't find object in current purpose \""));
s_comment += clientPurpose;
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\" - FAILURE\n"));
}
}
static void s_test__createSimpleRegistry__free(void)
{
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\ts_test__createSimpleRegistry__free\n"));
s_test__createSimpleRegistry(rtl::OUString());
}
static void s_test__createSimpleRegistry__purpose(void)
{
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\ts_test__createSimpleRegistry__purpose\n"));
s_test__createSimpleRegistry(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(":testenv")));
}
static void s_test__bootstrap_InitialComponentContext(rtl::OUString const & clientPurpose)
{
cppu::EnvGuard envGuard(uno::Environment(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(UNO_LB_UNO))
+ clientPurpose, NULL));
if (clientPurpose.getLength() && !envGuard.is())
{
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tcouldn't get purpose env: \""));
s_comment += clientPurpose;
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\" - FAILURE\n"));
return;
}
uno::Reference<uno::XComponentContext> xContext(
cppu::bootstrap_InitialComponentContext(
uno::Reference<registry::XSimpleRegistry>(),
s_getSDrive())
);
if (!xContext.is())
{
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tgot no object - FAILURE\n"));
return;
}
if (clientPurpose.getLength() != 0 && !s_check_object_is_in(xContext.get()))
{
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tcouldn't find object in current purpose \""));
s_comment += clientPurpose;
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\" - FAILURE\n"));
}
uno::Reference<lang::XComponent> xComponent(xContext, uno::UNO_QUERY_THROW);
xComponent->dispose();
}
static void s_test__bootstrap_InitialComponentContext__free(void)
{
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\ts_test__bootstrap_InitialComponentContext__free\n"));
s_test__bootstrap_InitialComponentContext(rtl::OUString());
}
static void s_test__bootstrap_InitialComponentContext__purpose(void)
{
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\ts_test__bootstrap_InitialComponentContext__purpose\n"));
s_test__bootstrap_InitialComponentContext(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(":testenv")));
}
SAL_IMPLEMENT_MAIN_WITH_ARGS(/*argc*/, argv)
{
s_test__createSimpleRegistry__free();
s_test__createSimpleRegistry__purpose();
s_test__loadSharedLibComponentFactory__free_free();
s_test__loadSharedLibComponentFactory__free_purpose();
s_test__loadSharedLibComponentFactory__purpose_free();
s_test__loadSharedLibComponentFactory__purpose_purpose();
s_test__bootstrap_InitialComponentContext__free();
s_test__bootstrap_InitialComponentContext__purpose();
int ret;
if (s_comment.indexOf(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FAILURE"))) == -1)
{
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TESTS PASSED\n"));
ret = 0;
}
else
{
s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TESTS _NOT_ PASSED\n"));
ret = -1;
}
std::cerr
<< argv[0]
<< std::endl
<< rtl::OUStringToOString(s_comment, RTL_TEXTENCODING_ASCII_US).getStr()
<< std::endl;
return ret;
}