blob: 597b3ea3bb9317f6356bb08bebb0c57179f83793 [file] [log] [blame]
// Copyright 2018 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 "chrome/chrome_cleaner/json_parser/json_parser_impl.h"
#include "base/bind.h"
#include "base/synchronization/waitable_event.h"
#include "base/test/test_timeouts.h"
#include "base/values.h"
#include "chrome/chrome_cleaner/interfaces/json_parser.mojom.h"
#include "chrome/chrome_cleaner/ipc/mojo_task_runner.h"
#include "chrome/chrome_cleaner/json_parser/sandboxed_json_parser.h"
#include "mojo/public/cpp/bindings/interface_request.h"
#include "testing/gtest/include/gtest/gtest.h"
using base::WaitableEvent;
namespace chrome_cleaner {
namespace {
const char kTestJsonKey[] = "name";
const char kTestJsonValue[] = "Jason";
const char kTestJsonText[] = "{ \"name\": \"Jason\" }";
const char kInvalidJsonText[] = "{ name: jason }";
class JsonParserImplTest : public testing::Test {
public:
JsonParserImplTest()
: task_runner_(MojoTaskRunner::Create()),
json_parser_ptr_(new mojom::JsonParserPtr(),
base::OnTaskRunnerDeleter(task_runner_)),
json_parser_impl_(nullptr, base::OnTaskRunnerDeleter(task_runner_)),
sandboxed_json_parser_(task_runner_.get(), json_parser_ptr_.get()) {
BindParser();
}
protected:
void BindParser() {
task_runner_->PostTask(
FROM_HERE,
base::BindOnce(
[](mojom::JsonParserPtr* json_parser,
std::unique_ptr<JsonParserImpl, base::OnTaskRunnerDeleter>*
json_parser_impl) {
json_parser_impl->reset(new JsonParserImpl(
mojo::MakeRequest(json_parser), base::DoNothing()));
},
json_parser_ptr_.get(), &json_parser_impl_));
}
scoped_refptr<MojoTaskRunner> task_runner_;
std::unique_ptr<mojom::JsonParserPtr, base::OnTaskRunnerDeleter>
json_parser_ptr_;
std::unique_ptr<JsonParserImpl, base::OnTaskRunnerDeleter> json_parser_impl_;
SandboxedJsonParser sandboxed_json_parser_;
};
} // namespace
TEST_F(JsonParserImplTest, ParseJson) {
WaitableEvent done(WaitableEvent::ResetPolicy::MANUAL,
WaitableEvent::InitialState::NOT_SIGNALED);
sandboxed_json_parser_.Parse(
kTestJsonText,
base::BindOnce(
[](WaitableEvent* done, base::Optional<base::Value> value,
const base::Optional<std::string>& error) {
ASSERT_FALSE(error.has_value());
ASSERT_TRUE(value.has_value());
ASSERT_TRUE(value->is_dict());
const base::DictionaryValue* dict;
ASSERT_TRUE(value->GetAsDictionary(&dict));
std::string string_value;
ASSERT_TRUE(dict->GetString(kTestJsonKey, &string_value));
EXPECT_EQ(kTestJsonValue, string_value);
done->Signal();
},
&done));
EXPECT_TRUE(done.TimedWait(TestTimeouts::action_timeout()));
}
TEST_F(JsonParserImplTest, ParseJsonError) {
WaitableEvent done(WaitableEvent::ResetPolicy::MANUAL,
WaitableEvent::InitialState::NOT_SIGNALED);
sandboxed_json_parser_.Parse(
kInvalidJsonText,
base::BindOnce(
[](WaitableEvent* done, base::Optional<base::Value> value,
const base::Optional<std::string>& error) {
ASSERT_TRUE(error.has_value());
EXPECT_FALSE(error->empty());
done->Signal();
},
&done));
EXPECT_TRUE(done.TimedWait(TestTimeouts::action_timeout()));
}
} // namespace chrome_cleaner