Skip to content

Commit

Permalink
[test] add fake platform (openthread#10594)
Browse files Browse the repository at this point in the history
This commit adds a fake platform for unit/component tests. This platform
uses virtual time so it should be able to run fast.

Note that the fake platforms leverage C++ virtual methods to allow mocking.

This commit verifies setting active dataset triggers the active dataset
change event by the notifier.
  • Loading branch information
bukepo authored Oct 9, 2024
1 parent f943729 commit 8cb529b
Show file tree
Hide file tree
Showing 8 changed files with 790 additions and 2 deletions.
1 change: 1 addition & 0 deletions .code-spell-ignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ aparent
apending
asender
asent
atleast
ect
intialize
nd
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/unit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -79,11 +79,11 @@ jobs:
sudo rm /etc/apt/sources.list.d/* && sudo apt-get update
sudo apt-get --no-install-recommends install -y ninja-build lcov
- name: Build Simulation
run: ./script/cmake-build simulation -DOT_BORDER_ROUTING=ON -DOT_NCP_INFRA_IF=ON
run: ./script/cmake-build simulation -DOT_BUILD_GTEST=ON -DOT_BORDER_ROUTING=ON -DOT_NCP_INFRA_IF=ON
- name: Test Simulation
run: cd build/simulation && ninja test
- name: Build Multipan Simulation
run: ./script/cmake-build simulation -DOT_MULTIPAN_TEST=ON
run: ./script/cmake-build simulation -DOT_BUILD_GTEST=ON -DOT_MULTIPAN_TEST=ON
- name: Test Multipan Simulation
run: cd build/simulation && ninja test
- name: Build POSIX
Expand Down
1 change: 1 addition & 0 deletions src/lib/spinel/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ target_link_libraries(openthread-radio-spinel
INTERFACE
ot-lib-config
PRIVATE
openthread-platform
ot-config
)

Expand Down
5 changes: 5 additions & 0 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,13 @@
# POSSIBILITY OF SUCH DAMAGE.
#

option(OT_BUILD_GTEST "enable gtest")

if(OT_FTD AND BUILD_TESTING)
add_subdirectory(unit)
if(OT_BUILD_GTEST)
add_subdirectory(gtest)
endif()
endif()

option(OT_FUZZ_TARGETS "enable fuzz targets" OFF)
Expand Down
67 changes: 67 additions & 0 deletions tests/gtest/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#
# Copyright (c) 2024, The OpenThread Authors.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. Neither the name of the copyright holder nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#

cmake_minimum_required(VERSION 3.14)
project(openthread-gtest)

# GoogleTest requires at least C++14
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

include(FetchContent)
FetchContent_Declare(
googletest
URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip
)
# For Windows: Prevent overriding the parent project's compiler/linker settings
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)

include(GoogleTest)

add_library(ot-fake-platform
fake_platform.cpp
)
target_link_libraries(ot-fake-platform
ot-config
)

add_library(ot-fake-ftd INTERFACE)
target_link_libraries(ot-fake-ftd INTERFACE
openthread-ftd
ot-fake-platform
)

add_executable(ot-ftd-gtest
dataset_test.cpp
)
target_link_libraries(ot-ftd-gtest
ot-fake-ftd
GTest::gmock_main
)
gtest_discover_tests(ot-ftd-gtest)
88 changes: 88 additions & 0 deletions tests/gtest/dataset_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/*
* Copyright (c) 2024, The OpenThread Authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/

#include <gmock/gmock.h>
#include <gtest/gtest.h>

#include <openthread/border_agent.h>
#include <openthread/dataset.h>
#include <openthread/dataset_ftd.h>
#include <openthread/instance.h>
#include <openthread/ip6.h>
#include <openthread/thread.h>
#include <openthread/platform/time.h>
#include "gmock/gmock.h"

#include "fake_platform.hpp"

using namespace ot;
using ::testing::AnyNumber;
using ::testing::AtLeast;
using ::testing::MockFunction;
using ::testing::Truly;

template <typename R, typename... A> class MockCallback : public testing::MockFunction<R(A...)>
{
public:
static R CallWithContext(A... aArgs, void *aContext)
{
return static_cast<MockCallback *>(aContext)->Call(aArgs...);
};
};

TEST(otDatasetSetActiveTlvs, shouldTriggerStateCallbackOnSuccess)
{
FakePlatform fakePlatform;

typedef MockCallback<void, otChangedFlags> MockStateCallback;

MockStateCallback mockStateCallback;

EXPECT_CALL(mockStateCallback, Call).Times(AnyNumber());

EXPECT_CALL(mockStateCallback, Call(Truly([](otChangedFlags aChangedFlags) -> bool {
return (aChangedFlags & OT_CHANGED_ACTIVE_DATASET);
})))
.Times(AtLeast(1));

otError error = otSetStateChangedCallback(FakePlatform::CurrentInstance(), MockStateCallback::CallWithContext,
&mockStateCallback);
assert(error == OT_ERROR_NONE);

otOperationalDataset dataset;
otOperationalDatasetTlvs datasetTlvs;

error = otDatasetCreateNewNetwork(FakePlatform::CurrentInstance(), &dataset);
assert(error == OT_ERROR_NONE);

otDatasetConvertToTlvs(&dataset, &datasetTlvs);
error = otDatasetSetActiveTlvs(FakePlatform::CurrentInstance(), &datasetTlvs);
assert(error == OT_ERROR_NONE);

fakePlatform.GoInMs(10000);
}
Loading

0 comments on commit 8cb529b

Please sign in to comment.