> What are all these setenv lines for? libedit requires a TERM to know how to deal with the screen. We can't talk to libedit if it can't figure out what kind of terminal it is working with.
> Another option is to use TEST_F instead of TEST(), and then declare a class with Setup() and TearDown() methods, and do the setenv() in the setup method. I am planning on doing that. I have another few tests I am writing. I have a "reduce duplication" XP style phase that will eliminate that. Good catch. I should have done it at my second test. On Thu, Oct 29, 2015 at 11:26 PM, Zachary Turner <ztur...@google.com> wrote: > > > On Thu, Oct 29, 2015 at 7:57 PM Todd Fiala via lldb-commits < > lldb-commits@lists.llvm.org> wrote: > >> Author: tfiala >> Date: Thu Oct 29 21:54:52 2015 >> New Revision: 251681 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=251681&view=rev >> Log: >> Added real editline tests. >> >> These are two simple tests that make sure single line and >> multiline content are processed and received by Editline.cpp. >> >> Fancier tests to come... >> >> Modified: >> lldb/trunk/lldb.xcodeproj/project.pbxproj >> lldb/trunk/lldb.xcodeproj/xcshareddata/xcschemes/lldb-gtest.xcscheme >> lldb/trunk/source/Host/CMakeLists.txt >> lldb/trunk/unittests/Editline/EditlineTest.cpp >> >> Modified: lldb/trunk/lldb.xcodeproj/project.pbxproj >> URL: >> http://llvm.org/viewvc/llvm-project/lldb/trunk/lldb.xcodeproj/project.pbxproj?rev=251681&r1=251680&r2=251681&view=diff >> >> ============================================================================== >> --- lldb/trunk/lldb.xcodeproj/project.pbxproj (original) >> +++ lldb/trunk/lldb.xcodeproj/project.pbxproj Thu Oct 29 21:54:52 2015 >> @@ -909,13 +909,6 @@ >> /* End PBXBuildFile section */ >> >> /* Begin PBXContainerItemProxy section */ >> - 2326CF411BDD636100A5CEAC /* PBXContainerItemProxy */ = { >> - isa = PBXContainerItemProxy; >> - containerPortal = 08FB7793FE84155DC02AAC07 /* >> Project object */; >> - proxyType = 1; >> - remoteGlobalIDString = 26680206115FD0ED008E1FE4; >> - remoteInfo = LLDB; >> - }; >> 235AFBC1199BC70700897A4B /* PBXContainerItemProxy */ = { >> isa = PBXContainerItemProxy; >> containerPortal = 08FB7793FE84155DC02AAC07 /* >> Project object */; >> @@ -937,6 +930,13 @@ >> remoteGlobalIDString = 456F67721AD46CE9002850C2; >> remoteInfo = "debugserver-mini"; >> }; >> + 23AB8B6A1BDF513B008BF3B0 /* PBXContainerItemProxy */ = { >> + isa = PBXContainerItemProxy; >> + containerPortal = 08FB7793FE84155DC02AAC07 /* >> Project object */; >> + proxyType = 1; >> + remoteGlobalIDString = 2689FFC913353D7A00698AC0; >> + remoteInfo = "lldb-core"; >> + }; >> 262CFC7111A450CB00946C6C /* PBXContainerItemProxy */ = { >> isa = PBXContainerItemProxy; >> containerPortal = 265E9BE1115C2BAA00D0DCCB /* >> debugserver.xcodeproj */; >> @@ -5831,7 +5831,7 @@ >> buildRules = ( >> ); >> dependencies = ( >> - 2326CF421BDD636100A5CEAC /* >> PBXTargetDependency */, >> + 23AB8B6B1BDF513B008BF3B0 /* >> PBXTargetDependency */, >> ); >> name = "lldb-gtest"; >> productName = "lldb-gtest"; >> @@ -6965,11 +6965,6 @@ >> /* End PBXSourcesBuildPhase section */ >> >> /* Begin PBXTargetDependency section */ >> - 2326CF421BDD636100A5CEAC /* PBXTargetDependency */ = { >> - isa = PBXTargetDependency; >> - target = 26680206115FD0ED008E1FE4 /* LLDB */; >> - targetProxy = 2326CF411BDD636100A5CEAC /* >> PBXContainerItemProxy */; >> - }; >> 235AFBC2199BC70700897A4B /* PBXTargetDependency */ = { >> isa = PBXTargetDependency; >> target = 26F5C26910F3D9A4009D5894 /* lldb-tool */; >> @@ -6980,6 +6975,11 @@ >> target = 235AFBB5199BC6AD00897A4B /* Linux */; >> targetProxy = 235AFBC3199BC70B00897A4B /* >> PBXContainerItemProxy */; >> }; >> + 23AB8B6B1BDF513B008BF3B0 /* PBXTargetDependency */ = { >> + isa = PBXTargetDependency; >> + target = 2689FFC913353D7A00698AC0 /* lldb-core */; >> + targetProxy = 23AB8B6A1BDF513B008BF3B0 /* >> PBXContainerItemProxy */; >> + }; >> 262CFC7211A450CB00946C6C /* PBXTargetDependency */ = { >> isa = PBXTargetDependency; >> name = debugserver; >> @@ -7404,31 +7404,13 @@ >> 239504D81BDD451400963CEA /* Debug */ = { >> isa = XCBuildConfiguration; >> buildSettings = { >> - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; >> - CLANG_ENABLE_MODULES = YES; >> - CLANG_ENABLE_OBJC_ARC = YES; >> - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = >> YES_ERROR; >> - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; >> - CODE_SIGN_IDENTITY = "-"; >> - ENABLE_TESTABILITY = YES; >> FRAMEWORK_SEARCH_PATHS = ( >> "$(inherited)", >> >> "\"$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks\"", >> >> "$(SYSTEM_LIBRARY_DIR)/Frameworks/CoreServices.framework/Frameworks", >> ); >> - GCC_C_LANGUAGE_STANDARD = gnu99; >> - GCC_DYNAMIC_NO_PIC = NO; >> - GCC_NO_COMMON_BLOCKS = YES; >> - GCC_PREPROCESSOR_DEFINITIONS = ( >> - "DEBUG=1", >> - "$(inherited)", >> - ); >> - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; >> - GCC_WARN_UNINITIALIZED_AUTOS = >> YES_AGGRESSIVE; >> LLDB_GTESTS_CFLAGS = "-I >> $(LLVM_SOURCE_DIR)/utils/unittest/googletest/include -I >> $(LLVM_SOURCE_DIR)/include -I $(LLVM_BUILD_DIR)/x86_64/include -I include >> -I source -I $(PYTHON_FRAMEWORK_PATH)/Headers"; >> LLDB_GTESTS_LDFLAGS = >> "$(LLVM_BUILD_DIR)/x86_64/$(LLVM_CONFIGURATION)/lib/libgtest.a -L >> $(PYTHON_FRAMEWORK_PATH)/Versions/$(PYTHON_VERSION_MAJOR).$(PYTHON_VERSION_MINOR)/lib >> -l python$(PYTHON_VERSION_MAJOR).$(PYTHON_VERSION_MINOR)"; >> - MACOSX_DEPLOYMENT_TARGET = 10.11; >> - MTL_ENABLE_DEBUG_INFO = YES; >> OTHER_CFLAGS = ( >> "-flimit-debug-info", >> "-Wparentheses", >> @@ -7453,38 +7435,19 @@ >> "$(LLDB_GTESTS_LDFLAGS)", >> ); >> PRODUCT_NAME = "$(TARGET_NAME)"; >> - SDKROOT = macosx; >> }; >> name = Debug; >> }; >> 239504D91BDD451400963CEA /* DebugClang */ = { >> isa = XCBuildConfiguration; >> buildSettings = { >> - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; >> - CLANG_ENABLE_MODULES = YES; >> - CLANG_ENABLE_OBJC_ARC = YES; >> - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = >> YES_ERROR; >> - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; >> - CODE_SIGN_IDENTITY = "-"; >> - ENABLE_TESTABILITY = YES; >> FRAMEWORK_SEARCH_PATHS = ( >> "$(inherited)", >> >> "\"$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks\"", >> >> "$(SYSTEM_LIBRARY_DIR)/Frameworks/CoreServices.framework/Frameworks", >> ); >> - GCC_C_LANGUAGE_STANDARD = gnu99; >> - GCC_DYNAMIC_NO_PIC = NO; >> - GCC_NO_COMMON_BLOCKS = YES; >> - GCC_PREPROCESSOR_DEFINITIONS = ( >> - "DEBUG=1", >> - "$(inherited)", >> - ); >> - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; >> - GCC_WARN_UNINITIALIZED_AUTOS = >> YES_AGGRESSIVE; >> LLDB_GTESTS_CFLAGS = "-I >> $(LLVM_SOURCE_DIR)/utils/unittest/googletest/include -I >> $(LLVM_SOURCE_DIR)/include -I $(LLVM_BUILD_DIR)/x86_64/include -I include >> -I source -I $(PYTHON_FRAMEWORK_PATH)/Headers"; >> LLDB_GTESTS_LDFLAGS = >> "$(LLVM_BUILD_DIR)/x86_64/$(LLVM_CONFIGURATION)/lib/libgtest.a -L >> $(PYTHON_FRAMEWORK_PATH)/Versions/$(PYTHON_VERSION_MAJOR).$(PYTHON_VERSION_MINOR)/lib >> -l python$(PYTHON_VERSION_MAJOR).$(PYTHON_VERSION_MINOR)"; >> - MACOSX_DEPLOYMENT_TARGET = 10.11; >> - MTL_ENABLE_DEBUG_INFO = YES; >> OTHER_CFLAGS = ( >> "-flimit-debug-info", >> "-Wparentheses", >> @@ -7509,34 +7472,19 @@ >> "$(LLDB_GTESTS_LDFLAGS)", >> ); >> PRODUCT_NAME = "$(TARGET_NAME)"; >> - SDKROOT = macosx; >> }; >> name = DebugClang; >> }; >> 239504DA1BDD451400963CEA /* Release */ = { >> isa = XCBuildConfiguration; >> buildSettings = { >> - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; >> - CLANG_ENABLE_MODULES = YES; >> - CLANG_ENABLE_OBJC_ARC = YES; >> - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = >> YES_ERROR; >> - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; >> - CODE_SIGN_IDENTITY = "-"; >> - DEBUG_INFORMATION_FORMAT = >> "dwarf-with-dsym"; >> - ENABLE_NS_ASSERTIONS = NO; >> FRAMEWORK_SEARCH_PATHS = ( >> "$(inherited)", >> >> "\"$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks\"", >> >> "$(SYSTEM_LIBRARY_DIR)/Frameworks/CoreServices.framework/Frameworks", >> ); >> - GCC_C_LANGUAGE_STANDARD = gnu99; >> - GCC_NO_COMMON_BLOCKS = YES; >> - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; >> - GCC_WARN_UNINITIALIZED_AUTOS = >> YES_AGGRESSIVE; >> LLDB_GTESTS_CFLAGS = "-I >> $(LLVM_SOURCE_DIR)/utils/unittest/googletest/include -I >> $(LLVM_SOURCE_DIR)/include -I $(LLVM_BUILD_DIR)/x86_64/include -I include >> -I source -I $(PYTHON_FRAMEWORK_PATH)/Headers"; >> LLDB_GTESTS_LDFLAGS = >> "$(LLVM_BUILD_DIR)/x86_64/$(LLVM_CONFIGURATION)/lib/libgtest.a -L >> $(PYTHON_FRAMEWORK_PATH)/Versions/$(PYTHON_VERSION_MAJOR).$(PYTHON_VERSION_MINOR)/lib >> -l python$(PYTHON_VERSION_MAJOR).$(PYTHON_VERSION_MINOR)"; >> - MACOSX_DEPLOYMENT_TARGET = 10.11; >> - MTL_ENABLE_DEBUG_INFO = NO; >> OTHER_CFLAGS = ( >> "-flimit-debug-info", >> "-Wparentheses", >> @@ -7561,34 +7509,19 @@ >> "$(LLDB_GTESTS_LDFLAGS)", >> ); >> PRODUCT_NAME = "$(TARGET_NAME)"; >> - SDKROOT = macosx; >> }; >> name = Release; >> }; >> 239504DB1BDD451400963CEA /* BuildAndIntegration */ = { >> isa = XCBuildConfiguration; >> buildSettings = { >> - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; >> - CLANG_ENABLE_MODULES = YES; >> - CLANG_ENABLE_OBJC_ARC = YES; >> - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = >> YES_ERROR; >> - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; >> - CODE_SIGN_IDENTITY = "-"; >> - DEBUG_INFORMATION_FORMAT = >> "dwarf-with-dsym"; >> - ENABLE_NS_ASSERTIONS = NO; >> FRAMEWORK_SEARCH_PATHS = ( >> "$(inherited)", >> >> "\"$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks\"", >> >> "$(SYSTEM_LIBRARY_DIR)/Frameworks/CoreServices.framework/Frameworks", >> ); >> - GCC_C_LANGUAGE_STANDARD = gnu99; >> - GCC_NO_COMMON_BLOCKS = YES; >> - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; >> - GCC_WARN_UNINITIALIZED_AUTOS = >> YES_AGGRESSIVE; >> LLDB_GTESTS_CFLAGS = "-I >> $(LLVM_SOURCE_DIR)/utils/unittest/googletest/include -I >> $(LLVM_SOURCE_DIR)/include -I $(LLVM_BUILD_DIR)/x86_64/include -I include >> -I source -I $(PYTHON_FRAMEWORK_PATH)/Headers"; >> LLDB_GTESTS_LDFLAGS = >> "$(LLVM_BUILD_DIR)/x86_64/$(LLVM_CONFIGURATION)/lib/libgtest.a -L >> $(PYTHON_FRAMEWORK_PATH)/Versions/$(PYTHON_VERSION_MAJOR).$(PYTHON_VERSION_MINOR)/lib >> -l python$(PYTHON_VERSION_MAJOR).$(PYTHON_VERSION_MINOR)"; >> - MACOSX_DEPLOYMENT_TARGET = 10.11; >> - MTL_ENABLE_DEBUG_INFO = NO; >> OTHER_CFLAGS = ( >> "-flimit-debug-info", >> "-Wparentheses", >> @@ -7613,7 +7546,6 @@ >> "$(LLDB_GTESTS_LDFLAGS)", >> ); >> PRODUCT_NAME = "$(TARGET_NAME)"; >> - SDKROOT = macosx; >> }; >> name = BuildAndIntegration; >> }; >> >> Modified: >> lldb/trunk/lldb.xcodeproj/xcshareddata/xcschemes/lldb-gtest.xcscheme >> URL: >> http://llvm.org/viewvc/llvm-project/lldb/trunk/lldb.xcodeproj/xcshareddata/xcschemes/lldb-gtest.xcscheme?rev=251681&r1=251680&r2=251681&view=diff >> >> ============================================================================== >> --- lldb/trunk/lldb.xcodeproj/xcshareddata/xcschemes/lldb-gtest.xcscheme >> (original) >> +++ lldb/trunk/lldb.xcodeproj/xcshareddata/xcschemes/lldb-gtest.xcscheme >> Thu Oct 29 21:54:52 2015 >> @@ -42,7 +42,7 @@ >> </AdditionalOptions> >> </TestAction> >> <LaunchAction >> - buildConfiguration = "DebugClang" >> + buildConfiguration = "Debug" >> selectedDebuggerIdentifier = >> "Xcode.DebuggerFoundation.Debugger.LLDB" >> selectedLauncherIdentifier = >> "Xcode.DebuggerFoundation.Launcher.LLDB" >> launchStyle = "0" >> >> Modified: lldb/trunk/source/Host/CMakeLists.txt >> URL: >> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/CMakeLists.txt?rev=251681&r1=251680&r2=251681&view=diff >> >> ============================================================================== >> --- lldb/trunk/source/Host/CMakeLists.txt (original) >> +++ lldb/trunk/source/Host/CMakeLists.txt Thu Oct 29 21:54:52 2015 >> @@ -170,6 +170,19 @@ if (${get_python_libdir}) >> endif() >> endif() >> >> +if (${get_python_libdir}) >> + # Call a python script to gather the arch-specific libdir for >> + # modules like the lldb module. >> + execute_process( >> + COMMAND ${PYTHON_EXECUTABLE} >> ${CMAKE_CURRENT_SOURCE_DIR}/../../scripts/get_relative_lib_dir.py >> + RESULT_VARIABLE get_libdir_status >> + OUTPUT_VARIABLE relative_libdir >> + ) >> + if (get_libdir_status EQUAL 0) >> + add_definitions(-DLLDB_PYTHON_RELATIVE_LIBDIR="${relative_libdir}") >> + endif() >> +endif() >> + >> add_lldb_library(lldbHost ${HOST_SOURCES}) >> >> if (CMAKE_SYSTEM_NAME MATCHES "NetBSD") >> >> Modified: lldb/trunk/unittests/Editline/EditlineTest.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Editline/EditlineTest.cpp?rev=251681&r1=251680&r2=251681&view=diff >> >> ============================================================================== >> --- lldb/trunk/unittests/Editline/EditlineTest.cpp (original) >> +++ lldb/trunk/unittests/Editline/EditlineTest.cpp Thu Oct 29 21:54:52 >> 2015 >> @@ -7,9 +7,362 @@ >> // >> >> >> //===----------------------------------------------------------------------===// >> >> +#ifndef LLDB_DISABLE_LIBEDIT >> + >> +#define EDITLINE_TEST_DUMP_OUTPUT 0 >> + >> +#include <stdio.h> >> +#include <unistd.h> >> + >> +#include <memory> >> +#include <thread> >> + >> #include "gtest/gtest.h" >> >> -TEST(EditlineTest, BasicTest) >> +#include "lldb/Core/Error.h" >> +#include "lldb/Core/StringList.h" >> +#include "lldb/Host/Editline.h" >> +#include "lldb/Host/Pipe.h" >> +#include "lldb/Utility/PseudoTerminal.h" >> + >> +namespace >> { >> - EXPECT_TRUE(true); >> + const size_t TIMEOUT_MILLIS = 5000; >> } >> + >> +class FilePointer >> +{ >> +public: >> + >> + FilePointer () = delete; >> + >> + FilePointer (const FilePointer&) = delete; >> + >> + FilePointer (FILE *file_p) >> + : _file_p (file_p) >> + { >> + } >> + >> + ~FilePointer () >> + { >> + if (_file_p != nullptr) >> + { >> + const int close_result = fclose (_file_p); >> + EXPECT_EQ(0, close_result); >> + } >> + } >> + >> + operator FILE* () >> + { >> + return _file_p; >> + } >> + >> +private: >> + >> + FILE *_file_p; >> + >> +}; >> + >> +/** >> + Wraps an Editline class, providing a simple way to feed >> + input (as if from the keyboard) and receive output from Editline. >> + */ >> +class EditlineAdapter >> +{ >> +public: >> + >> + EditlineAdapter (); >> + >> + void >> + CloseInput (); >> + >> + bool >> + IsValid () const >> + { >> + return _editline_sp.get () != nullptr; >> + } >> + >> + lldb_private::Editline& >> + GetEditline () >> + { >> + return *_editline_sp; >> + } >> + >> + bool >> + SendLine (const std::string &line); >> + >> + bool >> + SendLines (const std::vector<std::string> &lines); >> + >> + bool >> + GetLine (std::string &line, bool &interrupted, size_t >> timeout_millis); >> + >> + bool >> + GetLines (lldb_private::StringList &lines, bool &interrupted, size_t >> timeout_millis); >> + >> + void >> + ConsumeAllOutput (); >> + >> +private: >> + >> + static bool >> + IsInputComplete ( >> + lldb_private::Editline * editline, >> + lldb_private::StringList & lines, >> + void * baton); >> + >> + std::unique_ptr<lldb_private::Editline> _editline_sp; >> + >> + lldb_utility::PseudoTerminal _pty; >> + int _pty_master_fd; >> + int _pty_slave_fd; >> + >> + std::unique_ptr<FilePointer> _el_slave_file; >> +}; >> + >> +EditlineAdapter::EditlineAdapter () : >> + _editline_sp (), >> + _pty (), >> + _pty_master_fd (-1), >> + _pty_slave_fd (-1), >> + _el_slave_file () >> +{ >> + lldb_private::Error error; >> + >> + // Open the first master pty available. >> + char error_string[256]; >> + error_string[0] = '\0'; >> + if (!_pty.OpenFirstAvailableMaster (O_RDWR, error_string, sizeof >> (error_string))) >> + { >> + fprintf(stderr, "failed to open first available master pty: >> '%s'\n", error_string); >> + return; >> + } >> + >> + // Grab the master fd. This is a file descriptor we will: >> + // (1) write to when we want to send input to editline. >> + // (2) read from when we want to see what editline sends back. >> + _pty_master_fd = _pty.GetMasterFileDescriptor(); >> + >> + // Open the corresponding slave pty. >> + if (!_pty.OpenSlave (O_RDWR, error_string, sizeof (error_string))) >> + { >> + fprintf(stderr, "failed to open slave pty: '%s'\n", >> error_string); >> + return; >> + } >> + _pty_slave_fd = _pty.GetSlaveFileDescriptor(); >> + >> + _el_slave_file.reset (new FilePointer (fdopen (_pty_slave_fd, >> "rw"))); >> + EXPECT_FALSE (nullptr == *_el_slave_file); >> + if (*_el_slave_file == nullptr) >> + return; >> + >> + // Create an Editline instance. >> + _editline_sp.reset (new lldb_private::Editline("gtest editor", >> *_el_slave_file, *_el_slave_file, *_el_slave_file, false)); >> + _editline_sp->SetPrompt ("> "); >> + >> + // Hookup our input complete callback. >> + _editline_sp->SetIsInputCompleteCallback(IsInputComplete, this); >> +} >> + >> +void >> +EditlineAdapter::CloseInput () >> +{ >> + if (_el_slave_file != nullptr) >> + _el_slave_file.reset (nullptr); >> +} >> + >> +bool >> +EditlineAdapter::SendLine (const std::string &line) >> +{ >> + // Ensure we're valid before proceeding. >> + if (!IsValid ()) >> + return false; >> + >> + // Write the line out to the pipe connected to editline's input. >> + ssize_t input_bytes_written = >> + ::write (_pty_master_fd, >> + line.c_str(), >> + line.length() * sizeof (std::string::value_type)); >> + >> + const char *eoln = "\n"; >> + const size_t eoln_length = strlen(eoln); >> + input_bytes_written = >> + ::write (_pty_master_fd, >> + eoln, >> + eoln_length * sizeof (char)); >> + >> + EXPECT_EQ (eoln_length * sizeof (char), input_bytes_written); >> + return eoln_length * sizeof (char) == input_bytes_written; >> +} >> + >> +bool >> +EditlineAdapter::SendLines (const std::vector<std::string> &lines) >> +{ >> + for (auto &line : lines) >> + { >> +#if EDITLINE_TEST_DUMP_OUTPUT >> + printf ("<stdin> sending line \"%s\"\n", line.c_str()); >> +#endif >> + if (!SendLine (line)) >> + return false; >> + } >> + return true; >> +} >> + >> +// We ignore the timeout for now. >> +bool >> +EditlineAdapter::GetLine (std::string &line, bool &interrupted, size_t >> /* timeout_millis */) >> +{ >> + // Ensure we're valid before proceeding. >> + if (!IsValid ()) >> + return false; >> + >> + _editline_sp->GetLine (line, interrupted); >> + return true; >> +} >> + >> +bool >> +EditlineAdapter::GetLines (lldb_private::StringList &lines, bool >> &interrupted, size_t /* timeout_millis */) >> +{ >> + // Ensure we're valid before proceeding. >> + if (!IsValid ()) >> + return false; >> + >> + _editline_sp->GetLines (1, lines, interrupted); >> + return true; >> +} >> + >> +bool >> +EditlineAdapter::IsInputComplete ( >> + lldb_private::Editline * editline, >> + lldb_private::StringList & lines, >> + void * baton) >> +{ >> + // We'll call ourselves complete if we've received a balanced set of >> braces. >> + int start_block_count = 0; >> + int brace_balance = 0; >> + >> + for (size_t i = 0; i < lines.GetSize (); ++i) >> + { >> + for (auto ch : lines[i]) >> + { >> + if (ch == '{') >> + { >> + ++start_block_count; >> + ++brace_balance; >> + } >> + else if (ch == '}') >> + --brace_balance; >> + } >> + } >> + >> + return (start_block_count > 0) && (brace_balance == 0); >> +} >> + >> +void >> +EditlineAdapter::ConsumeAllOutput () >> +{ >> + FilePointer output_file (fdopen (_pty_master_fd, "r")); >> + >> + int ch; >> + while ((ch = fgetc(output_file)) != EOF) >> + { >> +#if EDITLINE_TEST_DUMP_OUTPUT >> + char display_str[] = { 0, 0, 0 }; >> + switch (ch) >> + { >> + case '\t': >> + display_str[0] = '\\'; >> + display_str[1] = 't'; >> + break; >> + case '\n': >> + display_str[0] = '\\'; >> + display_str[1] = 'n'; >> + break; >> + case '\r': >> + display_str[0] = '\\'; >> + display_str[1] = 'r'; >> + break; >> + default: >> + display_str[0] = ch; >> + break; >> + } >> + printf ("<stdout> 0x%02x (%03d) (%s)\n", ch, ch, display_str); >> + // putc(ch, stdout); >> +#endif >> + } >> +} >> > This strikes me as a little odd. What's this for? Should a unittest > really have debug printfs? > > >> + >> +TEST (EditlineTest, EditlineReceivesSingleLineText) >> +{ >> + setenv ("TERM", "vt100", 1); >> > What are all these setenv lines for? Another option is to use TEST_F > instead of TEST(), and then declare a class with Setup() and TearDown() > methods, and do the setenv() in the setup method. Then this environment > variable will be set in every test run. That said, it still feels a little > dirty to have the test muck with environment variables. How does Editline > use this? > -- -Todd
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits