blob: a0b89603fa205afc017399c819855a58ba3f19fe [file] [log] [blame]
/**
* 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 "Backoff.h"
#include "PulsarFriend.h"
using namespace pulsar;
using boost::posix_time::milliseconds;
using boost::posix_time::seconds;
static bool checkExactAndDecrementTimer(Backoff& backoff, const unsigned int& t2) {
const unsigned int& t1 = backoff.next().total_milliseconds();
boost::posix_time::ptime& firstBackOffTime = PulsarFriend::getFirstBackoffTime(backoff);
firstBackOffTime -= milliseconds(t2);
return t1 == t2;
}
static bool withinTenPercentAndDecrementTimer(Backoff& backoff, const unsigned int& t2) {
const unsigned int& t1 = backoff.next().total_milliseconds();
boost::posix_time::ptime& firstBackOffTime = PulsarFriend::getFirstBackoffTime(backoff);
firstBackOffTime -= milliseconds(t2);
return (t1 >= t2 * 0.9 && t1 <= t2);
}
TEST(BackoffTest, mandatoryStopTestNegativeTest) {
Backoff backoff(milliseconds(100), seconds(60), milliseconds(1900));
ASSERT_EQ(backoff.next().total_milliseconds(), 100);
backoff.next().total_milliseconds(); // 200
backoff.next().total_milliseconds(); // 400
backoff.next().total_milliseconds(); // 800
ASSERT_FALSE(withinTenPercentAndDecrementTimer(backoff, 400));
}
TEST(BackoffTest, firstBackoffTimerTest) {
Backoff backoff(milliseconds(100), seconds(60), milliseconds(1900));
ASSERT_EQ(backoff.next().total_milliseconds(), 100);
boost::posix_time::ptime firstBackOffTime = PulsarFriend::getFirstBackoffTime(backoff);
usleep(300 * 1000);
TimeDuration diffBackOffTime = PulsarFriend::getFirstBackoffTime(backoff) - firstBackOffTime;
ASSERT_EQ(diffBackOffTime, milliseconds(0)); // no change since reset not called
backoff.reset();
ASSERT_EQ(backoff.next().total_milliseconds(), 100);
diffBackOffTime = PulsarFriend::getFirstBackoffTime(backoff) - firstBackOffTime;
ASSERT_TRUE(diffBackOffTime >= milliseconds(300) && diffBackOffTime < milliseconds(310));
}
TEST(BackoffTest, basicTest) {
Backoff backoff(milliseconds(5), seconds(60), seconds(60));
ASSERT_TRUE(checkExactAndDecrementTimer(backoff, 5));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 10));
backoff.reset();
ASSERT_TRUE(checkExactAndDecrementTimer(backoff, 5));
}
TEST(BackoffTest, maxTest) {
Backoff backoff(milliseconds(5), milliseconds(20), milliseconds(20));
ASSERT_TRUE(checkExactAndDecrementTimer(backoff, 5));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 10));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 5));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 20));
}
TEST(BackoffTest, mandatoryStopTest) {
Backoff backoff(milliseconds(100), seconds(60), milliseconds(1900));
ASSERT_TRUE(checkExactAndDecrementTimer(backoff, 100));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 200));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 400));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 800));
// would have been 1600 w/o the mandatory stop
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 400));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 3200));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 6400));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 12800));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 25600));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 51200));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 60000));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 60000));
backoff.reset();
ASSERT_TRUE(checkExactAndDecrementTimer(backoff, 100));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 200));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 400));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 800));
// would have been 1600 w/o the mandatory stop
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 400));
backoff.reset();
ASSERT_TRUE(checkExactAndDecrementTimer(backoff, 100));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 200));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 400));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 800));
backoff.reset();
ASSERT_TRUE(checkExactAndDecrementTimer(backoff, 100));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 200));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 400));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 800));
}
TEST(BackoffTest, ignoringMandatoryStopTest) {
Backoff backoff(milliseconds(100), seconds(60), milliseconds(0));
ASSERT_TRUE(checkExactAndDecrementTimer(backoff, 100));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 200));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 400));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 800));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 1600));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 3200));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 6400));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 12800));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 25600));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 51200));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 60000));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 60000));
backoff.reset();
ASSERT_TRUE(checkExactAndDecrementTimer(backoff, 100));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 200));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 400));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 800));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 1600));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 3200));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 6400));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 12800));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 25600));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 51200));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 60000));
ASSERT_TRUE(withinTenPercentAndDecrementTimer(backoff, 60000));
}