testDebugger.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file Copyright.txt or https://cmake.org/licensing for details. */
  3. #pragma once
  4. #include <memory>
  5. #include <vector>
  6. #include "cmDebuggerAdapter.h"
  7. #include "cmDebuggerProtocol.h"
  8. #include "cmListFileCache.h"
  9. #include "cmMessenger.h"
  10. #include <cmcppdap/include/dap/io.h>
  11. #include <cmcppdap/include/dap/session.h>
  12. #include <cmcppdap/include/dap/types.h>
  13. #include "testCommon.h"
  14. #define ASSERT_VARIABLE(x, expectedName, expectedValue, expectedType) \
  15. do { \
  16. ASSERT_TRUE(x.name == expectedName); \
  17. ASSERT_TRUE(x.value == expectedValue); \
  18. if (expectedType == nullptr) { \
  19. ASSERT_TRUE(x.type == dap::optional<dap::string>()); \
  20. } else { \
  21. ASSERT_TRUE(x.type == dap::optional<dap::string>(expectedType)); \
  22. if (std::string(expectedType) == "collection") { \
  23. ASSERT_TRUE(x.variablesReference != 0); \
  24. } \
  25. } \
  26. ASSERT_TRUE(x.evaluateName.has_value() == false); \
  27. } while (false)
  28. #define ASSERT_VARIABLE_REFERENCE(x, expectedName, expectedValue, \
  29. expectedType, expectedReference) \
  30. do { \
  31. ASSERT_VARIABLE(x, expectedName, expectedValue, expectedType); \
  32. ASSERT_TRUE(x.variablesReference == (expectedReference)); \
  33. } while (false)
  34. #define ASSERT_VARIABLE_REFERENCE_NOT_ZERO(x, expectedName, expectedValue, \
  35. expectedType) \
  36. do { \
  37. ASSERT_VARIABLE(x, expectedName, expectedValue, expectedType); \
  38. ASSERT_TRUE(x.variablesReference != 0); \
  39. } while (false)
  40. #define ASSERT_BREAKPOINT(x, expectedId, expectedLine, sourcePath, \
  41. isVerified) \
  42. do { \
  43. ASSERT_TRUE(x.id.has_value()); \
  44. ASSERT_TRUE(x.id.value() == expectedId); \
  45. ASSERT_TRUE(x.line.has_value()); \
  46. ASSERT_TRUE(x.line.value() == expectedLine); \
  47. ASSERT_TRUE(x.source.has_value()); \
  48. ASSERT_TRUE(x.source.value().path.has_value()); \
  49. ASSERT_TRUE(x.source.value().path.value() == sourcePath); \
  50. ASSERT_TRUE(x.verified == isVerified); \
  51. } while (false)
  52. class DebuggerTestHelper
  53. {
  54. std::shared_ptr<dap::ReaderWriter> Client2Debugger = dap::pipe();
  55. std::shared_ptr<dap::ReaderWriter> Debugger2Client = dap::pipe();
  56. public:
  57. std::unique_ptr<dap::Session> Client = dap::Session::create();
  58. std::unique_ptr<dap::Session> Debugger = dap::Session::create();
  59. void bind()
  60. {
  61. auto client2server = dap::pipe();
  62. auto server2client = dap::pipe();
  63. Client->bind(server2client, client2server);
  64. Debugger->bind(client2server, server2client);
  65. }
  66. std::vector<cmListFileFunction> CreateListFileFunctions(const char* str,
  67. const char* filename)
  68. {
  69. cmMessenger messenger;
  70. cmListFileBacktrace backtrace;
  71. cmListFile listfile;
  72. listfile.ParseString(str, filename, &messenger, backtrace);
  73. return listfile.Functions;
  74. }
  75. };
  76. class ScopedThread
  77. {
  78. public:
  79. template <class... Args>
  80. explicit ScopedThread(Args&&... args)
  81. : Thread(std::forward<Args>(args)...)
  82. {
  83. }
  84. ~ScopedThread()
  85. {
  86. if (Thread.joinable())
  87. Thread.join();
  88. }
  89. private:
  90. std::thread Thread;
  91. };