blob: 389ca6fd60a2d5296b7f75a7e36775f66688f6e0 [file] [log] [blame]
// Copyright 2010-2015, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <errno.h>
#include <pthread.h>
#include <sys/types.h>
#include <ppapi/cpp/instance.h>
#include <ppapi/cpp/module.h>
#include <ppapi/cpp/url_loader.h>
#include <ppapi/cpp/url_request_info.h>
#include <ppapi/utility/completion_callback_factory.h>
#include <cstring>
#include <memory>
#include "base/port.h"
#include "base/logging.h"
#include "base/pepper_file_util.h"
#include "net/http_client_pepper.h"
#include "testing/base/public/googletest.h"
#include "testing/base/public/gunit.h"
namespace mozc {
namespace testing {
void WorkAroundEmptyFunctionToAvoidLinkError() {
}
} // namespace testing
} // namespace mozc
namespace pp {
namespace {
class NaclTestInstance : public pp::Instance {
public:
explicit NaclTestInstance(PP_Instance instance)
: pp::Instance(instance) {
cc_factory_.Initialize(this);
pthread_create(&thread_handle_,
0,
&NaclTestInstance::ThreadFunc,
static_cast<void *>(this));
}
virtual ~NaclTestInstance() {}
virtual void HandleMessage(const pp::Var &var_message) {}
private:
static void *ThreadFunc(void *ptr);
void TestFinish(int32_t result);
void OnUrlLoaderOpen(int32_t result);
pthread_t thread_handle_;
pp::CompletionCallbackFactory<NaclTestInstance> cc_factory_;
std::unique_ptr<pp::URLRequestInfo> url_request_;
std::unique_ptr<pp::URLLoader> url_loader_;
DISALLOW_COPY_AND_ASSIGN(NaclTestInstance);
};
void *NaclTestInstance::ThreadFunc(void *ptr) {
mozc::InitTestFlags();
NaclTestInstance *self = static_cast<NaclTestInstance *>(ptr);
mozc::RegisterPepperInstanceForHTTPClient(self);
mozc::PepperFileUtil::Initialize(self, 1024);
const int ret = RUN_ALL_TESTS();
pp::Module::Get()->core()->CallOnMainThread(
0,
self->cc_factory_.NewCallback(&NaclTestInstance::TestFinish),
ret);
return NULL;
}
void NaclTestInstance::TestFinish(int32_t result) {
url_request_.reset(new pp::URLRequestInfo(this));
url_loader_.reset(new pp::URLLoader(this));
if (result == 0) {
url_request_->SetURL("http://127.0.0.1:9999/TEST_FIN?result=success");
} else {
url_request_->SetURL("http://127.0.0.1:9999/TEST_FIN?result=failed");
}
url_request_->SetMethod("GET");
url_loader_->Open(
*url_request_,
cc_factory_.NewCallback(&NaclTestInstance::OnUrlLoaderOpen));
}
void NaclTestInstance::OnUrlLoaderOpen(int32_t result) {
// Do Nothing
}
class NaclTestModule : public pp::Module {
public:
NaclTestModule() : pp::Module() {}
virtual ~NaclTestModule() {}
protected:
virtual pp::Instance *CreateInstance(PP_Instance instance) {
return new NaclTestInstance(instance);
}
private:
DISALLOW_COPY_AND_ASSIGN(NaclTestModule);
};
} // namespace
Module* CreateModule() {
int argc = 1;
char argv0[] = "NaclModule";
char *argv_body[] = {argv0, NULL};
char **argv = argv_body;
InitGoogle(argv[0], &argc, &argv, true);
testing::InitGoogleTest(&argc, argv);
return new NaclTestModule();
}
} // namespace pp