@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:securityImpl>>;%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
