[Lldb-commits] [lldb] r251681 - Added real editline tests.
Todd Fiala via lldb-commits
lldb-commits at lists.llvm.org
Fri Oct 30 09:43:07 PDT 2015
> 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/c54da719/attachment-0001.html>
More information about the lldb-commits
mailing list