// 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 "kudu/gutil/sysinfo.h"

#include <gtest/gtest.h>

namespace kudu {

TEST(SysInfoTest, ReadMaxCpuIndexTest) {
  using base::ParseMaxCpuIndex;
  EXPECT_EQ(0, ParseMaxCpuIndex("0\n"));
  EXPECT_EQ(1, ParseMaxCpuIndex("1\n"));
  EXPECT_EQ(7, ParseMaxCpuIndex("0-7\n"));
  EXPECT_EQ(40, ParseMaxCpuIndex("0-7,30-40\n"));
  EXPECT_EQ(143, ParseMaxCpuIndex("2,4-127,128-143\n"));
  EXPECT_EQ(44, ParseMaxCpuIndex("44-44\n"));

  // Don't assume that ranges are in ascending order or non-overlapping,
  // just in case.
  EXPECT_EQ(8, ParseMaxCpuIndex("0-7,5-8\n"));
  EXPECT_EQ(7, ParseMaxCpuIndex("0-7,5-6\n"));
  EXPECT_EQ(3, ParseMaxCpuIndex("2-3,0-1\n"));
  EXPECT_EQ(3, ParseMaxCpuIndex("2-3,0\n"));
  EXPECT_EQ(3, ParseMaxCpuIndex("3,0-2\n"));

  // Invalid inputs.
  EXPECT_EQ(-1, ParseMaxCpuIndex(""));
  EXPECT_EQ(-1, ParseMaxCpuIndex("\n"));
  EXPECT_EQ(-1, ParseMaxCpuIndex(" "));
  EXPECT_EQ(-1, ParseMaxCpuIndex("a\n"));
  EXPECT_EQ(-1, ParseMaxCpuIndex("0\n1\n"));
  EXPECT_EQ(-1, ParseMaxCpuIndex("\n1\n"));
  EXPECT_EQ(-1, ParseMaxCpuIndex("\n1"));
  EXPECT_EQ(-1, ParseMaxCpuIndex("0-\n"));
  EXPECT_EQ(-1, ParseMaxCpuIndex("-2\n"));
  EXPECT_EQ(-1, ParseMaxCpuIndex("1-9qwerty\n"));
  EXPECT_EQ(-1, ParseMaxCpuIndex("1-9,0-\n"));
  EXPECT_EQ(-1, ParseMaxCpuIndex("1,2,3-\n"));
  EXPECT_EQ(-1, ParseMaxCpuIndex("1,2,a-4\n"));
  EXPECT_EQ(-1, ParseMaxCpuIndex("1,2,3@4\n"));
  EXPECT_EQ(-1, ParseMaxCpuIndex("1,2,\n"));
  EXPECT_EQ(-1, ParseMaxCpuIndex("3-2\n"));

  // Overflows in various positions.
  EXPECT_EQ(-1, ParseMaxCpuIndex("2147483648")); // 2^31
  EXPECT_EQ(-1, ParseMaxCpuIndex("18446744073709551617")); // 2^64 + 1
  EXPECT_EQ(-1, ParseMaxCpuIndex("999999999999999999999999999999999999999999999999"));
  EXPECT_EQ(-1, ParseMaxCpuIndex("0-2147483648")); // 2^31
  EXPECT_EQ(-1, ParseMaxCpuIndex("0-18446744073709551617")); // 2^64 + 1
  EXPECT_EQ(-1, ParseMaxCpuIndex("0-999999999999999999999999999999999999999999999999"));
  EXPECT_EQ(-1, ParseMaxCpuIndex("2147483648-1")); // 2^31
  EXPECT_EQ(-1, ParseMaxCpuIndex("18446744073709551617-1")); // 2^64 + 1
  EXPECT_EQ(-1, ParseMaxCpuIndex("999999999999999999999999999999999999999999999999-1"));
}

} // namespace kudu
