Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(96)

Side by Side Diff: util/mach/exc_server_variants_test.cc

Issue 775943005: UniversalMachExcServer: eliminate multiple implementation inheritance (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « util/mach/exc_server_variants.cc ('k') | util/mach/exception_ports_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « util/mach/exc_server_variants.cc ('k') | util/mach/exception_ports_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698