/*
 * 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 "protocol/body/ProcessQueueInfo.hpp"

#include <gmock/gmock.h>
#include <gtest/gtest.h>

#include "MQMessageExt.h"

using testing::InitGoogleMock;
using testing::InitGoogleTest;
using testing::Return;

using rocketmq::MQMessageExt;
using rocketmq::ProcessQueueInfo;

TEST(ProcessQueueInfoTest, Init) {
  ProcessQueueInfo processQueueInfo;
  EXPECT_EQ(processQueueInfo.commitOffset, 0);
  EXPECT_EQ(processQueueInfo.cachedMsgMinOffset, 0);
  EXPECT_EQ(processQueueInfo.cachedMsgMaxOffset, 0);
  EXPECT_EQ(processQueueInfo.cachedMsgCount, 0);
  EXPECT_EQ(processQueueInfo.transactionMsgMinOffset, 0);
  EXPECT_EQ(processQueueInfo.transactionMsgMaxOffset, 0);
  EXPECT_EQ(processQueueInfo.transactionMsgCount, 0);
  EXPECT_EQ(processQueueInfo.locked, false);
  EXPECT_EQ(processQueueInfo.tryUnlockTimes, 0);
  EXPECT_EQ(processQueueInfo.lastLockTimestamp, 0);
  EXPECT_EQ(processQueueInfo.droped, false);
  EXPECT_EQ(processQueueInfo.lastPullTimestamp, 0);
  EXPECT_EQ(processQueueInfo.lastConsumeTimestamp, 0);

  processQueueInfo.setLocked(true);
  EXPECT_EQ(processQueueInfo.isLocked(), true);

  processQueueInfo.setDroped(true);
  EXPECT_EQ(processQueueInfo.isDroped(), true);

  processQueueInfo.setCommitOffset(456);
  EXPECT_EQ(processQueueInfo.getCommitOffset(), 456);

  Json::Value outJson = processQueueInfo.toJson();

  EXPECT_EQ(outJson["commitOffset"], "456");
  EXPECT_EQ(outJson["cachedMsgMinOffset"], "0");
  EXPECT_EQ(outJson["cachedMsgMaxOffset"], "0");
  EXPECT_EQ(outJson["cachedMsgCount"].asInt(), 0);
  EXPECT_EQ(outJson["transactionMsgMinOffset"], "0");
  EXPECT_EQ(outJson["transactionMsgMaxOffset"], "0");
  EXPECT_EQ(outJson["transactionMsgCount"].asInt(), 0);
  EXPECT_EQ(outJson["locked"].asBool(), true);
  EXPECT_EQ(outJson["tryUnlockTimes"].asInt(), 0);
  EXPECT_EQ(outJson["lastLockTimestamp"], "0");
  EXPECT_EQ(outJson["droped"].asBool(), true);
  EXPECT_EQ(outJson["lastPullTimestamp"], "0");
  EXPECT_EQ(outJson["lastConsumeTimestamp"], "0");
}

int main(int argc, char* argv[]) {
  InitGoogleMock(&argc, argv);
  testing::GTEST_FLAG(throw_on_failure) = true;
  testing::GTEST_FLAG(filter) = "ProcessQueueInfoTest.*";
  return RUN_ALL_TESTS();
}
