// 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 "modules/fetch/DataConsumerHandleUtil.h"

#include "modules/fetch/DataConsumerHandleTestUtil.h"

namespace blink {

namespace {

const WebDataConsumerHandle::Result kShouldWait = WebDataConsumerHandle::ShouldWait;
const WebDataConsumerHandle::Result kDone = WebDataConsumerHandle::Done;
const WebDataConsumerHandle::Result kUnexpectedError = WebDataConsumerHandle::UnexpectedError;
const WebDataConsumerHandle::Flags kNone = WebDataConsumerHandle::FlagNone;

TEST(DataConsumerHandleUtilTest, CreateWaitingHandle)
{
    char buffer[20];
    const void* p = nullptr;
    size_t size = 0;
    OwnPtr<WebDataConsumerHandle> handle = createWaitingDataConsumerHandle();
    OwnPtr<WebDataConsumerHandle::Reader> reader = handle->obtainReader(nullptr);

    EXPECT_EQ(kShouldWait, reader->read(buffer, sizeof(buffer), kNone, &size));
    EXPECT_EQ(kShouldWait, reader->beginRead(&p, kNone, &size));
    EXPECT_EQ(kUnexpectedError, reader->endRead(99));
}

TEST(DataConsumerHandleUtilTest, WaitingHandleNoNotification)
{
    RefPtr<DataConsumerHandleTestUtil::ThreadingHandleNoNotificationTest> test = DataConsumerHandleTestUtil::ThreadingHandleNoNotificationTest::create();
    // Test this function doesn't crash.
    test->run(createWaitingDataConsumerHandle());
}

TEST(DataConsumerHandleUtilTest, CreateDoneHandle)
{
    char buffer[20];
    const void* p = nullptr;
    size_t size = 0;
    OwnPtr<WebDataConsumerHandle> handle = createDoneDataConsumerHandle();
    OwnPtr<WebDataConsumerHandle::Reader> reader = handle->obtainReader(nullptr);

    EXPECT_EQ(kDone, reader->read(buffer, sizeof(buffer), kNone, &size));
    EXPECT_EQ(kDone, reader->beginRead(&p, kNone, &size));
    EXPECT_EQ(kUnexpectedError, reader->endRead(99));
}

TEST(DataConsumerHandleUtilTest, DoneHandleNotification)
{
    RefPtr<DataConsumerHandleTestUtil::ThreadingHandleNotificationTest> test = DataConsumerHandleTestUtil::ThreadingHandleNotificationTest::create();
    // Test this function returns.
    test->run(createDoneDataConsumerHandle());
}

TEST(DataConsumerHandleUtilTest, DoneHandleNoNotification)
{
    RefPtr<DataConsumerHandleTestUtil::ThreadingHandleNoNotificationTest> test = DataConsumerHandleTestUtil::ThreadingHandleNoNotificationTest::create();
    // Test this function doesn't crash.
    test->run(createDoneDataConsumerHandle());
}

TEST(DataConsumerHandleUtilTest, CreateUnexpectedErrorHandle)
{
    char buffer[20];
    const void* p = nullptr;
    size_t size = 0;
    OwnPtr<WebDataConsumerHandle> handle = createUnexpectedErrorDataConsumerHandle();
    OwnPtr<WebDataConsumerHandle::Reader> reader = handle->obtainReader(nullptr);

    EXPECT_EQ(kUnexpectedError, reader->read(buffer, sizeof(buffer), kNone, &size));
    EXPECT_EQ(kUnexpectedError, reader->beginRead(&p, kNone, &size));
    EXPECT_EQ(kUnexpectedError, reader->endRead(99));
}

TEST(DataConsumerHandleUtilTest, UnexpectedErrorHandleNotification)
{
    RefPtr<DataConsumerHandleTestUtil::ThreadingHandleNotificationTest> test = DataConsumerHandleTestUtil::ThreadingHandleNotificationTest::create();
    // Test this function returns.
    test->run(createUnexpectedErrorDataConsumerHandle());
}

TEST(DataConsumerHandleUtilTest, UnexpectedErrorHandleNoNotification)
{
    RefPtr<DataConsumerHandleTestUtil::ThreadingHandleNoNotificationTest> test = DataConsumerHandleTestUtil::ThreadingHandleNoNotificationTest::create();
    // Test this function doesn't crash.
    test->run(createUnexpectedErrorDataConsumerHandle());
}

} // namespace

} // namespace blink
