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

#define CATCH_CONFIG_MAIN

#include <catch.hpp>
#include "Session.h"
#include "SessionBuilder.h"

std::shared_ptr<Session> session;

struct SessionListener : Catch::TestEventListenerBase {

  using TestEventListenerBase::TestEventListenerBase;

  void testCaseStarting(Catch::TestCaseInfo const& testInfo) override {
    if (testInfo.tagsAsString().find("[UrlUtils]") != std::string::npos) {
      return;
    }
    if (!session) {
      SessionBuilder builder;
      session = builder.host("127.0.0.1")
                    ->rpcPort(6667)
                    ->username("root")
                    ->password("root")
                    ->useSSL(false)
                    ->build();
    } else {
      session->open(false);
    }
  }

  void testCaseEnded(Catch::TestCaseStats const& testCaseStats) override {
    if (session) {
      session->close();
    }
  }

  void testRunEnded(Catch::TestRunStats const& testRunStats) override {
    // Release session before static/global teardown on Windows.
    session.reset();
  }
};

CATCH_REGISTER_LISTENER(SessionListener)
