blob: 18044816e7e908fc818d9ba5e5fb4300881132e1 [file]
/*
* 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 "paimon/common/options/time_duration.h"
#include "gtest/gtest.h"
#include "paimon/result.h"
#include "paimon/status.h"
#include "paimon/testing/utils/testharness.h"
namespace paimon::test {
TEST(TimeDurationTest, TestParseTime) {
ASSERT_OK_AND_ASSIGN(int64_t time, TimeDuration::Parse("1000 ns"));
ASSERT_EQ(time, 0L);
for (const auto& unit : {"ns", " ns", "nano", " nano", "nanos", "nanosecond", "nanoseconds"}) {
ASSERT_OK_AND_ASSIGN(time, TimeDuration::Parse(std::string("123456789") + unit));
ASSERT_EQ(time, 123L);
}
for (const auto& unit : {"us", " us", "µs", "micro", "micros", "microsecond", "microseconds"}) {
ASSERT_OK_AND_ASSIGN(time, TimeDuration::Parse(std::string("123456789") + unit));
ASSERT_EQ(time, 123456L);
}
for (const auto& unit : {"ms", "milli", " milli", "millis", "millisecond", "milliseconds"}) {
ASSERT_OK_AND_ASSIGN(time, TimeDuration::Parse(std::string("1000") + unit));
ASSERT_EQ(time, 1000L);
}
// without time unit, default time unit is milli
ASSERT_OK_AND_ASSIGN(time, TimeDuration::Parse("1000"));
ASSERT_EQ(time, 1000L);
for (const auto& unit : {"s", "sec", "secs", " second", "seconds"}) {
ASSERT_OK_AND_ASSIGN(time, TimeDuration::Parse(std::string("1000") + unit));
ASSERT_EQ(time, 1000000L);
}
for (const auto& unit : {" min", "m", "minute", "minutes"}) {
ASSERT_OK_AND_ASSIGN(time, TimeDuration::Parse(std::string("1000") + unit));
ASSERT_EQ(time, 60000000L);
}
for (const auto& unit : {"h", "hour", " hours"}) {
ASSERT_OK_AND_ASSIGN(time, TimeDuration::Parse(std::string("1000") + unit));
ASSERT_EQ(time, 3600000000L);
}
for (const auto& unit : {"d", "day", " days"}) {
ASSERT_OK_AND_ASSIGN(time, TimeDuration::Parse(std::string("1000") + unit));
ASSERT_EQ(time, 86400000000L);
}
// with invalid time unit
ASSERT_NOK_WITH_MSG(TimeDuration::Parse("1000ss"),
"Time duration unit 'ss' does not match any of the recognized units");
// with invalid time duration
ASSERT_NOK_WITH_MSG(TimeDuration::Parse(""), "argument is an empty or whitespace-only string");
ASSERT_NOK_WITH_MSG(TimeDuration::Parse(" "),
"argument is an empty or whitespace-only string");
ASSERT_NOK_WITH_MSG(TimeDuration::Parse("ns"), "text does not start with a number");
}
TEST(TimeDurationTest, TestBoundaryCheck) {
ASSERT_OK_AND_ASSIGN(int64_t time, TimeDuration::Parse("1000 us"));
ASSERT_EQ(time, 1L);
ASSERT_OK(TimeDuration::Parse("106751991167d"));
ASSERT_NOK(TimeDuration::Parse("106751991168d"));
ASSERT_OK(TimeDuration::Parse("2562047788015h"));
ASSERT_NOK(TimeDuration::Parse("2562047788016h"));
ASSERT_OK(TimeDuration::Parse("153722867280912m"));
ASSERT_NOK(TimeDuration::Parse("153722867280913m"));
ASSERT_OK(TimeDuration::Parse("9223372036854775s"));
ASSERT_NOK(TimeDuration::Parse("9223372036854776s"));
ASSERT_OK(TimeDuration::Parse("9223372036854775807ms"));
ASSERT_NOK(TimeDuration::Parse("9223372036854775808ms"));
}
} // namespace paimon::test