//
//
// Copyright 2026 gRPC authors.
//
// 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
//
//     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.
//
//

#ifndef GRPC_TEST_CPP_END2END_END2END_TEST_UTILS_H
#define GRPC_TEST_CPP_END2END_END2END_TEST_UTILS_H

#include <grpc/grpc.h>
#include <grpcpp/support/channel_arguments.h>

#include "src/core/lib/experiments/experiments.h"
#include "absl/log/globals.h"
#include "absl/log/log.h"

namespace grpc {
namespace testing {

// TODO(tjagtap) : [PH2][P3] : Remove once all the PH2 E2E tests are fixed.
inline void DisableLoggingForPH2Tests() {
  if (grpc_core::IsPromiseBasedHttp2ClientTransportEnabled()) {
    grpc_tracer_set_enabled("http", false);
    grpc_tracer_set_enabled("channel", false);
    grpc_tracer_set_enabled("subchannel", false);
    grpc_tracer_set_enabled("client_channel", false);
    grpc_tracer_set_enabled("http2_ph2_transport", false);
    grpc_tracer_set_enabled("call", false);
    grpc_tracer_set_enabled("call_state", false);
    grpc_tracer_set_enabled("promise_primitives", false);
    absl::SetGlobalVLogLevel(-1);
  }
}

// TODO(tjagtap) : [PH2][P3] : Remove once all the PH2 E2E tests are fixed.
inline void EnableLoggingForPH2Tests() {
  if (grpc_core::IsPromiseBasedHttp2ClientTransportEnabled()) {
    grpc_tracer_set_enabled("http", 1);
    grpc_tracer_set_enabled("channel", 1);
    grpc_tracer_set_enabled("subchannel", 1);
    grpc_tracer_set_enabled("client_channel", 1);
    grpc_tracer_set_enabled("http2_ph2_transport", 1);
    grpc_tracer_set_enabled("call", 1);
    grpc_tracer_set_enabled("call_state", 1);
    grpc_tracer_set_enabled("promise_primitives", 1);
    absl::SetGlobalVLogLevel(2);
  }
}

inline void ApplyCommonChannelArguments(ChannelArguments& args) {
  if (grpc_core::IsPromiseBasedHttp2ClientTransportEnabled()) {
    // TODO(tjagtap) [PH2][P2] Consider removing when bug in
    // retry_interceptor.cc is fixed.
    args.SetInt(GRPC_ARG_ENABLE_RETRIES, 0);
  }
}

#define SKIP_TEST_FOR_PH2_CLIENT(message)                     \
  if (grpc_core::IsPromiseBasedHttp2ClientTransportEnabled()) \
    GTEST_SKIP() << (message);

#define SKIP_TEST_FOR_PH2_SERVER(message)                     \
  if (grpc_core::IsPromiseBasedHttp2ServerTransportEnabled()) \
    GTEST_SKIP() << (message);

// Retry for PH2 will be implemented separately, after the PH2 Client and Server
// rollout starts.
#define SKIP_RETRY_TEST_FOR_PH2_CLIENT(message)               \
  if (grpc_core::IsPromiseBasedHttp2ClientTransportEnabled()) \
    GTEST_SKIP() << (message);

}  // namespace testing
}  // namespace grpc

#endif  // GRPC_TEST_CPP_END2END_END2END_TEST_UTILS_H
