// Copyright 2023 Google LLC
//
// Licensed 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
//
//    https://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 "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/proto_utils.h"

#include "quiche/blind_sign_auth/proto/timestamp.pb.h"
#include "quiche/common/platform/api/quiche_test.h"
#include "quiche/common/test_tools/quiche_test_utils.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/time/time.h"
#include "quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/testing_utils.h"
#include "quiche/blind_sign_auth/anonymous_tokens/proto/anonymous_tokens.pb.h"

namespace private_membership {
namespace anonymous_tokens {
namespace {

TEST(ProtoUtilsTest, EmptyUseCase) {
  EXPECT_THAT(ParseUseCase("").status().code(),
              absl::StatusCode::kInvalidArgument);
}

TEST(ProtoUtilsTest, InvalidUseCase) {
  EXPECT_THAT(ParseUseCase("NOT_A_USE_CASE").status().code(),
              absl::StatusCode::kInvalidArgument);
}

TEST(ProtoUtilsTest, UndefinedUseCase) {
  EXPECT_THAT(
      ParseUseCase("ANONYMOUS_TOKENS_USE_CASE_UNDEFINED").status().code(),
      absl::StatusCode::kInvalidArgument);
}

TEST(ProtoUtilsTest, ValidUseCase) {
  ANON_TOKENS_QUICHE_EXPECT_OK_AND_ASSIGN(AnonymousTokensUseCase use_case,
                                   ParseUseCase("TEST_USE_CASE"));
  EXPECT_EQ(use_case, AnonymousTokensUseCase::TEST_USE_CASE);
}

TEST(ProtoUtilsTest, TimeFromProtoGood) {
  quiche::protobuf::Timestamp timestamp;
  timestamp.set_seconds(1234567890);
  timestamp.set_nanos(12345);
  ANON_TOKENS_QUICHE_EXPECT_OK_AND_ASSIGN(absl::Time time, TimeFromProto(timestamp));
  ASSERT_EQ(time, absl::FromUnixNanos(1234567890000012345));
}

TEST(ProtoUtilsTest, TimeFromProtoBad) {
  quiche::protobuf::Timestamp proto;
  proto.set_nanos(-1);
  EXPECT_THAT(TimeFromProto(proto).status().code(),
              absl::StatusCode::kInvalidArgument);

  proto.set_nanos(0);
  proto.set_seconds(253402300800);
  EXPECT_THAT(TimeFromProto(proto).status().code(),
              absl::StatusCode::kInvalidArgument);
}

TEST(ProtoUtilsTest, TimeToProtoGood) {
  quiche::protobuf::Timestamp proto;
  ANON_TOKENS_QUICHE_EXPECT_OK_AND_ASSIGN(
      proto, TimeToProto(absl::FromUnixSeconds(1596762373)));
  EXPECT_EQ(proto.seconds(), 1596762373);
  EXPECT_EQ(proto.nanos(), 0);

  ANON_TOKENS_QUICHE_EXPECT_OK_AND_ASSIGN(
      proto, TimeToProto(absl::FromUnixMillis(1596762373123L)));
  EXPECT_EQ(proto.seconds(), 1596762373);
  EXPECT_EQ(proto.nanos(), 123000000);
}

TEST(ProtoUtilsTest, TimeToProtoBad) {
  absl::StatusOr<quiche::protobuf::Timestamp> proto;
  proto = TimeToProto(absl::FromUnixSeconds(253402300800));
  EXPECT_THAT(proto.status().code(), absl::StatusCode::kInvalidArgument);
}

}  // namespace
}  // namespace anonymous_tokens
}  // namespace private_membership
