@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: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=600
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
