// Copyright (c) 2013 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 "base/hash.h" #include "ppapi/c/ppb_core.h" #include "ppapi/proxy/interface_list.h" #include "ppapi/proxy/ppapi_proxy_test.h" namespace ppapi { namespace proxy { class InterfaceListTest : public PluginProxyTest { public: // Wrapper function so we can use the private InterfaceList::AddPPB. void AddPPB(InterfaceList* list, const char* iface_name, void* iface_addr, Permission perm) { list->AddPPB(iface_name, iface_addr, perm); } // Wrapper function so we can use the private // InterfaceList::HashInterfaceName. int HashInterfaceName(const std::string& name) { return InterfaceList::HashInterfaceName(name); } }; // Tests looking up a stable interface. TEST_F(InterfaceListTest, Stable) { InterfaceList list; ASSERT_TRUE(list.GetInterfaceForPPB(PPB_CORE_INTERFACE_1_0) != NULL); ASSERT_TRUE(list.GetInterfaceForPPB("FakeUnknownInterface") == NULL); } // Tests that dev channel restrictions work properly. TEST_F(InterfaceListTest, DevChannel) { InterfaceList list; // "Dev channel" interface. static const char* dev_channel_iface_name = "TestDevChannelInterface"; void* dev_channel_iface_addr = (void*)0xdeadbeef; // "Dev" interface static const char* dev_iface_name = "TestDevInterface"; void* dev_iface_addr = (void*)0xcafefade; AddPPB(&list, dev_channel_iface_name, dev_channel_iface_addr, PERMISSION_DEV_CHANNEL); AddPPB(&list, dev_iface_name, dev_iface_addr, PERMISSION_DEV); InterfaceList::SetProcessGlobalPermissions( PpapiPermissions(PERMISSION_NONE)); ASSERT_TRUE(list.GetInterfaceForPPB(dev_channel_iface_name) == NULL); ASSERT_TRUE(list.GetInterfaceForPPB(dev_iface_name) == NULL); InterfaceList::SetProcessGlobalPermissions( PpapiPermissions(PERMISSION_DEV_CHANNEL)); ASSERT_TRUE(list.GetInterfaceForPPB(dev_channel_iface_name) == dev_channel_iface_addr); ASSERT_TRUE(list.GetInterfaceForPPB(dev_iface_name) == NULL); InterfaceList::SetProcessGlobalPermissions( PpapiPermissions(PERMISSION_DEV)); ASSERT_TRUE(list.GetInterfaceForPPB(dev_channel_iface_name) == NULL); ASSERT_TRUE(list.GetInterfaceForPPB(dev_iface_name) == dev_iface_addr); InterfaceList::SetProcessGlobalPermissions( PpapiPermissions(PERMISSION_DEV | PERMISSION_DEV_CHANNEL)); ASSERT_TRUE(list.GetInterfaceForPPB(dev_channel_iface_name) == dev_channel_iface_addr); ASSERT_TRUE(list.GetInterfaceForPPB(dev_iface_name) == dev_iface_addr); } // Test that the hash function provided by base::Hash is unchanged. This is so // that we will generate correct values when logging interface use to UMA. TEST_F(InterfaceListTest, InterfaceHash) { EXPECT_EQ(612625164, HashInterfaceName("PPB_InputEvent;1.0")); EXPECT_EQ(79708274, HashInterfaceName("PPB_TCPSocket;1.1")); } } // namespace proxy } // namespace ppapi