Merge pull request 'Version Getter Function' (#575) from eive/fsfw:mueller/version-getter-upstream into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #575
This commit is contained in:
commit
288d453978
@ -32,6 +32,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
|
|||||||
## Additions
|
## Additions
|
||||||
|
|
||||||
- Linux HAL: Add wiretapping option for I2C. Enabled with `FSFW_HAL_I2C_WIRETAPPING` defined to 1
|
- Linux HAL: Add wiretapping option for I2C. Enabled with `FSFW_HAL_I2C_WIRETAPPING` defined to 1
|
||||||
|
- Dedicated Version class and constant `fsfw::FSFW_VERSION` containing version information
|
||||||
|
inside `fsfw/version.h`
|
||||||
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/559
|
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/559
|
||||||
|
|
||||||
# [v4.0.0]
|
# [v4.0.0]
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
target_sources(${LIB_FSFW_NAME} PRIVATE
|
||||||
|
version.cpp
|
||||||
|
)
|
||||||
|
|
||||||
# Core
|
# Core
|
||||||
|
|
||||||
add_subdirectory(action)
|
add_subdirectory(action)
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
#define FSFW_VERSION_H_
|
#define FSFW_VERSION_H_
|
||||||
|
|
||||||
// Versioning is kept in project CMakeLists.txt file
|
// Versioning is kept in project CMakeLists.txt file
|
||||||
#define FSFW_VERSION @FSFW_VERSION@
|
#define FSFW_VERSION_MAJOR @FSFW_VERSION@
|
||||||
#define FSFW_SUBVERSION @FSFW_SUBVERSION@
|
#define FSFW_VERSION_MINOR @FSFW_SUBVERSION@
|
||||||
#define FSFW_REVISION @FSFW_REVISION@
|
#define FSFW_VERSION_REVISION @FSFW_REVISION@
|
||||||
|
|
||||||
#endif /* FSFW_VERSION_H_ */
|
#endif /* FSFW_VERSION_H_ */
|
||||||
|
22
src/fsfw/version.cpp
Normal file
22
src/fsfw/version.cpp
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#include "version.h"
|
||||||
|
#include "fsfw/FSFWVersion.h"
|
||||||
|
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
|
#ifdef major
|
||||||
|
#undef major
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef minor
|
||||||
|
#undef minor
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const fsfw::Version fsfw::FSFW_VERSION = {FSFW_VERSION_MAJOR, FSFW_VERSION_MINOR,
|
||||||
|
FSFW_VERSION_REVISION};
|
||||||
|
|
||||||
|
fsfw::Version::Version(uint32_t major, uint32_t minor, uint32_t revision)
|
||||||
|
: major(major), minor(minor), revision(revision) {}
|
||||||
|
|
||||||
|
void fsfw::Version::getVersion(char* str, size_t maxLen) const {
|
||||||
|
snprintf(str, maxLen, "%d.%d.%d", major, minor, revision);
|
||||||
|
}
|
64
src/fsfw/version.h
Normal file
64
src/fsfw/version.h
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
#ifndef FSFW_SRC_FSFW_VERSION_H_
|
||||||
|
#define FSFW_SRC_FSFW_VERSION_H_
|
||||||
|
|
||||||
|
#include "fsfw/FSFW.h"
|
||||||
|
|
||||||
|
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
||||||
|
#include <iostream>
|
||||||
|
#endif
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
namespace fsfw {
|
||||||
|
|
||||||
|
class Version {
|
||||||
|
public:
|
||||||
|
Version(uint32_t major, uint32_t minor, uint32_t revision);
|
||||||
|
uint32_t major = 0;
|
||||||
|
uint32_t minor = 0;
|
||||||
|
uint32_t revision = 0;
|
||||||
|
|
||||||
|
friend bool operator==(const Version& v1, const Version& v2) {
|
||||||
|
return (v1.major == v2.major and v1.minor == v2.minor and v1.revision == v2.revision);
|
||||||
|
}
|
||||||
|
|
||||||
|
friend bool operator!=(const Version& v1, const Version& v2) { return not(v1 == v2); }
|
||||||
|
|
||||||
|
friend bool operator<(const Version& v1, const Version& v2) {
|
||||||
|
return ((v1.major < v2.major) or (v1.major == v2.major and v1.minor < v2.minor) or
|
||||||
|
(v1.major == v2.major and v1.minor == v2.minor and v1.revision < v2.revision));
|
||||||
|
}
|
||||||
|
|
||||||
|
friend bool operator>(const Version& v1, const Version& v2) {
|
||||||
|
return not (v1 < v2) and not (v1 == v2);
|
||||||
|
}
|
||||||
|
|
||||||
|
friend bool operator<=(const Version& v1, const Version& v2) { return ((v1 == v2) or (v1 < v2)); }
|
||||||
|
|
||||||
|
friend bool operator>=(const Version& v1, const Version& v2) { return ((v1 == v2) or (v1 > v2)); }
|
||||||
|
|
||||||
|
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
||||||
|
/**
|
||||||
|
* Print format to given ostream using format "major.minor.revision"
|
||||||
|
* @param os
|
||||||
|
* @param v
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
friend std::ostream& operator<<(std::ostream& os, const Version& v) {
|
||||||
|
os << v.major << "." << v.minor << "." << v.revision;
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get version as format "major.minor.revision"
|
||||||
|
* @param str
|
||||||
|
* @param maxLen
|
||||||
|
*/
|
||||||
|
void getVersion(char* str, size_t maxLen) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern const fsfw::Version FSFW_VERSION;
|
||||||
|
|
||||||
|
} // namespace fsfw
|
||||||
|
|
||||||
|
#endif /* FSFW_SRC_FSFW_VERSION_H_ */
|
@ -2,14 +2,13 @@ target_sources(${FSFW_TEST_TGT} PRIVATE
|
|||||||
CatchDefinitions.cpp
|
CatchDefinitions.cpp
|
||||||
CatchFactory.cpp
|
CatchFactory.cpp
|
||||||
printChar.cpp
|
printChar.cpp
|
||||||
|
version.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
# if(FSFW_CUSTOM_UNITTEST_RUNNER)
|
target_sources(${FSFW_TEST_TGT} PRIVATE
|
||||||
target_sources(${FSFW_TEST_TGT} PRIVATE
|
CatchRunner.cpp
|
||||||
CatchRunner.cpp
|
CatchSetup.cpp
|
||||||
CatchSetup.cpp
|
)
|
||||||
)
|
|
||||||
# endif()
|
|
||||||
|
|
||||||
add_subdirectory(testcfg)
|
add_subdirectory(testcfg)
|
||||||
add_subdirectory(action)
|
add_subdirectory(action)
|
||||||
|
92
tests/src/fsfw_tests/unit/version.cpp
Normal file
92
tests/src/fsfw_tests/unit/version.cpp
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
|
||||||
|
#include "fsfw/version.h"
|
||||||
|
|
||||||
|
#include <catch2/catch_test_macros.hpp>
|
||||||
|
|
||||||
|
#include "fsfw/serviceinterface.h"
|
||||||
|
#include "fsfw_tests/unit/CatchDefinitions.h"
|
||||||
|
|
||||||
|
TEST_CASE("Version API Tests", "[TestVersionAPI]") {
|
||||||
|
// Check that major version is non-zero
|
||||||
|
REQUIRE(fsfw::FSFW_VERSION.major > 0);
|
||||||
|
uint32_t fsfwMajor = fsfw::FSFW_VERSION.major;
|
||||||
|
REQUIRE(fsfw::Version(255, 0, 0) > fsfw::FSFW_VERSION);
|
||||||
|
REQUIRE(fsfw::Version(255, 0, 0) >= fsfw::FSFW_VERSION);
|
||||||
|
REQUIRE(fsfw::Version(0, 0, 0) < fsfw::FSFW_VERSION);
|
||||||
|
REQUIRE(fsfw::Version(0, 0, 0) <= fsfw::FSFW_VERSION);
|
||||||
|
fsfw::Version v1 = fsfw::Version(1, 1, 1);
|
||||||
|
fsfw::Version v2 = fsfw::Version(1, 1, 1);
|
||||||
|
REQUIRE(v1 == v2);
|
||||||
|
REQUIRE(not (v1 < v2));
|
||||||
|
REQUIRE(not (v1 > v2));
|
||||||
|
REQUIRE(v1 <= v2);
|
||||||
|
REQUIRE(v1 >= v2);
|
||||||
|
v1.revision -= 1;
|
||||||
|
REQUIRE(v1 != v2);
|
||||||
|
REQUIRE(not (v1 == v2));
|
||||||
|
REQUIRE(not (v1 > v2));
|
||||||
|
REQUIRE(not (v1 >= v2));
|
||||||
|
REQUIRE(v1 < v2);
|
||||||
|
REQUIRE(v1 <= v2);
|
||||||
|
v1.revision += 1;
|
||||||
|
v1.minor -= 1;
|
||||||
|
REQUIRE(v1 != v2);
|
||||||
|
REQUIRE(v1 < v2);
|
||||||
|
REQUIRE(v1 <= v2);
|
||||||
|
REQUIRE(not (v1 == v2));
|
||||||
|
REQUIRE(not (v1 > v2));
|
||||||
|
REQUIRE(not (v1 >= v2));
|
||||||
|
v1.minor += 1;
|
||||||
|
v1.major -= 1;
|
||||||
|
REQUIRE(v1 != v2);
|
||||||
|
REQUIRE(v1 < v2);
|
||||||
|
REQUIRE(v1 <= v2);
|
||||||
|
REQUIRE(not (v1 == v2));
|
||||||
|
REQUIRE(not (v1 > v2));
|
||||||
|
REQUIRE(not (v1 >= v2));
|
||||||
|
v1.major += 1;
|
||||||
|
REQUIRE(v1 == v2);
|
||||||
|
REQUIRE(v1 <= v2);
|
||||||
|
REQUIRE(v1 >= v2);
|
||||||
|
REQUIRE(not (v1 != v2));
|
||||||
|
REQUIRE(not (v1 > v2));
|
||||||
|
REQUIRE(not (v1 < v2));
|
||||||
|
v1.major += 1;
|
||||||
|
v1.minor -= 1;
|
||||||
|
REQUIRE(v1 != v2);
|
||||||
|
REQUIRE(v1 > v2);
|
||||||
|
REQUIRE(v1 >= v2);
|
||||||
|
REQUIRE(not (v1 == v2));
|
||||||
|
REQUIRE(not (v1 < v2));
|
||||||
|
REQUIRE(not (v1 <= v2));
|
||||||
|
v1.major -= 1;
|
||||||
|
v1.minor += 2;
|
||||||
|
v1.revision -= 1;
|
||||||
|
REQUIRE(v1 != v2);
|
||||||
|
REQUIRE(v1 > v2);
|
||||||
|
REQUIRE(v1 >= v2);
|
||||||
|
REQUIRE(not (v1 == v2));
|
||||||
|
REQUIRE(not (v1 < v2));
|
||||||
|
REQUIRE(not (v1 <= v2));
|
||||||
|
v1.minor -= 1;
|
||||||
|
v1.revision += 2;
|
||||||
|
REQUIRE(v1 != v2);
|
||||||
|
REQUIRE(v1 > v2);
|
||||||
|
REQUIRE(v1 >= v2);
|
||||||
|
REQUIRE(not (v1 == v2));
|
||||||
|
REQUIRE(not (v1 < v2));
|
||||||
|
REQUIRE(not (v1 <= v2));
|
||||||
|
v1.revision -= 1;
|
||||||
|
REQUIRE(v1 == v2);
|
||||||
|
REQUIRE(v1 <= v2);
|
||||||
|
REQUIRE(v1 >= v2);
|
||||||
|
REQUIRE(not (v1 != v2));
|
||||||
|
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
||||||
|
sif::info << "v" << fsfw::FSFW_VERSION << std::endl;
|
||||||
|
#endif
|
||||||
|
char verString[10] = {};
|
||||||
|
fsfw::FSFW_VERSION.getVersion(verString, sizeof(verString));
|
||||||
|
#if FSFW_DISABLE_PRINTOUT == 0
|
||||||
|
printf("v%s\n",verString);
|
||||||
|
#endif
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user