diff --git a/trunk/3rdparty/st-srs/.gitignore b/trunk/3rdparty/st-srs/.gitignore index 97cd5081d9..3e8c92e446 100644 --- a/trunk/3rdparty/st-srs/.gitignore +++ b/trunk/3rdparty/st-srs/.gitignore @@ -2,3 +2,8 @@ DARWIN_*_DBG LINUX_*_DBG obj st.pc + +gtest +*.gcda +*.gcno +*.html diff --git a/trunk/3rdparty/st-srs/Makefile b/trunk/3rdparty/st-srs/Makefile index d1ab9d2cc1..af6894bb47 100644 --- a/trunk/3rdparty/st-srs/Makefile +++ b/trunk/3rdparty/st-srs/Makefile @@ -75,6 +75,9 @@ DESC = st.pc TARGETS = darwin-debug darwin-optimized \ linux-debug linux-optimized +UTEST_TARGETS = darwin-debug-utest linux-debug-utest \ + darwin-debug-gcov linux-debug-gcov + # # Platform specifics # @@ -159,9 +162,14 @@ endif # or to enable stats for ST: # # make EXTRA_CFLAGS=-DDEBUG_STATS +# +# or enable the coverage for utest: +# make UTEST_FLAGS="-fprofile-arcs -ftest-coverage" +# ########################## CFLAGS += $(DEFINES) $(OTHER_FLAGS) $(EXTRA_CFLAGS) +CFLAGS += $(UTEST_FLAGS) OBJS = $(TARGETDIR)/sched.o \ $(TARGETDIR)/stk.o \ @@ -204,6 +212,8 @@ unknown: @echo @for target in $(TARGETS); do echo $$target; done @echo + @for target in $(UTEST_TARGETS); do echo $$target; done + @echo st.pc: st.pc.in sed "s/@VERSION@/${VERSION}/g" < $< > $@ @@ -267,5 +277,23 @@ linux-debug: linux-optimized: $(MAKE) OS="LINUX" BUILD="OPT" +darwin-debug-utest: + @echo "Build utest for state-threads" + $(MAKE) OS="DARWIN" BUILD="DBG" + cd utest && $(MAKE) +linux-debug-utest: + @echo "Build utest for state-threads" + $(MAKE) OS="LINUX" BUILD="DBG" + cd utest && $(MAKE) + +darwin-debug-gcov: + @echo "Build utest with gcov for state-threads" + $(MAKE) OS="DARWIN" BUILD="DBG" UTEST_FLAGS="-fprofile-arcs -ftest-coverage" + cd utest && $(MAKE) UTEST_FLAGS="-fprofile-arcs -ftest-coverage" +linux-debug-gcov: + @echo "Build utest with gcov for state-threads" + $(MAKE) OS="LINUX" BUILD="DBG" UTEST_FLAGS="-fprofile-arcs -ftest-coverage" + cd utest && $(MAKE) UTEST_FLAGS="-fprofile-arcs -ftest-coverage" + ########################## diff --git a/trunk/3rdparty/st-srs/README.md b/trunk/3rdparty/st-srs/README.md index 466b0e4180..08ab3cf0f5 100644 --- a/trunk/3rdparty/st-srs/README.md +++ b/trunk/3rdparty/st-srs/README.md @@ -15,7 +15,7 @@ Get code: ``` git clone https://github.com/ossrs/state-threads.git st-1.9 && -git checkout -b srs origin/srs +git checkout srs ``` For Linux: @@ -89,6 +89,33 @@ Important cli options: 1. `--track-origins= [default: no]`, Controls whether Memcheck tracks the origin of uninitialised values. By default, it does not, which means that although it can tell you that an uninitialised value is being used in a dangerous way, it cannot tell you where the uninitialised value came from. This often makes it difficult to track down the root problem. 1. `--show-reachable= , --show-possibly-lost=`, to show the using memory. +## UTest and Coverage + +To make ST with utest and run it: + +```bash +make linux-debug-utest-gcov && ./obj/st_utest +``` + +> For macOS: `make darwin-debug-utest-gcov && ./obj/st_utest` + +Then, install [gcovr](https://gcovr.com/en/stable/guide.html) for coverage: + +```bash +yum install -y python2-pip && +pip install lxml && pip install gcovr +``` + +> For macOS: `pip3 install gcovr` + +Finally, run test and get the report + +```bash +mkdir -p coverage && +gcovr -r . -e LINUX -e DARWIN --html --html-details -o coverage/st.html && +open coverage/st.html +``` + ## Docs & Analysis * Introduction: http://ossrs.github.io/state-threads/docs/st.html diff --git a/trunk/3rdparty/st-srs/utest/Makefile b/trunk/3rdparty/st-srs/utest/Makefile new file mode 100644 index 0000000000..4836058504 --- /dev/null +++ b/trunk/3rdparty/st-srs/utest/Makefile @@ -0,0 +1,82 @@ +# user must run make the objs/utest dir +# at the same dir of Makefile. + +# A sample Makefile for building Google Test and using it in user +# tests. Please tweak it to suit your environment and project. You +# may want to move it to your project's root directory. +# +# SYNOPSIS: +# +# make [all] - makes everything. +# make TARGET - makes the given target. +# make clean - removes all files generated by make. + +# Please tweak the following variable definitions as needed by your +# project, except GTEST_HEADERS, which you can use in your own targets +# but shouldn't modify. + +# Points to the root of Google Test, relative to where this file is. +# Remember to tweak this if you move this file. +GTEST_DIR = ./gtest + +# Flags passed to the preprocessor. +CPPFLAGS += -I$(GTEST_DIR)/include + +# Flags passed to the C++ compiler. +CXXFLAGS += -g -O0 -std=c++11 +CXXFLAGS += -Wall -Wno-deprecated-declarations -Wno-unused-private-field -Wno-unused-command-line-argument +CXXFLAGS += -DGTEST_USE_OWN_TR1_TUPLE=1 + +# All tests produced by this Makefile. Remember to add new tests you +# created to the list. +TESTS = ../obj/st_utest + +# All Google Test headers. Usually you shouldn't change this +# definition. +GTEST_HEADERS = $(GTEST_DIR)/include/gtest/*.h \ + $(GTEST_DIR)/include/gtest/internal/*.h + +# House-keeping build targets. + +all : $(TESTS) + +clean : + rm -f $(TESTS) gtest.a gtest_main.a *.o *.gcno *.gcda + +# Usually you shouldn't tweak such internal variables, indicated by a +# trailing _. +GTEST_SRCS_ = $(GTEST_DIR)/src/*.cc $(GTEST_DIR)/src/*.h $(GTEST_HEADERS) + +# For simplicity and to avoid depending on Google Test's +# implementation details, the dependencies specified below are +# conservative and not optimized. This is fine as Google Test +# compiles fast and for ordinary users its source rarely changes. +../obj/gtest-all.o : $(GTEST_SRCS_) + $(CXX) $(CPPFLAGS) -I$(GTEST_DIR) $(CXXFLAGS) -c \ + $(GTEST_DIR)/src/gtest-all.cc -o $@ + +../obj/gtest.a : ../obj/gtest-all.o + $(AR) $(ARFLAGS) $@ $^ + +##################################################################################### +##################################################################################### +# ST(state-threads) utest section +##################################################################################### +##################################################################################### + +# Includes, the include dir. +ST_UTEST_INC = -I../obj -I./ + +# Depends, the depends objects +ST_UTEST_DEPS = ../obj/libst.a + +# Depends, utest header files +UTEST_DEPS = st_utest.hpp + +# Objects, build each object of utest +../obj/st_utest.o : $(UTEST_DEPS) st_utest.cpp $(ST_UTEST_DEPS) + $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(UTEST_FLAGS) $(ST_UTEST_INC) -c st_utest.cpp -o $@ + +# generate the utest binary +../obj/st_utest : $(ST_UTEST_DEPS) ../obj/st_utest.o ../obj/gtest.a + $(CXX) -o $@ $(CPPFLAGS) $(CXXFLAGS) $(UTEST_FLAGS) $^ -lpthread -ldl -lpthread diff --git a/trunk/3rdparty/st-srs/utest/st_utest.cpp b/trunk/3rdparty/st-srs/utest/st_utest.cpp new file mode 100644 index 0000000000..a31744bc07 --- /dev/null +++ b/trunk/3rdparty/st-srs/utest/st_utest.cpp @@ -0,0 +1,49 @@ +/* +The MIT License (MIT) + +Copyright (c) 2021 Winlin + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#include + +#include +#include + +// We could do something in the main of utest. +// Copy from gtest-1.6.0/src/gtest_main.cc +GTEST_API_ int main(int argc, char **argv) { + // Select the best event system available on the OS. In Linux this is + // epoll(). On BSD it will be kqueue. + assert(st_set_eventsys(ST_EVENTSYS_ALT) != -1); + assert(st_init() == 0); + + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} + +// basic test and samples. +VOID TEST(SampleTest, FastSampleInt64Test) +{ + EXPECT_EQ(1, (int)sizeof(int8_t)); + EXPECT_EQ(2, (int)sizeof(int16_t)); + EXPECT_EQ(4, (int)sizeof(int32_t)); + EXPECT_EQ(8, (int)sizeof(int64_t)); +} + diff --git a/trunk/3rdparty/st-srs/utest/st_utest.hpp b/trunk/3rdparty/st-srs/utest/st_utest.hpp new file mode 100644 index 0000000000..a310bb0fe4 --- /dev/null +++ b/trunk/3rdparty/st-srs/utest/st_utest.hpp @@ -0,0 +1,36 @@ +/* +The MIT License (MIT) + +Copyright (c) 2021 Winlin + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#ifndef ST_UTEST_PUBLIC_HPP +#define ST_UTEST_PUBLIC_HPP + +// Before define the private/protected, we must include some system header files. +// Or it may fail with: +// redeclared with different access struct __xfer_bufptrs +// @see https://stackoverflow.com/questions/47839718/sstream-redeclared-with-public-access-compiler-error +#include + +#define VOID + +#endif +