| OLD | NEW |
| 1 // Copyright 2014 The Crashpad Authors. All rights reserved. | 1 // Copyright 2014 The Crashpad Authors. All rights reserved. |
| 2 // | 2 // |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
| 5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
| 6 // | 6 // |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 // | 8 // |
| 9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
| (...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 442 Head.msgh_bits); | 442 Head.msgh_bits); |
| 443 EXPECT_EQ(sizeof(*this), Head.msgh_size); | 443 EXPECT_EQ(sizeof(*this), Head.msgh_size); |
| 444 EXPECT_EQ(kClientRemotePort, Head.msgh_remote_port); | 444 EXPECT_EQ(kClientRemotePort, Head.msgh_remote_port); |
| 445 EXPECT_EQ(kMachPortNull, Head.msgh_local_port); | 445 EXPECT_EQ(kMachPortNull, Head.msgh_local_port); |
| 446 EXPECT_EQ(id + 100, Head.msgh_id); | 446 EXPECT_EQ(id + 100, Head.msgh_id); |
| 447 EXPECT_EQ(0, memcmp(&NDR, &NDR_record, sizeof(NDR))); | 447 EXPECT_EQ(0, memcmp(&NDR, &NDR_record, sizeof(NDR))); |
| 448 EXPECT_EQ(MIG_BAD_ID, RetCode); | 448 EXPECT_EQ(MIG_BAD_ID, RetCode); |
| 449 } | 449 } |
| 450 }; | 450 }; |
| 451 | 451 |
| 452 class MockUniversalMachExcServer : public UniversalMachExcServer { | 452 class MockUniversalMachExcServer : public UniversalMachExcServer::Interface { |
| 453 public: | 453 public: |
| 454 struct ConstExceptionCodes { | 454 struct ConstExceptionCodes { |
| 455 const mach_exception_data_type_t* code; | 455 const mach_exception_data_type_t* code; |
| 456 mach_msg_type_number_t code_count; | 456 mach_msg_type_number_t code_count; |
| 457 }; | 457 }; |
| 458 struct ThreadState { | 458 struct ThreadState { |
| 459 thread_state_t state; | 459 thread_state_t state; |
| 460 mach_msg_type_number_t* state_count; | 460 mach_msg_type_number_t* state_count; |
| 461 }; | 461 }; |
| 462 struct ConstThreadState { | 462 struct ConstThreadState { |
| 463 const natural_t* state; | 463 const natural_t* state; |
| 464 mach_msg_type_number_t* state_count; | 464 mach_msg_type_number_t* state_count; |
| 465 }; | 465 }; |
| 466 | 466 |
| 467 // UniversalMachExcServer::Interface: |
| 468 |
| 467 // CatchMachException is the method to mock, but it has 13 parameters, and | 469 // CatchMachException is the method to mock, but it has 13 parameters, and |
| 468 // gmock can only mock methods with up to 10 parameters. Coalesce some related | 470 // gmock can only mock methods with up to 10 parameters. Coalesce some related |
| 469 // parameters together into structs, and call a mocked method. | 471 // parameters together into structs, and call a mocked method. |
| 470 virtual kern_return_t CatchMachException( | 472 virtual kern_return_t CatchMachException( |
| 471 exception_behavior_t behavior, | 473 exception_behavior_t behavior, |
| 472 exception_handler_t exception_port, | 474 exception_handler_t exception_port, |
| 473 thread_t thread, | 475 thread_t thread, |
| 474 task_t task, | 476 task_t task, |
| 475 exception_type_t exception, | 477 exception_type_t exception, |
| 476 const mach_exception_data_type_t* code, | 478 const mach_exception_data_type_t* code, |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 573 DefaultValue<T>::Set(default_value); | 575 DefaultValue<T>::Set(default_value); |
| 574 } | 576 } |
| 575 | 577 |
| 576 ~ScopedDefaultValue() { DefaultValue<T>::Clear(); } | 578 ~ScopedDefaultValue() { DefaultValue<T>::Clear(); } |
| 577 }; | 579 }; |
| 578 | 580 |
| 579 TEST(ExcServerVariants, MockExceptionRaise) { | 581 TEST(ExcServerVariants, MockExceptionRaise) { |
| 580 ScopedDefaultValue<kern_return_t> default_kern_return_t(KERN_FAILURE); | 582 ScopedDefaultValue<kern_return_t> default_kern_return_t(KERN_FAILURE); |
| 581 | 583 |
| 582 MockUniversalMachExcServer server; | 584 MockUniversalMachExcServer server; |
| 585 UniversalMachExcServer universal_mach_exc_server(&server); |
| 583 | 586 |
| 584 ExceptionRaiseRequest request; | 587 ExceptionRaiseRequest request; |
| 585 EXPECT_LE(request.Head.msgh_size, server.MachMessageServerRequestSize()); | 588 EXPECT_LE(request.Head.msgh_size, |
| 589 universal_mach_exc_server.MachMessageServerRequestSize()); |
| 586 | 590 |
| 587 ExceptionRaiseReply reply; | 591 ExceptionRaiseReply reply; |
| 588 EXPECT_LE(sizeof(reply), server.MachMessageServerReplySize()); | 592 EXPECT_LE(sizeof(reply), |
| 593 universal_mach_exc_server.MachMessageServerReplySize()); |
| 589 | 594 |
| 590 const exception_behavior_t kExceptionBehavior = EXCEPTION_DEFAULT; | 595 const exception_behavior_t kExceptionBehavior = EXCEPTION_DEFAULT; |
| 591 | 596 |
| 592 EXPECT_CALL(server, | 597 EXPECT_CALL(server, |
| 593 MockCatchMachException(kExceptionBehavior, | 598 MockCatchMachException(kExceptionBehavior, |
| 594 kServerLocalPort, | 599 kServerLocalPort, |
| 595 kExceptionThreadPort, | 600 kExceptionThreadPort, |
| 596 kExceptionTaskPort, | 601 kExceptionTaskPort, |
| 597 kExceptionType, | 602 kExceptionType, |
| 598 AreExceptionCodes(kTestExceptonCodes[0], | 603 AreExceptionCodes(kTestExceptonCodes[0], |
| 599 kTestExceptonCodes[1]), | 604 kTestExceptonCodes[1]), |
| 600 Pointee(Eq(THREAD_STATE_NONE)), | 605 Pointee(Eq(THREAD_STATE_NONE)), |
| 601 IsThreadStateCount(0u), | 606 IsThreadStateCount(0u), |
| 602 IsThreadStateCount(0u), | 607 IsThreadStateCount(0u), |
| 603 Eq(&request.trailer))) | 608 Eq(&request.trailer))) |
| 604 .WillOnce(Return(KERN_SUCCESS)) | 609 .WillOnce(Return(KERN_SUCCESS)) |
| 605 .RetiresOnSaturation(); | 610 .RetiresOnSaturation(); |
| 606 | 611 |
| 607 bool destroy_complex_request = false; | 612 bool destroy_complex_request = false; |
| 608 EXPECT_TRUE(server.MachMessageServerFunction( | 613 EXPECT_TRUE(universal_mach_exc_server.MachMessageServerFunction( |
| 609 reinterpret_cast<mach_msg_header_t*>(&request), | 614 reinterpret_cast<mach_msg_header_t*>(&request), |
| 610 reinterpret_cast<mach_msg_header_t*>(&reply), | 615 reinterpret_cast<mach_msg_header_t*>(&reply), |
| 611 &destroy_complex_request)); | 616 &destroy_complex_request)); |
| 612 EXPECT_TRUE(destroy_complex_request); | 617 EXPECT_TRUE(destroy_complex_request); |
| 613 | 618 |
| 614 reply.Verify(kExceptionBehavior); | 619 reply.Verify(kExceptionBehavior); |
| 615 } | 620 } |
| 616 | 621 |
| 617 TEST(ExcServerVariants, MockExceptionRaiseState) { | 622 TEST(ExcServerVariants, MockExceptionRaiseState) { |
| 618 ScopedDefaultValue<kern_return_t> default_kern_return_t(KERN_FAILURE); | 623 ScopedDefaultValue<kern_return_t> default_kern_return_t(KERN_FAILURE); |
| 619 | 624 |
| 620 MockUniversalMachExcServer server; | 625 MockUniversalMachExcServer server; |
| 626 UniversalMachExcServer universal_mach_exc_server(&server); |
| 621 | 627 |
| 622 ExceptionRaiseStateRequest request; | 628 ExceptionRaiseStateRequest request; |
| 623 EXPECT_LE(request.Head.msgh_size, server.MachMessageServerRequestSize()); | 629 EXPECT_LE(request.Head.msgh_size, |
| 630 universal_mach_exc_server.MachMessageServerRequestSize()); |
| 624 | 631 |
| 625 ExceptionRaiseStateReply reply; | 632 ExceptionRaiseStateReply reply; |
| 626 EXPECT_LE(sizeof(reply), server.MachMessageServerReplySize()); | 633 EXPECT_LE(sizeof(reply), |
| 634 universal_mach_exc_server.MachMessageServerReplySize()); |
| 627 | 635 |
| 628 const exception_behavior_t kExceptionBehavior = EXCEPTION_STATE; | 636 const exception_behavior_t kExceptionBehavior = EXCEPTION_STATE; |
| 629 | 637 |
| 630 EXPECT_CALL( | 638 EXPECT_CALL( |
| 631 server, | 639 server, |
| 632 MockCatchMachException( | 640 MockCatchMachException( |
| 633 kExceptionBehavior, | 641 kExceptionBehavior, |
| 634 kServerLocalPort, | 642 kServerLocalPort, |
| 635 THREAD_NULL, | 643 THREAD_NULL, |
| 636 TASK_NULL, | 644 TASK_NULL, |
| 637 kExceptionType, | 645 kExceptionType, |
| 638 AreExceptionCodes(kTestExceptonCodes[0], kTestExceptonCodes[1]), | 646 AreExceptionCodes(kTestExceptonCodes[0], kTestExceptonCodes[1]), |
| 639 Pointee(Eq(kThreadStateFlavor)), | 647 Pointee(Eq(kThreadStateFlavor)), |
| 640 IsThreadStateCount(kThreadStateFlavorCount), | 648 IsThreadStateCount(kThreadStateFlavorCount), |
| 641 IsThreadStateCount(arraysize(reply.new_state)), | 649 IsThreadStateCount(arraysize(reply.new_state)), |
| 642 Eq(request.Trailer()))) | 650 Eq(request.Trailer()))) |
| 643 .WillOnce(Return(KERN_SUCCESS)) | 651 .WillOnce(Return(KERN_SUCCESS)) |
| 644 .RetiresOnSaturation(); | 652 .RetiresOnSaturation(); |
| 645 | 653 |
| 646 bool destroy_complex_request = false; | 654 bool destroy_complex_request = false; |
| 647 EXPECT_TRUE(server.MachMessageServerFunction( | 655 EXPECT_TRUE(universal_mach_exc_server.MachMessageServerFunction( |
| 648 reinterpret_cast<mach_msg_header_t*>(&request), | 656 reinterpret_cast<mach_msg_header_t*>(&request), |
| 649 reinterpret_cast<mach_msg_header_t*>(&reply), | 657 reinterpret_cast<mach_msg_header_t*>(&reply), |
| 650 &destroy_complex_request)); | 658 &destroy_complex_request)); |
| 651 | 659 |
| 652 // The request wasn’t complex, so nothing got a chance to change the value of | 660 // The request wasn’t complex, so nothing got a chance to change the value of |
| 653 // this variable. | 661 // this variable. |
| 654 EXPECT_FALSE(destroy_complex_request); | 662 EXPECT_FALSE(destroy_complex_request); |
| 655 | 663 |
| 656 reply.Verify(kExceptionBehavior); | 664 reply.Verify(kExceptionBehavior); |
| 657 } | 665 } |
| 658 | 666 |
| 659 TEST(ExcServerVariants, MockExceptionRaiseStateIdentity) { | 667 TEST(ExcServerVariants, MockExceptionRaiseStateIdentity) { |
| 660 ScopedDefaultValue<kern_return_t> default_kern_return_t(KERN_FAILURE); | 668 ScopedDefaultValue<kern_return_t> default_kern_return_t(KERN_FAILURE); |
| 661 | 669 |
| 662 MockUniversalMachExcServer server; | 670 MockUniversalMachExcServer server; |
| 671 UniversalMachExcServer universal_mach_exc_server(&server); |
| 663 | 672 |
| 664 ExceptionRaiseStateIdentityRequest request; | 673 ExceptionRaiseStateIdentityRequest request; |
| 665 EXPECT_LE(request.Head.msgh_size, server.MachMessageServerRequestSize()); | 674 EXPECT_LE(request.Head.msgh_size, |
| 675 universal_mach_exc_server.MachMessageServerRequestSize()); |
| 666 | 676 |
| 667 ExceptionRaiseStateIdentityReply reply; | 677 ExceptionRaiseStateIdentityReply reply; |
| 668 EXPECT_LE(sizeof(reply), server.MachMessageServerReplySize()); | 678 EXPECT_LE(sizeof(reply), |
| 679 universal_mach_exc_server.MachMessageServerReplySize()); |
| 669 | 680 |
| 670 const exception_behavior_t kExceptionBehavior = EXCEPTION_STATE_IDENTITY; | 681 const exception_behavior_t kExceptionBehavior = EXCEPTION_STATE_IDENTITY; |
| 671 | 682 |
| 672 EXPECT_CALL( | 683 EXPECT_CALL( |
| 673 server, | 684 server, |
| 674 MockCatchMachException( | 685 MockCatchMachException( |
| 675 kExceptionBehavior, | 686 kExceptionBehavior, |
| 676 kServerLocalPort, | 687 kServerLocalPort, |
| 677 kExceptionThreadPort, | 688 kExceptionThreadPort, |
| 678 kExceptionTaskPort, | 689 kExceptionTaskPort, |
| 679 kExceptionType, | 690 kExceptionType, |
| 680 AreExceptionCodes(kTestExceptonCodes[0], kTestExceptonCodes[1]), | 691 AreExceptionCodes(kTestExceptonCodes[0], kTestExceptonCodes[1]), |
| 681 Pointee(Eq(kThreadStateFlavor)), | 692 Pointee(Eq(kThreadStateFlavor)), |
| 682 IsThreadStateCount(kThreadStateFlavorCount), | 693 IsThreadStateCount(kThreadStateFlavorCount), |
| 683 IsThreadStateCount(arraysize(reply.new_state)), | 694 IsThreadStateCount(arraysize(reply.new_state)), |
| 684 Eq(request.Trailer()))) | 695 Eq(request.Trailer()))) |
| 685 .WillOnce(Return(KERN_SUCCESS)) | 696 .WillOnce(Return(KERN_SUCCESS)) |
| 686 .RetiresOnSaturation(); | 697 .RetiresOnSaturation(); |
| 687 | 698 |
| 688 bool destroy_complex_request = false; | 699 bool destroy_complex_request = false; |
| 689 EXPECT_TRUE(server.MachMessageServerFunction( | 700 EXPECT_TRUE(universal_mach_exc_server.MachMessageServerFunction( |
| 690 reinterpret_cast<mach_msg_header_t*>(&request), | 701 reinterpret_cast<mach_msg_header_t*>(&request), |
| 691 reinterpret_cast<mach_msg_header_t*>(&reply), | 702 reinterpret_cast<mach_msg_header_t*>(&reply), |
| 692 &destroy_complex_request)); | 703 &destroy_complex_request)); |
| 693 EXPECT_TRUE(destroy_complex_request); | 704 EXPECT_TRUE(destroy_complex_request); |
| 694 | 705 |
| 695 reply.Verify(kExceptionBehavior); | 706 reply.Verify(kExceptionBehavior); |
| 696 } | 707 } |
| 697 | 708 |
| 698 TEST(ExcServerVariants, MockMachExceptionRaise) { | 709 TEST(ExcServerVariants, MockMachExceptionRaise) { |
| 699 ScopedDefaultValue<kern_return_t> default_kern_return_t(KERN_FAILURE); | 710 ScopedDefaultValue<kern_return_t> default_kern_return_t(KERN_FAILURE); |
| 700 | 711 |
| 701 MockUniversalMachExcServer server; | 712 MockUniversalMachExcServer server; |
| 713 UniversalMachExcServer universal_mach_exc_server(&server); |
| 702 | 714 |
| 703 MachExceptionRaiseRequest request; | 715 MachExceptionRaiseRequest request; |
| 704 EXPECT_LE(request.Head.msgh_size, server.MachMessageServerRequestSize()); | 716 EXPECT_LE(request.Head.msgh_size, |
| 717 universal_mach_exc_server.MachMessageServerRequestSize()); |
| 705 | 718 |
| 706 MachExceptionRaiseReply reply; | 719 MachExceptionRaiseReply reply; |
| 707 EXPECT_LE(sizeof(reply), server.MachMessageServerReplySize()); | 720 EXPECT_LE(sizeof(reply), |
| 721 universal_mach_exc_server.MachMessageServerReplySize()); |
| 708 | 722 |
| 709 const exception_behavior_t kExceptionBehavior = | 723 const exception_behavior_t kExceptionBehavior = |
| 710 EXCEPTION_DEFAULT | MACH_EXCEPTION_CODES; | 724 EXCEPTION_DEFAULT | MACH_EXCEPTION_CODES; |
| 711 | 725 |
| 712 EXPECT_CALL( | 726 EXPECT_CALL( |
| 713 server, | 727 server, |
| 714 MockCatchMachException(kExceptionBehavior, | 728 MockCatchMachException(kExceptionBehavior, |
| 715 kServerLocalPort, | 729 kServerLocalPort, |
| 716 kExceptionThreadPort, | 730 kExceptionThreadPort, |
| 717 kExceptionTaskPort, | 731 kExceptionTaskPort, |
| 718 kExceptionType, | 732 kExceptionType, |
| 719 AreExceptionCodes(kTestMachExceptionCodes[0], | 733 AreExceptionCodes(kTestMachExceptionCodes[0], |
| 720 kTestMachExceptionCodes[1]), | 734 kTestMachExceptionCodes[1]), |
| 721 Pointee(Eq(THREAD_STATE_NONE)), | 735 Pointee(Eq(THREAD_STATE_NONE)), |
| 722 IsThreadStateCount(0u), | 736 IsThreadStateCount(0u), |
| 723 IsThreadStateCount(0u), | 737 IsThreadStateCount(0u), |
| 724 Eq(&request.trailer))) | 738 Eq(&request.trailer))) |
| 725 .WillOnce(Return(KERN_SUCCESS)) | 739 .WillOnce(Return(KERN_SUCCESS)) |
| 726 .RetiresOnSaturation(); | 740 .RetiresOnSaturation(); |
| 727 | 741 |
| 728 bool destroy_complex_request = false; | 742 bool destroy_complex_request = false; |
| 729 EXPECT_TRUE(server.MachMessageServerFunction( | 743 EXPECT_TRUE(universal_mach_exc_server.MachMessageServerFunction( |
| 730 reinterpret_cast<mach_msg_header_t*>(&request), | 744 reinterpret_cast<mach_msg_header_t*>(&request), |
| 731 reinterpret_cast<mach_msg_header_t*>(&reply), | 745 reinterpret_cast<mach_msg_header_t*>(&reply), |
| 732 &destroy_complex_request)); | 746 &destroy_complex_request)); |
| 733 EXPECT_TRUE(destroy_complex_request); | 747 EXPECT_TRUE(destroy_complex_request); |
| 734 | 748 |
| 735 reply.Verify(kExceptionBehavior); | 749 reply.Verify(kExceptionBehavior); |
| 736 } | 750 } |
| 737 | 751 |
| 738 TEST(ExcServerVariants, MockMachExceptionRaiseState) { | 752 TEST(ExcServerVariants, MockMachExceptionRaiseState) { |
| 739 ScopedDefaultValue<kern_return_t> default_kern_return_t(KERN_FAILURE); | 753 ScopedDefaultValue<kern_return_t> default_kern_return_t(KERN_FAILURE); |
| 740 | 754 |
| 741 MockUniversalMachExcServer server; | 755 MockUniversalMachExcServer server; |
| 756 UniversalMachExcServer universal_mach_exc_server(&server); |
| 742 | 757 |
| 743 MachExceptionRaiseStateRequest request; | 758 MachExceptionRaiseStateRequest request; |
| 744 EXPECT_LE(request.Head.msgh_size, server.MachMessageServerRequestSize()); | 759 EXPECT_LE(request.Head.msgh_size, |
| 760 universal_mach_exc_server.MachMessageServerRequestSize()); |
| 745 | 761 |
| 746 MachExceptionRaiseStateReply reply; | 762 MachExceptionRaiseStateReply reply; |
| 747 EXPECT_LE(sizeof(reply), server.MachMessageServerReplySize()); | 763 EXPECT_LE(sizeof(reply), |
| 764 universal_mach_exc_server.MachMessageServerReplySize()); |
| 748 | 765 |
| 749 const exception_behavior_t kExceptionBehavior = | 766 const exception_behavior_t kExceptionBehavior = |
| 750 EXCEPTION_STATE | MACH_EXCEPTION_CODES; | 767 EXCEPTION_STATE | MACH_EXCEPTION_CODES; |
| 751 | 768 |
| 752 EXPECT_CALL( | 769 EXPECT_CALL( |
| 753 server, | 770 server, |
| 754 MockCatchMachException(kExceptionBehavior, | 771 MockCatchMachException(kExceptionBehavior, |
| 755 kServerLocalPort, | 772 kServerLocalPort, |
| 756 THREAD_NULL, | 773 THREAD_NULL, |
| 757 TASK_NULL, | 774 TASK_NULL, |
| 758 kExceptionType, | 775 kExceptionType, |
| 759 AreExceptionCodes(kTestMachExceptionCodes[0], | 776 AreExceptionCodes(kTestMachExceptionCodes[0], |
| 760 kTestMachExceptionCodes[1]), | 777 kTestMachExceptionCodes[1]), |
| 761 Pointee(Eq(kThreadStateFlavor)), | 778 Pointee(Eq(kThreadStateFlavor)), |
| 762 IsThreadStateCount(kThreadStateFlavorCount), | 779 IsThreadStateCount(kThreadStateFlavorCount), |
| 763 IsThreadStateCount(arraysize(reply.new_state)), | 780 IsThreadStateCount(arraysize(reply.new_state)), |
| 764 Eq(request.Trailer()))) | 781 Eq(request.Trailer()))) |
| 765 .WillOnce(Return(KERN_SUCCESS)) | 782 .WillOnce(Return(KERN_SUCCESS)) |
| 766 .RetiresOnSaturation(); | 783 .RetiresOnSaturation(); |
| 767 | 784 |
| 768 bool destroy_complex_request = false; | 785 bool destroy_complex_request = false; |
| 769 EXPECT_TRUE(server.MachMessageServerFunction( | 786 EXPECT_TRUE(universal_mach_exc_server.MachMessageServerFunction( |
| 770 reinterpret_cast<mach_msg_header_t*>(&request), | 787 reinterpret_cast<mach_msg_header_t*>(&request), |
| 771 reinterpret_cast<mach_msg_header_t*>(&reply), | 788 reinterpret_cast<mach_msg_header_t*>(&reply), |
| 772 &destroy_complex_request)); | 789 &destroy_complex_request)); |
| 773 | 790 |
| 774 // The request wasn’t complex, so nothing got a chance to change the value of | 791 // The request wasn’t complex, so nothing got a chance to change the value of |
| 775 // this variable. | 792 // this variable. |
| 776 EXPECT_FALSE(destroy_complex_request); | 793 EXPECT_FALSE(destroy_complex_request); |
| 777 | 794 |
| 778 reply.Verify(kExceptionBehavior); | 795 reply.Verify(kExceptionBehavior); |
| 779 } | 796 } |
| 780 | 797 |
| 781 TEST(ExcServerVariants, MockMachExceptionRaiseStateIdentity) { | 798 TEST(ExcServerVariants, MockMachExceptionRaiseStateIdentity) { |
| 782 ScopedDefaultValue<kern_return_t> default_kern_return_t(KERN_FAILURE); | 799 ScopedDefaultValue<kern_return_t> default_kern_return_t(KERN_FAILURE); |
| 783 | 800 |
| 784 MockUniversalMachExcServer server; | 801 MockUniversalMachExcServer server; |
| 802 UniversalMachExcServer universal_mach_exc_server(&server); |
| 785 | 803 |
| 786 MachExceptionRaiseStateIdentityRequest request; | 804 MachExceptionRaiseStateIdentityRequest request; |
| 787 EXPECT_LE(request.Head.msgh_size, server.MachMessageServerRequestSize()); | 805 EXPECT_LE(request.Head.msgh_size, |
| 806 universal_mach_exc_server.MachMessageServerRequestSize()); |
| 788 | 807 |
| 789 MachExceptionRaiseStateIdentityReply reply; | 808 MachExceptionRaiseStateIdentityReply reply; |
| 790 EXPECT_LE(sizeof(reply), server.MachMessageServerReplySize()); | 809 EXPECT_LE(sizeof(reply), |
| 810 universal_mach_exc_server.MachMessageServerReplySize()); |
| 791 | 811 |
| 792 const exception_behavior_t kExceptionBehavior = | 812 const exception_behavior_t kExceptionBehavior = |
| 793 EXCEPTION_STATE_IDENTITY | MACH_EXCEPTION_CODES; | 813 EXCEPTION_STATE_IDENTITY | MACH_EXCEPTION_CODES; |
| 794 | 814 |
| 795 EXPECT_CALL( | 815 EXPECT_CALL( |
| 796 server, | 816 server, |
| 797 MockCatchMachException(kExceptionBehavior, | 817 MockCatchMachException(kExceptionBehavior, |
| 798 kServerLocalPort, | 818 kServerLocalPort, |
| 799 kExceptionThreadPort, | 819 kExceptionThreadPort, |
| 800 kExceptionTaskPort, | 820 kExceptionTaskPort, |
| 801 kExceptionType, | 821 kExceptionType, |
| 802 AreExceptionCodes(kTestMachExceptionCodes[0], | 822 AreExceptionCodes(kTestMachExceptionCodes[0], |
| 803 kTestMachExceptionCodes[1]), | 823 kTestMachExceptionCodes[1]), |
| 804 Pointee(Eq(kThreadStateFlavor)), | 824 Pointee(Eq(kThreadStateFlavor)), |
| 805 IsThreadStateCount(kThreadStateFlavorCount), | 825 IsThreadStateCount(kThreadStateFlavorCount), |
| 806 IsThreadStateCount(arraysize(reply.new_state)), | 826 IsThreadStateCount(arraysize(reply.new_state)), |
| 807 Eq(request.Trailer()))) | 827 Eq(request.Trailer()))) |
| 808 .WillOnce(Return(KERN_SUCCESS)) | 828 .WillOnce(Return(KERN_SUCCESS)) |
| 809 .RetiresOnSaturation(); | 829 .RetiresOnSaturation(); |
| 810 | 830 |
| 811 bool destroy_complex_request = false; | 831 bool destroy_complex_request = false; |
| 812 EXPECT_TRUE(server.MachMessageServerFunction( | 832 EXPECT_TRUE(universal_mach_exc_server.MachMessageServerFunction( |
| 813 reinterpret_cast<mach_msg_header_t*>(&request), | 833 reinterpret_cast<mach_msg_header_t*>(&request), |
| 814 reinterpret_cast<mach_msg_header_t*>(&reply), | 834 reinterpret_cast<mach_msg_header_t*>(&reply), |
| 815 &destroy_complex_request)); | 835 &destroy_complex_request)); |
| 816 EXPECT_TRUE(destroy_complex_request); | 836 EXPECT_TRUE(destroy_complex_request); |
| 817 | 837 |
| 818 reply.Verify(kExceptionBehavior); | 838 reply.Verify(kExceptionBehavior); |
| 819 } | 839 } |
| 820 | 840 |
| 821 TEST(ExcServerVariants, MockUnknownID) { | 841 TEST(ExcServerVariants, MockUnknownID) { |
| 822 ScopedDefaultValue<kern_return_t> default_kern_return_t(KERN_FAILURE); | 842 ScopedDefaultValue<kern_return_t> default_kern_return_t(KERN_FAILURE); |
| 823 | 843 |
| 824 MockUniversalMachExcServer server; | 844 MockUniversalMachExcServer server; |
| 845 UniversalMachExcServer universal_mach_exc_server(&server); |
| 825 | 846 |
| 826 // Make sure that a message with an unknown ID is handled appropriately. | 847 // Make sure that a message with an unknown ID is handled appropriately. |
| 827 // UniversalMachExcServer should not dispatch the message to | 848 // UniversalMachExcServer should not dispatch the message to |
| 828 // MachMessageServerFunction, but should generate a MIG_BAD_ID error reply. | 849 // MachMessageServerFunction, but should generate a MIG_BAD_ID error reply. |
| 829 | 850 |
| 830 const mach_msg_id_t unknown_ids[] = { | 851 const mach_msg_id_t unknown_ids[] = { |
| 831 // Reasonable things to check. | 852 // Reasonable things to check. |
| 832 -101, | 853 -101, |
| 833 -100, | 854 -100, |
| 834 -99, | 855 -99, |
| (...skipping 20 matching lines...) Expand all Loading... |
| 855 2507, | 876 2507, |
| 856 2508, | 877 2508, |
| 857 }; | 878 }; |
| 858 | 879 |
| 859 for (size_t index = 0; index < arraysize(unknown_ids); ++index) { | 880 for (size_t index = 0; index < arraysize(unknown_ids); ++index) { |
| 860 mach_msg_id_t id = unknown_ids[index]; | 881 mach_msg_id_t id = unknown_ids[index]; |
| 861 | 882 |
| 862 SCOPED_TRACE(base::StringPrintf("unknown id %d", id)); | 883 SCOPED_TRACE(base::StringPrintf("unknown id %d", id)); |
| 863 | 884 |
| 864 InvalidRequest request(id); | 885 InvalidRequest request(id); |
| 865 EXPECT_LE(sizeof(request), server.MachMessageServerRequestSize()); | 886 EXPECT_LE(sizeof(request), |
| 887 universal_mach_exc_server.MachMessageServerRequestSize()); |
| 866 | 888 |
| 867 BadIDErrorReply reply; | 889 BadIDErrorReply reply; |
| 868 EXPECT_LE(sizeof(reply), server.MachMessageServerReplySize()); | 890 EXPECT_LE(sizeof(reply), |
| 891 universal_mach_exc_server.MachMessageServerReplySize()); |
| 869 | 892 |
| 870 bool destroy_complex_request = false; | 893 bool destroy_complex_request = false; |
| 871 EXPECT_FALSE(server.MachMessageServerFunction( | 894 EXPECT_FALSE(universal_mach_exc_server.MachMessageServerFunction( |
| 872 reinterpret_cast<mach_msg_header_t*>(&request), | 895 reinterpret_cast<mach_msg_header_t*>(&request), |
| 873 reinterpret_cast<mach_msg_header_t*>(&reply), | 896 reinterpret_cast<mach_msg_header_t*>(&reply), |
| 874 &destroy_complex_request)); | 897 &destroy_complex_request)); |
| 875 | 898 |
| 876 // The request wasn’t handled, nothing got a chance to change the value of | 899 // The request wasn’t handled, nothing got a chance to change the value of |
| 877 // this variable. MachMessageServer would destroy the request if it was | 900 // this variable. MachMessageServer would destroy the request if it was |
| 878 // complex, regardless of what was done to this variable, because the | 901 // complex, regardless of what was done to this variable, because the |
| 879 // return code was not KERN_SUCCESS or MIG_NO_REPLY. | 902 // return code was not KERN_SUCCESS or MIG_NO_REPLY. |
| 880 EXPECT_FALSE(destroy_complex_request); | 903 EXPECT_FALSE(destroy_complex_request); |
| 881 | 904 |
| 882 reply.Verify(id); | 905 reply.Verify(id); |
| 883 } | 906 } |
| 884 } | 907 } |
| 885 | 908 |
| 886 class TestExcServerVariants : public UniversalMachExcServer, | 909 class TestExcServerVariants : public MachMultiprocess, |
| 887 public MachMultiprocess { | 910 public UniversalMachExcServer::Interface { |
| 888 public: | 911 public: |
| 889 TestExcServerVariants(exception_behavior_t behavior, | 912 TestExcServerVariants(exception_behavior_t behavior, |
| 890 thread_state_flavor_t flavor, | 913 thread_state_flavor_t flavor, |
| 891 mach_msg_type_number_t state_count) | 914 mach_msg_type_number_t state_count) |
| 892 : UniversalMachExcServer(), | 915 : MachMultiprocess(), |
| 893 MachMultiprocess(), | 916 UniversalMachExcServer::Interface(), |
| 894 behavior_(behavior), | 917 behavior_(behavior), |
| 895 flavor_(flavor), | 918 flavor_(flavor), |
| 896 state_count_(state_count), | 919 state_count_(state_count), |
| 897 handled_(false) {} | 920 handled_(false) {} |
| 898 | 921 |
| 899 // UniversalMachExcServer: | 922 // UniversalMachExcServer::Interface: |
| 900 | 923 |
| 901 virtual kern_return_t CatchMachException( | 924 virtual kern_return_t CatchMachException( |
| 902 exception_behavior_t behavior, | 925 exception_behavior_t behavior, |
| 903 exception_handler_t exception_port, | 926 exception_handler_t exception_port, |
| 904 thread_t thread, | 927 thread_t thread, |
| 905 task_t task, | 928 task_t task, |
| 906 exception_type_t exception, | 929 exception_type_t exception, |
| 907 const mach_exception_data_type_t* code, | 930 const mach_exception_data_type_t* code, |
| 908 mach_msg_type_number_t code_count, | 931 mach_msg_type_number_t code_count, |
| 909 thread_state_flavor_t* flavor, | 932 thread_state_flavor_t* flavor, |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 963 EXPECT_EQ(REQUESTED_TRAILER_SIZE(kMachMessageOptions), | 986 EXPECT_EQ(REQUESTED_TRAILER_SIZE(kMachMessageOptions), |
| 964 trailer->msgh_trailer_size); | 987 trailer->msgh_trailer_size); |
| 965 | 988 |
| 966 return ExcServerSuccessfulReturnValue(behavior, false); | 989 return ExcServerSuccessfulReturnValue(behavior, false); |
| 967 } | 990 } |
| 968 | 991 |
| 969 private: | 992 private: |
| 970 // MachMultiprocess: | 993 // MachMultiprocess: |
| 971 | 994 |
| 972 void MachMultiprocessParent() override { | 995 void MachMultiprocessParent() override { |
| 996 UniversalMachExcServer universal_mach_exc_server(this); |
| 997 |
| 973 kern_return_t kr = | 998 kern_return_t kr = |
| 974 MachMessageServer::Run(this, | 999 MachMessageServer::Run(&universal_mach_exc_server, |
| 975 LocalPort(), | 1000 LocalPort(), |
| 976 kMachMessageOptions, | 1001 kMachMessageOptions, |
| 977 MachMessageServer::kOneShot, | 1002 MachMessageServer::kOneShot, |
| 978 MachMessageServer::kBlocking, | 1003 MachMessageServer::kBlocking, |
| 979 MachMessageServer::kReceiveLargeError, | 1004 MachMessageServer::kReceiveLargeError, |
| 980 0); | 1005 0); |
| 981 EXPECT_EQ(KERN_SUCCESS, kr) | 1006 EXPECT_EQ(KERN_SUCCESS, kr) |
| 982 << MachErrorMessage(kr, "MachMessageServer::Run"); | 1007 << MachErrorMessage(kr, "MachMessageServer::Run"); |
| 983 | 1008 |
| 984 EXPECT_TRUE(handled_); | 1009 EXPECT_TRUE(handled_); |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1201 | 1226 |
| 1202 EXPECT_EQ(test_data.kr, | 1227 EXPECT_EQ(test_data.kr, |
| 1203 ExcServerSuccessfulReturnValue(test_data.behavior, | 1228 ExcServerSuccessfulReturnValue(test_data.behavior, |
| 1204 test_data.set_thread_state)); | 1229 test_data.set_thread_state)); |
| 1205 } | 1230 } |
| 1206 } | 1231 } |
| 1207 | 1232 |
| 1208 } // namespace | 1233 } // namespace |
| 1209 } // namespace test | 1234 } // namespace test |
| 1210 } // namespace crashpad | 1235 } // namespace crashpad |
| OLD | NEW |