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 "ipc/placeholder_brokerable_attachment.h"
13 #include "testing/gtest/include/gtest/gtest.h"
15 #if USE_ATTACHMENT_BROKER
21 class MockAttachment
: public BrokerableAttachment
{
24 MockAttachment(BrokerableAttachment::AttachmentId id
)
25 : BrokerableAttachment(id
) {}
28 base::PlatformFile
TakePlatformFile() override
{
29 return base::PlatformFile();
33 BrokerableType
GetBrokerableType() const override
{ return WIN_HANDLE
; }
36 ~MockAttachment() override
{}
39 class MockAttachmentBroker
: public AttachmentBroker
{
41 typedef std::set
<scoped_refptr
<BrokerableAttachment
>> AttachmentSet
;
43 bool SendAttachmentToProcess(const BrokerableAttachment
* attachment
,
44 base::ProcessId destination_process
) override
{
48 bool OnMessageReceived(const Message
& message
) override
{ return false; }
50 void AddAttachment(scoped_refptr
<BrokerableAttachment
> attachment
) {
51 get_attachments()->push_back(attachment
);
52 NotifyObservers(attachment
->GetIdentifier());
56 class MockChannelReader
: public ChannelReader
{
59 : ChannelReader(nullptr), last_dispatched_message_(nullptr) {}
61 ReadState
ReadData(char* buffer
, int buffer_len
, int* bytes_read
) override
{
65 bool ShouldDispatchInputMessage(Message
* msg
) override
{ return true; }
67 bool GetNonBrokeredAttachments(Message
* msg
) override
{ return true; }
69 bool DidEmptyInputBuffers() override
{ return true; }
71 void HandleInternalMessage(const Message
& msg
) override
{}
73 void DispatchMessage(Message
* m
) override
{ last_dispatched_message_
= m
; }
75 base::ProcessId
GetSenderPID() override
{ return base::kNullProcessId
; }
77 bool IsAttachmentBrokerEndpoint() override
{ return false; }
79 AttachmentBroker
* GetAttachmentBroker() override
{ return broker_
; }
81 // This instance takes ownership of |m|.
82 void AddMessageForDispatch(Message
* m
) {
83 get_queued_messages()->push_back(m
);
86 Message
* get_last_dispatched_message() { return last_dispatched_message_
; }
88 void set_broker(AttachmentBroker
* broker
) { broker_
= broker
; }
91 Message
* last_dispatched_message_
;
92 AttachmentBroker
* broker_
;
97 TEST(ChannelReaderTest
, AttachmentAlreadyBrokered
) {
98 MockAttachmentBroker broker
;
99 MockChannelReader reader
;
100 reader
.set_broker(&broker
);
101 scoped_refptr
<MockAttachment
> attachment(new MockAttachment
);
102 broker
.AddAttachment(attachment
);
104 Message
* m
= new Message
;
105 PlaceholderBrokerableAttachment
* needs_brokering_attachment
=
106 new PlaceholderBrokerableAttachment(attachment
->GetIdentifier());
107 EXPECT_TRUE(m
->WriteAttachment(needs_brokering_attachment
));
108 reader
.AddMessageForDispatch(m
);
109 EXPECT_EQ(ChannelReader::DISPATCH_FINISHED
, reader
.DispatchMessages());
110 EXPECT_EQ(m
, reader
.get_last_dispatched_message());
113 TEST(ChannelReaderTest
, AttachmentNotYetBrokered
) {
114 MockAttachmentBroker broker
;
115 MockChannelReader reader
;
116 reader
.set_broker(&broker
);
117 scoped_refptr
<MockAttachment
> attachment(new MockAttachment
);
119 Message
* m
= new Message
;
120 PlaceholderBrokerableAttachment
* needs_brokering_attachment
=
121 new PlaceholderBrokerableAttachment(attachment
->GetIdentifier());
122 EXPECT_TRUE(m
->WriteAttachment(needs_brokering_attachment
));
123 reader
.AddMessageForDispatch(m
);
124 EXPECT_EQ(ChannelReader::DISPATCH_WAITING_ON_BROKER
,
125 reader
.DispatchMessages());
126 EXPECT_EQ(nullptr, reader
.get_last_dispatched_message());
128 broker
.AddAttachment(attachment
);
129 EXPECT_EQ(m
, reader
.get_last_dispatched_message());
132 } // namespace internal
134 #endif // USE_ATTACHMENT_BROKER