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

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

Issue 1058523002: Add ConstThreadState to mach_extensions.h and use it everywhere (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: clang-unformat Created 5 years, 8 months 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,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and 12 // See the License for the specific language governing permissions and
13 // limitations under the License. 13 // limitations under the License.
14 14
15 #include "util/mach/exc_server_variants.h" 15 #include "util/mach/exc_server_variants.h"
16 16
17 #include <mach/mach.h> 17 #include <mach/mach.h>
18 #include <signal.h> 18 #include <signal.h>
19 #include <string.h> 19 #include <string.h>
20 20
21 #include "base/strings/stringprintf.h" 21 #include "base/strings/stringprintf.h"
22 #include "gmock/gmock.h" 22 #include "gmock/gmock.h"
23 #include "gtest/gtest.h" 23 #include "gtest/gtest.h"
24 #include "test/mac/mach_errors.h" 24 #include "test/mac/mach_errors.h"
25 #include "test/mac/mach_multiprocess.h" 25 #include "test/mac/mach_multiprocess.h"
26 #include "util/mach/exception_behaviors.h" 26 #include "util/mach/exception_behaviors.h"
27 #include "util/mach/mach_extensions.h"
28 #include "util/mach/mach_message.h" 27 #include "util/mach/mach_message.h"
29 28
30 namespace crashpad { 29 namespace crashpad {
31 namespace test { 30 namespace test {
32 namespace { 31 namespace {
33 32
34 using testing::DefaultValue; 33 using testing::DefaultValue;
35 using testing::Eq; 34 using testing::Eq;
36 using testing::Pointee; 35 using testing::Pointee;
37 using testing::Return; 36 using testing::Return;
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after
448 EXPECT_EQ(MIG_BAD_ID, RetCode); 447 EXPECT_EQ(MIG_BAD_ID, RetCode);
449 } 448 }
450 }; 449 };
451 450
452 class MockUniversalMachExcServer : public UniversalMachExcServer::Interface { 451 class MockUniversalMachExcServer : public UniversalMachExcServer::Interface {
453 public: 452 public:
454 struct ConstExceptionCodes { 453 struct ConstExceptionCodes {
455 const mach_exception_data_type_t* code; 454 const mach_exception_data_type_t* code;
456 mach_msg_type_number_t code_count; 455 mach_msg_type_number_t code_count;
457 }; 456 };
458 struct ThreadState { 457 struct ThreadStateAndCount {
459 thread_state_t state; 458 thread_state_t state;
460 mach_msg_type_number_t* state_count; 459 mach_msg_type_number_t* state_count;
461 }; 460 };
462 struct ConstThreadState { 461 struct ConstThreadStateAndCount {
463 const natural_t* state; 462 ConstThreadState state;
464 mach_msg_type_number_t* state_count; 463 mach_msg_type_number_t* state_count;
465 }; 464 };
466 465
467 // UniversalMachExcServer::Interface: 466 // UniversalMachExcServer::Interface:
468 467
469 // CatchMachException is the method to mock, but it has 13 parameters, and 468 // CatchMachException is the method to mock, but it has 13 parameters, and
470 // gmock can only mock methods with up to 10 parameters. Coalesce some related 469 // gmock can only mock methods with up to 10 parameters. Coalesce some related
471 // parameters together into structs, and call a mocked method. 470 // parameters together into structs, and call a mocked method.
472 virtual kern_return_t CatchMachException( 471 virtual kern_return_t CatchMachException(
473 exception_behavior_t behavior, 472 exception_behavior_t behavior,
474 exception_handler_t exception_port, 473 exception_handler_t exception_port,
475 thread_t thread, 474 thread_t thread,
476 task_t task, 475 task_t task,
477 exception_type_t exception, 476 exception_type_t exception,
478 const mach_exception_data_type_t* code, 477 const mach_exception_data_type_t* code,
479 mach_msg_type_number_t code_count, 478 mach_msg_type_number_t code_count,
480 thread_state_flavor_t* flavor, 479 thread_state_flavor_t* flavor,
481 const natural_t* old_state, 480 ConstThreadState old_state,
482 mach_msg_type_number_t old_state_count, 481 mach_msg_type_number_t old_state_count,
483 thread_state_t new_state, 482 thread_state_t new_state,
484 mach_msg_type_number_t* new_state_count, 483 mach_msg_type_number_t* new_state_count,
485 const mach_msg_trailer_t* trailer, 484 const mach_msg_trailer_t* trailer,
486 bool* destroy_complex_request) override { 485 bool* destroy_complex_request) override {
487 *destroy_complex_request = true; 486 *destroy_complex_request = true;
488 const ConstExceptionCodes exception_codes = {code, code_count}; 487 const ConstExceptionCodes exception_codes = {code, code_count};
489 const ConstThreadState old_thread_state = {old_state, &old_state_count}; 488 const ConstThreadStateAndCount old_thread_state = {old_state,
490 ThreadState new_thread_state = {new_state, new_state_count}; 489 &old_state_count};
490 ThreadStateAndCount new_thread_state = {new_state, new_state_count};
491 return MockCatchMachException(behavior, 491 return MockCatchMachException(behavior,
492 exception_port, 492 exception_port,
493 thread, 493 thread,
494 task, 494 task,
495 exception, 495 exception,
496 &exception_codes, 496 &exception_codes,
497 flavor, 497 flavor,
498 &old_thread_state, 498 &old_thread_state,
499 &new_thread_state, 499 &new_thread_state,
500 trailer); 500 trailer);
501 } 501 }
502 502
503 MOCK_METHOD10(MockCatchMachException, 503 MOCK_METHOD10(MockCatchMachException,
504 kern_return_t(exception_behavior_t behavior, 504 kern_return_t(exception_behavior_t behavior,
505 exception_handler_t exception_port, 505 exception_handler_t exception_port,
506 thread_t thread, 506 thread_t thread,
507 task_t task, 507 task_t task,
508 exception_type_t exception, 508 exception_type_t exception,
509 const ConstExceptionCodes* exception_codes, 509 const ConstExceptionCodes* exception_codes,
510 thread_state_flavor_t* flavor, 510 thread_state_flavor_t* flavor,
511 const ConstThreadState* old_thread_state, 511 const ConstThreadStateAndCount* old_thread_state,
512 ThreadState* new_thread_state, 512 ThreadStateAndCount* new_thread_state,
513 const mach_msg_trailer_t* trailer)); 513 const mach_msg_trailer_t* trailer));
514 }; 514 };
515 515
516 // Matcher for ConstExceptionCodes, testing that it carries 2 codes matching 516 // Matcher for ConstExceptionCodes, testing that it carries 2 codes matching
517 // code_0 and code_1. 517 // code_0 and code_1.
518 MATCHER_P2(AreExceptionCodes, code_0, code_1, "") { 518 MATCHER_P2(AreExceptionCodes, code_0, code_1, "") {
519 if (!arg) { 519 if (!arg) {
520 return false; 520 return false;
521 } 521 }
522 522
523 if (arg->code_count == 2 && arg->code[0] == code_0 && 523 if (arg->code_count == 2 && arg->code[0] == code_0 &&
524 arg->code[1] == code_1) { 524 arg->code[1] == code_1) {
525 return true; 525 return true;
526 } 526 }
527 527
528 *result_listener << "codes ("; 528 *result_listener << "codes (";
529 for (size_t index = 0; index < arg->code_count; ++index) { 529 for (size_t index = 0; index < arg->code_count; ++index) {
530 *result_listener << arg->code[index]; 530 *result_listener << arg->code[index];
531 if (index < arg->code_count - 1) { 531 if (index < arg->code_count - 1) {
532 *result_listener << ", "; 532 *result_listener << ", ";
533 } 533 }
534 } 534 }
535 *result_listener << ")"; 535 *result_listener << ")";
536 536
537 return false; 537 return false;
538 } 538 }
539 539
540 // Matcher for ThreadState and ConstThreadState, testing that *state_count is 540 // Matcher for ThreadStateAndCount and ConstThreadStateAndCount, testing that
541 // present and matches the specified value. If 0 is specified for the count, 541 // *state_count is present and matches the specified value. If 0 is specified
542 // |state| must be nullptr (not present), otherwise |state| must not be nullptr 542 // for the count, |state| must be nullptr (not present), otherwise |state| must
543 // (present). 543 // not be nullptr (present).
544 MATCHER_P(IsThreadStateCount, state_count, "") { 544 MATCHER_P(IsThreadStateAndCount, state_count, "") {
545 if (!arg) { 545 if (!arg) {
546 return false; 546 return false;
547 } 547 }
548 if (!arg->state_count) { 548 if (!arg->state_count) {
549 *result_listener << "state_count nullptr"; 549 *result_listener << "state_count nullptr";
550 return false; 550 return false;
551 } 551 }
552 if (*(arg->state_count) != state_count) { 552 if (*(arg->state_count) != state_count) {
553 *result_listener << "*state_count " << *(arg->state_count); 553 *result_listener << "*state_count " << *(arg->state_count);
554 return false; 554 return false;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
600 600
601 EXPECT_CALL(server, 601 EXPECT_CALL(server,
602 MockCatchMachException(kExceptionBehavior, 602 MockCatchMachException(kExceptionBehavior,
603 kServerLocalPort, 603 kServerLocalPort,
604 kExceptionThreadPort, 604 kExceptionThreadPort,
605 kExceptionTaskPort, 605 kExceptionTaskPort,
606 kExceptionType, 606 kExceptionType,
607 AreExceptionCodes(kTestExceptonCodes[0], 607 AreExceptionCodes(kTestExceptonCodes[0],
608 kTestExceptonCodes[1]), 608 kTestExceptonCodes[1]),
609 Pointee(Eq(THREAD_STATE_NONE)), 609 Pointee(Eq(THREAD_STATE_NONE)),
610 IsThreadStateCount(0u), 610 IsThreadStateAndCount(0u),
611 IsThreadStateCount(0u), 611 IsThreadStateAndCount(0u),
612 Eq(&request.trailer))) 612 Eq(&request.trailer)))
613 .WillOnce(Return(KERN_SUCCESS)) 613 .WillOnce(Return(KERN_SUCCESS))
614 .RetiresOnSaturation(); 614 .RetiresOnSaturation();
615 615
616 bool destroy_complex_request = false; 616 bool destroy_complex_request = false;
617 EXPECT_TRUE(universal_mach_exc_server.MachMessageServerFunction( 617 EXPECT_TRUE(universal_mach_exc_server.MachMessageServerFunction(
618 reinterpret_cast<mach_msg_header_t*>(&request), 618 reinterpret_cast<mach_msg_header_t*>(&request),
619 reinterpret_cast<mach_msg_header_t*>(&reply), 619 reinterpret_cast<mach_msg_header_t*>(&reply),
620 &destroy_complex_request)); 620 &destroy_complex_request));
621 EXPECT_TRUE(destroy_complex_request); 621 EXPECT_TRUE(destroy_complex_request);
(...skipping 24 matching lines...) Expand all
646 EXPECT_CALL( 646 EXPECT_CALL(
647 server, 647 server,
648 MockCatchMachException( 648 MockCatchMachException(
649 kExceptionBehavior, 649 kExceptionBehavior,
650 kServerLocalPort, 650 kServerLocalPort,
651 THREAD_NULL, 651 THREAD_NULL,
652 TASK_NULL, 652 TASK_NULL,
653 kExceptionType, 653 kExceptionType,
654 AreExceptionCodes(kTestExceptonCodes[0], kTestExceptonCodes[1]), 654 AreExceptionCodes(kTestExceptonCodes[0], kTestExceptonCodes[1]),
655 Pointee(Eq(kThreadStateFlavor)), 655 Pointee(Eq(kThreadStateFlavor)),
656 IsThreadStateCount(kThreadStateFlavorCount), 656 IsThreadStateAndCount(kThreadStateFlavorCount),
657 IsThreadStateCount(arraysize(reply.new_state)), 657 IsThreadStateAndCount(arraysize(reply.new_state)),
658 Eq(request.Trailer()))) 658 Eq(request.Trailer())))
659 .WillOnce(Return(KERN_SUCCESS)) 659 .WillOnce(Return(KERN_SUCCESS))
660 .RetiresOnSaturation(); 660 .RetiresOnSaturation();
661 661
662 bool destroy_complex_request = false; 662 bool destroy_complex_request = false;
663 EXPECT_TRUE(universal_mach_exc_server.MachMessageServerFunction( 663 EXPECT_TRUE(universal_mach_exc_server.MachMessageServerFunction(
664 reinterpret_cast<mach_msg_header_t*>(&request), 664 reinterpret_cast<mach_msg_header_t*>(&request),
665 reinterpret_cast<mach_msg_header_t*>(&reply), 665 reinterpret_cast<mach_msg_header_t*>(&reply),
666 &destroy_complex_request)); 666 &destroy_complex_request));
667 667
(...skipping 27 matching lines...) Expand all
695 EXPECT_CALL( 695 EXPECT_CALL(
696 server, 696 server,
697 MockCatchMachException( 697 MockCatchMachException(
698 kExceptionBehavior, 698 kExceptionBehavior,
699 kServerLocalPort, 699 kServerLocalPort,
700 kExceptionThreadPort, 700 kExceptionThreadPort,
701 kExceptionTaskPort, 701 kExceptionTaskPort,
702 kExceptionType, 702 kExceptionType,
703 AreExceptionCodes(kTestExceptonCodes[0], kTestExceptonCodes[1]), 703 AreExceptionCodes(kTestExceptonCodes[0], kTestExceptonCodes[1]),
704 Pointee(Eq(kThreadStateFlavor)), 704 Pointee(Eq(kThreadStateFlavor)),
705 IsThreadStateCount(kThreadStateFlavorCount), 705 IsThreadStateAndCount(kThreadStateFlavorCount),
706 IsThreadStateCount(arraysize(reply.new_state)), 706 IsThreadStateAndCount(arraysize(reply.new_state)),
707 Eq(request.Trailer()))) 707 Eq(request.Trailer())))
708 .WillOnce(Return(KERN_SUCCESS)) 708 .WillOnce(Return(KERN_SUCCESS))
709 .RetiresOnSaturation(); 709 .RetiresOnSaturation();
710 710
711 bool destroy_complex_request = false; 711 bool destroy_complex_request = false;
712 EXPECT_TRUE(universal_mach_exc_server.MachMessageServerFunction( 712 EXPECT_TRUE(universal_mach_exc_server.MachMessageServerFunction(
713 reinterpret_cast<mach_msg_header_t*>(&request), 713 reinterpret_cast<mach_msg_header_t*>(&request),
714 reinterpret_cast<mach_msg_header_t*>(&reply), 714 reinterpret_cast<mach_msg_header_t*>(&reply),
715 &destroy_complex_request)); 715 &destroy_complex_request));
716 EXPECT_TRUE(destroy_complex_request); 716 EXPECT_TRUE(destroy_complex_request);
(...skipping 25 matching lines...) Expand all
742 EXPECT_CALL( 742 EXPECT_CALL(
743 server, 743 server,
744 MockCatchMachException(kExceptionBehavior, 744 MockCatchMachException(kExceptionBehavior,
745 kServerLocalPort, 745 kServerLocalPort,
746 kExceptionThreadPort, 746 kExceptionThreadPort,
747 kExceptionTaskPort, 747 kExceptionTaskPort,
748 kExceptionType, 748 kExceptionType,
749 AreExceptionCodes(kTestMachExceptionCodes[0], 749 AreExceptionCodes(kTestMachExceptionCodes[0],
750 kTestMachExceptionCodes[1]), 750 kTestMachExceptionCodes[1]),
751 Pointee(Eq(THREAD_STATE_NONE)), 751 Pointee(Eq(THREAD_STATE_NONE)),
752 IsThreadStateCount(0u), 752 IsThreadStateAndCount(0u),
753 IsThreadStateCount(0u), 753 IsThreadStateAndCount(0u),
754 Eq(&request.trailer))) 754 Eq(&request.trailer)))
755 .WillOnce(Return(KERN_SUCCESS)) 755 .WillOnce(Return(KERN_SUCCESS))
756 .RetiresOnSaturation(); 756 .RetiresOnSaturation();
757 757
758 bool destroy_complex_request = false; 758 bool destroy_complex_request = false;
759 EXPECT_TRUE(universal_mach_exc_server.MachMessageServerFunction( 759 EXPECT_TRUE(universal_mach_exc_server.MachMessageServerFunction(
760 reinterpret_cast<mach_msg_header_t*>(&request), 760 reinterpret_cast<mach_msg_header_t*>(&request),
761 reinterpret_cast<mach_msg_header_t*>(&reply), 761 reinterpret_cast<mach_msg_header_t*>(&reply),
762 &destroy_complex_request)); 762 &destroy_complex_request));
763 EXPECT_TRUE(destroy_complex_request); 763 EXPECT_TRUE(destroy_complex_request);
(...skipping 25 matching lines...) Expand all
789 EXPECT_CALL( 789 EXPECT_CALL(
790 server, 790 server,
791 MockCatchMachException(kExceptionBehavior, 791 MockCatchMachException(kExceptionBehavior,
792 kServerLocalPort, 792 kServerLocalPort,
793 THREAD_NULL, 793 THREAD_NULL,
794 TASK_NULL, 794 TASK_NULL,
795 kExceptionType, 795 kExceptionType,
796 AreExceptionCodes(kTestMachExceptionCodes[0], 796 AreExceptionCodes(kTestMachExceptionCodes[0],
797 kTestMachExceptionCodes[1]), 797 kTestMachExceptionCodes[1]),
798 Pointee(Eq(kThreadStateFlavor)), 798 Pointee(Eq(kThreadStateFlavor)),
799 IsThreadStateCount(kThreadStateFlavorCount), 799 IsThreadStateAndCount(kThreadStateFlavorCount),
800 IsThreadStateCount(arraysize(reply.new_state)), 800 IsThreadStateAndCount(arraysize(reply.new_state)),
801 Eq(request.Trailer()))) 801 Eq(request.Trailer())))
802 .WillOnce(Return(KERN_SUCCESS)) 802 .WillOnce(Return(KERN_SUCCESS))
803 .RetiresOnSaturation(); 803 .RetiresOnSaturation();
804 804
805 bool destroy_complex_request = false; 805 bool destroy_complex_request = false;
806 EXPECT_TRUE(universal_mach_exc_server.MachMessageServerFunction( 806 EXPECT_TRUE(universal_mach_exc_server.MachMessageServerFunction(
807 reinterpret_cast<mach_msg_header_t*>(&request), 807 reinterpret_cast<mach_msg_header_t*>(&request),
808 reinterpret_cast<mach_msg_header_t*>(&reply), 808 reinterpret_cast<mach_msg_header_t*>(&reply),
809 &destroy_complex_request)); 809 &destroy_complex_request));
810 810
(...skipping 28 matching lines...) Expand all
839 EXPECT_CALL( 839 EXPECT_CALL(
840 server, 840 server,
841 MockCatchMachException(kExceptionBehavior, 841 MockCatchMachException(kExceptionBehavior,
842 kServerLocalPort, 842 kServerLocalPort,
843 kExceptionThreadPort, 843 kExceptionThreadPort,
844 kExceptionTaskPort, 844 kExceptionTaskPort,
845 kExceptionType, 845 kExceptionType,
846 AreExceptionCodes(kTestMachExceptionCodes[0], 846 AreExceptionCodes(kTestMachExceptionCodes[0],
847 kTestMachExceptionCodes[1]), 847 kTestMachExceptionCodes[1]),
848 Pointee(Eq(kThreadStateFlavor)), 848 Pointee(Eq(kThreadStateFlavor)),
849 IsThreadStateCount(kThreadStateFlavorCount), 849 IsThreadStateAndCount(kThreadStateFlavorCount),
850 IsThreadStateCount(arraysize(reply.new_state)), 850 IsThreadStateAndCount(arraysize(reply.new_state)),
851 Eq(request.Trailer()))) 851 Eq(request.Trailer())))
852 .WillOnce(Return(KERN_SUCCESS)) 852 .WillOnce(Return(KERN_SUCCESS))
853 .RetiresOnSaturation(); 853 .RetiresOnSaturation();
854 854
855 bool destroy_complex_request = false; 855 bool destroy_complex_request = false;
856 EXPECT_TRUE(universal_mach_exc_server.MachMessageServerFunction( 856 EXPECT_TRUE(universal_mach_exc_server.MachMessageServerFunction(
857 reinterpret_cast<mach_msg_header_t*>(&request), 857 reinterpret_cast<mach_msg_header_t*>(&request),
858 reinterpret_cast<mach_msg_header_t*>(&reply), 858 reinterpret_cast<mach_msg_header_t*>(&reply),
859 &destroy_complex_request)); 859 &destroy_complex_request));
860 EXPECT_TRUE(destroy_complex_request); 860 EXPECT_TRUE(destroy_complex_request);
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
969 969
970 virtual kern_return_t CatchMachException( 970 virtual kern_return_t CatchMachException(
971 exception_behavior_t behavior, 971 exception_behavior_t behavior,
972 exception_handler_t exception_port, 972 exception_handler_t exception_port,
973 thread_t thread, 973 thread_t thread,
974 task_t task, 974 task_t task,
975 exception_type_t exception, 975 exception_type_t exception,
976 const mach_exception_data_type_t* code, 976 const mach_exception_data_type_t* code,
977 mach_msg_type_number_t code_count, 977 mach_msg_type_number_t code_count,
978 thread_state_flavor_t* flavor, 978 thread_state_flavor_t* flavor,
979 const natural_t* old_state, 979 ConstThreadState old_state,
980 mach_msg_type_number_t old_state_count, 980 mach_msg_type_number_t old_state_count,
981 thread_state_t new_state, 981 thread_state_t new_state,
982 mach_msg_type_number_t* new_state_count, 982 mach_msg_type_number_t* new_state_count,
983 const mach_msg_trailer_t* trailer, 983 const mach_msg_trailer_t* trailer,
984 bool* destroy_complex_request) override { 984 bool* destroy_complex_request) override {
985 *destroy_complex_request = true; 985 *destroy_complex_request = true;
986 986
987 EXPECT_FALSE(handled_); 987 EXPECT_FALSE(handled_);
988 handled_ = true; 988 handled_ = true;
989 989
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after
1348 EXPECT_EQ(old_state[i], new_state[i]) << "i " << i; 1348 EXPECT_EQ(old_state[i], new_state[i]) << "i " << i;
1349 } 1349 }
1350 for (size_t i = arraysize(old_state); i < arraysize(new_state); ++i) { 1350 for (size_t i = arraysize(old_state); i < arraysize(new_state); ++i) {
1351 EXPECT_EQ(0u, new_state[i]) << "i " << i; 1351 EXPECT_EQ(0u, new_state[i]) << "i " << i;
1352 } 1352 }
1353 } 1353 }
1354 1354
1355 } // namespace 1355 } // namespace
1356 } // namespace test 1356 } // namespace test
1357 } // namespace crashpad 1357 } // 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