[Lldb-commits] [lldb] r251681 - Added real editline tests.
Zachary Turner via lldb-commits
lldb-commits at lists.llvm.org
Fri Oct 30 09:48:39 PDT 2015
BTW, can you add EditlineTests.cpp to unittests/Editline/CMakeLists.txt?
Currently this unittest only appears to be enabled for the Xcode build (and
it might actually break the CMake build since CMake complains if there is a
cpp file that is not added to a target)
On Fri, Oct 30, 2015 at 9:43 AM Todd Fiala <todd.fiala at gmail.com> wrote:
> > Should a unittest really have debug printfs?
>
> Those are behind a define. edit line is inherently about converting input
> to output, and when we layer in auto-tabbing, auto-completion, etc. it is
> critical in test development to see how these develop. Every single touch
> of this test is going to involve flipping them on and off, so from a
> workflow perspective, having the define (and usually turned off) for the
> debug printing way trumps purity of carrying that debug content that is
> usually #ifdef'd out.
>
> On Fri, Oct 30, 2015 at 9:40 AM, Todd Fiala <todd.fiala at gmail.com> wrote:
>
>> > 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 <zturner at google.com>
>> wrote:
>>
>>>
>>>
>>> On Thu, Oct 29, 2015 at 7:57 PM Todd Fiala via lldb-commits <
>>> lldb-commits at 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
>>
>
>
>
> --
> -Todd
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20151030/d67b5267/attachment-0001.html>
More information about the lldb-commits
mailing list