// Copyright 2014 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 "content/public/test/mock_blob_url_request_context.h"

#include "storage/browser/blob/blob_data_builder.h"
#include "storage/browser/blob/blob_storage_context.h"
#include "storage/browser/blob/blob_url_request_job.h"
#include "storage/browser/blob/blob_url_request_job_factory.h"

namespace content {

MockBlobURLRequestContext::MockBlobURLRequestContext(
    storage::FileSystemContext* file_system_context)
    : blob_storage_context_(new storage::BlobStorageContext) {
  // Job factory owns the protocol handler.
  job_factory_.SetProtocolHandler(
      "blob",
      new storage::BlobProtocolHandler(blob_storage_context_.get(),
                                       file_system_context,
                                       base::MessageLoopProxy::current()));
  set_job_factory(&job_factory_);
}

MockBlobURLRequestContext::~MockBlobURLRequestContext() {
  AssertNoURLRequests();
}

ScopedTextBlob::ScopedTextBlob(
    const MockBlobURLRequestContext& request_context,
    const std::string& blob_id,
    const std::string& data)
    : blob_id_(blob_id),
      context_(request_context.blob_storage_context()) {
  DCHECK(context_);
  storage::BlobDataBuilder blob_builder(blob_id_);
  if (!data.empty())
    blob_builder.AppendData(data);
  handle_ = context_->AddFinishedBlob(blob_builder);
}

ScopedTextBlob::~ScopedTextBlob() {
}

scoped_ptr<storage::BlobDataHandle> ScopedTextBlob::GetBlobDataHandle() {
  return context_->GetBlobDataFromUUID(blob_id_);
}

}  // namespace content
