// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "core/testing/sim/SimRequest.h"

#include "core/testing/sim/SimNetwork.h"
#include "platform/weborigin/KURL.h"
#include "public/platform/Platform.h"
#include "public/platform/WebURLLoaderClient.h"
#include "public/platform/WebURLLoaderMockFactory.h"

namespace blink {

SimRequest::SimRequest(String url, String mime_type)
    : url_(url),
      client_(nullptr),
      total_encoded_data_length_(0),
      is_ready_(false) {
  KURL full_url(url);
  WebURLResponse response(full_url);
  response.SetMIMEType(mime_type);
  response.SetHTTPStatusCode(200);
  Platform::Current()->GetURLLoaderMockFactory()->RegisterURL(full_url,
                                                              response, "");
  SimNetwork::Current().AddRequest(*this);
}

SimRequest::~SimRequest() {
  DCHECK(!is_ready_);
}

void SimRequest::DidReceiveResponse(WebURLLoaderClient* client,
                                    const WebURLResponse& response) {
  client_ = client;
  response_ = response;
  is_ready_ = true;
}

void SimRequest::DidFail(const WebURLError& error) {
  error_ = error;
}

void SimRequest::Start() {
  SimNetwork::Current().ServePendingRequests();
  DCHECK(is_ready_);
  client_->DidReceiveResponse(response_);
}

void SimRequest::Write(const String& data) {
  DCHECK(is_ready_);
  DCHECK(!error_);
  total_encoded_data_length_ += data.length();
  client_->DidReceiveData(data.Utf8().data(), data.length());
}

void SimRequest::Write(const Vector<char>& data) {
  DCHECK(is_ready_);
  DCHECK(!error_);
  total_encoded_data_length_ += data.size();
  client_->DidReceiveData(data.data(), data.size());
}

void SimRequest::Finish() {
  DCHECK(is_ready_);
  if (error_) {
    client_->DidFail(*error_, total_encoded_data_length_,
                     total_encoded_data_length_, total_encoded_data_length_);
  } else {
    // TODO(esprehn): Is claiming a request time of 0 okay for tests?
    client_->DidFinishLoading(0, total_encoded_data_length_,
                              total_encoded_data_length_,
                              total_encoded_data_length_, false);
  }
  Reset();
}

void SimRequest::Complete(const String& data) {
  Start();
  if (!data.IsEmpty())
    Write(data);
  Finish();
}

void SimRequest::Complete(const Vector<char>& data) {
  Start();
  if (!data.IsEmpty())
    Write(data);
  Finish();
}

void SimRequest::Reset() {
  is_ready_ = false;
  client_ = nullptr;
  SimNetwork::Current().RemoveRequest(*this);
}

}  // namespace blink
