/* -*- 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 #include #include #include #include #include #include #include #include #include #include #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("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(UNO_LB_UNO + clientPurpose, NULL)); if (!clientPurpose.isEmpty() && !envGuard.is()) { s_comment += "\t\tcouldn't get purpose env: \"" + clientPurpose + "\" - FAILURE\n"; return; } rtl::OString os_clientPurpose(rtl::OUStringToOString(clientPurpose, RTL_TEXTENCODING_ASCII_US)); uno::Reference xItf( cppu::loadSharedLibComponentFactory( rtl::OUString(SAL_DLLPREFIX "TestComponent.uno" SAL_DLLEXTENSION), #ifdef WIN32 "", #else "file://../lib/", #endif "impl.test.TestComponent" + servicePurpose, uno::Reference(), uno::Reference() ) ); if (!xItf.is()) { s_comment += rtl::OUString("\t\tgot no object - FAILURE\n"); return; } if (!clientPurpose.equals(servicePurpose) && !s_check_object_is_in(xItf.get())) { s_comment += "\t\tcouldn't find object in current purpose \"" + clientPurpose + "\" - FAILURE\n"; } if (!cppu::EnvDcp::getPurpose(uno::Environment::getCurrent().getTypeName()).equals(clientPurpose)) { s_comment += "\t\tdid not enter client purpose \"" + clientPurpose + "\" - FAILURE\n"; } } static void s_test__loadSharedLibComponentFactory__free_free() { s_comment += "\ts_test__loadSharedLibComponentFactory__free_free\n"; s_test__loadSharedLibComponentFactory("", ""); } static void s_test__loadSharedLibComponentFactory__free_purpose() { s_comment += "\ts_test__loadSharedLibComponentFactory__free_purpose\n"; s_test__loadSharedLibComponentFactory("", ":testenv"); } static void s_test__loadSharedLibComponentFactory__purpose_free() { s_comment += "\ts_test__loadSharedLibComponentFactory__purpose_free\n"; s_test__loadSharedLibComponentFactory(":testenv", ""); } static void s_test__loadSharedLibComponentFactory__purpose_purpose() { s_comment += "\ts_test__loadSharedLibComponentFactory__purpose_purpose\n"; s_test__loadSharedLibComponentFactory(":testenv", ":testenv"); } static rtl::OUString s_getSDrive() { rtl::OUString path;//("file://"); // FIXME no more S drive osl::FileBase::getFileURLFromSystemPath(path, path); return path; } static void s_test__createSimpleRegistry(rtl::OUString const & clientPurpose) { cppu::EnvGuard envGuard(uno::Environment(rtl::OUString(UNO_LB_UNO) + clientPurpose, NULL)); if (!clientPurpose.isEmpty() && !envGuard.is()) { s_comment += "\t\tcouldn't get purpose env: \"" + clientPurpose + "\" - FAILURE\n"; return; } uno::Reference registry(cppu::createSimpleRegistry( s_getSDrive())); if (!registry.is()) { s_comment += "\t\tgot no object - FAILURE\n"; return; } if (!clientPurpose.isEmpty() && !s_check_object_is_in(registry.get())) { s_comment += "\t\tcouldn't find object in current purpose \"" + clientPurpose + "\" - FAILURE\n"; } } static void s_test__createSimpleRegistry__free() { s_comment += "\ts_test__createSimpleRegistry__free\n"; s_test__createSimpleRegistry(rtl::OUString()); } static void s_test__createSimpleRegistry__purpose() { s_comment += "\ts_test__createSimpleRegistry__purpose\n"; s_test__createSimpleRegistry(":testenv"); } static void s_test__bootstrap_InitialComponentContext(rtl::OUString const & clientPurpose) { cppu::EnvGuard envGuard(uno::Environment(rtl::OUString(UNO_LB_UNO) + clientPurpose, NULL)); if (!clientPurpose.isEmpty() && !envGuard.is()) { s_comment += "\t\tcouldn't get purpose env: \"" + clientPurpose + "\" - FAILURE\n"; return; } uno::Reference xContext( cppu::bootstrap_InitialComponentContext( uno::Reference(), s_getSDrive()) ); if (!xContext.is()) { s_comment += "\t\tgot no object - FAILURE\n"; return; } if (!clientPurpose.isEmpty() && !s_check_object_is_in(xContext.get())) { s_comment += "\t\tcouldn't find object in current purpose \"" + clientPurpose + "\" - FAILURE\n"; } uno::Reference xComponent(xContext, uno::UNO_QUERY_THROW); xComponent->dispose(); } static void s_test__bootstrap_InitialComponentContext__free() { s_comment += "\ts_test__bootstrap_InitialComponentContext__free\n"; s_test__bootstrap_InitialComponentContext(rtl::OUString()); } static void s_test__bootstrap_InitialComponentContext__purpose() { s_comment += "\ts_test__bootstrap_InitialComponentContext__purpose\n"; s_test__bootstrap_InitialComponentContext(":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("FAILURE") == -1) { s_comment += "TESTS PASSED\n"; ret = 0; } else { s_comment += "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; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */