| OLD | NEW |
| 1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 the V8 project authors. All rights reserved. |
| 2 // | 2 // |
| 3 // Tests of logging functions from log.h | 3 // Tests of logging functions from log.h |
| 4 | 4 |
| 5 #ifdef ENABLE_LOGGING_AND_PROFILING | 5 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 6 | 6 |
| 7 #ifdef __linux__ | 7 #ifdef __linux__ |
| 8 #include <math.h> | 8 #include <math.h> |
| 9 #include <pthread.h> | 9 #include <pthread.h> |
| 10 #include <signal.h> | 10 #include <signal.h> |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 old_sigprof_handler.sa_sigaction(signal, info, context); | 167 old_sigprof_handler.sa_sigaction(signal, info, context); |
| 168 } | 168 } |
| 169 | 169 |
| 170 #endif // __linux__ | 170 #endif // __linux__ |
| 171 | 171 |
| 172 | 172 |
| 173 namespace { | 173 namespace { |
| 174 | 174 |
| 175 class ScopedLoggerInitializer { | 175 class ScopedLoggerInitializer { |
| 176 public: | 176 public: |
| 177 explicit ScopedLoggerInitializer(bool log, bool prof_lazy) | 177 explicit ScopedLoggerInitializer(bool prof_lazy) |
| 178 : saved_log_(i::FLAG_log), | 178 : saved_prof_lazy_(i::FLAG_prof_lazy), |
| 179 saved_prof_lazy_(i::FLAG_prof_lazy), | |
| 180 saved_prof_(i::FLAG_prof), | 179 saved_prof_(i::FLAG_prof), |
| 181 saved_prof_auto_(i::FLAG_prof_auto), | 180 saved_prof_auto_(i::FLAG_prof_auto), |
| 182 trick_to_run_init_flags_(init_flags_(log, prof_lazy)), | 181 trick_to_run_init_flags_(init_flags_(prof_lazy)), |
| 183 need_to_set_up_logger_(i::V8::IsRunning()), | 182 need_to_set_up_logger_(i::V8::IsRunning()), |
| 184 scope_(), | 183 scope_(), |
| 185 env_(v8::Context::New()) { | 184 env_(v8::Context::New()) { |
| 186 if (need_to_set_up_logger_) Logger::Setup(); | 185 if (need_to_set_up_logger_) Logger::Setup(); |
| 187 env_->Enter(); | 186 env_->Enter(); |
| 188 } | 187 } |
| 189 | 188 |
| 190 ~ScopedLoggerInitializer() { | 189 ~ScopedLoggerInitializer() { |
| 191 env_->Exit(); | 190 env_->Exit(); |
| 192 Logger::TearDown(); | 191 Logger::TearDown(); |
| 193 i::FLAG_prof_lazy = saved_prof_lazy_; | 192 i::FLAG_prof_lazy = saved_prof_lazy_; |
| 194 i::FLAG_prof = saved_prof_; | 193 i::FLAG_prof = saved_prof_; |
| 195 i::FLAG_prof_auto = saved_prof_auto_; | 194 i::FLAG_prof_auto = saved_prof_auto_; |
| 196 i::FLAG_log = saved_log_; | |
| 197 } | 195 } |
| 198 | 196 |
| 199 v8::Handle<v8::Context>& env() { return env_; } | 197 v8::Handle<v8::Context>& env() { return env_; } |
| 200 | 198 |
| 201 private: | 199 private: |
| 202 static bool init_flags_(bool log, bool prof_lazy) { | 200 static bool init_flags_(bool prof_lazy) { |
| 203 i::FLAG_log = log; | |
| 204 i::FLAG_prof = true; | 201 i::FLAG_prof = true; |
| 205 i::FLAG_prof_lazy = prof_lazy; | 202 i::FLAG_prof_lazy = prof_lazy; |
| 206 i::FLAG_prof_auto = false; | 203 i::FLAG_prof_auto = false; |
| 207 i::FLAG_logfile = "*"; | 204 i::FLAG_logfile = "*"; |
| 208 return prof_lazy; | 205 return prof_lazy; |
| 209 } | 206 } |
| 210 | 207 |
| 211 const bool saved_log_; | |
| 212 const bool saved_prof_lazy_; | 208 const bool saved_prof_lazy_; |
| 213 const bool saved_prof_; | 209 const bool saved_prof_; |
| 214 const bool saved_prof_auto_; | 210 const bool saved_prof_auto_; |
| 215 const bool trick_to_run_init_flags_; | 211 const bool trick_to_run_init_flags_; |
| 216 const bool need_to_set_up_logger_; | 212 const bool need_to_set_up_logger_; |
| 217 v8::HandleScope scope_; | 213 v8::HandleScope scope_; |
| 218 v8::Handle<v8::Context> env_; | 214 v8::Handle<v8::Context> env_; |
| 219 | 215 |
| 220 DISALLOW_COPY_AND_ASSIGN(ScopedLoggerInitializer); | 216 DISALLOW_COPY_AND_ASSIGN(ScopedLoggerInitializer); |
| 221 }; | 217 }; |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 313 CHECK_GT(matcher->GetNextChunk(), 0); | 309 CHECK_GT(matcher->GetNextChunk(), 0); |
| 314 matcher->PrintBuffer(); | 310 matcher->PrintBuffer(); |
| 315 CHECK_NE(NULL, matcher->Find(code_creation)); | 311 CHECK_NE(NULL, matcher->Find(code_creation)); |
| 316 const char* tick = "\ntick,"; | 312 const char* tick = "\ntick,"; |
| 317 const bool ticks_found = matcher->Find(tick) != NULL; | 313 const bool ticks_found = matcher->Find(tick) != NULL; |
| 318 CHECK_EQ(was_sigprof_received, ticks_found); | 314 CHECK_EQ(was_sigprof_received, ticks_found); |
| 319 } | 315 } |
| 320 | 316 |
| 321 | 317 |
| 322 TEST(ProfLazyMode) { | 318 TEST(ProfLazyMode) { |
| 323 ScopedLoggerInitializer initialize_logger(false, true); | 319 ScopedLoggerInitializer initialize_logger(true); |
| 324 | 320 |
| 325 // No sampling should happen prior to resuming profiler. | 321 // No sampling should happen prior to resuming profiler. |
| 326 CHECK(!LoggerTestHelper::IsSamplerActive()); | 322 CHECK(!LoggerTestHelper::IsSamplerActive()); |
| 327 | 323 |
| 328 LogBufferMatcher matcher; | 324 LogBufferMatcher matcher; |
| 329 // Nothing must be logged until profiling is resumed. | 325 // Nothing must be logged until profiling is resumed. |
| 330 CHECK_EQ(0, matcher.log_pos()); | 326 CHECK_EQ(0, matcher.log_pos()); |
| 331 | 327 |
| 332 CompileAndRunScript("var a = (function(x) { return x + 1; })(10);"); | 328 CompileAndRunScript("var a = (function(x) { return x + 1; })(10);"); |
| 333 | 329 |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 533 // Must not crash. | 529 // Must not crash. |
| 534 i::Logger::LogCompiledFunctions(); | 530 i::Logger::LogCompiledFunctions(); |
| 535 } | 531 } |
| 536 | 532 |
| 537 | 533 |
| 538 static v8::Handle<v8::Value> ObjMethod1(const v8::Arguments& args) { | 534 static v8::Handle<v8::Value> ObjMethod1(const v8::Arguments& args) { |
| 539 return v8::Handle<v8::Value>(); | 535 return v8::Handle<v8::Value>(); |
| 540 } | 536 } |
| 541 | 537 |
| 542 TEST(LogCallbacks) { | 538 TEST(LogCallbacks) { |
| 543 ScopedLoggerInitializer initialize_logger(false, false); | 539 ScopedLoggerInitializer initialize_logger(false); |
| 544 LogBufferMatcher matcher; | 540 LogBufferMatcher matcher; |
| 545 | 541 |
| 546 v8::Persistent<v8::FunctionTemplate> obj = | 542 v8::Persistent<v8::FunctionTemplate> obj = |
| 547 v8::Persistent<v8::FunctionTemplate>::New(v8::FunctionTemplate::New()); | 543 v8::Persistent<v8::FunctionTemplate>::New(v8::FunctionTemplate::New()); |
| 548 obj->SetClassName(v8::String::New("Obj")); | 544 obj->SetClassName(v8::String::New("Obj")); |
| 549 v8::Handle<v8::ObjectTemplate> proto = obj->PrototypeTemplate(); | 545 v8::Handle<v8::ObjectTemplate> proto = obj->PrototypeTemplate(); |
| 550 v8::Local<v8::Signature> signature = v8::Signature::New(obj); | 546 v8::Local<v8::Signature> signature = v8::Signature::New(obj); |
| 551 proto->Set(v8::String::New("method1"), | 547 proto->Set(v8::String::New("method1"), |
| 552 v8::FunctionTemplate::New(ObjMethod1, | 548 v8::FunctionTemplate::New(ObjMethod1, |
| 553 v8::Handle<v8::Value>(), | 549 v8::Handle<v8::Value>(), |
| (...skipping 29 matching lines...) Expand all Loading... |
| 583 v8::Local<v8::Value> value, | 579 v8::Local<v8::Value> value, |
| 584 const v8::AccessorInfo& info) { | 580 const v8::AccessorInfo& info) { |
| 585 } | 581 } |
| 586 | 582 |
| 587 static v8::Handle<v8::Value> Prop2Getter(v8::Local<v8::String> property, | 583 static v8::Handle<v8::Value> Prop2Getter(v8::Local<v8::String> property, |
| 588 const v8::AccessorInfo& info) { | 584 const v8::AccessorInfo& info) { |
| 589 return v8::Handle<v8::Value>(); | 585 return v8::Handle<v8::Value>(); |
| 590 } | 586 } |
| 591 | 587 |
| 592 TEST(LogAccessorCallbacks) { | 588 TEST(LogAccessorCallbacks) { |
| 593 ScopedLoggerInitializer initialize_logger(false, false); | 589 ScopedLoggerInitializer initialize_logger(false); |
| 594 LogBufferMatcher matcher; | 590 LogBufferMatcher matcher; |
| 595 | 591 |
| 596 v8::Persistent<v8::FunctionTemplate> obj = | 592 v8::Persistent<v8::FunctionTemplate> obj = |
| 597 v8::Persistent<v8::FunctionTemplate>::New(v8::FunctionTemplate::New()); | 593 v8::Persistent<v8::FunctionTemplate>::New(v8::FunctionTemplate::New()); |
| 598 obj->SetClassName(v8::String::New("Obj")); | 594 obj->SetClassName(v8::String::New("Obj")); |
| 599 v8::Handle<v8::ObjectTemplate> inst = obj->InstanceTemplate(); | 595 v8::Handle<v8::ObjectTemplate> inst = obj->InstanceTemplate(); |
| 600 inst->SetAccessor(v8::String::New("prop1"), Prop1Getter, Prop1Setter); | 596 inst->SetAccessor(v8::String::New("prop1"), Prop1Getter, Prop1Setter); |
| 601 inst->SetAccessor(v8::String::New("prop2"), Prop2Getter); | 597 inst->SetAccessor(v8::String::New("prop2"), Prop2Getter); |
| 602 | 598 |
| 603 i::Logger::LogAccessorCallbacks(); | 599 i::Logger::LogAccessorCallbacks(); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 618 i::OS::SNPrintF(prop2_getter_record, | 614 i::OS::SNPrintF(prop2_getter_record, |
| 619 "code-creation,Callback,0x%" V8PRIxPTR ",1,\"get prop2\"", | 615 "code-creation,Callback,0x%" V8PRIxPTR ",1,\"get prop2\"", |
| 620 Prop2Getter); | 616 Prop2Getter); |
| 621 CHECK_NE(NULL, matcher.Find(prop2_getter_record)); | 617 CHECK_NE(NULL, matcher.Find(prop2_getter_record)); |
| 622 | 618 |
| 623 obj.Dispose(); | 619 obj.Dispose(); |
| 624 } | 620 } |
| 625 | 621 |
| 626 | 622 |
| 627 TEST(LogTags) { | 623 TEST(LogTags) { |
| 628 ScopedLoggerInitializer initialize_logger(true, false); | 624 ScopedLoggerInitializer initialize_logger(false); |
| 629 LogBufferMatcher matcher; | 625 LogBufferMatcher matcher; |
| 630 | 626 |
| 631 const char* open_tag = "open-tag,"; | 627 const char* open_tag = "open-tag,"; |
| 632 const char* close_tag = "close-tag,"; | 628 const char* close_tag = "close-tag,"; |
| 633 | 629 |
| 634 // Check compatibility with the old style behavior. | 630 // Check compatibility with the old style behavior. |
| 635 CHECK_EQ(v8::PROFILER_MODULE_NONE, Logger::GetActiveProfilerModules()); | 631 CHECK_EQ(v8::PROFILER_MODULE_NONE, Logger::GetActiveProfilerModules()); |
| 636 Logger::ResumeProfiler(v8::PROFILER_MODULE_CPU, 0); | 632 Logger::ResumeProfiler(v8::PROFILER_MODULE_CPU, 0); |
| 637 CHECK_EQ(v8::PROFILER_MODULE_CPU, Logger::GetActiveProfilerModules()); | 633 CHECK_EQ(v8::PROFILER_MODULE_CPU, Logger::GetActiveProfilerModules()); |
| 638 Logger::PauseProfiler(v8::PROFILER_MODULE_CPU, 0); | 634 Logger::PauseProfiler(v8::PROFILER_MODULE_CPU, 0); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 703 Logger::PauseProfiler(v8::PROFILER_MODULE_CPU, 3); | 699 Logger::PauseProfiler(v8::PROFILER_MODULE_CPU, 3); |
| 704 CHECK_EQ(v8::PROFILER_MODULE_NONE, Logger::GetActiveProfilerModules()); | 700 CHECK_EQ(v8::PROFILER_MODULE_NONE, Logger::GetActiveProfilerModules()); |
| 705 Logger::ResumeProfiler(v8::PROFILER_MODULE_CPU, 3); | 701 Logger::ResumeProfiler(v8::PROFILER_MODULE_CPU, 3); |
| 706 CHECK_EQ(v8::PROFILER_MODULE_NONE, Logger::GetActiveProfilerModules()); | 702 CHECK_EQ(v8::PROFILER_MODULE_NONE, Logger::GetActiveProfilerModules()); |
| 707 // Must be no tags, because logging must be disabled. | 703 // Must be no tags, because logging must be disabled. |
| 708 CHECK_EQ(NULL, matcher.Find(open_tag3)); | 704 CHECK_EQ(NULL, matcher.Find(open_tag3)); |
| 709 CHECK_EQ(NULL, matcher.Find(close_tag3)); | 705 CHECK_EQ(NULL, matcher.Find(close_tag3)); |
| 710 } | 706 } |
| 711 | 707 |
| 712 | 708 |
| 709 TEST(IsLoggingPreserved) { |
| 710 ScopedLoggerInitializer initialize_logger(false); |
| 711 |
| 712 CHECK(Logger::is_logging()); |
| 713 Logger::ResumeProfiler(v8::PROFILER_MODULE_CPU, 1); |
| 714 CHECK(Logger::is_logging()); |
| 715 Logger::PauseProfiler(v8::PROFILER_MODULE_CPU, 1); |
| 716 CHECK(Logger::is_logging()); |
| 717 |
| 718 CHECK(Logger::is_logging()); |
| 719 Logger::ResumeProfiler( |
| 720 v8::PROFILER_MODULE_HEAP_STATS | v8::PROFILER_MODULE_JS_CONSTRUCTORS, 1); |
| 721 CHECK(Logger::is_logging()); |
| 722 Logger::PauseProfiler( |
| 723 v8::PROFILER_MODULE_HEAP_STATS | v8::PROFILER_MODULE_JS_CONSTRUCTORS, 1); |
| 724 CHECK(Logger::is_logging()); |
| 725 |
| 726 CHECK(Logger::is_logging()); |
| 727 Logger::ResumeProfiler( |
| 728 v8::PROFILER_MODULE_CPU | |
| 729 v8::PROFILER_MODULE_HEAP_STATS | v8::PROFILER_MODULE_JS_CONSTRUCTORS, 1); |
| 730 CHECK(Logger::is_logging()); |
| 731 Logger::PauseProfiler( |
| 732 v8::PROFILER_MODULE_CPU | |
| 733 v8::PROFILER_MODULE_HEAP_STATS | v8::PROFILER_MODULE_JS_CONSTRUCTORS, 1); |
| 734 CHECK(Logger::is_logging()); |
| 735 } |
| 736 |
| 737 |
| 713 static inline bool IsStringEqualTo(const char* r, const char* s) { | 738 static inline bool IsStringEqualTo(const char* r, const char* s) { |
| 714 return strncmp(r, s, strlen(r)) == 0; | 739 return strncmp(r, s, strlen(r)) == 0; |
| 715 } | 740 } |
| 716 | 741 |
| 717 | 742 |
| 718 static bool Consume(const char* str, char** buf) { | 743 static bool Consume(const char* str, char** buf) { |
| 719 if (IsStringEqualTo(str, *buf)) { | 744 if (IsStringEqualTo(str, *buf)) { |
| 720 *buf += strlen(str); | 745 *buf += strlen(str); |
| 721 return true; | 746 return true; |
| 722 } | 747 } |
| (...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1169 // Make sure that all log data is written prior crash due to CHECK failure. | 1194 // Make sure that all log data is written prior crash due to CHECK failure. |
| 1170 fflush(stdout); | 1195 fflush(stdout); |
| 1171 CHECK(results_equal); | 1196 CHECK(results_equal); |
| 1172 | 1197 |
| 1173 env->Exit(); | 1198 env->Exit(); |
| 1174 Logger::TearDown(); | 1199 Logger::TearDown(); |
| 1175 i::FLAG_always_compact = saved_always_compact; | 1200 i::FLAG_always_compact = saved_always_compact; |
| 1176 } | 1201 } |
| 1177 | 1202 |
| 1178 #endif // ENABLE_LOGGING_AND_PROFILING | 1203 #endif // ENABLE_LOGGING_AND_PROFILING |
| OLD | NEW |