#
#   userver -- a fairly simple web server designed for experimentation.
#   Copyright (C) 2003  Hewlett-Packard Company
#   Contributed by Tim Brecht <brecht@cs.uwaterloo.ca>
#   Partially based on servers by: 
#      David Mosberger <david.mosberger@hp.com> and
#      Abhishek Chandra <abhishek@cs.umass.edu>
#   See AUTHORS file for list of contributions.
#
#   This file is part of userver, a simple web server designed for
#   performance experiments.
#
#   This program is free software; you can redistribute it and/or
#   modify it under the terms of the GNU General Public License as
#   published by the Free Software Foundation; either version 2 of the
#   License, or (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
#   02111-1307 USA
#


include Makefile.base

MAKE-GPROF      = Makefile.gprof
MAKE-NOGPROF    = Makefile.nogprof
MAKE-SEND       = Makefile.send
MAKE-SEND-GPROF = Makefile.send-gprof
BIN             = $(HOME)/bin

PGMS =  userver userver-gprof userver-send

cur: userver
# cur: userver-send

all: userver man

man: userver.txt userver.ps userver.pdf userver.html

userver.txt: userver.1
	groff -man -Tascii userver.1 > userver.txt

userver.ps: userver.1
	groff -man -Tps userver.1 > userver.ps

userver.pdf: userver.ps
	ps2pdf userver.ps userver.pdf

userver.html: userver.1
	man2html userver.1 > userver.html

os: FORCE
	echo os = $(OS)

userver-gprof: FORCE
	$(MAKE) -f $(MAKE-GPROF) userver-gprof

userver-send: FORCE
	$(MAKE) -f $(MAKE-SEND) userver-send

userver-send-gprof: FORCE
	$(MAKE) -f $(MAKE-SEND-GPROF) userver-send-gprof

predepend:
	touch .depend

depend: predepend userver-depend

userver-depend: predepend FORCE
	$(MAKE) -f $(MAKE-NOGPROF) userver-depend

userver-send-depend: FORCE
	$(MAKE) -f $(MAKE-SEND) userver-send-depend

userver: FORCE
	$(MAKE) -f $(MAKE-NOGPROF) userver

testall: test1 test2
test: test1 test2


test1: FORCE
	@echo "Running Basic Test Subset"
	@echo "Running test 1 - should get 100 replies and 0 errors"
	csh -c "./userver >& test.out &"
	sleep 2
	csh -c "./scripts/run 100 |& egrep 'Reply status:|Errors:'"
	@./scripts/kill-server
	@echo ""
	@echo "Running test 2 - should get 100 replies and 0 errors"
	csh -c "./userver -C >& test.out &"
	sleep 2
	csh -c "./scripts/run 100 |& egrep 'Reply status:|Errors:'"
	@./scripts/kill-server
	@echo ""
	@echo "Running test 3 - should get 100 replies and 0 errors"
	csh -c "./userver -C --use-sendfile --use-tcp-cork >& test.out &"
	sleep 2
	csh -c "./scripts/run 100 |& egrep 'Reply status:|Errors:'"
	@./scripts/kill-server
	@echo ""
	@echo "Running test 4 - should get 5000 replies and 0 errors in about 10 seconds"
	csh -c "./userver -C --use-sendfile --use-tcp-cork -c 450 -f 1000 >& test.out &"
	sleep 2
	csh -c "./scripts/runrate 500 5000 |& egrep 'Reply status:|Errors:'"
	@./scripts/kill-server
	@echo ""
	@echo "Running test 5 - should get 6000 replies and 0 errors in about 10 seconds"
	csh -c "./userver -C --use-sendfile --use-tcp-cork -m 0 -e 10 -c 450 -f 1000 >& test.out &"
	sleep 2
	csh -c "./scripts/runrate 600 6000 |& egrep 'Reply status:|Errors:'"
	@./scripts/kill-server
	@echo ""

test2:
	@echo "Running IP Address Subset"
	@echo "Running test 1 - should get 100 replies and 0 errors"
	csh -c "./userver --ip-addr 127.0.0.1 >& test.out &"
	sleep 2
	csh -c "./scripts/run 100 |& egrep 'Reply status:|Errors:'"
	@./scripts/kill-server
	@echo ""
	@echo "Running test 2 - should get 10 replies and 0 errors"
	csh -c "./userver --ip-addr 127.0.0.1:6802 >& test.out &"
	sleep 2
	csh -c "./scripts/runaddrport 127.0.0.1 6802 |& egrep 'Reply status:|Errors:'"
	@./scripts/kill-server
	@echo ""
	@echo "Running test 3 - should get 100 replies and 0 errors"
	csh -c "./userver --ip-addr 0.0.0.0 >& test.out &"
	sleep 2
	csh -c "./scripts/run 100 |& egrep 'Reply status:|Errors:'"
	@./scripts/kill-server
	@echo ""

