// 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 "public/web/WebEmbeddedWorker.h"

#include "platform/testing/URLTestHelpers.h"
#include "platform/testing/UnitTestHelpers.h"
#include "public/platform/Platform.h"
#include "public/platform/WebURLResponse.h"
#include "public/platform/WebUnitTestSupport.h"
#include "public/web/WebEmbeddedWorkerStartData.h"
#include "public/web/WebSettings.h"
#include "public/web/modules/serviceworker/WebServiceWorkerContextClient.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace blink {
namespace {

class MockServiceWorkerContextClient
    : public WebServiceWorkerContextClient {
public:
    MockServiceWorkerContextClient() { }
    ~MockServiceWorkerContextClient() override { }
    MOCK_METHOD0(workerReadyForInspection, void());
    MOCK_METHOD0(workerContextFailedToStart, void());
    MOCK_METHOD1(createServiceWorkerNetworkProvider, WebServiceWorkerNetworkProvider*(WebDataSource*));
};

class WebEmbeddedWorkerImplFailureTest : public ::testing::Test {
protected:
    void SetUp() override
    {
        m_mockClient = new MockServiceWorkerContextClient();
        m_worker = adoptPtr(WebEmbeddedWorker::create(m_mockClient, nullptr));

        WebURL invalidScriptURL = URLTestHelpers::toKURL("https://www.example.com/sw.js");
        WebURLResponse errorResponse;
        errorResponse.initialize();
        errorResponse.setMIMEType("text/html");
        errorResponse.setHTTPStatusCode(404);
        WebURLError error;
        error.reason = 1010;
        error.domain = "WebEmbeddedWorkerImplTest";
        Platform::current()->unitTestSupport()->registerMockedErrorURL(invalidScriptURL, errorResponse, error);

        m_startData.scriptURL = invalidScriptURL;
        m_startData.userAgent = WebString("dummy user agent");
        m_startData.waitForDebuggerMode = WebEmbeddedWorkerStartData::DontWaitForDebugger;
        m_startData.v8CacheOptions = WebSettings::V8CacheOptionsDefault;
    }

    void TearDown() override
    {
        Platform::current()->unitTestSupport()->unregisterAllMockedURLs();
    }

    WebEmbeddedWorkerStartData m_startData;
    MockServiceWorkerContextClient* m_mockClient;
    OwnPtr<WebEmbeddedWorker> m_worker;
};

} // namespace

TEST_F(WebEmbeddedWorkerImplFailureTest, TerminateSoonAfterStart)
{
    EXPECT_CALL(*m_mockClient, workerReadyForInspection()).Times(1);
    m_worker->startWorkerContext(m_startData);
    ::testing::Mock::VerifyAndClearExpectations(m_mockClient);

    EXPECT_CALL(*m_mockClient, workerContextFailedToStart()).Times(1);
    m_worker->terminateWorkerContext();
    ::testing::Mock::VerifyAndClearExpectations(m_mockClient);
}

TEST_F(WebEmbeddedWorkerImplFailureTest, TerminateWhileWaitingForDebugger)
{
    EXPECT_CALL(*m_mockClient, workerReadyForInspection()).Times(1);
    m_startData.waitForDebuggerMode = WebEmbeddedWorkerStartData::WaitForDebugger;
    m_worker->startWorkerContext(m_startData);
    ::testing::Mock::VerifyAndClearExpectations(m_mockClient);

    EXPECT_CALL(*m_mockClient, workerContextFailedToStart()).Times(1);
    m_worker->terminateWorkerContext();
    ::testing::Mock::VerifyAndClearExpectations(m_mockClient);
}

TEST_F(WebEmbeddedWorkerImplFailureTest, TerminateWhileLoadingScript)
{
    EXPECT_CALL(*m_mockClient, workerReadyForInspection()).Times(1);
    m_worker->startWorkerContext(m_startData);
    ::testing::Mock::VerifyAndClearExpectations(m_mockClient);

    EXPECT_CALL(*m_mockClient, createServiceWorkerNetworkProvider(::testing::_)).WillOnce(::testing::Return(nullptr));
    testing::runPendingTasks();
    ::testing::Mock::VerifyAndClearExpectations(m_mockClient);

    EXPECT_CALL(*m_mockClient, workerContextFailedToStart()).Times(1);
    m_worker->terminateWorkerContext();
    ::testing::Mock::VerifyAndClearExpectations(m_mockClient);
}

} // namespace blink
