blob: 50e80431b967df668c95f0f1da855ba88d3095c9 [file] [log] [blame]
rspangler@google.com49fdf182009-10-10 00:57:34 +00001// Copyright (c) 2009 The Chromium OS 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.
4
Alex Deymo759c2752014-03-17 21:09:36 -07005#ifndef CHROMEOS_PLATFORM_UPDATE_ENGINE_MOCK_HTTP_FETCHER_H_
6#define CHROMEOS_PLATFORM_UPDATE_ENGINE_MOCK_HTTP_FETCHER_H_
rspangler@google.com49fdf182009-10-10 00:57:34 +00007
8#include <vector>
Andrew de los Reyes45168102010-11-22 11:13:50 -08009
10#include <base/logging.h>
rspangler@google.com49fdf182009-10-10 00:57:34 +000011#include <glib.h>
Andrew de los Reyes45168102010-11-22 11:13:50 -080012
rspangler@google.com49fdf182009-10-10 00:57:34 +000013#include "update_engine/http_fetcher.h"
Jay Srinivasan43488792012-06-19 00:25:31 -070014#include "update_engine/mock_connection_manager.h"
15#include "update_engine/mock_system_state.h"
rspangler@google.com49fdf182009-10-10 00:57:34 +000016
17// This is a mock implementation of HttpFetcher which is useful for testing.
18// All data must be passed into the ctor. When started, MockHttpFetcher will
19// deliver the data in chunks of size kMockHttpFetcherChunkSize. To simulate
20// a network failure, you can call FailTransfer().
21
22namespace chromeos_update_engine {
23
24// MockHttpFetcher will send a chunk of data down in each call to BeginTransfer
25// and Unpause. For the other chunks of data, a callback is put on the run
26// loop and when that's called, another chunk is sent down.
27const size_t kMockHttpFetcherChunkSize(65536);
28
29class MockHttpFetcher : public HttpFetcher {
30 public:
31 // The data passed in here is copied and then passed to the delegate after
32 // the transfer begins.
Andrew de los Reyes45168102010-11-22 11:13:50 -080033 MockHttpFetcher(const char* data,
34 size_t size,
35 ProxyResolver* proxy_resolver)
Jay Srinivasan43488792012-06-19 00:25:31 -070036 : HttpFetcher(proxy_resolver, &mock_system_state_),
Andrew de los Reyes45168102010-11-22 11:13:50 -080037 sent_size_(0),
Darin Petkovedc522e2010-11-05 09:35:17 -070038 timeout_source_(NULL),
39 timout_tag_(0),
40 paused_(false),
Andrew de los Reyes173e63c2011-04-04 17:19:57 -070041 fail_transfer_(false),
Jay Srinivasan43488792012-06-19 00:25:31 -070042 never_use_(false),
43 mock_connection_manager_(&mock_system_state_) {
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080044 mock_system_state_.set_connection_manager(&mock_connection_manager_);
rspangler@google.com49fdf182009-10-10 00:57:34 +000045 data_.insert(data_.end(), data, data + size);
rspangler@google.com49fdf182009-10-10 00:57:34 +000046 }
47
48 // Cleans up all internal state. Does not notify delegate
49 ~MockHttpFetcher();
50
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -070051 // Ignores this.
Andrew de los Reyes34e41a12010-10-26 20:07:58 -070052 virtual void SetOffset(off_t offset) {
53 sent_size_ = offset;
54 if (delegate_)
55 delegate_->SeekToOffset(offset);
56 }
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -070057
Gilad Arnolde4ad2502011-12-29 17:08:54 -080058 // Do nothing.
59 virtual void SetLength(size_t length) {}
60 virtual void UnsetLength() {}
David Zeuthen34135a92013-08-06 11:16:16 -070061 virtual void set_low_speed_limit(int low_speed_bps, int low_speed_sec) {}
62 virtual void set_connect_timeout(int connect_timeout_seconds) {}
63 virtual void set_max_retry_count(int max_retry_count) {}
Gilad Arnolde4ad2502011-12-29 17:08:54 -080064
Gilad Arnold48085ba2011-11-16 09:36:08 -080065 // Dummy: no bytes were downloaded.
66 virtual size_t GetBytesDownloaded() {
67 return sent_size_;
68 }
69
rspangler@google.com49fdf182009-10-10 00:57:34 +000070 // Begins the transfer if it hasn't already begun.
71 virtual void BeginTransfer(const std::string& url);
72
73 // If the transfer is in progress, aborts the transfer early.
74 // The transfer cannot be resumed.
75 virtual void TerminateTransfer();
76
77 // Suspend the mock transfer.
78 virtual void Pause();
79
80 // Resume the mock transfer.
81 virtual void Unpause();
82
83 // Fail the transfer. This simulates a network failure.
Darin Petkovedc522e2010-11-05 09:35:17 -070084 void FailTransfer(int http_response_code);
rspangler@google.com49fdf182009-10-10 00:57:34 +000085
Andrew de los Reyes173e63c2011-04-04 17:19:57 -070086 // If set to true, this will EXPECT fail on BeginTransfer
87 void set_never_use(bool never_use) { never_use_ = never_use; }
88
rspangler@google.com49fdf182009-10-10 00:57:34 +000089 const std::vector<char>& post_data() const {
90 return post_data_;
91 }
adlr@google.comc98a7ed2009-12-04 18:54:03 +000092
rspangler@google.com49fdf182009-10-10 00:57:34 +000093 private:
94 // Sends data to the delegate and sets up a glib timeout callback if needed.
95 // There must be a delegate and there must be data to send. If there is
96 // already a timeout callback, and it should be deleted by the caller,
97 // this will return false; otherwise true is returned.
98 // If skip_delivery is true, no bytes will be delivered, but the callbacks
99 // still still be set if needed
100 bool SendData(bool skip_delivery);
101
102 // Callback for when our glib main loop callback is called
103 bool TimeoutCallback();
104 static gboolean StaticTimeoutCallback(gpointer data) {
105 return reinterpret_cast<MockHttpFetcher*>(data)->TimeoutCallback();
106 }
107
Darin Petkovedc522e2010-11-05 09:35:17 -0700108 // Sets the HTTP response code and signals to the delegate that the transfer
109 // is complete.
110 void SignalTransferComplete();
111
rspangler@google.com49fdf182009-10-10 00:57:34 +0000112 // A full copy of the data we'll return to the delegate
113 std::vector<char> data_;
114
115 // The number of bytes we've sent so far
116 size_t sent_size_;
117
118 // The glib main loop timeout source. After each chunk of data sent, we
119 // time out for 0s just to make sure that run loop services other clients.
120 GSource* timeout_source_;
121
122 // ID of the timeout source, valid only if timeout_source_ != NULL
123 guint timout_tag_;
124
125 // True iff the fetcher is paused.
126 bool paused_;
127
Darin Petkovedc522e2010-11-05 09:35:17 -0700128 // Set to true if the transfer should fail.
129 bool fail_transfer_;
130
Andrew de los Reyes173e63c2011-04-04 17:19:57 -0700131 // Set to true if BeginTransfer should EXPECT fail.
132 bool never_use_;
133
Jay Srinivasan43488792012-06-19 00:25:31 -0700134 MockSystemState mock_system_state_;
135 MockConnectionManager mock_connection_manager_;
136
rspangler@google.com49fdf182009-10-10 00:57:34 +0000137 DISALLOW_COPY_AND_ASSIGN(MockHttpFetcher);
138};
139
140} // namespace chromeos_update_engine
141
Alex Deymo759c2752014-03-17 21:09:36 -0700142#endif // CHROMEOS_PLATFORM_UPDATE_ENGINE_MOCK_HTTP_FETCHER_H_