// Copyright 2016 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "cobalt/bindings/testing/bindings_test_base.h"
#include "cobalt/bindings/testing/garbage_collection_test_interface.h"

#include "testing/gtest/include/gtest/gtest.h"

namespace cobalt {
namespace bindings {
namespace testing {

namespace {
typedef BindingsTestBase GarbageCollectionTest;
}  // namespace

TEST_F(GarbageCollectionTest, JSObjectHoldsReferenceToPlatformObject) {
  EXPECT_EQ(GarbageCollectionTestInterface::instances().size(), 0);
  EXPECT_TRUE(
      EvaluateScript("var obj = new GarbageCollectionTestInterface();", NULL));

  // Ensure that this is kept alive after GC is run.
  EXPECT_EQ(GarbageCollectionTestInterface::instances().size(), 1);
  CollectGarbage();
  EXPECT_EQ(GarbageCollectionTestInterface::instances().size(), 1);

  // Ensure that this is destroyed when there are no more references to it from
  // JavaScript.
  EXPECT_TRUE(EvaluateScript("var obj = undefined;", NULL));
  CollectGarbage();
#if !defined(ENGINE_USES_CONSERVATIVE_ROOTING)
  EXPECT_EQ(GarbageCollectionTestInterface::instances().size(), 0);
#endif
}

TEST_F(GarbageCollectionTest, PreventGarbageCollection) {
  EXPECT_EQ(GarbageCollectionTestInterface::instances().size(), 0);
  EXPECT_TRUE(
      EvaluateScript("var obj = new GarbageCollectionTestInterface();", NULL));

  // Keep this instance alive using PreventGarbageCollection
  ASSERT_EQ(GarbageCollectionTestInterface::instances().size(), 1);
  global_environment_->PreventGarbageCollection(
      make_scoped_refptr<script::Wrappable>(
          GarbageCollectionTestInterface::instances()[0]));
  // Remove the only reference to this object from JavaScript.
  EXPECT_TRUE(EvaluateScript("var obj = undefined;", NULL));

  // Ensure that the object is kept alive.
  CollectGarbage();
  ASSERT_EQ(GarbageCollectionTestInterface::instances().size(), 1);

  // Allow this object to be garbage collected once more.
  global_environment_->AllowGarbageCollection(
      make_scoped_refptr<script::Wrappable>(
          GarbageCollectionTestInterface::instances()[0]));

  // Ensure that the object is destroyed by garbage collection.
  CollectGarbage();
#if !defined(ENGINE_USES_CONSERVATIVE_ROOTING)
  EXPECT_EQ(GarbageCollectionTestInterface::instances().size(), 0);
#endif
}

TEST_F(GarbageCollectionTest, ReachableObjectsKeptAlive) {
  // Build a linked-list structure.
  EXPECT_EQ(GarbageCollectionTestInterface::instances().size(), 0);
  EXPECT_TRUE(EvaluateScript(
      "var head = new GarbageCollectionTestInterface();"
      "head.next = new GarbageCollectionTestInterface();"
      "head.next.next = new GarbageCollectionTestInterface();"
      "head.next.next.next = new GarbageCollectionTestInterface();"));
  ASSERT_EQ(GarbageCollectionTestInterface::instances().size(), 4);

  // A reference to anything in the list should keep the rest of the structure
  // alive.
  EXPECT_TRUE(
      EvaluateScript("var tail = head.next.next.next;"
                     "var head = undefined;"));
  CollectGarbage();
  ASSERT_EQ(GarbageCollectionTestInterface::instances().size(), 4);

  // The old tail is not reachable, so the nodes should get garbage collected.
  EXPECT_TRUE(
      EvaluateScript("var tail = tail.previous.previous;"
                     "tail.next = null;"));
  CollectGarbage();
#if !defined(ENGINE_USES_CONSERVATIVE_ROOTING)
  ASSERT_EQ(GarbageCollectionTestInterface::instances().size(), 2);
#endif
}

TEST_F(GarbageCollectionTest, JSObjectRetainsCustomProperty) {
  // Build a linked-list structure.
  EXPECT_EQ(GarbageCollectionTestInterface::instances().size(), 0);
  EXPECT_TRUE(EvaluateScript(
      "var head = new GarbageCollectionTestInterface();"
      "head.next = new GarbageCollectionTestInterface();"
      "head.next.next = new GarbageCollectionTestInterface();"
      "head.next.next.next = new GarbageCollectionTestInterface();"));
  ASSERT_EQ(GarbageCollectionTestInterface::instances().size(), 4);

  // Add a custom property to an object that is not directly reachable from JS.
  EXPECT_TRUE(EvaluateScript("head.next.bicycle = 7;"));

  // Collect garbage and ensure that the custom property persisted.
  CollectGarbage();
  std::string result;
  EXPECT_TRUE(EvaluateScript("head.next.bicycle;", &result));
  EXPECT_STREQ("7", result.c_str());
}

}  // namespace testing
}  // namespace bindings
}  // namespace cobalt
