blob: 6c8474b5ee1e44e3b485a96e3ab3651e63e1ec96 [file] [log] [blame]
// Copyright 2018 The Fuchsia 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 "lib/cmx_facet_parser/cmx_facet_parser.h"
#include <fcntl.h>
#include <string>
#include <tuple>
#include "gtest/gtest.h"
#include "lib/fxl/files/scoped_temp_dir.h"
#include "lib/json/json_parser.h"
#include "rapidjson/document.h"
namespace component {
namespace {
class CmxFacetParserTest : public ::testing::Test {
protected:
// Returns true for a valid cmx manifest represented by |json|.
bool ParseFrom(const std::string& json) {
json::JSONParser json_parser;
rapidjson::Document document =
json_parser.ParseFromString(json, "test_file");
EXPECT_FALSE(json_parser.HasError());
EXPECT_TRUE(facet_parser().Parse(document, &json_parser));
return !json_parser.HasError();
}
bool ParseFromFileAt(const std::string& json) {
files::ScopedTempDir tmp_dir;
const int dirfd = open(tmp_dir.path().c_str(), O_RDONLY);
std::string tmp_file;
tmp_dir.NewTempFileWithData(json, &tmp_file);
json::JSONParser json_parser;
return facet_parser().ParseFromFileAt(dirfd, tmp_file, &json_parser);
}
CmxFacetParser& facet_parser() { return facet_parser_; };
private:
CmxFacetParser facet_parser_;
};
TEST_F(CmxFacetParserTest, ParseEmpty) {
EXPECT_TRUE(ParseFrom(R"JSON({})JSON"));
}
TEST_F(CmxFacetParserTest, ParseSection) {
EXPECT_TRUE(ParseFrom(R"JSON({"facets":
{"section1":
{ "v1" : 1, "v2" : 2, "v3": "v3_value" },
"section2": "some_str"}
})JSON"));
const auto& section1 = facet_parser().GetSection("section1");
ASSERT_FALSE(section1.IsNull());
ASSERT_TRUE(section1.HasMember("v1"));
ASSERT_TRUE(section1.HasMember("v2"));
ASSERT_TRUE(section1.HasMember("v3"));
EXPECT_EQ(section1["v1"].GetInt(), 1);
EXPECT_EQ(section1["v2"].GetInt(), 2);
EXPECT_EQ(std::string(section1["v3"].GetString()), "v3_value");
const auto& section2 = facet_parser().GetSection("section2");
ASSERT_FALSE(section2.IsNull());
ASSERT_TRUE(section2.IsString());
EXPECT_EQ(std::string(section2.GetString()), "some_str");
const auto& invalid = facet_parser().GetSection("invalid");
ASSERT_TRUE(invalid.IsNull());
}
TEST_F(CmxFacetParserTest, ParseFromFileAt) {
files::ScopedTempDir tmp_dir;
const int dirfd = open(tmp_dir.path().c_str(), O_RDONLY);
std::string tmp_file;
tmp_dir.NewTempFileWithData(R"JSON({"facets":
{"section1":
{ "v1" : 1, "v2" : 2, "v3": "v3_value" },
"section2": "some_str"}
})JSON",
&tmp_file);
json::JSONParser json_parser;
EXPECT_TRUE(facet_parser().ParseFromFileAt(dirfd, tmp_file, &json_parser));
EXPECT_FALSE(json_parser.HasError());
}
} // namespace
} // namespace component