15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_test_sink.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ipc/ipc_listener.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_message.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestSink::TestSink() {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestSink::~TestSink() {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestSink::Send(Message* message) {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnMessageReceived(*message);
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete message;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool TestSink::Connect() {
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  NOTIMPLEMENTED();
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return false;
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void TestSink::Close() {
3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  NOTIMPLEMENTED();
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)base::ProcessId TestSink::GetPeerPID() const {
3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  NOTIMPLEMENTED();
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return base::ProcessId();
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)base::ProcessId TestSink::GetSelfPID() const {
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NOTIMPLEMENTED();
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return base::ProcessId();
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestSink::OnMessageReceived(const Message& msg) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ObserverListBase<Listener>::Iterator it(filter_list_);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Listener* observer;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while ((observer = it.GetNext()) != NULL) {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (observer->OnMessageReceived(msg))
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No filter handled the message, so store it.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  messages_.push_back(Message(msg));
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestSink::ClearMessages() {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  messages_.clear();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Message* TestSink::GetMessageAt(size_t index) const {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (index >= messages_.size())
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &messages_[index];
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Message* TestSink::GetFirstMessageMatching(uint32 id) const {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < messages_.size(); i++) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (messages_[i].type() == id)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return &messages_[i];
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Message* TestSink::GetUniqueMessageMatching(uint32 id) const {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t found_index = 0;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t found_count = 0;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < messages_.size(); i++) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (messages_[i].type() == id) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      found_count++;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      found_index = i;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (found_count != 1)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;  // Didn't find a unique one.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &messages_[found_index];
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestSink::AddFilter(Listener* filter) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  filter_list_.AddObserver(filter);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestSink::RemoveFilter(Listener* filter) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  filter_list_.RemoveObserver(filter);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_NACL)
9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int TestSink::GetClientFileDescriptor() const {
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  NOTREACHED();
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return -1;
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int TestSink::TakeClientFileDescriptor() {
10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  NOTREACHED();
10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return -1;
10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif  // defined(OS_POSIX) && !defined(OS_NACL)
10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace IPC
111