blob: 90d34ddd8340a145aed5458f84dc21cbb8131483 [file] [log] [blame]
Alex Deymoaea4c1c2015-08-19 20:24:43 -07001//
2// Copyright (C) 2009 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
rspangler@google.com49fdf182009-10-10 00:57:34 +000016
Alex Deymo39910dc2015-11-09 17:04:30 -080017#ifndef UPDATE_ENGINE_COMMON_MOCK_HTTP_FETCHER_H_
18#define UPDATE_ENGINE_COMMON_MOCK_HTTP_FETCHER_H_
rspangler@google.com49fdf182009-10-10 00:57:34 +000019
Alex Vakulenkod2779df2014-06-16 13:19:00 -070020#include <string>
rspangler@google.com49fdf182009-10-10 00:57:34 +000021#include <vector>
Andrew de los Reyes45168102010-11-22 11:13:50 -080022
23#include <base/logging.h>
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070024#include <brillo/message_loops/message_loop.h>
Andrew de los Reyes45168102010-11-22 11:13:50 -080025
Alex Deymo39910dc2015-11-09 17:04:30 -080026#include "update_engine/common/http_fetcher.h"
rspangler@google.com49fdf182009-10-10 00:57:34 +000027
28// This is a mock implementation of HttpFetcher which is useful for testing.
29// All data must be passed into the ctor. When started, MockHttpFetcher will
30// deliver the data in chunks of size kMockHttpFetcherChunkSize. To simulate
31// a network failure, you can call FailTransfer().
32
33namespace chromeos_update_engine {
34
35// MockHttpFetcher will send a chunk of data down in each call to BeginTransfer
36// and Unpause. For the other chunks of data, a callback is put on the run
37// loop and when that's called, another chunk is sent down.
38const size_t kMockHttpFetcherChunkSize(65536);
39
40class MockHttpFetcher : public HttpFetcher {
41 public:
42 // The data passed in here is copied and then passed to the delegate after
43 // the transfer begins.
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -080044 MockHttpFetcher(const uint8_t* data,
Andrew de los Reyes45168102010-11-22 11:13:50 -080045 size_t size,
46 ProxyResolver* proxy_resolver)
Alex Deymoc1c17b42015-11-23 03:53:15 -030047 : HttpFetcher(proxy_resolver),
Andrew de los Reyes45168102010-11-22 11:13:50 -080048 sent_size_(0),
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070049 timeout_id_(brillo::MessageLoop::kTaskIdNull),
Darin Petkovedc522e2010-11-05 09:35:17 -070050 paused_(false),
Andrew de los Reyes173e63c2011-04-04 17:19:57 -070051 fail_transfer_(false),
Alex Deymof6ee0162015-07-31 12:35:22 -070052 never_use_(false) {
rspangler@google.com49fdf182009-10-10 00:57:34 +000053 data_.insert(data_.end(), data, data + size);
rspangler@google.com49fdf182009-10-10 00:57:34 +000054 }
55
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -080056 // Constructor overload for string data.
57 MockHttpFetcher(const char* data, size_t size, ProxyResolver* proxy_resolver)
58 : MockHttpFetcher(reinterpret_cast<const uint8_t*>(data), size,
59 proxy_resolver) {}
60
rspangler@google.com49fdf182009-10-10 00:57:34 +000061 // Cleans up all internal state. Does not notify delegate
Alex Deymo610277e2014-11-11 21:18:11 -080062 ~MockHttpFetcher() override;
rspangler@google.com49fdf182009-10-10 00:57:34 +000063
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -070064 // Ignores this.
Alex Deymo610277e2014-11-11 21:18:11 -080065 void SetOffset(off_t offset) override {
Andrew de los Reyes34e41a12010-10-26 20:07:58 -070066 sent_size_ = offset;
67 if (delegate_)
68 delegate_->SeekToOffset(offset);
69 }
Andrew de los Reyes3fd5d302010-10-07 20:07:18 -070070
Gilad Arnolde4ad2502011-12-29 17:08:54 -080071 // Do nothing.
Alex Deymo610277e2014-11-11 21:18:11 -080072 void SetLength(size_t length) override {}
73 void UnsetLength() override {}
74 void set_low_speed_limit(int low_speed_bps, int low_speed_sec) override {}
75 void set_connect_timeout(int connect_timeout_seconds) override {}
76 void set_max_retry_count(int max_retry_count) override {}
Gilad Arnolde4ad2502011-12-29 17:08:54 -080077
Gilad Arnold48085ba2011-11-16 09:36:08 -080078 // Dummy: no bytes were downloaded.
Alex Deymo610277e2014-11-11 21:18:11 -080079 size_t GetBytesDownloaded() override {
Gilad Arnold48085ba2011-11-16 09:36:08 -080080 return sent_size_;
81 }
82
rspangler@google.com49fdf182009-10-10 00:57:34 +000083 // Begins the transfer if it hasn't already begun.
Alex Deymo610277e2014-11-11 21:18:11 -080084 void BeginTransfer(const std::string& url) override;
rspangler@google.com49fdf182009-10-10 00:57:34 +000085
86 // If the transfer is in progress, aborts the transfer early.
87 // The transfer cannot be resumed.
Alex Deymo610277e2014-11-11 21:18:11 -080088 void TerminateTransfer() override;
rspangler@google.com49fdf182009-10-10 00:57:34 +000089
90 // Suspend the mock transfer.
Alex Deymo610277e2014-11-11 21:18:11 -080091 void Pause() override;
rspangler@google.com49fdf182009-10-10 00:57:34 +000092
93 // Resume the mock transfer.
Alex Deymo610277e2014-11-11 21:18:11 -080094 void Unpause() override;
rspangler@google.com49fdf182009-10-10 00:57:34 +000095
96 // Fail the transfer. This simulates a network failure.
Darin Petkovedc522e2010-11-05 09:35:17 -070097 void FailTransfer(int http_response_code);
rspangler@google.com49fdf182009-10-10 00:57:34 +000098
Andrew de los Reyes173e63c2011-04-04 17:19:57 -070099 // If set to true, this will EXPECT fail on BeginTransfer
100 void set_never_use(bool never_use) { never_use_ = never_use; }
101
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700102 const brillo::Blob& post_data() const {
rspangler@google.com49fdf182009-10-10 00:57:34 +0000103 return post_data_;
104 }
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000105
rspangler@google.com49fdf182009-10-10 00:57:34 +0000106 private:
Alex Deymo60ca1a72015-06-18 18:19:15 -0700107 // Sends data to the delegate and sets up a timeout callback if needed.
rspangler@google.com49fdf182009-10-10 00:57:34 +0000108 // There must be a delegate and there must be data to send. If there is
109 // already a timeout callback, and it should be deleted by the caller,
110 // this will return false; otherwise true is returned.
111 // If skip_delivery is true, no bytes will be delivered, but the callbacks
Alex Vakulenko072359c2014-07-18 11:41:07 -0700112 // still be set if needed.
rspangler@google.com49fdf182009-10-10 00:57:34 +0000113 bool SendData(bool skip_delivery);
114
Alex Deymo60ca1a72015-06-18 18:19:15 -0700115 // Callback for when our message loop timeout expires.
116 void TimeoutCallback();
rspangler@google.com49fdf182009-10-10 00:57:34 +0000117
Darin Petkovedc522e2010-11-05 09:35:17 -0700118 // Sets the HTTP response code and signals to the delegate that the transfer
119 // is complete.
120 void SignalTransferComplete();
121
rspangler@google.com49fdf182009-10-10 00:57:34 +0000122 // A full copy of the data we'll return to the delegate
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700123 brillo::Blob data_;
rspangler@google.com49fdf182009-10-10 00:57:34 +0000124
125 // The number of bytes we've sent so far
126 size_t sent_size_;
127
Alex Deymo60ca1a72015-06-18 18:19:15 -0700128 // The TaskId of the timeout callback. After each chunk of data sent, we
rspangler@google.com49fdf182009-10-10 00:57:34 +0000129 // time out for 0s just to make sure that run loop services other clients.
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700130 brillo::MessageLoop::TaskId timeout_id_;
rspangler@google.com49fdf182009-10-10 00:57:34 +0000131
132 // True iff the fetcher is paused.
133 bool paused_;
134
Darin Petkovedc522e2010-11-05 09:35:17 -0700135 // Set to true if the transfer should fail.
136 bool fail_transfer_;
137
Andrew de los Reyes173e63c2011-04-04 17:19:57 -0700138 // Set to true if BeginTransfer should EXPECT fail.
139 bool never_use_;
140
rspangler@google.com49fdf182009-10-10 00:57:34 +0000141 DISALLOW_COPY_AND_ASSIGN(MockHttpFetcher);
142};
143
144} // namespace chromeos_update_engine
145
Alex Deymo39910dc2015-11-09 17:04:30 -0800146#endif // UPDATE_ENGINE_COMMON_MOCK_HTTP_FETCHER_H_