testsend:
	@echo "Running SEND Test Subset"
	@echo "Running test 1 - should get 100 replies and 0 errors"
	csh -c "./userver -B -E -Y -U -N >& test.out &"
	sleep 2
	csh -c "./scripts/run 100 |& egrep 'Reply status:|Errors:'"
	@./scripts/kill-server
	@echo ""
	@echo "Running test 2 - should get 100 replies and 0 errors"
	csh -c "./userver -C -B -E -Y -U -N >& test.out &"
	sleep 2
	csh -c "./scripts/run 100 |& egrep 'Reply status:|Errors:'"
	@./scripts/kill-server
	@echo ""
	@echo "Running test 3 - should get 100 replies and 0 errors"
	csh -c "./userver -C --use-sendfile --use-tcp-cork -B -E -Y -U -N >& test.out &"
	csh -c "./scripts/run 100 |& egrep 'Reply status:|Errors:'"
	@./scripts/kill-server
	@echo ""
	@echo "Running test 4 - should get 5000 replies and 0 errors in about 10 seconds"
	csh -c "./userver -C --use-sendfile --use-tcp-cork -c 450 -f 1000 -B -E -Y -U -N >& test.out &"
	sleep 2
	csh -c "./scripts/runrate 500 5000 |& egrep 'Reply status:|Errors:'"
	@./scripts/kill-server
	@echo ""
	@echo "Running test 5 - should get 6000 replies and 0 errors in about 10 seconds"
	csh -c "./userver -C --use-sendfile --use-tcp-cork -m 0 -e 10 -c 450 -f 1000 -B -E -Y -U -N >& test.out &"
	sleep 2
	csh -c "./scripts/runrate 600 6000 |& egrep 'Reply status:|Errors:'"
	@./scripts/kill-server
	@echo ""


install: FORCE
	mv $(PGMS) $(BIN)

clean: FORCE
	rm -f *.o

vclean: FORCE
	-rm -f *.o $(PGMS) core .depend events.out
	-rm -f userver.ps userver.pdf userver.txt userver.html

ctags: FORCE
	ctags *.[ch]

tags: FORCE
	ctags *.[ch]

# NOTE CVS tag version should be the same as the dist version but with dashes 
# (cvs can't deal with dots).
DIST_VER     = 0.3.3
CVS_TAG_VER  = 0-3-3

DIST_NAME = userver-$(DIST_VER)
DIST_DEST = ../$(DIST_NAME)
SCRIPTS_DEST = ../$(DIST_NAME)/scripts
TESTS_DEST = ../$(DIST_NAME)/docs
INCLUDE_DEST = ../$(DIST_NAME)

dist: userver.txt userver.ps userver.pdf userver.html
	-mkdir $(DIST_DEST)
	-mkdir $(SCRIPTS_DEST)
	-mkdir $(TESTS_DEST)
	-mkdir $(INCLUDE_DEST)
	cp -p $(DIST_LIST) $(DIST_DEST)
	cp -p $(SCRIPTS) $(SCRIPTS_DEST)
	cp -p $(TESTDOCS) $(TESTS_DEST)
	cp -pr $(INCLUDE) $(INCLUDE_DEST)
	rm -rf $(INCLUDE_DEST)/include/CVS $(INCLUDE_DEST)/include/*/CVS $(INCLUDE_DEST)/include/*/*/CVS
	csh -c "cd .. ; pwd ; tar -czf $(DIST_NAME).tar.gz $(DIST_NAME)/"

updist:
	scp CHANGELOG bcr2.uwaterloo.ca:www/userver/src/CHANGELOG-$(DIST_VER).txt
	scp ../$(DIST_NAME).tar.gz bcr2.uwaterloo.ca:www/userver/src
	ssh bcr2.uwaterloo.ca 'chmod a+r www/userver/src/*'
	echo "Don't forget to tag the CVS tree!!!"

cvstag:
	cvs tag Ver-$(CVS_TAG_VER)

# upindex:
#  	scp index.html bcr2:www/userver/src

FORCE:

