#!/usr/bin/env bash
#
# 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.
#

set -e

SRC_DIR=$(git rev-parse --show-toplevel)
cd $SRC_DIR

if [ -f /.dockerenv ]; then
    # When running tests inside docker. Unpack the pulsar tgz
    # because otherwise the classpath might not be correct
    # in picking up the jars from local maven repo
    export PULSAR_DIR=/tmp/pulsar-test-dist
    rm -rf $PULSAR_DIR
    mkdir $PULSAR_DIR
    TGZ=$(ls -1 $SRC_DIR/distribution/server/target/apache-pulsar*bin.tar.gz | head -1)
    tar -xzf $TGZ -C $PULSAR_DIR --strip-components 1
else
    export PULSAR_DIR=$SRC_DIR
fi

DATA_DIR=/tmp/pulsar-test-data
rm -rf $DATA_DIR
mkdir -p $DATA_DIR

# Set up basic authentication
cp $SRC_DIR/pulsar-client-cpp/test-conf/.htpasswd $DATA_DIR/.htpasswd
export PULSAR_EXTRA_OPTS=-Dpulsar.auth.basic.conf=$DATA_DIR/.htpasswd

# Copy TLS test certificates
mkdir -p $DATA_DIR/certs
cp $SRC_DIR/pulsar-broker/src/test/resources/authentication/tls/*.pem $DATA_DIR/certs

# Generate secret key and token
mkdir -p $DATA_DIR/tokens
$PULSAR_DIR/bin/pulsar tokens create-secret-key --output $DATA_DIR/tokens/secret.key

$PULSAR_DIR/bin/pulsar tokens create \
            --subject token-principal \
            --secret-key file:///$DATA_DIR/tokens/secret.key \
            > $DATA_DIR/tokens/token.txt

export PULSAR_STANDALONE_CONF=$SRC_DIR/pulsar-client-cpp/test-conf/standalone-ssl.conf
$PULSAR_DIR/bin/pulsar-daemon start standalone \
        --no-functions-worker --no-stream-storage \
        --bookkeeper-dir $DATA_DIR/bookkeeper

echo "-- Wait for Pulsar service to be ready"
until curl http://localhost:8080/metrics > /dev/null 2>&1 ; do sleep 1; done

echo "-- Pulsar service is ready -- Configure permissions"

export PULSAR_CLIENT_CONF=$SRC_DIR/pulsar-client-cpp/test-conf/client-ssl.conf

# Create "standalone" cluster if it does not exist
$PULSAR_DIR/bin/pulsar-admin clusters list | grep -q '^standalone$' ||
        $PULSAR_DIR/bin/pulsar-admin clusters create \
                standalone \
                --url http://localhost:8080/ \
                --url-secure https://localhost:8443/ \
                --broker-url pulsar://localhost:6650/ \
                --broker-url-secure pulsar+ssl://localhost:6651/

# Update "public" tenant
$PULSAR_DIR/bin/pulsar-admin tenants create public -r "anonymous" -c "standalone"

# Create "public/default" with no auth required
$PULSAR_DIR/bin/pulsar-admin namespaces create public/default
$PULSAR_DIR/bin/pulsar-admin namespaces grant-permission public/default \
                        --actions produce,consume \
                        --role "anonymous"

# Create "public/default-2" with no auth required
$PULSAR_DIR/bin/pulsar-admin namespaces create public/default-2 \
                        --clusters standalone
$PULSAR_DIR/bin/pulsar-admin namespaces grant-permission public/default-2 \
                        --actions produce,consume \
                        --role "anonymous"

# Create "public/default-3" with no auth required
$PULSAR_DIR/bin/pulsar-admin namespaces create public/default-3 \
                        --clusters standalone
$PULSAR_DIR/bin/pulsar-admin namespaces grant-permission public/default-3 \
                        --actions produce,consume \
                        --role "anonymous"

# Create "public/default-4" with encryption required
$PULSAR_DIR/bin/pulsar-admin namespaces create public/default-4 \
                        --clusters standalone
$PULSAR_DIR/bin/pulsar-admin namespaces grant-permission public/default-4 \
                        --actions produce,consume \
                        --role "anonymous"
$PULSAR_DIR/bin/pulsar-admin namespaces set-encryption-required public/default-4 -e

# Create "public/test-backlog-quotas" to test backlog quotas policy
$PULSAR_DIR/bin/pulsar-admin namespaces create public/test-backlog-quotas \
                        --clusters standalone

# Create "private" tenant
$PULSAR_DIR/bin/pulsar-admin tenants create private -r "" -c "standalone"

# Create "private/auth" with required authentication
$PULSAR_DIR/bin/pulsar-admin namespaces create private/auth --clusters standalone

$PULSAR_DIR/bin/pulsar-admin namespaces grant-permission private/auth \
                        --actions produce,consume \
                        --role "token-principal"

echo "-- Ready to start tests"
