1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "build/build_config.h"
9 #include "ipc/attachment_broker.h"
10 #include "ipc/brokerable_attachment.h"
11 #include "ipc/ipc_channel_reader.h"
12 #include "testing/gtest/include/gtest/gtest.h"
14 #if USE_ATTACHMENT_BROKER
20 class MockAttachment
: public BrokerableAttachment
{
22 MockAttachment(int internal_state
) : internal_state_(internal_state
) {}
23 MockAttachment(BrokerableAttachment::AttachmentId id
)
24 : BrokerableAttachment(id
, true), internal_state_(-1) {}
26 void PopulateWithAttachment(const BrokerableAttachment
* attachment
) override
{
27 const MockAttachment
* mock_attachment
=
28 static_cast<const MockAttachment
*>(attachment
);
29 internal_state_
= mock_attachment
->internal_state_
;
33 base::PlatformFile
TakePlatformFile() override
{
34 return base::PlatformFile();
38 BrokerableType
GetBrokerableType() const override
{ return WIN_HANDLE
; }
41 ~MockAttachment() override
{}
42 // Internal state differentiates MockAttachments.
46 class MockAttachmentBroker
: public AttachmentBroker
{
48 typedef std::set
<scoped_refptr
<BrokerableAttachment
>> AttachmentSet
;
50 bool SendAttachmentToProcess(const BrokerableAttachment
* attachment
,
51 base::ProcessId destination_process
) override
{
55 bool OnMessageReceived(const Message
& message
) override
{ return false; }
57 void AddAttachment(scoped_refptr
<BrokerableAttachment
> attachment
) {
58 get_attachments()->push_back(attachment
);
59 NotifyObservers(attachment
->GetIdentifier());
63 class MockChannelReader
: public ChannelReader
{
66 : ChannelReader(nullptr), last_dispatched_message_(nullptr) {}
68 ReadState
ReadData(char* buffer
, int buffer_len
, int* bytes_read
) override
{
72 bool ShouldDispatchInputMessage(Message
* msg
) override
{ return true; }
74 bool GetNonBrokeredAttachments(Message
* msg
) override
{ return true; }
76 bool DidEmptyInputBuffers() override
{ return true; }
78 void HandleInternalMessage(const Message
& msg
) override
{}
80 void DispatchMessage(Message
* m
) override
{ last_dispatched_message_
= m
; }
82 base::ProcessId
GetSenderPID() override
{ return base::kNullProcessId
; }
84 bool IsAttachmentBrokerEndpoint() override
{ return false; }
86 AttachmentBroker
* GetAttachmentBroker() override
{ return broker_
; }
88 // This instance takes ownership of |m|.
89 void AddMessageForDispatch(Message
* m
) {
90 get_queued_messages()->push_back(m
);
93 Message
* get_last_dispatched_message() { return last_dispatched_message_
; }
95 void set_broker(AttachmentBroker
* broker
) { broker_
= broker
; }
98 Message
* last_dispatched_message_
;
99 AttachmentBroker
* broker_
;
104 TEST(ChannelReaderTest
, AttachmentAlreadyBrokered
) {
105 MockAttachmentBroker broker
;
106 MockChannelReader reader
;
107 reader
.set_broker(&broker
);
108 scoped_refptr
<MockAttachment
> attachment(new MockAttachment(5));
109 broker
.AddAttachment(attachment
);
111 Message
* m
= new Message
;
112 MockAttachment
* needs_brokering_attachment
=
113 new MockAttachment(attachment
->GetIdentifier());
114 EXPECT_TRUE(m
->WriteAttachment(needs_brokering_attachment
));
115 reader
.AddMessageForDispatch(m
);
116 EXPECT_EQ(ChannelReader::DISPATCH_FINISHED
, reader
.DispatchMessages());
117 EXPECT_EQ(m
, reader
.get_last_dispatched_message());
120 TEST(ChannelReaderTest
, AttachmentNotYetBrokered
) {
121 MockAttachmentBroker broker
;
122 MockChannelReader reader
;
123 reader
.set_broker(&broker
);
124 scoped_refptr
<MockAttachment
> attachment(new MockAttachment(5));
126 Message
* m
= new Message
;
127 MockAttachment
* needs_brokering_attachment
=
128 new MockAttachment(attachment
->GetIdentifier());
129 EXPECT_TRUE(m
->WriteAttachment(needs_brokering_attachment
));
130 reader
.AddMessageForDispatch(m
);
131 EXPECT_EQ(ChannelReader::DISPATCH_WAITING_ON_BROKER
,
132 reader
.DispatchMessages());
133 EXPECT_EQ(nullptr, reader
.get_last_dispatched_message());
135 broker
.AddAttachment(attachment
);
136 EXPECT_EQ(m
, reader
.get_last_dispatched_message());
139 } // namespace internal
141 #endif // USE_ATTACHMENT_BROKER