#!/usr/bin/env python
#
# This is a valgrind torture test for the daemon.
#
import sys, gpsfake 

debuglevel=1

invocation="valgrind --tool=memcheck --gen-suppressions=yes --leak-check=yes --suppressions=valgrind-suppressions"
test = gpsfake.TestSession(prefix=invocation, options="-D %d" % debuglevel)
test.progress = sys.stderr.write

try:
    print "\n*** Test #1: Normal single-client-session behavior."
    print "**** Add a GPS.\n"
    gps1 = test.gps_add("test/bu303-moving.log")

    print "\n**** Add and remove a client.\n"
    c1 = test.client_add("w\n")
    test.gather(3)
    test.client_remove(c1)

    print "\n**** Remove the GPS."
    test.gps_remove(gps1)
    print "*** Test #1 complete.\n"
    test.wait(3)

    ######################################################################

    print "\n*** Test #2: Successive non-overlapping client sessions."
    print "**** Add a GPS.\n"
    gps1 = test.gps_add("test/bu303-climbing.log")

    print "\n**** Add and remove first client.\n"
    c1 = test.client_add("w\n")
    test.gather(3)
    test.client_remove(c1)
    test.wait(3)

    print "\n**** Add and remove second client.\n"
    c2 = test.client_add("w\n")
    test.gather(3)
    test.client_remove(c2)
    test.wait(3)

    print "\n**** Remove the GPS."
    test.gps_remove(gps1)
    print "*** Test #2 complete.\n"
    test.wait(3)

    ######################################################################

    print "\n*** Test #3: Overlapping client sessions."
    print "**** Add a GPS.\n"
    gps1 = test.gps_add("test/bu303-climbing.log")

    print "\n**** Add first client.\n"
    c1 = test.client_add("w\n")
    test.gather(2)
    print "\n**** Add second client.\n"
    c2 = test.client_add("w\n")
    test.gather(3)
    print "\n**** Remove first client.\n"
    test.client_remove(c1)
    test.gather(2)
    print "\n**** Remove second client.\n"
    test.client_remove(c2)

    print "\n**** Remove the GPS."
    test.gps_remove(gps1)
    print "*** Test #3 complete.\n"

    ######################################################################

    print "\n*** Test #4: GPS removed while client still active."
    print "**** Add a GPS.\n"
    gps1 = test.gps_add("test/bu303-moving.log")

    print "\n**** Add a client.\n"
    c1 = test.client_add("w\n")
    test.gather(3)
    print "\n**** Remove the GPS."
    test.gps_remove(gps1)
    test.wait(3)
    print "\n**** Remove the client.\n"
    test.client_remove(c1)

    print "*** Test #4 complete.\n"
    test.cleanup();
finally:
    test.killall();
