|
18 | 18 | #include <quick-lint-js/configuration.h> |
19 | 19 | #include <quick-lint-js/fake-configuration-filesystem.h> |
20 | 20 | #include <quick-lint-js/file-handle.h> |
| 21 | +#include <quick-lint-js/filesystem-test.h> |
21 | 22 | #include <quick-lint-js/lsp-endpoint.h> |
22 | 23 | #include <quick-lint-js/lsp-server.h> |
23 | 24 | #include <quick-lint-js/padded-string.h> |
24 | 25 | #include <quick-lint-js/spy-lsp-endpoint-remote.h> |
| 26 | +#include <quick-lint-js/trace-flusher.h> |
25 | 27 | #include <quick-lint-js/version.h> |
26 | 28 | #include <quick-lint-js/warning.h> |
27 | 29 | #include <simdjson.h> |
@@ -81,7 +83,7 @@ class mock_lsp_linter final : public lsp_linter { |
81 | 83 | std::function<lint_and_get_diagnostics_notification_type> callback_; |
82 | 84 | }; |
83 | 85 |
|
84 | | -class test_linting_lsp_server : public ::testing::Test { |
| 86 | +class test_linting_lsp_server : public ::testing::Test, public filesystem_test { |
85 | 87 | public: |
86 | 88 | explicit test_linting_lsp_server() { this->reset(); } |
87 | 89 |
|
@@ -288,6 +290,149 @@ TEST_F(test_linting_lsp_server, stores_config_values_after_config_response) { |
288 | 290 | EXPECT_EQ(config.tracing_directory, "/test/tracing/dir"); |
289 | 291 | } |
290 | 292 |
|
| 293 | +TEST_F(test_linting_lsp_server, did_change_configuration_notification) { |
| 294 | + this->server->append( |
| 295 | + make_message(u8R"({ |
| 296 | + "jsonrpc": "2.0", |
| 297 | + "method": "workspace/didChangeConfiguration", |
| 298 | + "params": { |
| 299 | + "settings": { |
| 300 | + "quick-lint-js.tracing-directory": "/test/tracing/dir" |
| 301 | + } |
| 302 | + } |
| 303 | + })")); |
| 304 | + this->handler->flush_pending_notifications(*this->client); |
| 305 | + |
| 306 | + EXPECT_THAT(this->client->messages, IsEmpty()); |
| 307 | + linting_lsp_server_config& config = this->handler->server_config(); |
| 308 | + EXPECT_EQ(config.tracing_directory, "/test/tracing/dir"); |
| 309 | +} |
| 310 | + |
| 311 | +TEST_F(test_linting_lsp_server, |
| 312 | + changing_config_to_same_tracing_dir_does_not_reset_tracing) { |
| 313 | + std::string temp_dir = this->make_temporary_directory(); |
| 314 | + trace_flusher tracer; |
| 315 | + fake_configuration_filesystem fs; |
| 316 | + mock_lsp_linter linter; |
| 317 | + linting_lsp_server_handler handler(&fs, &linter, &tracer); |
| 318 | + spy_lsp_endpoint_remote client; |
| 319 | + lsp_endpoint server(&handler, &client); |
| 320 | + |
| 321 | + server.append( |
| 322 | + make_message(u8R"({ |
| 323 | + "jsonrpc": "2.0", |
| 324 | + "method": "workspace/didChangeConfiguration", |
| 325 | + "params": { |
| 326 | + "settings": { |
| 327 | + "quick-lint-js.tracing-directory": )" + |
| 328 | + json_to_string8(::boost::json::string(temp_dir)) + u8R"( |
| 329 | + } |
| 330 | + } |
| 331 | + })")); |
| 332 | + |
| 333 | + std::vector<std::string> original_children = |
| 334 | + list_files_in_directory(temp_dir); |
| 335 | + EXPECT_THAT(original_children, ElementsAre(::testing::_)) |
| 336 | + << "enabling tracing in " << temp_dir |
| 337 | + << " should create a trace subdirectory"; |
| 338 | + |
| 339 | + server.append( |
| 340 | + make_message(u8R"({ |
| 341 | + "jsonrpc": "2.0", |
| 342 | + "method": "workspace/didChangeConfiguration", |
| 343 | + "params": { |
| 344 | + "settings": { |
| 345 | + "quick-lint-js.tracing-directory": )" + |
| 346 | + json_to_string8(::boost::json::string(temp_dir)) + u8R"( |
| 347 | + } |
| 348 | + } |
| 349 | + })")); |
| 350 | + |
| 351 | + std::vector<std::string> new_children = list_files_in_directory(temp_dir); |
| 352 | + EXPECT_THAT(new_children, original_children) |
| 353 | + << "enabling tracing in " << temp_dir |
| 354 | + << " should not create another trace subdirectory"; |
| 355 | +} |
| 356 | + |
| 357 | +TEST_F(test_linting_lsp_server, |
| 358 | + changing_config_to_different_tracing_dir_resets_tracing) { |
| 359 | + trace_flusher tracer; |
| 360 | + fake_configuration_filesystem fs; |
| 361 | + mock_lsp_linter linter; |
| 362 | + linting_lsp_server_handler handler(&fs, &linter, &tracer); |
| 363 | + spy_lsp_endpoint_remote client; |
| 364 | + lsp_endpoint server(&handler, &client); |
| 365 | + |
| 366 | + std::string original_tracing_dir = this->make_temporary_directory(); |
| 367 | + std::string new_tracing_dir = this->make_temporary_directory(); |
| 368 | + |
| 369 | + server.append(make_message( |
| 370 | + u8R"({ |
| 371 | + "jsonrpc": "2.0", |
| 372 | + "method": "workspace/didChangeConfiguration", |
| 373 | + "params": { |
| 374 | + "settings": { |
| 375 | + "quick-lint-js.tracing-directory": )" + |
| 376 | + json_to_string8(::boost::json::string(original_tracing_dir)) + |
| 377 | + u8R"( |
| 378 | + } |
| 379 | + } |
| 380 | + })")); |
| 381 | + server.append( |
| 382 | + make_message(u8R"({ |
| 383 | + "jsonrpc": "2.0", |
| 384 | + "method": "workspace/didChangeConfiguration", |
| 385 | + "params": { |
| 386 | + "settings": { |
| 387 | + "quick-lint-js.tracing-directory": )" + |
| 388 | + json_to_string8(::boost::json::string(new_tracing_dir)) + |
| 389 | + u8R"( |
| 390 | + } |
| 391 | + } |
| 392 | + })")); |
| 393 | + |
| 394 | + std::vector<std::string> new_children = |
| 395 | + list_files_in_directory(new_tracing_dir); |
| 396 | + EXPECT_THAT(new_children, ElementsAre(::testing::_)) |
| 397 | + << "changing tracing dir from " << original_tracing_dir << " to " |
| 398 | + << new_tracing_dir << " should create a new trace subdirectory"; |
| 399 | +} |
| 400 | + |
| 401 | +TEST_F(test_linting_lsp_server, |
| 402 | + changing_tracing_dir_config_to_empty_disables_tracing) { |
| 403 | + std::string temp_dir = this->make_temporary_directory(); |
| 404 | + trace_flusher tracer; |
| 405 | + fake_configuration_filesystem fs; |
| 406 | + mock_lsp_linter linter; |
| 407 | + linting_lsp_server_handler handler(&fs, &linter, &tracer); |
| 408 | + spy_lsp_endpoint_remote client; |
| 409 | + lsp_endpoint server(&handler, &client); |
| 410 | + |
| 411 | + server.append( |
| 412 | + make_message(u8R"({ |
| 413 | + "jsonrpc": "2.0", |
| 414 | + "method": "workspace/didChangeConfiguration", |
| 415 | + "params": { |
| 416 | + "settings": { |
| 417 | + "quick-lint-js.tracing-directory": )" + |
| 418 | + json_to_string8(::boost::json::string(temp_dir)) + u8R"( |
| 419 | + } |
| 420 | + } |
| 421 | + })")); |
| 422 | + EXPECT_TRUE(tracer.is_enabled()); |
| 423 | + server.append( |
| 424 | + make_message(u8R"({ |
| 425 | + "jsonrpc": "2.0", |
| 426 | + "method": "workspace/didChangeConfiguration", |
| 427 | + "params": { |
| 428 | + "settings": { |
| 429 | + "quick-lint-js.tracing-directory": "" |
| 430 | + } |
| 431 | + } |
| 432 | + })")); |
| 433 | + EXPECT_FALSE(tracer.is_enabled()); |
| 434 | +} |
| 435 | + |
291 | 436 | // https://microsoft.github.io/language-server-protocol/specifications/specification-current/#shutdown |
292 | 437 | TEST_F(test_linting_lsp_server, shutdown) { |
293 | 438 | this->server->append( |
|
0 commit comments