From 1cb57f687bd68bc8df6957f3b2c37bd6b28a68d3 Mon Sep 17 00:00:00 2001 From: Inkyun Kil Date: Thu, 16 Jul 2020 13:38:25 +0900 Subject: [PATCH] Prep gmock tests Change-Id: I0a2abe76e35f0879aa4e810261b86e9c1cdb0ddf Signed-off-by: Inkyun Kil --- CMakeLists.txt | 5 +-- packaging/librua.spec | 50 ++++++++++++++++++++++++++++ tests/CMakeLists.txt | 2 ++ tests/mock/aul_mock.cc | 27 +++++++++++++++ tests/mock/aul_mock.h | 34 +++++++++++++++++++ tests/mock/mock_hook.h | 42 +++++++++++++++++++++++ tests/mock/module_mock.h | 25 ++++++++++++++ tests/mock/test_fixture.cc | 21 ++++++++++++ tests/mock/test_fixture.h | 54 ++++++++++++++++++++++++++++++ {test => tests/rua-test}/CMakeLists.txt | 1 - {test => tests/rua-test}/rua-test.c | 0 tests/unittest/CMakeLists.txt | 25 ++++++++++++++ tests/unittest/main.cc | 25 ++++++++++++++ tests/unittest/rua_unit_test.cc | 59 +++++++++++++++++++++++++++++++++ 14 files changed, 367 insertions(+), 3 deletions(-) create mode 100644 tests/CMakeLists.txt create mode 100644 tests/mock/aul_mock.cc create mode 100644 tests/mock/aul_mock.h create mode 100644 tests/mock/mock_hook.h create mode 100644 tests/mock/module_mock.h create mode 100644 tests/mock/test_fixture.cc create mode 100644 tests/mock/test_fixture.h rename {test => tests/rua-test}/CMakeLists.txt (99%) rename {test => tests/rua-test}/rua-test.c (100%) create mode 100644 tests/unittest/CMakeLists.txt create mode 100644 tests/unittest/main.cc create mode 100644 tests/unittest/rua_unit_test.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d95170..96e22b8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6) -PROJECT(rua C) +PROJECT(rua C CXX) SET(PREFIX ${CMAKE_INSTALL_PREFIX}) SET(EXEC_PREFIX "\${prefix}") @@ -19,6 +19,7 @@ ENDFOREACH(flag) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -std=c++14 -fPIE") ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"") ADD_DEFINITIONS("-DFACTORYFS=\"$ENV{FACTORYFS}\"") @@ -42,4 +43,4 @@ INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/rua_types.h DESTINATION includ INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/rua_context.h DESTINATION include/${PROJECT_NAME}) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/rua_manager.h DESTINATION include/${PROJECT_NAME}) -ADD_SUBDIRECTORY(test) +ADD_SUBDIRECTORY(tests) diff --git a/packaging/librua.spec b/packaging/librua.spec index 25bf7a9..294e1f7 100644 --- a/packaging/librua.spec +++ b/packaging/librua.spec @@ -14,9 +14,15 @@ BuildRequires: pkgconfig(sqlite3) BuildRequires: pkgconfig(libtzplatform-config) BuildRequires: pkgconfig(gio-2.0) BuildRequires: pkgconfig(glib-2.0) +BuildRequires: pkgconfig(gmock) BuildRequires: pkgconfig(capi-appfw-app-control) BuildRequires: pkgconfig(pkgmgr-info) +%if 0%{?gcov:1} +BuildRequires: lcov +BuildRequires: zip +%endif + %description Recently used application library @@ -39,6 +45,13 @@ Recently used application library (test) cp %{SOURCE1001} . %build +%if 0%{?gcov:1} +export CFLAGS+=" -fprofile-arcs -ftest-coverage" +export CXXFLAGS+=" -fprofile-arcs -ftest-coverage" +export FFLAGS+=" -fprofile-arcs -ftest-coverage" +export LDFLAGS+=" -lgcov" +%endif + MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` %cmake -DFULLVER=%{version} \ -DMAJORVER=${MAJORVER} \ @@ -46,9 +59,28 @@ MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` make %{?_smp_mflags} +%if 0%{?gcov:1} +mkdir -p gcov-obj +find . -name '*.gcno' -exec cp '{}' gcov-obj ';' +%endif + +%check +(cd tests && cd unittest && LD_LIBRARY_PATH=../../ ctest -V) +%if 0%{?gcov:1} +lcov -c --ignore-errors graph --no-external -q -d . -o rua.info +genhtml rua.info -o rua.out +zip -r rua.zip rua.out +install -m 0644 rua.zip %{buildroot}%{_datadir}/gcov/ +%endif + %install %make_install +%if 0%{?gcov:1} +mkdir -p %{buildroot}%{_datadir}/gcov/obj +install -m 0644 gcov-obj/* %{buildroot}%{_datadir}/gcov/obj +%endif + %post -p /sbin/ldconfig %postun -p /sbin/ldconfig @@ -71,3 +103,21 @@ make %{?_smp_mflags} %manifest %{name}.manifest %defattr(-,root,root,-) %{_bindir}/rua-test + +################################################# +# rua-gcov +################################################# +%if 0%{?gcov:1} +%package gcov +Summary: Simple string key-val dictionary ADT (gcov) +Group: Application Framework/Testing + +%description gcov +Simple string key-val dictionary ADT gcov objects +%endif + +%if 0%{?gcov:1} +%files gcov +%defattr(-,root,root,-) +%{_datadir}/gcov/* +%endif diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..3baa0d0 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,2 @@ +ADD_SUBDIRECTORY(rua-test) +ADD_SUBDIRECTORY(unittest) \ No newline at end of file diff --git a/tests/mock/aul_mock.cc b/tests/mock/aul_mock.cc new file mode 100644 index 0000000..ab22c6d --- /dev/null +++ b/tests/mock/aul_mock.cc @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed 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 + +#include "mock_hook.h" +#include "test_fixture.h" +#include "aul_mock.h" + + +extern "C" int aul_add_rua_history_for_uid( + bundle* arg0, uid_t arg1) { + return MOCK_HOOK_P2(AulMock, aul_add_rua_history_for_uid, arg0, arg1); +} diff --git a/tests/mock/aul_mock.h b/tests/mock/aul_mock.h new file mode 100644 index 0000000..da623ae --- /dev/null +++ b/tests/mock/aul_mock.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed 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. + */ + +#ifndef UNIT_TESTS_MOCK_AUL_MOCK_H_ +#define UNIT_TESTS_MOCK_AUL_MOCK_H_ + +#include +#include +#include + +#include "module_mock.h" + +class AulMock : public virtual ModuleMock { + public: + virtual ~AulMock() {} + + MOCK_METHOD2(aul_add_rua_history_for_uid, int(bundle*, uid_t)); + +}; + +#endif // UNIT_TESTS_MOCK_AUL_MOCK_H_ diff --git a/tests/mock/mock_hook.h b/tests/mock/mock_hook.h new file mode 100644 index 0000000..af27bba --- /dev/null +++ b/tests/mock/mock_hook.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed 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. + */ + +#ifndef UNIT_TESTS_MOCK_MOCK_HOOK_H_ +#define UNIT_TESTS_MOCK_MOCK_HOOK_H_ + +#define MOCK_HOOK_P0(MOCK_CLASS, f) \ + TestFixture::GetMock().f() +#define MOCK_HOOK_P1(MOCK_CLASS, f, p1) \ + TestFixture::GetMock().f(p1) +#define MOCK_HOOK_P2(MOCK_CLASS, f, p1, p2) \ + TestFixture::GetMock().f(p1, p2) +#define MOCK_HOOK_P3(MOCK_CLASS, f, p1, p2, p3) \ + TestFixture::GetMock().f(p1, p2, p3) +#define MOCK_HOOK_P4(MOCK_CLASS, f, p1, p2, p3, p4) \ + TestFixture::GetMock().f(p1, p2, p3, p4) +#define MOCK_HOOK_P5(MOCK_CLASS, f, p1, p2, p3, p4, p5) \ + TestFixture::GetMock().f(p1, p2, p3, p4, p5) +#define MOCK_HOOK_P6(MOCK_CLASS, f, p1, p2, p3, p4, p5, p6) \ + TestFixture::GetMock().f(p1, p2, p3, p4, p5, p6) +#define MOCK_HOOK_P7(MOCK_CLASS, f, p1, p2, p3, p4, p5, p6, p7) \ + TestFixture::GetMock().f(p1, p2, p3, p4, p5, p6, p7) +#define MOCK_HOOK_P8(MOCK_CLASS, f, p1, p2, p3, p4, p5, p6, p7, p8) \ + TestFixture::GetMock().f(p1, p2, p3, p4, p5, p6, p7, p8) +#define MOCK_HOOK_P10(MOCK_CLASS, f, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) \ + TestFixture::GetMock().f( \ + p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) + +#endif // UNIT_TESTS_MOCK_MOCK_HOOK_H_ diff --git a/tests/mock/module_mock.h b/tests/mock/module_mock.h new file mode 100644 index 0000000..9b19d89 --- /dev/null +++ b/tests/mock/module_mock.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed 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. + */ + +#ifndef UNIT_TESTS_MOCK_MODULE_MOCK_H_ +#define UNIT_TESTS_MOCK_MODULE_MOCK_H_ + +class ModuleMock { + public: + virtual ~ModuleMock() {} +}; + +#endif // UNIT_TESTS_MOCK_MODULE_MOCK_H_ diff --git a/tests/mock/test_fixture.cc b/tests/mock/test_fixture.cc new file mode 100644 index 0000000..27f5666 --- /dev/null +++ b/tests/mock/test_fixture.cc @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed 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 "test_fixture.h" + +#include + +std::unique_ptr TestFixture::mock_; diff --git a/tests/mock/test_fixture.h b/tests/mock/test_fixture.h new file mode 100644 index 0000000..1f9d858 --- /dev/null +++ b/tests/mock/test_fixture.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed 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. + */ + +#ifndef UNIT_TESTS_MOCK_TEST_FIXTURE_H_ +#define UNIT_TESTS_MOCK_TEST_FIXTURE_H_ + +#include + +#include +#include +#include +#include + +#include "module_mock.h" +#include "test_fixture.h" + +class TestFixture : public ::testing::Test { + public: + explicit TestFixture(std::unique_ptr&& mock) { + mock_ = std::move(mock); + } + virtual ~TestFixture() { + mock_.reset(); + } + + virtual void SetUp() {} + virtual void TearDown() {} + + template + static T& GetMock() { + auto ptr = dynamic_cast(mock_.get()); + if (!ptr) + throw std::invalid_argument("The test does not provide mock of \"" + + std::string(typeid(T).name()) + "\""); + return *ptr; + } + + static std::unique_ptr mock_; +}; + +#endif // UNIT_TESTS_MOCK_TEST_FIXTURE_H_ diff --git a/test/CMakeLists.txt b/tests/rua-test/CMakeLists.txt similarity index 99% rename from test/CMakeLists.txt rename to tests/rua-test/CMakeLists.txt index 3f7d5c8..088189a 100644 --- a/test/CMakeLists.txt +++ b/tests/rua-test/CMakeLists.txt @@ -19,4 +19,3 @@ SET_TARGET_PROPERTIES(${RUATEST} PROPERTIES COMPILE_FLAGS "${RUATEST_CFLAGS}") TARGET_LINK_LIBRARIES(${RUATEST} ${PROJECT_NAME} ${RUATEST_PKGS_LDFLAGS}) INSTALL(TARGETS ${RUATEST} DESTINATION bin) - diff --git a/test/rua-test.c b/tests/rua-test/rua-test.c similarity index 100% rename from test/rua-test.c rename to tests/rua-test/rua-test.c diff --git a/tests/unittest/CMakeLists.txt b/tests/unittest/CMakeLists.txt new file mode 100644 index 0000000..d4677ec --- /dev/null +++ b/tests/unittest/CMakeLists.txt @@ -0,0 +1,25 @@ +ENABLE_TESTING() +SET(TARGET_RUA_UNIT_TEST "rua-unit-test") + +AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/ UNIT_TESTS_SRCS) +AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/../mock/ UNIT_TESTS_SRCS) +ADD_EXECUTABLE(${TARGET_RUA_UNIT_TEST} + ${UNIT_TESTS_SRCS} +) + +TARGET_INCLUDE_DIRECTORIES(${TARGET_RUA_UNIT_TEST} PUBLIC + "${CMAKE_CURRENT_SOURCE_DIR}/../../include" + "${CMAKE_CURRENT_SOURCE_DIR}/../mock" +) + +INCLUDE(FindPkgConfig) +PKG_CHECK_MODULES(gtest_pkgs REQUIRED gmock) + +TARGET_LINK_LIBRARIES(${TARGET_RUA_UNIT_TEST} PUBLIC ${gtest_pkgs_LDFLAGS} ${PROJECT_NAME}) +SET_TARGET_PROPERTIES(${TARGET_RUA_UNIT_TEST} PROPERTIES COMPILE_FLAGS "-fPIE") +SET_TARGET_PROPERTIES(${TARGET_RUA_UNIT_TEST} PROPERTIES LINK_FLAGS "-pie") + +ADD_TEST( + NAME ${TARGET_RUA_UNIT_TEST} + COMMAND ${TARGET_RUA_UNIT_TEST} +) diff --git a/tests/unittest/main.cc b/tests/unittest/main.cc new file mode 100644 index 0000000..5f340cd --- /dev/null +++ b/tests/unittest/main.cc @@ -0,0 +1,25 @@ +// Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#include +#include + +int main(int argc, char** argv) { + int ret = -1; + try { + testing::InitGoogleTest(&argc, argv); + } catch(...) { + std::cout << "Exception occurred" << std::endl; + } + + try { + ret = RUN_ALL_TESTS(); + } catch (const ::testing::internal::GoogleTestFailureException& e) { + ret = -1; + std::cout << "GoogleTestFailureException was thrown:" << e.what() + << std::endl; + } + + return ret; +} diff --git a/tests/unittest/rua_unit_test.cc b/tests/unittest/rua_unit_test.cc new file mode 100644 index 0000000..ccffbb9 --- /dev/null +++ b/tests/unittest/rua_unit_test.cc @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed 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 + +#include + +#include +#include + +#include "aul_mock.h" +#include "test_fixture.h" + +using ::testing::_; +using ::testing::Return; + +class Mocks : public ::testing::NiceMock{}; + +class RuaTest : public TestFixture { + public: + RuaTest() : TestFixture(std::make_unique()) {} + virtual ~RuaTest() {} + + virtual void SetUp() { + } + + virtual void TearDown() { + } +}; + +TEST_F(RuaTest, rua_add_history_for_uid) { + EXPECT_CALL(GetMock(), + aul_add_rua_history_for_uid(_, _)). + WillOnce(Return(0)); + + int ret; + ret = rua_add_history_for_uid("test", "/app_path", "arg", 5001); + EXPECT_EQ(ret, 0); +} + +TEST_F(RuaTest, rua_delete_history_with_pkgname_N) { + int ret; + ret = rua_delete_history_with_pkgname("test"); + EXPECT_NE(ret, 0); +} + -- 2.7.4