@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=$<SHELL_PATH:$<TARGET_LINKER_FILE_DIR:Apache.Geode>>;%PATH%
set PATH=$<SHELL_PATH:$<TARGET_LINKER_FILE_DIR:framework>>;%PATH%
set PATH=$<SHELL_PATH:$<TARGET_LINKER_FILE_DIR:testobject>>;%PATH%
set PATH=$<SHELL_PATH:$<TARGET_LINKER_FILE_DIR:SqLiteImpl>>;%PATH%
set PATH=$<SHELL_PATH:$<TARGET_LINKER_FILE_DIR:cryptoImpl>>;%PATH%
set PATH=$<SHELL_PATH:$<TARGET_LINKER_FILE_DIR:DHImpl>>;%PATH%
set PATH=$<SHELL_PATH:$<TARGET_LINKER_FILE_DIR:securityImpl>>;%PATH%
set PATH=$<SHELL_PATH:$<TARGET_LINKER_FILE_DIR:PkcsWrapper>>;%PATH%
set PATH=$<JOIN:$<SHELL_PATH:${PATH}>,;>;%PATH%

set PATH=c:\Program Files (x86)\Nunit 2.6.4\bin;%PATH%

set TEST_DIR="$<SHELL_PATH:${TEST_DIR}>"
set GEODE_NATIVE_HOME="%TEST_DIR%"

set TESTSRC=$<SHELL_PATH:${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 GFE_DIR=$<SHELL_PATH:${Geode_PATH}>
set MCAST_ADDR=224.10.13.63
set MCAST_PORT=${PORT}
set TIMEBOMB=3600
set GF_CLASSPATH=%GF_CLASSPATH%;$<SHELL_PATH:${CMAKE_BINARY_DIR}>\tests\javaobject\javaobject.jar
set PROFILERCMD=
set BUG481=
set TESTNAME=${TEST}

rmdir /q /s "%TEST_DIR%" 2>nul
mkdir "%TEST_DIR%"
if %errorlevel% neq 0 exit /b %errorlevel%
pushd "%TEST_DIR%"
if %errorlevel% neq 0 exit /b %errorlevel%

${NUNIT_CONSOLE} /labels /run:${NAMESPACE}.${TESTCLASS} ..\..\$<CONFIG>\UnitTests.dll 
if %errorlevel% neq 0 exit /b %errorlevel%

popd
exit /b
