// Copyright (c) 2011 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 "ppapi/proxy/plugin_resource_tracker.h"

#include "base/process/process.h"
#include "ppapi/proxy/mock_resource.h"
#include "ppapi/proxy/plugin_dispatcher.h"
#include "ppapi/proxy/ppapi_messages.h"
#include "ppapi/proxy/ppapi_proxy_test.h"
#include "ppapi/shared_impl/proxy_lock.h"

namespace ppapi {
namespace proxy {

namespace {

// Object so we know when a resource has been released.
class TrackedMockResource : public MockResource {
 public:
  TrackedMockResource(const HostResource& serialized)
      : MockResource(serialized) {
    tracked_alive_count++;
  }
  ~TrackedMockResource() {
    tracked_alive_count--;
  }

  static int tracked_alive_count;
};

int TrackedMockResource::tracked_alive_count = 0;

}  // namespace

class PluginResourceTrackerTest : public PluginProxyTest {
 public:
  PluginResourceTrackerTest() {}
  ~PluginResourceTrackerTest() {}
};

TEST_F(PluginResourceTrackerTest, PluginResourceForHostResource) {
  ProxyAutoLock lock;

  PP_Resource host_resource = 0x5678;

  HostResource serialized;
  serialized.SetHostResource(pp_instance(), host_resource);

  // When we haven't added an object, the return value should be 0.
  EXPECT_EQ(0, resource_tracker().PluginResourceForHostResource(serialized));

  EXPECT_EQ(0, TrackedMockResource::tracked_alive_count);
  TrackedMockResource* object = new TrackedMockResource(serialized);
  EXPECT_EQ(1, TrackedMockResource::tracked_alive_count);
  PP_Resource plugin_resource = object->GetReference();

  // Now that the object has been added, the return value should be the plugin
  // resource ID we already got.
  EXPECT_EQ(plugin_resource,
            resource_tracker().PluginResourceForHostResource(serialized));

  // Releasing the resource should have freed it.
  resource_tracker().ReleaseResource(plugin_resource);
  EXPECT_EQ(0, TrackedMockResource::tracked_alive_count);
  EXPECT_EQ(0, resource_tracker().PluginResourceForHostResource(serialized));
}

}  // namespace proxy
}  // namespace ppapi
