15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "sync/test/fake_server/fake_server_http_post_provider.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <string>
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/bind.h"
10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/location.h"
11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/memory/ref_counted.h"
12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/sequenced_task_runner.h"
13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/synchronization/waitable_event.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "sync/test/fake_server/fake_server.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using syncer::HttpPostProviderInterface;
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace fake_server {
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)FakeServerHttpPostProviderFactory::FakeServerHttpPostProviderFactory(
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    FakeServer* fake_server,
22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    scoped_refptr<base::SequencedTaskRunner> task_runner)
23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        : fake_server_(fake_server), task_runner_(task_runner) { }
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)FakeServerHttpPostProviderFactory::~FakeServerHttpPostProviderFactory() { }
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FakeServerHttpPostProviderFactory::Init(const std::string& user_agent) { }
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)HttpPostProviderInterface* FakeServerHttpPostProviderFactory::Create() {
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FakeServerHttpPostProvider* http =
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new FakeServerHttpPostProvider(fake_server_, task_runner_);
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  http->AddRef();
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return http;
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FakeServerHttpPostProviderFactory::Destroy(
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    HttpPostProviderInterface* http) {
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static_cast<FakeServerHttpPostProvider*>(http)->Release();
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)FakeServerHttpPostProvider::FakeServerHttpPostProvider(
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    FakeServer* fake_server,
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    scoped_refptr<base::SequencedTaskRunner> task_runner)
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        : fake_server_(fake_server),
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          task_runner_(task_runner),
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          post_complete_(false, false) { }
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)FakeServerHttpPostProvider::~FakeServerHttpPostProvider() { }
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FakeServerHttpPostProvider::SetExtraRequestHeaders(const char* headers) {
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(pvalenzuela): Add assertions on this value.
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extra_request_headers_.assign(headers);
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FakeServerHttpPostProvider::SetURL(const char* url, int port) {
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(pvalenzuela): Add assertions on these values.
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  request_url_.assign(url);
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  request_port_ = port;
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FakeServerHttpPostProvider::SetPostPayload(const char* content_type,
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                int content_length,
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                const char* content) {
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  request_content_type_.assign(content_type);
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  request_content_.assign(content, content_length);
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void FakeServerHttpPostProvider::OnPostComplete(int error_code,
69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                int response_code,
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                const std::string& response) {
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  post_error_code_ = error_code;
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  post_response_code_ = response_code;
73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  response_ = response;
74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  post_complete_.Signal();
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool FakeServerHttpPostProvider::MakeSynchronousPost(int* error_code,
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                     int* response_code) {
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // It is assumed that a POST is being made to /command.
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  FakeServer::HandleCommandCallback callback = base::Bind(
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      &FakeServerHttpPostProvider::OnPostComplete, base::Unretained(this));
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  task_runner_->PostNonNestableTask(FROM_HERE,
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    base::Bind(&FakeServer::HandleCommand,
84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                               base::Unretained(fake_server_),
85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                               base::ConstRef(request_content_),
86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                               base::ConstRef(callback)));
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  post_complete_.Wait();
88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  *error_code = post_error_code_;
89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  *response_code = post_response_code_;
90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return *error_code == 0;
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int FakeServerHttpPostProvider::GetResponseContentLength() const {
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return response_.length();
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char* FakeServerHttpPostProvider::GetResponseContent() const {
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return response_.c_str();
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const std::string FakeServerHttpPostProvider::GetResponseHeaderValue(
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& name) const {
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return std::string();
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FakeServerHttpPostProvider::Abort() {
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace fake_server
110