12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/tests/test_talk_private.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <stdio.h>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string.h>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/pp_errors.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/private/ppb_talk_private.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/cpp/instance.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/cpp/module.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/tests/test_utils.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/tests/testing_instance.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)REGISTER_TEST_CASE(TalkPrivate);
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TestTalkPrivate::TestTalkPrivate(TestingInstance* instance)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : TestCase(instance),
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      talk_private_interface_1(NULL) {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TestTalkPrivate::Init() {
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!CheckTestingInterface()) {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    instance_->AppendError("Testing interface not available");
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  talk_private_interface_1 = static_cast<const PPB_Talk_Private_1_0*>(
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      pp::Module::Get()->GetBrowserInterface(PPB_TALK_PRIVATE_INTERFACE_1_0));
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(__native_client__)
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (talk_private_interface_1)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    instance_->AppendError("TalkPrivate interface is supported by NaCl");
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!talk_private_interface_1)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    instance_->AppendError("TalkPrivate interface not available");
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestTalkPrivate::RunTests(const std::string& filter) {
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RUN_CALLBACK_TEST(TestTalkPrivate, GetPermission, filter);
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string TestTalkPrivate::TestGetPermission() {
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!talk_private_interface_1) {
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PASS();
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!testing_interface_->IsOutOfProcess()) {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We only support out-of-process access to this API, so skip in-process
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PASS();
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Under Ash, this will prompt the user so the test cannot run in an automated
5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // fashion. To manually test under Ash, replace "!defined(USE_ASH)" with 1.
6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if !defined(USE_ASH)
61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  PP_Resource talk_resource = talk_private_interface_1->Create(
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      instance_->pp_instance());
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestCompletionCallback callback(instance_->pp_instance(), callback_type());
65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  callback.WaitForResult(talk_private_interface_1->GetPermission(talk_resource,
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      callback.GetCallback().pp_completion_callback()));
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK_CALLBACK_BEHAVIOR(callback);
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_ASH)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Under Ash, this test will actually prompt the user and return either true
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // or false depending on their choice.
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (callback.result() != 0 && callback.result() != 1)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return "Unexpected result";
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Currently not implemented without Ash, bur always returns false.
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (callback.result() != 0)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return "Unexpected non-zero result";
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
7923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PASS();
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
82