Cleanup and work on fixing test cases
This commit is contained in:
parent
1a1c0d9875
commit
323aeebe3e
15
.github/workflows/test.yml
vendored
15
.github/workflows/test.yml
vendored
@ -4,6 +4,8 @@ on:
|
|||||||
push:
|
push:
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
|
# TODO: Test statically linked
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test-linux:
|
test-linux:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
@ -41,12 +43,12 @@ jobs:
|
|||||||
-D${{matrix.symbols}}=On \
|
-D${{matrix.symbols}}=On \
|
||||||
-D${{matrix.demangle}}=On \
|
-D${{matrix.demangle}}=On \
|
||||||
-DCPPTRACE_BACKTRACE_PATH=/usr/lib/gcc/x86_64-linux-gnu/10/include/backtrace.h \
|
-DCPPTRACE_BACKTRACE_PATH=/usr/lib/gcc/x86_64-linux-gnu/10/include/backtrace.h \
|
||||||
-DCPPTRACE_BUILD_TEST=On
|
-DCPPTRACE_BUILD_TEST=On \
|
||||||
|
-DBUILD_SHARED_LIBS=On
|
||||||
make
|
make
|
||||||
- name: test
|
- name: test
|
||||||
working-directory: build
|
working-directory: build
|
||||||
run: |
|
run: |
|
||||||
#readelf --debug-dump=info test | grep foo
|
|
||||||
./test | python3 ../test/test.py "${{matrix.compiler}}"
|
./test | python3 ../test/test.py "${{matrix.compiler}}"
|
||||||
test-windows:
|
test-windows:
|
||||||
runs-on: windows-2019
|
runs-on: windows-2019
|
||||||
@ -86,7 +88,8 @@ jobs:
|
|||||||
-D${{matrix.unwind}}=On `
|
-D${{matrix.unwind}}=On `
|
||||||
-D${{matrix.symbols}}=On `
|
-D${{matrix.symbols}}=On `
|
||||||
-D${{matrix.demangle}}=On `
|
-D${{matrix.demangle}}=On `
|
||||||
-DCPPTRACE_BUILD_TEST=On
|
-DCPPTRACE_BUILD_TEST=On `
|
||||||
|
-DBUILD_SHARED_LIBS=On
|
||||||
msbuild .\cpptrace.sln
|
msbuild .\cpptrace.sln
|
||||||
- name: test
|
- name: test
|
||||||
working-directory: build
|
working-directory: build
|
||||||
@ -116,7 +119,8 @@ jobs:
|
|||||||
-DCMAKE_CXX_STANDARD=${{matrix.std}} \
|
-DCMAKE_CXX_STANDARD=${{matrix.std}} \
|
||||||
-DCPPTRACE_BACKTRACE_PATH=/usr/lib/gcc/x86_64-linux-gnu/10/include/backtrace.h \
|
-DCPPTRACE_BACKTRACE_PATH=/usr/lib/gcc/x86_64-linux-gnu/10/include/backtrace.h \
|
||||||
${{matrix.config}} \
|
${{matrix.config}} \
|
||||||
-DCPPTRACE_BUILD_TEST=On
|
-DCPPTRACE_BUILD_TEST=On \
|
||||||
|
-DBUILD_SHARED_LIBS=On
|
||||||
make
|
make
|
||||||
- name: test
|
- name: test
|
||||||
working-directory: build
|
working-directory: build
|
||||||
@ -146,7 +150,8 @@ jobs:
|
|||||||
-DCMAKE_CXX_COMPILER=${{matrix.compiler}} `
|
-DCMAKE_CXX_COMPILER=${{matrix.compiler}} `
|
||||||
-DCMAKE_CXX_STANDARD=${{matrix.std}} `
|
-DCMAKE_CXX_STANDARD=${{matrix.std}} `
|
||||||
${{matrix.config}} `
|
${{matrix.config}} `
|
||||||
-DCPPTRACE_BUILD_TEST=On
|
-DCPPTRACE_BUILD_TEST=On `
|
||||||
|
-DBUILD_SHARED_LIBS=On
|
||||||
msbuild .\cpptrace.sln
|
msbuild .\cpptrace.sln
|
||||||
- name: test
|
- name: test
|
||||||
working-directory: build
|
working-directory: build
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@ -3,3 +3,4 @@ build
|
|||||||
build2
|
build2
|
||||||
a.out
|
a.out
|
||||||
test/build
|
test/build
|
||||||
|
repro*/
|
||||||
|
|||||||
@ -10,7 +10,7 @@ Make stack traces simple for once.
|
|||||||
|
|
||||||
Support for MacOS and cygwin/mingw will be added soon.
|
Support for MacOS and cygwin/mingw will be added soon.
|
||||||
|
|
||||||
*Some day C++23's `<stacktrace>` will be ubiquitous*
|
*Some day C++23's `<stacktrace>` will be ubiquitous, and maybe one day the msvc implementation will be acceptable*
|
||||||
|
|
||||||
## Table of contents
|
## Table of contents
|
||||||
|
|
||||||
|
|||||||
@ -5,12 +5,12 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#ifndef CPPTRACE_FULL_TRACE_WITH_LIBBACKTRACE
|
#if !(defined(CPPTRACE_FULL_TRACE_WITH_LIBBACKTRACE) || defined(CPPTRACE_FULL_TRACE_WITH_STACKTRACE))
|
||||||
|
|
||||||
#include "symbols/libcpp_symbols.hpp"
|
#include "symbols/cpptrace_symbols.hpp"
|
||||||
#include "unwind/libcpp_unwind.hpp"
|
#include "unwind/cpptrace_unwind.hpp"
|
||||||
#include "demangle/libcpp_demangle.hpp"
|
#include "demangle/cpptrace_demangle.hpp"
|
||||||
#include "platform/libcpp_common.hpp"
|
#include "platform/cpptrace_common.hpp"
|
||||||
|
|
||||||
namespace cpptrace {
|
namespace cpptrace {
|
||||||
CPPTRACE_FORCE_NO_INLINE
|
CPPTRACE_FORCE_NO_INLINE
|
||||||
@ -31,8 +31,8 @@ namespace cpptrace {
|
|||||||
|
|
||||||
// full trace
|
// full trace
|
||||||
|
|
||||||
#include "full/libcpp_full_trace.hpp"
|
#include "full/cpptrace_full_trace.hpp"
|
||||||
#include "demangle/libcpp_demangle.hpp"
|
#include "demangle/cpptrace_demangle.hpp"
|
||||||
|
|
||||||
namespace cpptrace {
|
namespace cpptrace {
|
||||||
CPPTRACE_FORCE_NO_INLINE
|
CPPTRACE_FORCE_NO_INLINE
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
#ifndef LIBCPP_DEMANGLE_HPP
|
#ifndef CPPTRACE_DEMANGLE_HPP
|
||||||
#define LIBCPP_DEMANGLE_HPP
|
#define CPPTRACE_DEMANGLE_HPP
|
||||||
|
|
||||||
#include <cpptrace/cpptrace.hpp>
|
#include <cpptrace/cpptrace.hpp>
|
||||||
|
|
||||||
@ -1,7 +1,7 @@
|
|||||||
#ifdef CPPTRACE_DEMANGLE_WITH_CXXABI
|
#ifdef CPPTRACE_DEMANGLE_WITH_CXXABI
|
||||||
|
|
||||||
#include <cpptrace/cpptrace.hpp>
|
#include <cpptrace/cpptrace.hpp>
|
||||||
#include "libcpp_demangle.hpp"
|
#include "cpptrace_demangle.hpp"
|
||||||
|
|
||||||
#include <cxxabi.h>
|
#include <cxxabi.h>
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
#ifdef CPPTRACE_DEMANGLE_WITH_NOTHING
|
#ifdef CPPTRACE_DEMANGLE_WITH_NOTHING
|
||||||
|
|
||||||
#include <cpptrace/cpptrace.hpp>
|
#include <cpptrace/cpptrace.hpp>
|
||||||
#include "libcpp_demangle.hpp"
|
#include "cpptrace_demangle.hpp"
|
||||||
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
#ifndef LIBCPP_FULL_TRACE_HPP
|
#ifndef CPPTRACE_FULL_TRACE_HPP
|
||||||
#define LIBCPP_FULL_TRACE_HPP
|
#define CPPTRACE_FULL_TRACE_HPP
|
||||||
|
|
||||||
#include <cpptrace/cpptrace.hpp>
|
#include <cpptrace/cpptrace.hpp>
|
||||||
#include "../platform/libcpp_common.hpp"
|
#include "../platform/cpptrace_common.hpp"
|
||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -1,9 +1,9 @@
|
|||||||
#ifdef CPPTRACE_FULL_TRACE_WITH_LIBBACKTRACE
|
#ifdef CPPTRACE_FULL_TRACE_WITH_LIBBACKTRACE
|
||||||
|
|
||||||
#include <cpptrace/cpptrace.hpp>
|
#include <cpptrace/cpptrace.hpp>
|
||||||
#include "libcpp_full_trace.hpp"
|
#include "cpptrace_full_trace.hpp"
|
||||||
#include "../platform/libcpp_program_name.hpp"
|
#include "../platform/cpptrace_program_name.hpp"
|
||||||
#include "../platform/libcpp_common.hpp"
|
#include "../platform/cpptrace_common.hpp"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ namespace cpptrace {
|
|||||||
static backtrace_state* state = nullptr;
|
static backtrace_state* state = nullptr;
|
||||||
static bool called = false;
|
static bool called = false;
|
||||||
if(!called) {
|
if(!called) {
|
||||||
state = backtrace_create_state(program_name().c_str(), true, error_callback, nullptr);
|
state = backtrace_create_state(program_name(), true, error_callback, nullptr);
|
||||||
called = true;
|
called = true;
|
||||||
}
|
}
|
||||||
return state;
|
return state;
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
#ifdef CPPTRACE_FULL_TRACE_WITH_STACKTRACE
|
#ifdef CPPTRACE_FULL_TRACE_WITH_STACKTRACE
|
||||||
|
|
||||||
#include <cpptrace/cpptrace.hpp>
|
#include <cpptrace/cpptrace.hpp>
|
||||||
#include "libcpp_full_trace.hpp"
|
#include "cpptrace_full_trace.hpp"
|
||||||
#include "../platform/libcpp_common.hpp"
|
#include "../platform/cpptrace_common.hpp"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <stacktrace>
|
#include <stacktrace>
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
#ifndef LIBCPP_COMMON_HPP
|
#ifndef CPPTRACE_COMMON_HPP
|
||||||
#define LIBCPP_COMMON_HPP
|
#define CPPTRACE_COMMON_HPP
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#define CPPTRACE_FORCE_NO_INLINE __declspec(noinline)
|
#define CPPTRACE_FORCE_NO_INLINE __declspec(noinline)
|
||||||
51
src/platform/cpptrace_program_name.hpp
Normal file
51
src/platform/cpptrace_program_name.hpp
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#ifndef CPPTRACE_PROGRAM_NAME_HPP
|
||||||
|
#define CPPTRACE_PROGRAM_NAME_HPP
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
namespace cpptrace {
|
||||||
|
namespace detail {
|
||||||
|
inline std::string program_name() {
|
||||||
|
char buffer[MAX_PATH + 1];
|
||||||
|
int res = GetModuleFileNameA(nullptr, buffer, MAX_PATH);
|
||||||
|
if(res) {
|
||||||
|
return buffer;
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
#include <linux/limits.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
namespace cpptrace {
|
||||||
|
namespace detail {
|
||||||
|
inline const char* program_name() {
|
||||||
|
static std::string name;
|
||||||
|
static bool did_init = false;
|
||||||
|
static bool valid = false;
|
||||||
|
if(!did_init) {
|
||||||
|
did_init = true;
|
||||||
|
char buffer[PATH_MAX + 1];
|
||||||
|
ssize_t s = readlink("/proc/self/exe", buffer, PATH_MAX);
|
||||||
|
if(s == -1) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
buffer[s] = 0;
|
||||||
|
name = buffer;
|
||||||
|
valid = true;
|
||||||
|
}
|
||||||
|
return valid ? name.c_str() : nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
@ -1,35 +0,0 @@
|
|||||||
#ifndef LIBCPP_PROGRAM_NAME_HPP
|
|
||||||
#define LIBCPP_PROGRAM_NAME_HPP
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
namespace cpptrace {
|
|
||||||
namespace detail {
|
|
||||||
inline std::string program_name() {
|
|
||||||
char buffer[MAX_PATH + 1];
|
|
||||||
int res = GetModuleFileNameA(nullptr, buffer, MAX_PATH);
|
|
||||||
if(res) {
|
|
||||||
return buffer;
|
|
||||||
} else {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
namespace cpptrace {
|
|
||||||
namespace detail {
|
|
||||||
inline std::string program_name() {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
#ifndef LIBCPP_SYMBOLS_HPP
|
#ifndef CPPTRACE_SYMBOLS_HPP
|
||||||
#define LIBCPP_SYMBOLS_HPP
|
#define CPPTRACE_SYMBOLS_HPP
|
||||||
|
|
||||||
#include <cpptrace/cpptrace.hpp>
|
#include <cpptrace/cpptrace.hpp>
|
||||||
|
|
||||||
@ -1,8 +1,8 @@
|
|||||||
#ifdef CPPTRACE_GET_SYMBOLS_WITH_DBGHELP
|
#ifdef CPPTRACE_GET_SYMBOLS_WITH_DBGHELP
|
||||||
|
|
||||||
#include <cpptrace/cpptrace.hpp>
|
#include <cpptrace/cpptrace.hpp>
|
||||||
#include "libcpp_symbols.hpp"
|
#include "cpptrace_symbols.hpp"
|
||||||
#include "../platform/libcpp_program_name.hpp"
|
#include "../platform/cpptrace_program_name.hpp"
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <regex>
|
#include <regex>
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
#ifdef CPPTRACE_GET_SYMBOLS_WITH_LIBBACKTRACE
|
#ifdef CPPTRACE_GET_SYMBOLS_WITH_LIBBACKTRACE
|
||||||
|
|
||||||
#include <cpptrace/cpptrace.hpp>
|
#include <cpptrace/cpptrace.hpp>
|
||||||
#include "libcpp_symbols.hpp"
|
#include "cpptrace_symbols.hpp"
|
||||||
#include "../platform/libcpp_program_name.hpp"
|
#include "../platform/cpptrace_program_name.hpp"
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -18,7 +18,7 @@ namespace cpptrace {
|
|||||||
int full_callback(void* data, uintptr_t address, const char* file, int line, const char* symbol) {
|
int full_callback(void* data, uintptr_t address, const char* file, int line, const char* symbol) {
|
||||||
stacktrace_frame& frame = *static_cast<stacktrace_frame*>(data);
|
stacktrace_frame& frame = *static_cast<stacktrace_frame*>(data);
|
||||||
if(line == 0) {
|
if(line == 0) {
|
||||||
fprintf(stderr, "Getting bad data for some reason\n");
|
///fprintf(stderr, "Getting bad data for some reason\n"); // TODO: Eliminate
|
||||||
}
|
}
|
||||||
frame.address = address;
|
frame.address = address;
|
||||||
frame.line = line;
|
frame.line = line;
|
||||||
@ -37,7 +37,7 @@ namespace cpptrace {
|
|||||||
|
|
||||||
void error_callback(void* data, const char* msg, int errnum) {
|
void error_callback(void* data, const char* msg, int errnum) {
|
||||||
// nothing at the moment
|
// nothing at the moment
|
||||||
fprintf(stderr, "Backtrace error %s %d %p\n", msg, errnum, data);
|
///fprintf(stderr, "Backtrace error %s %d %p\n", msg, errnum, data); // TODO: Eliminate
|
||||||
}
|
}
|
||||||
|
|
||||||
backtrace_state* get_backtrace_state() {
|
backtrace_state* get_backtrace_state() {
|
||||||
@ -45,7 +45,7 @@ namespace cpptrace {
|
|||||||
static backtrace_state* state = nullptr;
|
static backtrace_state* state = nullptr;
|
||||||
static bool called = false;
|
static bool called = false;
|
||||||
if(!called) {
|
if(!called) {
|
||||||
state = backtrace_create_state(program_name().c_str(), true, error_callback, nullptr);
|
state = backtrace_create_state(program_name(), true, error_callback, nullptr);
|
||||||
called = true;
|
called = true;
|
||||||
}
|
}
|
||||||
return state;
|
return state;
|
||||||
@ -56,13 +56,15 @@ namespace cpptrace {
|
|||||||
stacktrace_frame resolve_frame(void* addr) {
|
stacktrace_frame resolve_frame(void* addr) {
|
||||||
stacktrace_frame frame;
|
stacktrace_frame frame;
|
||||||
frame.col = -1;
|
frame.col = -1;
|
||||||
if(!backtrace_pcinfo(
|
backtrace_pcinfo(
|
||||||
get_backtrace_state(),
|
get_backtrace_state(),
|
||||||
reinterpret_cast<uintptr_t>(addr),
|
reinterpret_cast<uintptr_t>(addr),
|
||||||
full_callback,
|
full_callback,
|
||||||
error_callback,
|
error_callback,
|
||||||
&frame
|
&frame
|
||||||
)) {
|
);
|
||||||
|
if(frame.symbol.empty()) {
|
||||||
|
// fallback, try to at least recover the symbol name with backtrace_syminfo
|
||||||
backtrace_syminfo(
|
backtrace_syminfo(
|
||||||
get_backtrace_state(),
|
get_backtrace_state(),
|
||||||
reinterpret_cast<uintptr_t>(addr),
|
reinterpret_cast<uintptr_t>(addr),
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
#ifdef CPPTRACE_GET_SYMBOLS_WITH_NOTHING
|
#ifdef CPPTRACE_GET_SYMBOLS_WITH_NOTHING
|
||||||
|
|
||||||
#include <cpptrace/cpptrace.hpp>
|
#include <cpptrace/cpptrace.hpp>
|
||||||
#include "libcpp_symbols.hpp"
|
#include "cpptrace_symbols.hpp"
|
||||||
#include "../platform/libcpp_program_name.hpp"
|
#include "../platform/cpptrace_program_name.hpp"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
#ifndef LIBCPP_UNWIND_HPP
|
#ifndef CPPTRACE_UNWIND_HPP
|
||||||
#define LIBCPP_UNWIND_HPP
|
#define CPPTRACE_UNWIND_HPP
|
||||||
|
|
||||||
#include <cpptrace/cpptrace.hpp>
|
#include <cpptrace/cpptrace.hpp>
|
||||||
#include "../platform/libcpp_common.hpp"
|
#include "../platform/cpptrace_common.hpp"
|
||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
|
||||||
@ -1,8 +1,8 @@
|
|||||||
#ifdef CPPTRACE_UNWIND_WITH_EXECINFO
|
#ifdef CPPTRACE_UNWIND_WITH_EXECINFO
|
||||||
|
|
||||||
#include <cpptrace/cpptrace.hpp>
|
#include <cpptrace/cpptrace.hpp>
|
||||||
#include "libcpp_unwind.hpp"
|
#include "cpptrace_unwind.hpp"
|
||||||
#include "../platform/libcpp_common.hpp"
|
#include "../platform/cpptrace_common.hpp"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
#ifdef CPPTRACE_UNWIND_WITH_NOTHING
|
#ifdef CPPTRACE_UNWIND_WITH_NOTHING
|
||||||
|
|
||||||
#include <cpptrace/cpptrace.hpp>
|
#include <cpptrace/cpptrace.hpp>
|
||||||
#include "libcpp_unwind.hpp"
|
#include "cpptrace_unwind.hpp"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
#ifdef CPPTRACE_UNWIND_WITH_WINAPI
|
#ifdef CPPTRACE_UNWIND_WITH_WINAPI
|
||||||
|
|
||||||
#include <cpptrace/cpptrace.hpp>
|
#include <cpptrace/cpptrace.hpp>
|
||||||
#include "libcpp_unwind.hpp"
|
#include "cpptrace_unwind.hpp"
|
||||||
#include "../platform/libcpp_common.hpp"
|
#include "../platform/cpptrace_common.hpp"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
|||||||
@ -22,6 +22,8 @@ def main():
|
|||||||
|
|
||||||
output = sys.stdin.read()
|
output = sys.stdin.read()
|
||||||
|
|
||||||
|
print(output) # for debug reasons
|
||||||
|
|
||||||
if output.strip() == "":
|
if output.strip() == "":
|
||||||
print(f"Error: No output from test", file=sys.stderr)
|
print(f"Error: No output from test", file=sys.stderr)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
@ -47,8 +49,11 @@ def main():
|
|||||||
break
|
break
|
||||||
|
|
||||||
if errored:
|
if errored:
|
||||||
print("Test output:", file=sys.stderr)
|
#print("Test output:", file=sys.stderr)
|
||||||
print(raw_output, file=sys.stderr)
|
#print(raw_output, file=sys.stderr)
|
||||||
|
print("Test failed")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
else:
|
||||||
|
print("Test passed")
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user