#!/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 update public -r "anonymous" -c "standalone"

# Update "public/default" with no auth required
$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"
