﻿/*
 * 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.
 */

namespace DotPulsar.StressTests
{
    using Extensions;
    using Fixtures;
    using System;
    using System.Threading;
    using System.Threading.Tasks;
    using Xunit;
    using Xunit.Abstractions;

    [Collection(nameof(StandaloneClusterTest))]
    public class ConnectionTests
    {
        private readonly ITestOutputHelper _output;

        public ConnectionTests(ITestOutputHelper output)
            => _output = output;

        [Theory]
        [InlineData("pulsar://localhost:54545")] // test that we can connect directly to a broker
        [InlineData("pulsar://localhost:6666")] // test that we can connect through a reverse proxy (NOT a pulsar proxy)
        public async Task ConnectionHandshake_GivenValidServiceUrls_ShouldEstablishConnection(string serviceUrl)
        {
            //Arrange
            var testRunId = Guid.NewGuid().ToString("N");

            var topic = $"persistent://public/default/consumer-tests-{testRunId}";

            var builder = PulsarClient.Builder()
                .ExceptionHandler(new XunitExceptionHandler(_output));

            if (!string.IsNullOrEmpty(serviceUrl))
                builder.ServiceUrl(new Uri(serviceUrl));

            await using var client = builder.Build();

            await using var producer = client.NewProducer(Schema.ByteArray)
                .ProducerName($"producer-{testRunId}")
                .Topic(topic)
                .Create();

            var cts = new CancellationTokenSource(TimeSpan.FromSeconds(60));

            //Act & Assert
            await producer.StateChangedTo(ProducerState.Connected, cts.Token);
        }
    }
}
