| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 #include <stdlib.h> | 30 #include <stdlib.h> |
| 31 | 31 |
| 32 #define V8_DISABLE_DEPRECATIONS 1 | 32 #define V8_DISABLE_DEPRECATIONS 1 |
| 33 #include "v8.h" | 33 #include "v8.h" |
| 34 | 34 |
| 35 #include "api.h" | 35 #include "api.h" |
| 36 #include "cctest.h" | 36 #include "cctest.h" |
| 37 #include "compilation-cache.h" | 37 #include "compilation-cache.h" |
| 38 #include "debug.h" | 38 #include "debug.h" |
| 39 #include "deoptimizer.h" | 39 #include "deoptimizer.h" |
| 40 #include "platform.h" | 40 #include "platform/socket.h" |
| 41 #include "stub-cache.h" | 41 #include "stub-cache.h" |
| 42 #include "utils.h" | 42 #include "utils.h" |
| 43 #undef V8_DISABLE_DEPRECATIONS | 43 #undef V8_DISABLE_DEPRECATIONS |
| 44 | 44 |
| 45 | 45 |
| 46 using ::v8::internal::EmbeddedVector; | 46 using ::v8::internal::EmbeddedVector; |
| 47 using ::v8::internal::Object; | 47 using ::v8::internal::Object; |
| 48 using ::v8::internal::OS; | 48 using ::v8::internal::OS; |
| 49 using ::v8::internal::Handle; | 49 using ::v8::internal::Handle; |
| 50 using ::v8::internal::Heap; | 50 using ::v8::internal::Heap; |
| (...skipping 5889 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5940 const int kPort2 = 5857 + FlagDependentPortOffset(); | 5940 const int kPort2 = 5857 + FlagDependentPortOffset(); |
| 5941 const int kPort3 = 5856 + FlagDependentPortOffset(); | 5941 const int kPort3 = 5856 + FlagDependentPortOffset(); |
| 5942 | 5942 |
| 5943 // Make a string with the port2 number. | 5943 // Make a string with the port2 number. |
| 5944 const int kPortBufferLen = 6; | 5944 const int kPortBufferLen = 6; |
| 5945 char port2_str[kPortBufferLen]; | 5945 char port2_str[kPortBufferLen]; |
| 5946 OS::SNPrintF(i::Vector<char>(port2_str, kPortBufferLen), "%d", kPort2); | 5946 OS::SNPrintF(i::Vector<char>(port2_str, kPortBufferLen), "%d", kPort2); |
| 5947 | 5947 |
| 5948 bool ok; | 5948 bool ok; |
| 5949 | 5949 |
| 5950 // Initialize the socket library. | |
| 5951 i::Socket::SetUp(); | |
| 5952 | |
| 5953 // Test starting and stopping the agent without any client connection. | 5950 // Test starting and stopping the agent without any client connection. |
| 5954 debugger->StartAgent("test", kPort1); | 5951 debugger->StartAgent("test", kPort1); |
| 5955 debugger->StopAgent(); | 5952 debugger->StopAgent(); |
| 5956 // Test starting the agent, connecting a client and shutting down the agent | 5953 // Test starting the agent, connecting a client and shutting down the agent |
| 5957 // with the client connected. | 5954 // with the client connected. |
| 5958 ok = debugger->StartAgent("test", kPort2); | 5955 ok = debugger->StartAgent("test", kPort2); |
| 5959 CHECK(ok); | 5956 CHECK(ok); |
| 5960 debugger->WaitForAgent(); | 5957 debugger->WaitForAgent(); |
| 5961 i::Socket* client = i::OS::CreateSocket(); | 5958 i::Socket* client = new i::Socket; |
| 5962 ok = client->Connect("localhost", port2_str); | 5959 ok = client->Connect("localhost", port2_str); |
| 5963 CHECK(ok); | 5960 CHECK(ok); |
| 5964 // It is important to wait for a message from the agent. Otherwise, | 5961 // It is important to wait for a message from the agent. Otherwise, |
| 5965 // we can close the server socket during "accept" syscall, making it failing | 5962 // we can close the server socket during "accept" syscall, making it failing |
| 5966 // (at least on Linux), and the test will work incorrectly. | 5963 // (at least on Linux), and the test will work incorrectly. |
| 5967 char buf; | 5964 char buf; |
| 5968 ok = client->Receive(&buf, 1) == 1; | 5965 ok = client->Receive(&buf, 1) == 1; |
| 5969 CHECK(ok); | 5966 CHECK(ok); |
| 5970 debugger->StopAgent(); | 5967 debugger->StopAgent(); |
| 5971 delete client; | 5968 delete client; |
| 5972 | 5969 |
| 5973 // Test starting and stopping the agent with the required port already | 5970 // Test starting and stopping the agent with the required port already |
| 5974 // occoupied. | 5971 // occoupied. |
| 5975 i::Socket* server = i::OS::CreateSocket(); | 5972 i::Socket* server = new i::Socket; |
| 5976 server->Bind(kPort3); | 5973 ok = server->Bind(kPort3); |
| 5974 CHECK(ok); |
| 5977 | 5975 |
| 5978 debugger->StartAgent("test", kPort3); | 5976 debugger->StartAgent("test", kPort3); |
| 5979 debugger->StopAgent(); | 5977 debugger->StopAgent(); |
| 5980 | 5978 |
| 5981 delete server; | 5979 delete server; |
| 5982 } | 5980 } |
| 5983 | 5981 |
| 5984 | 5982 |
| 5985 class DebuggerAgentProtocolServerThread : public i::Thread { | 5983 class DebuggerAgentProtocolServerThread : public i::Thread { |
| 5986 public: | 5984 public: |
| (...skipping 20 matching lines...) Expand all Loading... |
| 6007 i::Socket* server_; // Server socket used for bind/accept. | 6005 i::Socket* server_; // Server socket used for bind/accept. |
| 6008 i::Socket* client_; // Single client connection used by the test. | 6006 i::Socket* client_; // Single client connection used by the test. |
| 6009 i::Semaphore listening_; // Signalled when the server is in listen mode. | 6007 i::Semaphore listening_; // Signalled when the server is in listen mode. |
| 6010 }; | 6008 }; |
| 6011 | 6009 |
| 6012 | 6010 |
| 6013 void DebuggerAgentProtocolServerThread::Run() { | 6011 void DebuggerAgentProtocolServerThread::Run() { |
| 6014 bool ok; | 6012 bool ok; |
| 6015 | 6013 |
| 6016 // Create the server socket and bind it to the requested port. | 6014 // Create the server socket and bind it to the requested port. |
| 6017 server_ = i::OS::CreateSocket(); | 6015 server_ = new i::Socket; |
| 6018 CHECK(server_ != NULL); | 6016 CHECK(server_ != NULL); |
| 6019 ok = server_->Bind(port_); | 6017 ok = server_->Bind(port_); |
| 6020 CHECK(ok); | 6018 CHECK(ok); |
| 6021 | 6019 |
| 6022 // Listen for new connections. | 6020 // Listen for new connections. |
| 6023 ok = server_->Listen(1); | 6021 ok = server_->Listen(1); |
| 6024 CHECK(ok); | 6022 CHECK(ok); |
| 6025 listening_.Signal(); | 6023 listening_.Signal(); |
| 6026 | 6024 |
| 6027 // Accept a connection. | 6025 // Accept a connection. |
| 6028 client_ = server_->Accept(); | 6026 client_ = server_->Accept(); |
| 6029 CHECK(client_ != NULL); | 6027 CHECK(client_ != NULL); |
| 6030 | 6028 |
| 6031 // Receive a debugger agent protocol message. | 6029 // Receive a debugger agent protocol message. |
| 6032 i::DebuggerAgentUtil::ReceiveMessage(client_); | 6030 i::DebuggerAgentUtil::ReceiveMessage(client_); |
| 6033 } | 6031 } |
| 6034 | 6032 |
| 6035 | 6033 |
| 6036 TEST(DebuggerAgentProtocolOverflowHeader) { | 6034 TEST(DebuggerAgentProtocolOverflowHeader) { |
| 6037 // Make sure this port is not used by other tests to allow tests to run in | 6035 // Make sure this port is not used by other tests to allow tests to run in |
| 6038 // parallel. | 6036 // parallel. |
| 6039 const int kPort = 5860 + FlagDependentPortOffset(); | 6037 const int kPort = 5860 + FlagDependentPortOffset(); |
| 6040 static const char* kLocalhost = "localhost"; | 6038 static const char* kLocalhost = "localhost"; |
| 6041 | 6039 |
| 6042 // Make a string with the port number. | 6040 // Make a string with the port number. |
| 6043 const int kPortBufferLen = 6; | 6041 const int kPortBufferLen = 6; |
| 6044 char port_str[kPortBufferLen]; | 6042 char port_str[kPortBufferLen]; |
| 6045 OS::SNPrintF(i::Vector<char>(port_str, kPortBufferLen), "%d", kPort); | 6043 OS::SNPrintF(i::Vector<char>(port_str, kPortBufferLen), "%d", kPort); |
| 6046 | 6044 |
| 6047 // Initialize the socket library. | |
| 6048 i::Socket::SetUp(); | |
| 6049 | |
| 6050 // Create a socket server to receive a debugger agent message. | 6045 // Create a socket server to receive a debugger agent message. |
| 6051 DebuggerAgentProtocolServerThread* server = | 6046 DebuggerAgentProtocolServerThread* server = |
| 6052 new DebuggerAgentProtocolServerThread(kPort); | 6047 new DebuggerAgentProtocolServerThread(kPort); |
| 6053 server->Start(); | 6048 server->Start(); |
| 6054 server->WaitForListening(); | 6049 server->WaitForListening(); |
| 6055 | 6050 |
| 6056 // Connect. | 6051 // Connect. |
| 6057 i::Socket* client = i::OS::CreateSocket(); | 6052 i::Socket* client = new i::Socket; |
| 6058 CHECK(client != NULL); | 6053 CHECK(client != NULL); |
| 6059 bool ok = client->Connect(kLocalhost, port_str); | 6054 bool ok = client->Connect(kLocalhost, port_str); |
| 6060 CHECK(ok); | 6055 CHECK(ok); |
| 6061 | 6056 |
| 6062 // Send headers which overflow the receive buffer. | 6057 // Send headers which overflow the receive buffer. |
| 6063 static const int kBufferSize = 1000; | 6058 static const int kBufferSize = 1000; |
| 6064 char buffer[kBufferSize]; | 6059 char buffer[kBufferSize]; |
| 6065 | 6060 |
| 6066 // Long key and short value: XXXX....XXXX:0\r\n. | 6061 // Long key and short value: XXXX....XXXX:0\r\n. |
| 6067 for (int i = 0; i < kBufferSize - 4; i++) { | 6062 for (int i = 0; i < kBufferSize - 4; i++) { |
| 6068 buffer[i] = 'X'; | 6063 buffer[i] = 'X'; |
| 6069 } | 6064 } |
| 6070 buffer[kBufferSize - 4] = ':'; | 6065 buffer[kBufferSize - 4] = ':'; |
| 6071 buffer[kBufferSize - 3] = '0'; | 6066 buffer[kBufferSize - 3] = '0'; |
| 6072 buffer[kBufferSize - 2] = '\r'; | 6067 buffer[kBufferSize - 2] = '\r'; |
| 6073 buffer[kBufferSize - 1] = '\n'; | 6068 buffer[kBufferSize - 1] = '\n'; |
| 6074 client->Send(buffer, kBufferSize); | 6069 int result = client->Send(buffer, kBufferSize); |
| 6070 CHECK_EQ(kBufferSize, result); |
| 6075 | 6071 |
| 6076 // Short key and long value: X:XXXX....XXXX\r\n. | 6072 // Short key and long value: X:XXXX....XXXX\r\n. |
| 6077 buffer[0] = 'X'; | 6073 buffer[0] = 'X'; |
| 6078 buffer[1] = ':'; | 6074 buffer[1] = ':'; |
| 6079 for (int i = 2; i < kBufferSize - 2; i++) { | 6075 for (int i = 2; i < kBufferSize - 2; i++) { |
| 6080 buffer[i] = 'X'; | 6076 buffer[i] = 'X'; |
| 6081 } | 6077 } |
| 6082 buffer[kBufferSize - 2] = '\r'; | 6078 buffer[kBufferSize - 2] = '\r'; |
| 6083 buffer[kBufferSize - 1] = '\n'; | 6079 buffer[kBufferSize - 1] = '\n'; |
| 6084 client->Send(buffer, kBufferSize); | 6080 result = client->Send(buffer, kBufferSize); |
| 6081 CHECK_EQ(kBufferSize, result); |
| 6085 | 6082 |
| 6086 // Add empty body to request. | 6083 // Add empty body to request. |
| 6087 const char* content_length_zero_header = "Content-Length:0\r\n"; | 6084 const char* content_length_zero_header = "Content-Length:0\r\n"; |
| 6088 client->Send(content_length_zero_header, | 6085 int length = StrLength(content_length_zero_header); |
| 6089 StrLength(content_length_zero_header)); | 6086 result = client->Send(content_length_zero_header, length); |
| 6090 client->Send("\r\n", 2); | 6087 CHECK_EQ(length, result); |
| 6088 result = client->Send("\r\n", 2); |
| 6089 CHECK_EQ(2, result); |
| 6091 | 6090 |
| 6092 // Wait until data is received. | 6091 // Wait until data is received. |
| 6093 server->Join(); | 6092 server->Join(); |
| 6094 | 6093 |
| 6095 // Check for empty body. | 6094 // Check for empty body. |
| 6096 CHECK(server->body() == NULL); | 6095 CHECK(server->body() == NULL); |
| 6097 | 6096 |
| 6098 // Close the client before the server to avoid TIME_WAIT issues. | 6097 // Close the client before the server to avoid TIME_WAIT issues. |
| 6099 client->Shutdown(); | 6098 client->Shutdown(); |
| 6100 delete client; | 6099 delete client; |
| (...skipping 1447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7548 TEST(LiveEditDisabled) { | 7547 TEST(LiveEditDisabled) { |
| 7549 v8::internal::FLAG_allow_natives_syntax = true; | 7548 v8::internal::FLAG_allow_natives_syntax = true; |
| 7550 LocalContext env; | 7549 LocalContext env; |
| 7551 v8::HandleScope scope(env->GetIsolate()); | 7550 v8::HandleScope scope(env->GetIsolate()); |
| 7552 v8::Debug::SetLiveEditEnabled(false); | 7551 v8::Debug::SetLiveEditEnabled(false); |
| 7553 CompileRun("%LiveEditCompareStrings('', '')"); | 7552 CompileRun("%LiveEditCompareStrings('', '')"); |
| 7554 } | 7553 } |
| 7555 | 7554 |
| 7556 | 7555 |
| 7557 #endif // ENABLE_DEBUGGER_SUPPORT | 7556 #endif // ENABLE_DEBUGGER_SUPPORT |
| OLD | NEW |