blob: 2f399291fe56a1d0c05e1d7dfa218d362b0e9630 [file] [log] [blame]
// 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 "config.h"
#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/WebServiceWorkerContextClient.h"
#include "public/web/WebSettings.h"
#include <gmock/gmock.h>
#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, 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