222 lines
10 KiB
C++
222 lines
10 KiB
C++
// Licensed to the Apache Software Foundation (ASF) under one
|
|
// or more contributor license agreements. See the NOTICE file
|
|
// distributed with this work for additional information
|
|
// regarding copyright ownership. The ASF licenses this file
|
|
// to you under the Apache License, Version 2.0 (the
|
|
// "License"); you may not use this file except in compliance
|
|
// with the License. You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing,
|
|
// software distributed under the License is distributed on an
|
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
// KIND, either express or implied. See the License for the
|
|
// specific language governing permissions and limitations
|
|
// under the License.
|
|
|
|
#include <gtest/gtest.h>
|
|
|
|
#include <regex>
|
|
|
|
#include "vec/exec/format/parquet/parquet_common.h"
|
|
|
|
namespace doris {
|
|
namespace vectorized {
|
|
class ParquetVersionTest : public testing::Test {
|
|
public:
|
|
ParquetVersionTest() = default;
|
|
};
|
|
|
|
TEST_F(ParquetVersionTest, test_version_parser) {
|
|
std::unique_ptr<ParsedVersion> parsed_version;
|
|
|
|
Status status = VersionParser::parse("parquet-mr version 1.6.0 (build abcd)", &parsed_version);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_EQ(ParsedVersion("parquet-mr", "1.6.0", "abcd"), *parsed_version);
|
|
|
|
status = VersionParser::parse("parquet-mr version 1.6.22rc99-SNAPSHOT (build abcd)",
|
|
&parsed_version);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_EQ(ParsedVersion("parquet-mr", "1.6.22rc99-SNAPSHOT", "abcd"), *parsed_version);
|
|
|
|
status = VersionParser::parse("unparseable string", &parsed_version);
|
|
EXPECT_FALSE(status.ok());
|
|
|
|
// missing semver
|
|
status = VersionParser::parse("parquet-mr version (build abcd)", &parsed_version);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_EQ(ParsedVersion("parquet-mr", std::nullopt, "abcd"), *parsed_version);
|
|
|
|
status = VersionParser::parse("parquet-mr version (build abcd)", &parsed_version);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_EQ(ParsedVersion("parquet-mr", std::nullopt, "abcd"), *parsed_version);
|
|
|
|
// missing build hash
|
|
status = VersionParser::parse("parquet-mr version 1.6.0 (build )", &parsed_version);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_EQ(ParsedVersion("parquet-mr", "1.6.0", std::nullopt), *parsed_version);
|
|
|
|
status = VersionParser::parse("parquet-mr version 1.6.0 (build)", &parsed_version);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_EQ(ParsedVersion("parquet-mr", "1.6.0", std::nullopt), *parsed_version);
|
|
|
|
status = VersionParser::parse("parquet-mr version (build)", &parsed_version);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_EQ(ParsedVersion("parquet-mr", std::nullopt, std::nullopt), *parsed_version);
|
|
|
|
status = VersionParser::parse("parquet-mr version (build )", &parsed_version);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_EQ(ParsedVersion("parquet-mr", std::nullopt, std::nullopt), *parsed_version);
|
|
|
|
// Missing entire build section
|
|
status = VersionParser::parse("parquet-mr version 1.6.0", &parsed_version);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_EQ(ParsedVersion("parquet-mr", "1.6.0", std::nullopt), *parsed_version);
|
|
|
|
status = VersionParser::parse("parquet-mr version 1.8.0rc4", &parsed_version);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_EQ(ParsedVersion("parquet-mr", "1.8.0rc4", std::nullopt), *parsed_version);
|
|
|
|
status = VersionParser::parse("parquet-mr version 1.8.0rc4-SNAPSHOT", &parsed_version);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_EQ(ParsedVersion("parquet-mr", "1.8.0rc4-SNAPSHOT", std::nullopt), *parsed_version);
|
|
|
|
status = VersionParser::parse("parquet-mr version", &parsed_version);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_EQ(ParsedVersion("parquet-mr", std::nullopt, std::nullopt), *parsed_version);
|
|
|
|
// Various spaces
|
|
status = VersionParser::parse("parquet-mr version 1.6.0", &parsed_version);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_EQ(ParsedVersion("parquet-mr", "1.6.0", std::nullopt), *parsed_version);
|
|
|
|
status = VersionParser::parse("parquet-mr version 1.8.0rc4", &parsed_version);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_EQ(ParsedVersion("parquet-mr", "1.8.0rc4", std::nullopt), *parsed_version);
|
|
|
|
status =
|
|
VersionParser::parse("parquet-mr version 1.8.0rc4-SNAPSHOT ", &parsed_version);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_EQ(ParsedVersion("parquet-mr", "1.8.0rc4-SNAPSHOT", std::nullopt), *parsed_version);
|
|
|
|
status = VersionParser::parse("parquet-mr version", &parsed_version);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_EQ(ParsedVersion("parquet-mr", std::nullopt, std::nullopt), *parsed_version);
|
|
|
|
status = VersionParser::parse("parquet-mr version 1.6.0 ( build )", &parsed_version);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_EQ(ParsedVersion("parquet-mr", "1.6.0", std::nullopt), *parsed_version);
|
|
|
|
status = VersionParser::parse("parquet-mr version 1.6.0 ( build)", &parsed_version);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_EQ(ParsedVersion("parquet-mr", "1.6.0", std::nullopt), *parsed_version);
|
|
|
|
status = VersionParser::parse("parquet-mr version ( build)", &parsed_version);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_EQ(ParsedVersion("parquet-mr", std::nullopt, std::nullopt), *parsed_version);
|
|
|
|
status = VersionParser::parse("parquet-mr version (build )", &parsed_version);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_EQ(ParsedVersion("parquet-mr", std::nullopt, std::nullopt), *parsed_version);
|
|
}
|
|
|
|
void assertLessThan(const std::string& a, const std::string& b) {
|
|
std::unique_ptr<SemanticVersion> version_a;
|
|
Status status = SemanticVersion::parse(a, &version_a);
|
|
EXPECT_TRUE(status.ok());
|
|
std::unique_ptr<SemanticVersion> version_b;
|
|
status = SemanticVersion::parse(b, &version_b);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_LT(version_a->compare_to(*version_b), 0) << a << " should be < " << b;
|
|
EXPECT_GT(version_b->compare_to(*version_a), 0) << b << " should be > " << a;
|
|
}
|
|
|
|
void assertEqualTo(const std::string& a, const std::string& b) {
|
|
std::unique_ptr<SemanticVersion> version_a;
|
|
Status status = SemanticVersion::parse(a, &version_a);
|
|
EXPECT_TRUE(status.ok());
|
|
std::unique_ptr<SemanticVersion> version_b;
|
|
status = SemanticVersion::parse(b, &version_b);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_EQ(version_a->compare_to(*version_b), 0) << a << " should equal " << b;
|
|
}
|
|
|
|
TEST_F(ParquetVersionTest, test_compare) {
|
|
EXPECT_EQ(SemanticVersion(1, 8, 1).compare_to(SemanticVersion(1, 8, 1)), 0);
|
|
EXPECT_LT(SemanticVersion(1, 8, 0).compare_to(SemanticVersion(1, 8, 1)), 0);
|
|
EXPECT_GT(SemanticVersion(1, 8, 2).compare_to(SemanticVersion(1, 8, 1)), 0);
|
|
|
|
EXPECT_EQ(SemanticVersion(1, 8, 1).compare_to(SemanticVersion(1, 8, 1)), 0);
|
|
EXPECT_LT(SemanticVersion(1, 8, 0).compare_to(SemanticVersion(1, 8, 1)), 0);
|
|
EXPECT_GT(SemanticVersion(1, 8, 2).compare_to(SemanticVersion(1, 8, 1)), 0);
|
|
|
|
EXPECT_LT(SemanticVersion(1, 7, 0).compare_to(SemanticVersion(1, 8, 0)), 0);
|
|
EXPECT_GT(SemanticVersion(1, 9, 0).compare_to(SemanticVersion(1, 8, 0)), 0);
|
|
|
|
EXPECT_LT(SemanticVersion(0, 0, 0).compare_to(SemanticVersion(1, 0, 0)), 0);
|
|
EXPECT_GT(SemanticVersion(2, 0, 0).compare_to(SemanticVersion(1, 0, 0)), 0);
|
|
|
|
EXPECT_LT(SemanticVersion(1, 8, 100).compare_to(SemanticVersion(1, 9, 0)), 0);
|
|
|
|
EXPECT_GT(SemanticVersion(1, 8, 0).compare_to(SemanticVersion(1, 8, 0, true)), 0);
|
|
EXPECT_EQ(SemanticVersion(1, 8, 0, true).compare_to(SemanticVersion(1, 8, 0, true)), 0);
|
|
EXPECT_LT(SemanticVersion(1, 8, 0, true).compare_to(SemanticVersion(1, 8, 0)), 0);
|
|
}
|
|
|
|
TEST_F(ParquetVersionTest, test_semver_prerelease_examples) {
|
|
std::vector<std::string> examples = {"1.0.0-alpha", "1.0.0-alpha.1", "1.0.0-alpha.beta",
|
|
"1.0.0-beta", "1.0.0-beta.2", "1.0.0-beta.11",
|
|
"1.0.0-rc.1", "1.0.0"};
|
|
for (size_t i = 0; i < examples.size() - 1; ++i) {
|
|
assertLessThan(examples[i], examples[i + 1]);
|
|
assertEqualTo(examples[i], examples[i]);
|
|
}
|
|
assertEqualTo(examples.back(), examples.back());
|
|
}
|
|
|
|
TEST_F(ParquetVersionTest, test_semver_build_info_examples) {
|
|
assertEqualTo("1.0.0-alpha+001", "1.0.0-alpha+001");
|
|
assertEqualTo("1.0.0-alpha", "1.0.0-alpha+001");
|
|
assertEqualTo("1.0.0+20130313144700", "1.0.0+20130313144700");
|
|
assertEqualTo("1.0.0", "1.0.0+20130313144700");
|
|
assertEqualTo("1.0.0-beta+exp.sha.5114f85", "1.0.0-beta+exp.sha.5114f85");
|
|
assertEqualTo("1.0.0-beta", "1.0.0-beta+exp.sha.5114f85");
|
|
}
|
|
|
|
TEST_F(ParquetVersionTest, test_unknown_comparisons) {
|
|
assertLessThan("1.0.0rc0-alpha+001", "1.0.0-alpha");
|
|
}
|
|
|
|
TEST_F(ParquetVersionTest, test_distribution_versions) {
|
|
assertEqualTo("1.5.0-cdh5.5.0", "1.5.0-cdh5.5.0");
|
|
assertLessThan("1.5.0-cdh5.5.0", "1.5.0-cdh5.5.1");
|
|
assertLessThan("1.5.0-cdh5.5.0", "1.5.0-cdh5.5.1-SNAPSHOT");
|
|
assertLessThan("1.5.0-cdh5.5.0", "1.5.0-cdh5.6.0");
|
|
assertLessThan("1.5.0-cdh5.5.0", "1.5.0-cdh6.0.0");
|
|
assertLessThan("1.5.0-cdh5.5.0", "1.5.0");
|
|
assertLessThan("1.5.0-cdh5.5.0", "1.5.0-cdh5.5.0-SNAPSHOT");
|
|
}
|
|
|
|
TEST_F(ParquetVersionTest, test_parse) {
|
|
std::unique_ptr<SemanticVersion> semantic_version;
|
|
Status status = SemanticVersion::parse("1.8.0", &semantic_version);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_EQ(*semantic_version, SemanticVersion(1, 8, 0));
|
|
status = SemanticVersion::parse("1.8.0rc3", &semantic_version);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_EQ(*semantic_version, SemanticVersion(1, 8, 0, true));
|
|
status = SemanticVersion::parse("1.8.0rc3-SNAPSHOT", &semantic_version);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_EQ(*semantic_version, SemanticVersion(1, 8, 0, "rc3", "SNAPSHOT", std::nullopt));
|
|
status = SemanticVersion::parse("1.8.0-SNAPSHOT", &semantic_version);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_EQ(*semantic_version, SemanticVersion(1, 8, 0, std::nullopt, "SNAPSHOT", std::nullopt));
|
|
status = SemanticVersion::parse("1.5.0-cdh5.5.0", &semantic_version);
|
|
EXPECT_TRUE(status.ok());
|
|
EXPECT_EQ(*semantic_version, SemanticVersion(1, 5, 0, std::nullopt, "cdh5.5.0", std::nullopt));
|
|
}
|
|
|
|
} // namespace vectorized
|
|
} // namespace doris
|