blob: 428e4e73f072519c134dfb0e05a8a1a0cccbd586 [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 "core/dom/CrossThreadTask.h"
#include "platform/heap/Handle.h"
#include <gtest/gtest.h>
namespace blink {
class GCObject : public GarbageCollectedFinalized<GCObject> {
public:
static int s_counter;
GCObject() { ++s_counter; }
~GCObject() { --s_counter; }
DEFINE_INLINE_TRACE() { }
void run(GCObject*) { }
};
int GCObject::s_counter = 0;
static void functionWithGarbageCollected(GCObject*)
{
}
static void functionWithExecutionContext(GCObject*, ExecutionContext*)
{
}
class CrossThreadTaskTest : public testing::Test {
protected:
void SetUp() override
{
GCObject::s_counter = 0;
}
void TearDown() override
{
Heap::collectGarbage(BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep, BlinkGC::ForcedGC);
ASSERT_EQ(0, GCObject::s_counter);
}
};
TEST_F(CrossThreadTaskTest, CreateForGarbageCollectedMethod)
{
OwnPtr<ExecutionContextTask> task1 = createCrossThreadTask(&GCObject::run, new GCObject, new GCObject);
OwnPtr<ExecutionContextTask> task2 = createCrossThreadTask(&GCObject::run, RawPtr<GCObject>(new GCObject), RawPtr<GCObject>(new GCObject));
Heap::collectGarbage(BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep, BlinkGC::ForcedGC);
EXPECT_EQ(4, GCObject::s_counter);
}
TEST_F(CrossThreadTaskTest, CreateForFunctionWithGarbageCollected)
{
OwnPtr<ExecutionContextTask> task1 = createCrossThreadTask(&functionWithGarbageCollected, new GCObject);
OwnPtr<ExecutionContextTask> task2 = createCrossThreadTask(&functionWithGarbageCollected, RawPtr<GCObject>(new GCObject));
Heap::collectGarbage(BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep, BlinkGC::ForcedGC);
EXPECT_EQ(2, GCObject::s_counter);
}
TEST_F(CrossThreadTaskTest, CreateForFunctionWithExecutionContext)
{
OwnPtr<ExecutionContextTask> task1 = createCrossThreadTask(&functionWithExecutionContext, new GCObject);
OwnPtr<ExecutionContextTask> task2 = createCrossThreadTask(&functionWithExecutionContext, RawPtr<GCObject>(new GCObject));
Heap::collectGarbage(BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep, BlinkGC::ForcedGC);
EXPECT_EQ(2, GCObject::s_counter);
}
}