@echo off

rem Licensed to the Apache Software Foundation (ASF) under one or more
rem contributor license agreements.  See the NOTICE file distributed with
rem this work for additional information regarding copyright ownership.
rem The ASF licenses this file to You under the Apache License, Version 2.0
rem (the "License"); you may not use this file except in compliance with
rem the License.  You may obtain a copy of the License at
rem 
rem      http://www.apache.org/licenses/LICENSE-2.0
rem 
rem Unless required by applicable law or agreed to in writing, software
rem distributed under the License is distributed on an "AS IS" BASIS,
rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rem See the License for the specific language governing permissions and
rem limitations under the License.

setlocal

set PATH=%PATH%;$<SHELL_PATH:$<TARGET_LINKER_FILE_DIR:apache-geode>>
set PATH=%PATH%;$<SHELL_PATH:$<TARGET_LINKER_FILE_DIR:framework>>
set PATH=%PATH%;$<SHELL_PATH:$<TARGET_LINKER_FILE_DIR:testobject>>
set PATH=%PATH%;$<SHELL_PATH:$<TARGET_LINKER_FILE_DIR:SqLiteImpl>>
set PATH=%PATH%;$<SHELL_PATH:$<TARGET_LINKER_FILE_DIR:cryptoImpl>>
set PATH=%PATH%;$<SHELL_PATH:$<TARGET_LINKER_FILE_DIR:DHImpl>>
set PATH=%PATH%;$<SHELL_PATH:$<TARGET_LINKER_FILE_DIR:securityImpl>>
set PATH=%PATH%;$<SHELL_PATH:$<TARGET_LINKER_FILE_DIR:unit_test_callbacks>>
set PATH=%PATH%;$<JOIN:$<SHELL_PATH:${PATH}>,;>

set TESTSRC=${CMAKE_CURRENT_SOURCE_DIR}
set GF_JAVA=$<SHELL_PATH:${Java_JAVA_EXECUTABLE}>
set GFJAVA=$<SHELL_PATH:${Geode_PATH}>
set GFE_LOGLEVEL=config
set GFE_SECLOGLEVEL=config
set MCAST_ADDR=224.10.13.63
set MCAST_PORT=${PORT}
set TIMEBOMB=3600
set GF_CLASSPATH=%GF_CLASSPATH%;${CMAKE_BINARY_DIR}/tests/javaobject/javaobject.jar
set PROFILERCMD=
set BUG481=
set TESTNAME=${TEST}

set

rmdir /q /s "$<SHELL_PATH:${TEST_DIR}>" 2>nul
mkdir "$<SHELL_PATH:${TEST_DIR}>"
if %errorlevel% neq 0 exit /b %errorlevel%
pushd "$<SHELL_PATH:${TEST_DIR}>"
if %errorlevel% neq 0 exit /b %errorlevel%

"$<SHELL_PATH:$<TARGET_FILE:${TEST}>>"
if %errorlevel% neq 0 exit /b %errorlevel%

popd
exit /b
