File: fake_host_connection.cc

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (121 lines) | stat: -rw-r--r-- 4,142 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chromeos/ash/components/tether/fake_host_connection.h"

#include "base/functional/callback_helpers.h"
#include "base/memory/ptr_util.h"
#include "chromeos/ash/components/multidevice/remote_device_test_util.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace ash::tether {

FakeHostConnection::Factory::Factory() = default;
FakeHostConnection::Factory::~Factory() = default;

void FakeHostConnection::Factory::ScanForTetherHostAndCreateConnection(
    const std::string& device_id,
    ConnectionPriority connection_priority,
    raw_ptr<PayloadListener> payload_listener,
    OnDisconnectionCallback on_disconnection,
    OnConnectionCreatedCallback on_connection_attempt_finished) {
  if (base::Contains(pending_connection_attempts_, device_id)) {
    if (pending_connection_attempts_.at(device_id)) {
      pending_connection_attempts_.at(device_id)->set_payload_listener(
          payload_listener);
      pending_connection_attempts_.at(device_id)->set_on_disconnection(
          std::move(on_disconnection));
    }

    active_connections_.emplace(
        device_id, pending_connection_attempts_.at(device_id).get());

    std::move(on_connection_attempt_finished)
        .Run(std::move(pending_connection_attempts_.at(device_id)));
    pending_connection_attempts_.erase(device_id);
  }
}

void FakeHostConnection::Factory::Create(
    const TetherHost& tether_host,
    ConnectionPriority connection_priority,
    raw_ptr<PayloadListener> payload_listener,
    OnDisconnectionCallback on_disconnection,
    OnConnectionCreatedCallback on_connection_attempt_finished) {
  ScanForTetherHostAndCreateConnection(
      tether_host.GetDeviceId(), connection_priority, payload_listener,
      std::move(on_disconnection), std::move(on_connection_attempt_finished));
}

void FakeHostConnection::Factory::FailConnectionAttempt(
    const TetherHost& tether_host) {
  pending_connection_attempts_.insert_or_assign(tether_host.GetDeviceId(),
                                                nullptr);
}

void FakeHostConnection::Factory::SetupConnectionAttempt(
    const TetherHost& tether_host) {
  pending_connection_attempts_.insert_or_assign(
      tether_host.GetDeviceId(),
      std::make_unique<FakeHostConnection>(base::BindOnce(
          &FakeHostConnection::Factory::OnConnectionDestroyed,
          weak_ptr_factory_.GetWeakPtr(), tether_host.GetDeviceId())));
}

FakeHostConnection* FakeHostConnection::Factory::GetPendingConnectionAttempt(
    const std::string& device_id) {
  if (!base::Contains(pending_connection_attempts_, device_id)) {
    return nullptr;
  }

  return pending_connection_attempts_.at(device_id).get();
}

FakeHostConnection* FakeHostConnection::Factory::GetActiveConnection(
    const std::string& device_id) {
  if (!base::Contains(active_connections_, device_id)) {
    return nullptr;
  }

  return active_connections_.at(device_id);
}

void FakeHostConnection::Factory::OnConnectionDestroyed(
    const std::string& device_id) {
  active_connections_.erase(device_id);
}

FakeHostConnection::FakeHostConnection(base::OnceClosure on_destroyed)
    : HostConnection(
          /*payload_listener=*/nullptr,
          /*on_disconnection=*/base::DoNothing()),
      on_destroyed_(std::move(on_destroyed)) {}

FakeHostConnection::~FakeHostConnection() {
  std::move(on_destroyed_).Run();
}

void FakeHostConnection::SendMessage(
    std::unique_ptr<MessageWrapper> message,
    OnMessageSentCallback on_message_sent_callback) {
  sent_messages_.emplace_back(std::move(message),
                              std::move(on_message_sent_callback));
}

void FakeHostConnection::ReceiveMessage(
    std::unique_ptr<MessageWrapper> message) {
  payload_listener_->OnMessageReceived(std::move(message));
}

void FakeHostConnection::Close() {
  std::move(on_disconnection_).Run();
}

void FakeHostConnection::FinishSendingMessages() {
  for (auto& message : sent_messages_) {
    std::move(message.second).Run();
  }
}

}  // namespace ash::tether