BIND 10 trac547, updated. e6fdd3e3e8b3d0a87987a2d7fbfa00ef4eeafbf3 [trac547] add make of spec files for testing

BIND 10 source code commits bind10-changes at lists.isc.org
Fri Feb 25 13:48:55 UTC 2011


The branch, trac547 has been updated
       via  e6fdd3e3e8b3d0a87987a2d7fbfa00ef4eeafbf3 (commit)
       via  717b65bcf2f316744f8286bf4ce00f868cb759ea (commit)
       via  75f1ea8f6976567bea3380edb5346daec2028462 (commit)
       via  c6c1987ebcb891abb80fa12727f0c777e03100a1 (commit)
       via  c3a0421ea9f36d12c2e5dc10321eaabff2ded01d (commit)
       via  9ea5ca1a0c1de5300a0866e460b0003ec5816069 (commit)
       via  611e2d1e8ee4e35f2532d1825e5c3114fab1c68d (commit)
       via  9c52945eeb0303e4ee48c21e14b2cdb79a8540e1 (commit)
       via  dce7c388a238821d375bc14b5a7fef2d8bbe00e9 (commit)
       via  088594fbcbffae7103e0111ec51e14f5e013dd13 (commit)
       via  d45bbaae489c96037af440d54682dae42e427112 (commit)
       via  94dd1f0734e3334f46f40deee18691b6794a8761 (commit)
       via  cc9e836e7f2ceffeabcdf758ab17e6816f5c6f74 (commit)
       via  6fe1776d6627610d3a6029486c24f276a26f6843 (commit)
       via  5589cee763995237682ab450d2335d98b4b84655 (commit)
       via  c974ea480a3e36e613401d30e97d0cbdd287c136 (commit)
       via  7a318c93a384a8b287acfb5deb892f4b0252eb6a (commit)
       via  5cd45d718c430b57e67ddd9b39ed04234ff6d49b (commit)
       via  0cba8576c31c7dd2a1af5e1476a3027688e734f4 (commit)
       via  fba83e32680db4a9bada2c1c2bf71b551c3af407 (commit)
       via  ceaca3d6b584ac787d201f4af6b1c816a727df9f (commit)
       via  3ba7ca9bcd750ea76b7d92b9bf9548ef91001439 (commit)
       via  548f41ac07ad9b510b293bc275cd57765b425ac9 (commit)
       via  483177a0cf86e1371185b3c8a48c323c17552366 (commit)
       via  873cc1760c20ccd9d0aaa4543508a498beb03a8d (commit)
       via  f250f5a9ad8e0340620dc7557666a9c1061ae7dd (commit)
       via  684c1f13fd36abfcae7ed940e65eec17f8f61fe1 (commit)
       via  9a78b302bdfe3a022c13169bd9e1e4b6d95a45e5 (commit)
       via  fb80cfd2d9f0bbd8ad51d750191234ab00047e57 (commit)
       via  c9d972d03cb7df6895597c0f7d1f8b852dbf7dfd (commit)
       via  558e07d6592192fa7c8010c3949b451a53e405f1 (commit)
       via  38823b01bc6fda647476bbba26b508570627ea7d (commit)
       via  ec6b9cec0acb44368f6c85206e894063f906ebf3 (commit)
       via  6b2fe393067e7bf74a50026f03cc257c187e408c (commit)
       via  de497179fb1d44e2f5a60334977d70445fd04640 (commit)
      from  982bf48eb2831feaf2a8ed6ea25e100e8077af27 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit e6fdd3e3e8b3d0a87987a2d7fbfa00ef4eeafbf3
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 22:48:41 2011 +0900

    [trac547] add make of spec files for testing

commit 717b65bcf2f316744f8286bf4ce00f868cb759ea
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 22:48:02 2011 +0900

    [trac547] move position of B10_FROM_BUILD

commit 75f1ea8f6976567bea3380edb5346daec2028462
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 22:47:42 2011 +0900

    [trac547]
    - add this year of copyright
    - remove __version__
    - change SPECFILE_LOCATION

commit c6c1987ebcb891abb80fa12727f0c777e03100a1
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 22:47:25 2011 +0900

    [trac547] add imp.reload in order to avoid to B10_FROM_BUILD be changeed in other test case

commit c3a0421ea9f36d12c2e5dc10321eaabff2ded01d
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 22:45:06 2011 +0900

    [trac547] fix environment variable B10_FROM_BUILD

commit 9ea5ca1a0c1de5300a0866e460b0003ec5816069
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 22:44:31 2011 +0900

    [trac547] fix typo

commit 611e2d1e8ee4e35f2532d1825e5c3114fab1c68d
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 22:44:18 2011 +0900

    [trac547]
    - change SPECFILE_LOCATION
    - remove unnecessary debug print

commit 9c52945eeb0303e4ee48c21e14b2cdb79a8540e1
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 22:43:47 2011 +0900

    [trac547]
    - add this year of copyright
    - remove __version__
    - change SPECFILE_LOCATION

commit dce7c388a238821d375bc14b5a7fef2d8bbe00e9
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 22:42:45 2011 +0900

    [trac547] move position of B10_FROM_BUILD

commit 088594fbcbffae7103e0111ec51e14f5e013dd13
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 22:42:39 2011 +0900

    [trac547] move position of B10_FROM_BUILD

commit d45bbaae489c96037af440d54682dae42e427112
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 22:41:59 2011 +0900

    [trac547]
     - remove xml filenames
     - refactor Makefile.am

commit 94dd1f0734e3334f46f40deee18691b6794a8761
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 21:22:54 2011 +0900

    [trac547] implement function get_value in dummy ConfigData class

commit cc9e836e7f2ceffeabcdf758ab17e6816f5c6f74
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 21:22:08 2011 +0900

    [trac547] change name of member variable in dummuy socket class

commit 6fe1776d6627610d3a6029486c24f276a26f6843
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 21:21:33 2011 +0900

    [trac547] fix wrong variable name of dummuy socket

commit 5589cee763995237682ab450d2335d98b4b84655
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 21:20:39 2011 +0900

    [trac547] add configuration of spec filename and xml filenames

commit c974ea480a3e36e613401d30e97d0cbdd287c136
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 21:20:10 2011 +0900

    [trac547] improve obtaining spec filename and xml filenames from configures in the specfile instead of global variables in this script

commit 7a318c93a384a8b287acfb5deb892f4b0252eb6a
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 11:57:38 2011 +0900

    [trac547] make closed parameter hidden because original socket class doesn't have it

commit 5cd45d718c430b57e67ddd9b39ed04234ff6d49b
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 11:48:15 2011 +0900

    [trac547] remove function get_socket() because original module doesn't have it

commit 0cba8576c31c7dd2a1af5e1476a3027688e734f4
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 09:57:47 2011 +0900

    [trac547]
     - improve overall unittest according to change of the target module stats_httpd.py
     - improve coverage percent

commit fba83e32680db4a9bada2c1c2bf71b551c3af407
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 09:56:11 2011 +0900

    [trac547]
     - fix line feed code
     - add variable of template

commit ceaca3d6b584ac787d201f4af6b1c816a727df9f
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 09:55:53 2011 +0900

    [trac547]
     - remove $Id$
     - add variable of template

commit 3ba7ca9bcd750ea76b7d92b9bf9548ef91001439
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 09:55:09 2011 +0900

    [trac547] fix line feed code

commit 548f41ac07ad9b510b293bc275cd57765b425ac9
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 09:54:13 2011 +0900

    [trac547]
    - improve overall structure about classes and functions
    - add paths of xml templates
    - change http handler according to its requests
    - change having verbose variable
    - add including external xml file as template with its maximum size

commit 483177a0cf86e1371185b3c8a48c323c17552366
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 09:45:44 2011 +0900

    [trac547]
    - rename dummy socket
    - add dummy modules select and string

commit 873cc1760c20ccd9d0aaa4543508a498beb03a8d
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 09:44:47 2011 +0900

    [trac547]
    - rename dummy socket
    - change condition that the session is open/closed
    - add functions group_{subscribe,unsubscribe}

commit f250f5a9ad8e0340620dc7557666a9c1061ae7dd
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 09:40:03 2011 +0900

    [trac547]
    - rename dummy socket
    - add handler instance as a member variable
    - add some dummy function

commit 684c1f13fd36abfcae7ed940e65eec17f8f61fe1
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 08:54:14 2011 +0900

    [trac547] rename from dummy_socket to sockect

commit 9a78b302bdfe3a022c13169bd9e1e4b6d95a45e5
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 08:53:37 2011 +0900

    [trac547] add new dummy standard modules

commit fb80cfd2d9f0bbd8ad51d750191234ab00047e57
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Feb 25 08:48:26 2011 +0900

    [trac547]
     - add called counter variable of dummy socket instance for unittest
     - change type of return value of function fileno()

commit c9d972d03cb7df6895597c0f7d1f8b852dbf7dfd
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Wed Feb 23 15:41:40 2011 +0900

    [trac547] add send_error for dummy

commit 558e07d6592192fa7c8010c3949b451a53e405f1
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Wed Feb 23 15:41:00 2011 +0900

    [trac547]
     - fix content-type name
     - fix string encoding
     - fix minor problem

commit 38823b01bc6fda647476bbba26b508570627ea7d
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Wed Feb 23 15:39:29 2011 +0900

    [trac547] add xml templates

commit ec6b9cec0acb44368f6c85206e894063f906ebf3
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Wed Feb 23 09:49:46 2011 +0900

    [trac547] add importing shutil

commit 6b2fe393067e7bf74a50026f03cc257c187e408c
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Wed Feb 23 09:23:29 2011 +0900

    [trac547]
    - add template files of xml, xsd and xsl
    - add more implements for do_GET, do_HEAD
    - add implement to gathering statistics data from remote stats module
    - add minor changes

commit de497179fb1d44e2f5a60334977d70445fd04640
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Wed Feb 23 09:20:13 2011 +0900

    [trac547] add template files of xml, xsd and xsl

-----------------------------------------------------------------------

Summary of changes:
 src/bin/stats/Makefile.am                          |    9 +-
 src/bin/stats/run_b10-stats-httpd.sh.in            |    6 +-
 src/bin/stats/run_b10-stats.sh.in                  |    6 +-
 src/bin/stats/stats-httpd-xml.tpl                  |   66 +++---
 src/bin/stats/stats-httpd-xsd.tpl                  |    2 +-
 src/bin/stats/stats-httpd-xsl.tpl                  |  228 ++++++++--------
 src/bin/stats/stats.py.in                          |    6 +-
 src/bin/stats/stats_httpd.py.in                    |  300 ++++++++++++--------
 src/bin/stats/stats_httpd.spec.pre.in              |   51 ++++-
 src/bin/stats/tests/Makefile.am                    |    6 +-
 src/bin/stats/tests/b10-stats-httpd_test.py        |  126 ++++++--
 src/bin/stats/tests/b10-stats_test.py              |    6 +-
 src/bin/stats/tests/http/server.py                 |   20 +-
 src/bin/stats/tests/isc/cc/session.py              |   19 +-
 src/bin/stats/tests/isc/config/ccsession.py        |   37 +++
 .../{run_b10-stats-httpd.sh.in => tests/select.py} |   37 ++-
 src/bin/stats/tests/{dummy_socket.py => socket.py} |    7 +-
 src/bin/stats/tests/stats_test.in                  |    6 +-
 src/bin/stats/tests/{dummy_socket.py => string.py} |   16 +-
 src/bin/stats/tests/testdata/Makefile.am           |   11 +
 20 files changed, 606 insertions(+), 359 deletions(-)
 copy src/bin/stats/{run_b10-stats-httpd.sh.in => tests/select.py} (52%)
 copy src/bin/stats/tests/{dummy_socket.py => socket.py} (89%)
 rename src/bin/stats/tests/{dummy_socket.py => string.py} (80%)

-----------------------------------------------------------------------
diff --git a/src/bin/stats/Makefile.am b/src/bin/stats/Makefile.am
index 98bec0f..d0451b2 100644
--- a/src/bin/stats/Makefile.am
+++ b/src/bin/stats/Makefile.am
@@ -7,7 +7,8 @@ pkglibexec_SCRIPTS = b10-stats b10-stats-httpd
 b10_statsdir = $(DESTDIR)$(pkgdatadir)
 b10_stats_DATA = stats.spec stats_httpd.spec
 
-CLEANFILES = stats.spec b10-stats stats.pyc stats.spec b10-stats-httpd stats_httpd.pyc stats_httpd.spec
+CLEANFILES = b10-stats stats.pyc stats.spec 
+CLEANFILES += b10-stats-httpd stats_httpd.pyc stats_httpd.spec
 
 man_MANS = b10-stats.8 b10-stats-httpd.8
 EXTRA_DIST = $(man_MANS) b10-stats.xml b10-stats-httpd.xml
@@ -26,17 +27,15 @@ stats.spec: stats.spec.pre
 	$(SED) -e "s|@@LOCALSTATEDIR@@|$(localstatedir)|" stats.spec.pre >$@
 
 stats_httpd.spec: stats_httpd.spec.pre
-	$(SED) -e "s|@@LOCALSTATEDIR@@|$(localstatedir)|" stats_httpd.spec.pre >$@
+	$(SED) -e "s|@@DATAROOTDIR@@|@datarootdir@|" stats_httpd.spec.pre >$@
 
 # TODO: does this need $$(DESTDIR) also?
 # this is done here since configure.ac AC_OUTPUT doesn't expand exec_prefix
 b10-stats: stats.py
 	$(SED) -e "s|@@PYTHONPATH@@|@pyexecdir@|" \
-	       -e "s|@@LOCALSTATEDIR@@|$(localstatedir)|" \
 	       -e "s|.*#@@REMOVED@@$$||"  stats.py >$@
 	chmod a+x $@
 
 b10-stats-httpd: stats_httpd.py
-	$(SED) -e "s|@@PYTHONPATH@@|@pyexecdir@|" \
-	       -e "s|@@LOCALSTATEDIR@@|$(localstatedir)|" stats_httpd.py >$@
+	$(SED) -e "s|@@PYTHONPATH@@|@pyexecdir@|" stats_httpd.py >$@
 	chmod a+x $@
diff --git a/src/bin/stats/run_b10-stats-httpd.sh.in b/src/bin/stats/run_b10-stats-httpd.sh.in
index 273a96b..0c42dc8 100644
--- a/src/bin/stats/run_b10-stats-httpd.sh.in
+++ b/src/bin/stats/run_b10-stats-httpd.sh.in
@@ -24,10 +24,10 @@ export PYTHONPATH
 BIND10_MSGQ_SOCKET_FILE=@abs_top_builddir@/msgq_socket
 export BIND10_MSGQ_SOCKET_FILE
 
-B10_FROM_BUILD=@abs_top_builddir@
-export B10_FROM_BUILD
-
 STATS_PATH=@abs_top_builddir@/src/bin/stats
 
+B10_FROM_BUILD=${STATS_PATH}
+export B10_FROM_BUILD
+
 cd ${STATS_PATH}
 exec ${PYTHON_EXEC} -O b10-stats-httpd "$@"
diff --git a/src/bin/stats/run_b10-stats.sh.in b/src/bin/stats/run_b10-stats.sh.in
index 65b9737..d41e8f0 100644
--- a/src/bin/stats/run_b10-stats.sh.in
+++ b/src/bin/stats/run_b10-stats.sh.in
@@ -24,10 +24,10 @@ export PYTHONPATH
 BIND10_MSGQ_SOCKET_FILE=@abs_top_builddir@/msgq_socket
 export BIND10_MSGQ_SOCKET_FILE
 
-B10_FROM_BUILD=@abs_top_builddir@
-export B10_FROM_BUILD
-
 STATS_PATH=@abs_top_builddir@/src/bin/stats
 
+B10_FROM_BUILD=${STATS_PATH}
+export B10_FROM_BUILD
+
 cd ${STATS_PATH}
 exec ${PYTHON_EXEC} -O b10-stats "$@"
diff --git a/src/bin/stats/stats-httpd-xml.tpl b/src/bin/stats/stats-httpd-xml.tpl
index f9e6572..0826812 100644
--- a/src/bin/stats/stats-httpd-xml.tpl
+++ b/src/bin/stats/stats-httpd-xml.tpl
@@ -1,33 +1,33 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?xml-stylesheet type="text/xsl" href="bind10-statistics.xsl"?>
-<!--
- - Copyright (C) 2011  Internet Systems Consortium, Inc. ("ISC")
- -
- - Permission to use, copy, modify, and/or distribute this software for any
- - purpose with or without fee is hereby granted, provided that the above
- - copyright notice and this permission notice appear in all copies.
- -
- - THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
- - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- - AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
- - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
- - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- - PERFORMANCE OF THIS SOFTWARE.
--->
-
-<!-- $Id$ -->
-<stats:stats_data version="1.0"
-  xmlns:stats="http://bind10.isc.org/xsd/bind10-statistics"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://bind10.isc.org/xsd/bind10-statistics bind10-statistics.xsd">
-  <report_time>2011-01-25T11:47:56Z</report_time>
-  <bind10.boot_time>2011-01-25T11:47:45Z</bind10.boot_time>
-  <stats.boot_time>2011-01-25T11:47:45Z</stats.boot_time>
-  <stats.start_time>2011-01-25T11:47:47Z</stats.start_time>
-  <stats.last_update_time>2011-01-25T11:47:56Z</stats.last_update_time>
-  <stats.timestamp>1295956076.705266</stats.timestamp>
-  <stats.lname>4d3eb863_d at covm</stats.lname>
-  <auth.queries.tcp>123</auth.queries.tcp>
-  <auth.queries.ucp>456</auth.queries.ucp>
-</stats:stats_data>
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="bind10-statistics.xsl"?>
+<!--
+ - Copyright (C) 2011  Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or distribute this software for any
+ - purpose with or without fee is hereby granted, provided that the above
+ - copyright notice and this permission notice appear in all copies.
+ -
+ - THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+ - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ - PERFORMANCE OF THIS SOFTWARE.
+-->
+
+<stats:stats_data version="1.0"
+  xmlns:stats="http://bind10.isc.org/xsd/bind10-statistics"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://bind10.isc.org/xsd/bind10-statistics bind10-statistics.xsd">
+  <report_time>2011-01-25T11:47:56Z</report_time>
+  <bind10.boot_time>2011-01-25T11:47:45Z</bind10.boot_time>
+  <stats.boot_time>2011-01-25T11:47:45Z</stats.boot_time>
+  <stats.start_time>2011-01-25T11:47:47Z</stats.start_time>
+  <stats.last_update_time>2011-01-25T11:47:56Z</stats.last_update_time>
+  <stats.timestamp>1295956076.705266</stats.timestamp>
+  <stats.lname>4d3eb863_d at covm</stats.lname>
+  <auth.queries.tcp>123</auth.queries.tcp>
+  <auth.queries.ucp>456</auth.queries.ucp>
+</stats:stats_data>
+$xml_contents
\ No newline at end of file
diff --git a/src/bin/stats/stats-httpd-xsd.tpl b/src/bin/stats/stats-httpd-xsd.tpl
index 774785e..baaaa5f 100644
--- a/src/bin/stats/stats-httpd-xsd.tpl
+++ b/src/bin/stats/stats-httpd-xsd.tpl
@@ -15,7 +15,6 @@
  - PERFORMANCE OF THIS SOFTWARE.
 -->
 
-<!-- $Id$ -->
 <schema targetNamespace="http://bind10.isc.org/xsd/bind10-statistics"
   xmlns="http://www.w3.org/2001/XMLSchema"
   xmlns:stats="http://bind10.isc.org/xsd/bind10-statistics">
@@ -114,3 +113,4 @@
     </complexType>
   </element>
 </schema>
+$xsd_contents
\ No newline at end of file
diff --git a/src/bin/stats/stats-httpd-xsl.tpl b/src/bin/stats/stats-httpd-xsl.tpl
index 1e4f9af..54e01ae 100644
--- a/src/bin/stats/stats-httpd-xsl.tpl
+++ b/src/bin/stats/stats-httpd-xsl.tpl
@@ -1,114 +1,114 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- - Copyright (C) 2011  Internet Systems Consortium, Inc. ("ISC")
- -
- - Permission to use, copy, modify, and/or distribute this software for any
- - purpose with or without fee is hereby granted, provided that the above
- - copyright notice and this permission notice appear in all copies.
- -
- - THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
- - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- - AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
- - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
- - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- - PERFORMANCE OF THIS SOFTWARE.
--->
-
-<!-- $Id$ -->
-<xsl:stylesheet version="1.0"
-  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"
-  xmlns:stats="http://bind10.isc.org/xsd/bind10-statistics">
-  <xsl:output method="html" encoding="UTF-8"
-    doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"
-    doctype-system=" http://www.w3.org/TR/html4/loose.dtd " />
-  <xsl:template match="/">
-    <html lang="en">
-      <head>
-        <title>BIND 10 Statistics</title>
-        <style type="text/css"><![CDATA[
-table {
-  border: 1px #000000 solid;
-  border-collapse: collapse;
-}
-td, th {
-  padding: 3px 20px;
-  border: 1px #000000 solid;
-}
-]]>
-        </style>
-      </head>
-      <body>
-        <h1>BIND 10 Statistics</h1>
-        <table>
-          <tr>
-            <th>Title</th>
-            <th>Value</th>
-          </tr>
-          <xsl:apply-templates />
-        </table>
-      </body>
-    </html>
-  </xsl:template>
-  <xsl:template match="*">
-    <tr>
-      <td title="A date time when stats module reports">Report time</td>
-      <td>
-        <xsl:value-of select="report_time" />
-      </td>
-    </tr>
-    <tr>
-      <td title="A date time when bind10 process starts initially">stats.BootTime</td>
-      <td>
-        <xsl:value-of select="bind10.boot_time" />
-      </td>
-    </tr>
-    <tr>
-      <td
-        title="A date time when the stats module starts initially or when the stats module restarts">stats.BootTime</td>
-      <td>
-        <xsl:value-of select="stats.boot_time" />
-      </td>
-    </tr>
-    <tr>
-      <td
-        title="A date time when the stats module starts collecting data or resetting values last time">stats.StartTime</td>
-      <td>
-        <xsl:value-of select="stats.start_time" />
-      </td>
-    </tr>
-    <tr>
-      <td
-        title="The latest date time when the stats module receives from other modules like auth server or boss process and so on">stats.LastUpdateTime</td>
-      <td>
-        <xsl:value-of select="stats.last_update_time" />
-      </td>
-    </tr>
-    <tr>
-      <td title="A current time stamp since epoch time (1970-01-01T00:00:00Z)">stats.Timestamp</td>
-      <td>
-        <xsl:value-of select="stats.timestamp" />
-      </td>
-    </tr>
-    <tr>
-      <td title="A localname of stats module given via CC protocol">stats.LocalName</td>
-      <td>
-        <xsl:value-of select="stats.lname" />
-      </td>
-    </tr>
-    <tr>
-      <td
-        title="A number of total query counts which all auth servers receive over TCP since they started initially">auth.queries.tcp</td>
-      <td>
-        <xsl:value-of select="auth.queries.tcp" />
-      </td>
-    </tr>
-    <tr>
-      <td
-        title="A number of total query counts which all auth servers receive over UDP since they started initially">auth.queries.udp</td>
-      <td>
-        <xsl:value-of select="auth.queries.ucp" />
-      </td>
-    </tr>
-  </xsl:template>
-</xsl:stylesheet>
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ - Copyright (C) 2011  Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or distribute this software for any
+ - purpose with or without fee is hereby granted, provided that the above
+ - copyright notice and this permission notice appear in all copies.
+ -
+ - THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+ - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ - PERFORMANCE OF THIS SOFTWARE.
+-->
+
+<xsl:stylesheet version="1.0"
+  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:stats="http://bind10.isc.org/xsd/bind10-statistics">
+  <xsl:output method="html" encoding="UTF-8"
+    doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"
+    doctype-system=" http://www.w3.org/TR/html4/loose.dtd " />
+  <xsl:template match="/">
+    <html lang="en">
+      <head>
+        <title>BIND 10 Statistics</title>
+        <style type="text/css"><![CDATA[
+table {
+  border: 1px #000000 solid;
+  border-collapse: collapse;
+}
+td, th {
+  padding: 3px 20px;
+  border: 1px #000000 solid;
+}
+]]>
+        </style>
+      </head>
+      <body>
+        <h1>BIND 10 Statistics</h1>
+        <table>
+          <tr>
+            <th>Title</th>
+            <th>Value</th>
+          </tr>
+          <xsl:apply-templates />
+        </table>
+      </body>
+    </html>
+  </xsl:template>
+  <xsl:template match="*">
+    <tr>
+      <td title="A date time when stats module reports">Report time</td>
+      <td>
+        <xsl:value-of select="report_time" />
+      </td>
+    </tr>
+    <tr>
+      <td title="A date time when bind10 process starts initially">stats.BootTime</td>
+      <td>
+        <xsl:value-of select="bind10.boot_time" />
+      </td>
+    </tr>
+    <tr>
+      <td
+        title="A date time when the stats module starts initially or when the stats module restarts">stats.BootTime</td>
+      <td>
+        <xsl:value-of select="stats.boot_time" />
+      </td>
+    </tr>
+    <tr>
+      <td
+        title="A date time when the stats module starts collecting data or resetting values last time">stats.StartTime</td>
+      <td>
+        <xsl:value-of select="stats.start_time" />
+      </td>
+    </tr>
+    <tr>
+      <td
+        title="The latest date time when the stats module receives from other modules like auth server or boss process and so on">stats.LastUpdateTime</td>
+      <td>
+        <xsl:value-of select="stats.last_update_time" />
+      </td>
+    </tr>
+    <tr>
+      <td title="A current time stamp since epoch time (1970-01-01T00:00:00Z)">stats.Timestamp</td>
+      <td>
+        <xsl:value-of select="stats.timestamp" />
+      </td>
+    </tr>
+    <tr>
+      <td title="A localname of stats module given via CC protocol">stats.LocalName</td>
+      <td>
+        <xsl:value-of select="stats.lname" />
+      </td>
+    </tr>
+    <tr>
+      <td
+        title="A number of total query counts which all auth servers receive over TCP since they started initially">auth.queries.tcp</td>
+      <td>
+        <xsl:value-of select="auth.queries.tcp" />
+      </td>
+    </tr>
+    <tr>
+      <td
+        title="A number of total query counts which all auth servers receive over UDP since they started initially">auth.queries.udp</td>
+      <td>
+        <xsl:value-of select="auth.queries.ucp" />
+      </td>
+    </tr>
+  </xsl:template>
+</xsl:stylesheet>
+$xsl_contents
\ No newline at end of file
diff --git a/src/bin/stats/stats.py.in b/src/bin/stats/stats.py.in
index 15e2980..5362796 100755
--- a/src/bin/stats/stats.py.in
+++ b/src/bin/stats/stats.py.in
@@ -1,6 +1,6 @@
 #!@PYTHON@
 
-# Copyright (C) 2010  Internet Systems Consortium.
+# Copyright (C) 2010, 2011  Internet Systems Consortium.
 #
 # Permission to use, copy, modify, and distribute this software for any
 # purpose with or without fee is hereby granted, provided that the above
@@ -15,8 +15,6 @@
 # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
 # WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-__version__ = "$Revision$"
-
 import sys; sys.path.append ('@@PYTHONPATH@@')
 import os
 import signal
@@ -41,7 +39,7 @@ isc.util.process.rename()
 # from a directory relative to that, otherwise we use the ones
 # installed on the system
 if "B10_FROM_BUILD" in os.environ:
-    SPECFILE_LOCATION = os.environ["B10_FROM_BUILD"] + "/src/bin/stats/stats.spec"
+    SPECFILE_LOCATION = os.environ["B10_FROM_BUILD"] + "/stats.spec"
 else:
     PREFIX = "@prefix@"
     DATAROOTDIR = "@datarootdir@"
diff --git a/src/bin/stats/stats_httpd.py.in b/src/bin/stats/stats_httpd.py.in
index fce41ae..12ebfe4 100644
--- a/src/bin/stats/stats_httpd.py.in
+++ b/src/bin/stats/stats_httpd.py.in
@@ -22,36 +22,151 @@ import errno
 import select
 from optparse import OptionParser, OptionValueError
 import http.server
+import string
 
 import isc.cc
 import isc.config
 import isc.util.process
 
-# If B10_FROM_SOURCE is set in the environment, we use data files
+# If B10_FROM_BUILD is set in the environment, we use data files
 # from a directory relative to that, otherwise we use the ones
 # installed on the system
 if "B10_FROM_BUILD" in os.environ:
-    SPECFILE_LOCATION = os.environ["B10_FROM_BUILD"] + "/src/bin/stats/stats_httpd.spec"
+    SPECFILE_LOCATION = os.environ["B10_FROM_BUILD"] + "/stats_httpd.spec"
 else:
     PREFIX = "@prefix@"
     DATAROOTDIR = "@datarootdir@"
-    SPECFILE_LOCATION = "@datadir@/@PACKAGE@/stats_httpd.spec".replace(
-        "${datarootdir}", DATAROOTDIR).replace("${prefix}", PREFIX)
+    SPECFILE_LOCATION = "@datadir@/@PACKAGE@/stats_httpd.spec".replace("${datarootdir}", DATAROOTDIR).replace("${prefix}", PREFIX)
+
+MAX_SIZE_OF_TEMPLATE = 102400 # under 100k
 
 # Assign this process name
 isc.util.process.rename()
 
-IS_VERBOSE = True
+class HttpHandler(http.server.BaseHTTPRequestHandler):
+    """
+    HTTP handler class
+    """
+    def do_GET(self):
+        self.wfile.write(self.send_head().encode())
+
+    def do_HEAD(self):
+        self.send_head()
+
+    def send_head(self):
+        contents = ''
+        if self.path == '/':
+            contents = self.server.stats_httpd.get_stats_xml()
+        elif self.path == '/bind10-statistics.xsd':
+            contents = self.server.stats_httpd.get_stats_xsd()
+        elif self.path == '/bind10-statistics.xsl':
+            contents = self.server.stats_httpd.get_stats_xsl()
+        else:
+            contents = str(self.server.stats_httpd.get_stats_spec())
+            contents = contents + str(self.server.stats_httpd.get_stats_data())
+
+        if contents is None:
+            self.send_error(500, 'Internal Server Error')
+            return ""
+
+        self.send_response(200)
+        self.send_header("Content-type", "text/plain")
+        self.send_header("Content-Length", len(contents))
+        self.end_headers()
+        return contents
+
+    def log_message(self, format, *args):
+        """
+        Change default log format
+        """
+        if self.server.verbose:
+            sys.stderr.write("[b10-stats-httpd] %s - - [%s] %s\n" %
+                             (self.address_string(),
+                              self.log_date_time_string(),
+                              format%args))
 
-class CCSessionListener():
+class HttpServer(http.server.HTTPServer):
     """
+    HTTP Server class
     """
-    def __init__(self):
-        # start ccsession
-        self.ccs = isc.config.ModuleCCSession(SPECFILE_LOCATION, 
-                                         self.config_handler, self.command_handler)
-        self.ccs.start()
+    def __init__(self, handler, stats_httpd, verbose=False):
+        self.verbose = verbose
+        self.stats_httpd = stats_httpd
+        http.server.HTTPServer.__init__(
+            self,
+            (self.stats_httpd.http_addr, self.stats_httpd.http_port),
+            handler)
+
+class StatsHttpd:
+    """
+    """
+    def __init__(self, verbose=False):
+        self.verbose = verbose
+        self.running = False
+        # create ccsession
+        self.load_config()
+        self.open_httpd()
+        self.poll_intval = 0.5
+
+    def load_config(self):
+        self.ccs = isc.config.ModuleCCSession(
+            SPECFILE_LOCATION, self.config_handler, self.command_handler)
+        self.ccs_fd = self.ccs.get_socket()
+        self.cc_session = self.ccs._session
+        self.http_addr = self.ccs.get_value('listen_on_address')[0]
+        self.http_port = self.ccs.get_value('listen_on_port')[0]
+        self.xml_template = self.read_template(self.ccs.get_value('xml_template')[0])
+        self.xsd_template = self.read_template(self.ccs.get_value('xsd_template')[0])
+        self.xsl_template = self.read_template(self.ccs.get_value('xsl_template')[0])
+        self.stats_module_spec = isc.config.module_spec_from_file(
+            self.ccs.get_value('stats_spec_file')[0])
+        self.stats_config_spec = self.stats_module_spec.get_config_spec()
+        self.stats_module_name = self.stats_module_spec.get_module_name()
+
+    def open_httpd(self):
+        self.httpd = HttpServer(HttpHandler, self, self.verbose)
+        self.http_fd = self.httpd.socket
+
+    def close_httpd(self):
+        self.http_fd.close()
+
+    def start(self):
+        if self.verbose:
+            sys.stderr.write(
+                "[b10-stats-httpd] Started on address "
+                + str(self.http_addr)
+                + ", port " + str(self.http_port) + "\n")
         self.running = True
+        self.ccs.start()
+        self.cc_session.group_subscribe(self.stats_module_name, "*")
+        while self.running:
+            try:
+                (rfd, wfd, xfd) = select.select(
+                    [self.ccs_fd, self.http_fd], [], [], self.poll_intval)
+            except select.error as err:
+                if err.args[0] == errno.EINTR:
+                    (rfd, wfd, xfd) = ([], [], [])
+                else:
+                    sys.stderr.write(
+                        "[b10-stats-httpd] Unexpected error with select(); %s\n" % err)
+                    break
+            for fd in rfd + xfd:
+                if fd == self.ccs_fd:
+                    self.ccs.check_command(nonblock=False)
+                elif fd == self.http_fd:
+                    self.httpd.handle_request()
+        self.stop()
+
+    def stop(self):
+        if self.verbose:
+            sys.stdout.write("[b10-stats-httpd] shutting down\n")
+        self.running = False
+        self.cc_session.group_unsubscribe(self.stats_module_name, "*")
+        self.close_httpd()
+        self.cc_session.close()
+
+    def __del__(self):
+        self.stop()
 
     def config_handler(self, new_config):
         """
@@ -63,129 +178,88 @@ class CCSessionListener():
         """
         command handler
         """
-        global IS_VERBOSE
         if command == "status":
-            if IS_VERBOSE:
+            if self.verbose:
                 sys.stdout.write("[b10-stats-httpd] Received 'status' command\n")
             return isc.config.ccsession.create_answer(
-                0, "Stats Httpd is alive. (PID: " + str(os.getpid()) + ")")
+                0, "Stats Httpd is up. (PID " + str(os.getpid()) + ")")
         elif command == "shutdown":
-            if IS_VERBOSE:
+            if self.verbose:
                 sys.stdout.write("[b10-stats-httpd] Received 'shutdown' command\n")
             self.running = False
             return isc.config.ccsession.create_answer(0)
         else:
-            if IS_VERBOSE:
+            if self.verbose:
                 sys.stdout.write("[b10-stats-httpd] Received unknown command\n")
-            return isc.config.ccsession.create_answer(1, "Unknown command: " + str(command))
-
-    def get_spec(self):
-        """
-        return spec data
-        """
-        pass
-
-    def get_socket(self):
-        """
-        return socket object
-        """
-        return self.ccs.get_socket()
+            return isc.config.ccsession.create_answer(
+                1, "Unknown command: " + str(command))
 
-    def check_command(self):
-        """
-        return socket object
-        """
-        return self.ccs.check_command()
+    def get_stats_data(self):
+        seq = self.cc_session.group_sendmsg(
+            isc.config.ccsession.create_command('show'),
+            self.stats_module_name)
+        try:
+            answer, env = self.cc_session.group_recvmsg(False, seq)
+        except isc.cc.SessionTimeout:
+            sys.stderr.write("[b10-stats] Error Session timed out\n")
+            return
+        if answer:
+            (rcode, value) = isc.config.ccsession.parse_answer(answer)
+            self.cc_session.group_reply(
+                env, isc.config.ccsession.create_answer(0))
+        return (rcode, value)
 
-    def close(self):
+    def get_stats_spec(self):
         """
-        close cc session
+        return spec data
         """
-        self.ccs.close()
-        self.running = False
-
-class HttpHandler(http.server.BaseHTTPRequestHandler):
-    """
-    HTTP handler class
-    """
-    def do_GET(self):
-        if self.path:
-            self.send_response(code=200)
-            self.send_header("Content-type", "text/html")
-            self.end_headers()
-            self.wfile.write(b"<html>This is an example.\n</html>")
-
-class HttpListener:
-    """
-    HTTP Listener class
-    """
-
-    def __init__(self, httpd_spec=None, handler=None):
-        self.address = ''
-        self.port = 8000
-        self.httpd = http.server.HTTPServer((self.address, self.port), handler)
-
-    def get_address(self):
-        return (self.address, self.port)
-
-    def get_socket(self):
-        return self.httpd.socket
+        return self.stats_config_spec
 
-    def handle_request(self):
-        return self.httpd.handle_request()
+    def get_stats_xml(self):
+        xml_contents = ''
+        if self.xml_template is None:
+            return None
+        return self.xml_template.substitute(
+            xml_contents=xml_contents)
 
-    def close(self):
-        return self.get_socket().close()
-
-def main():
-    global IS_VERBOSE
-    try:
-        parser = OptionParser()
-        parser.add_option("-v", "--verbose", dest="verbose", action="store_true", help="display more about what is going on")
-        (options, args) = parser.parse_args()
-        if options.verbose != IS_VERBOSE:
-            IS_VERBOSE = options.verbose
-    except OptionValueError:
-        sys.stderr.write("[b10-stats] Error parsing options\n")
-        sys.exit(1)
+    def get_stats_xsd(self):
+        xsd_contents = ''
+        if self.xsd_template is None:
+            return None
+        return self.xsd_template.substitute(
+            xsd_contents=xsd_contents)
 
-    ccs_lsnr = CCSessionListener()
-    http_lsnr = HttpListener(httpd_spec=ccs_lsnr.get_spec(), handler=HttpHandler)
-    css_fd = ccs_lsnr.get_socket()
-    ht_fd = http_lsnr.get_socket()
+    def get_stats_xsl(self):
+        xsl_contents = ''
+        if self.xsl_template is None:
+            return None
+        return self.xsl_template.substitute(
+            xsl_contents=xsl_contents)
 
-    running = True
-    poll_intval = 0.5
-    while running:
+    def read_template(self, file_name):
         try:
-            (rfd, wfd, xfd) = select.select([css_fd,ht_fd], [], [], poll_intval)
-            if (rfd, wfd, xfd) == ([], [], []):
-                    continue
-        except select.error as err:
-            if err.args[0] == errno.EINTR:
-                (rfd, wfd, xfd) = ([], [], [])
-            else:
-                sys.stderr.write("[b10-stats-httpd] Error with select(); %s\n" % err)
-                break
-        for fd in rfd + xfd:
-            if fd == css_fd:
-                ccs_lsnr.check_command()
-                running = ccs_lsnr.running
-            elif fd == ht_fd:
-                http_lsnr.handle_request()
-            else:
-                sys.stderr.write("[b10-stats-httpd] Unexpected Error with select();\n")
-                running = False
-
-    running = False
-    ccs_lsnr.stop()
-    http_lsnr.stop()
+            contents = "".join(
+                open(file_name, 'r').readlines(MAX_SIZE_OF_TEMPLATE))
+        except IOError as err:
+            sys.stderr.write(
+                "[b10-stats-httpd] Unexpected Error with opening file; %s\n" % err)
+            return None
+        return string.Template(contents)
 
 if __name__ == "__main__":
     try:
-        main()
+        parser = OptionParser()
+        parser.add_option(
+            "-v", "--verbose", dest="verbose", action="store_true",
+            help="display more about what is going on")
+        (options, args) = parser.parse_args()
+        stats_httpd = StatsHttpd(verbose=options.verbose)
+        stats_httpd.start()
+    except KeyboardInterrupt as kie:
+        sys.stderr.write("[b10-stats-httpd] Interrupted, exiting\n")
+        stats_httpd.close()
     except isc.cc.session.SessionError as se:
         sys.stderr.write("[b10-stats-httpd] Error creating module, "
                          + "is the command channel daemon running?\n")
-    except KeyboardInterrupt as kie:
-        sys.stderr.write("[b10-stats-httpd] Interrupted, exiting\n")
+    except OptionValueError:
+        sys.stderr.write("[b10-stats-httpd] Error parsing options\n")
diff --git a/src/bin/stats/stats_httpd.spec.pre.in b/src/bin/stats/stats_httpd.spec.pre.in
index edefb70..25eb7c1 100644
--- a/src/bin/stats/stats_httpd.spec.pre.in
+++ b/src/bin/stats/stats_httpd.spec.pre.in
@@ -2,7 +2,56 @@
   "module_spec": {
     "module_name": "StatsHttpd",
     "module_description": "Stats HTTP daemon",
-    "config_data": [],
+    "config_data": [
+      {
+        "item_name": "stats_spec_file",
+        "item_type": "string",
+        "item_optional": false,
+        "item_default": "@@DATAROOTDIR@@/@PACKAGE@/stats.spec",
+        "item_description": "the location of stats.spec",
+        "item_format": "filename"
+      },
+      {
+        "item_name": "xml_template",
+        "item_type": "string",
+        "item_optional": false,
+        "item_default": "@@DATAROOTDIR@@/@PACKAGE@/stats-httpd-xml.tpl",
+        "item_description": "the location of xml template",
+        "item_format": "filename"
+      },
+      {
+        "item_name": "xsd_template",
+        "item_type": "string",
+        "item_optional": false,
+        "item_default": "@@DATAROOTDIR@@/@PACKAGE@/stats-httpd-xsd.tpl",
+        "item_description": "the location of xsd template",
+        "item_format": "filename"
+      },
+      {
+        "item_name": "xsl_template",
+        "item_type": "string",
+        "item_optional": false,
+        "item_default": "@@DATAROOTDIR@@/@PACKAGE@/stats-httpd-xsl.tpl",
+        "item_description": "the location of xsl template",
+        "item_format": "filename"
+      },
+      {
+        "item_name": "listen_on_address",
+        "item_type": "string",
+        "item_optional": true,
+        "item_default": "127.0.0.1",
+        "item_description": "http listen-on address",
+        "item_format": "address"
+      },
+      {
+        "item_name": "listen_on_port",
+        "item_type": "integer",
+        "item_optional": false,
+        "item_default": 8000,
+        "item_description": "http listen-on port",
+        "item_format": "port"
+      }
+    ],
     "commands": [
       {
         "command_name": "status",
diff --git a/src/bin/stats/tests/Makefile.am b/src/bin/stats/tests/Makefile.am
index 0bcc653..070ba45 100644
--- a/src/bin/stats/tests/Makefile.am
+++ b/src/bin/stats/tests/Makefile.am
@@ -1,8 +1,8 @@
 SUBDIRS = isc http testdata
 PYCOVERAGE_RUN = @PYCOVERAGE_RUN@
 PYTESTS = b10-stats_test.py b10-stats-httpd_test.py
-EXTRA_DIST = $(PYTESTS) fake_time.py dummy_socket.py
-CLEANFILES = fake_time.pyc dummy_socket.pyc
+EXTRA_DIST = $(PYTESTS) fake_time.py socket.py select.py string.py
+CLEANFILES = fake_time.pyc socket.pyc select.pyc string.pyc
 
 # test using command-line arguments, so use check-local target instead of TESTS
 check-local:
@@ -14,6 +14,6 @@ endif
 	for pytest in $(PYTESTS) ; do \
 	echo Running test: $$pytest ; \
 	env PYTHONPATH=$(abs_top_srcdir)/src/lib/python:$(abs_top_builddir)/src/lib/python:$(abs_top_builddir)/src/bin/stats:$(abs_top_builddir)/src/bin/stats/tests \
-	B10_FROM_BUILD=$(abs_top_builddir) \
+	B10_FROM_BUILD=$(abs_builddir)/testdata \
 	$(PYCOVERAGE_RUN) $(abs_srcdir)/$$pytest || exit ; \
 	done
diff --git a/src/bin/stats/tests/b10-stats-httpd_test.py b/src/bin/stats/tests/b10-stats-httpd_test.py
index 952366f..357e416 100644
--- a/src/bin/stats/tests/b10-stats-httpd_test.py
+++ b/src/bin/stats/tests/b10-stats-httpd_test.py
@@ -15,57 +15,121 @@
 
 import unittest
 import os
+import http.server
+import string
+import select
+import imp
 
 import isc.cc
 
 import stats_httpd
 
-class TestStats(unittest.TestCase):
+class TestStatsHttpd(unittest.TestCase):
 
     def setUp(self):
-        self.ccs_lsnr = stats_httpd.CCSessionListener()
-        self.http_lsnr = stats_httpd.HttpListener(httpd_spec=self.ccs_lsnr.get_spec())
-        self.http_handler = stats_httpd.HttpHandler()
-        self.assertFalse(self.ccs_lsnr.get_socket().closed)
-        self.assertTrue(self.ccs_lsnr.running)
-        self.assertFalse(self.http_lsnr.get_socket().closed)
+        self.verbose = True
+        self.stats_httpd = stats_httpd.StatsHttpd(self.verbose)
+        self.http_server = self.stats_httpd.httpd
+        self.assertTrue(self.stats_httpd.verbose)
+        self.assertFalse(self.stats_httpd.running)
+        self.assertEqual(self.stats_httpd.stats_module_name, "Stats")
+        self.assertEqual(type(self.stats_httpd.httpd), stats_httpd.HttpServer)
+        self.assertFalse(self.stats_httpd.ccs_fd._closed)
+        self.assertFalse(self.stats_httpd.http_fd._closed)
+        self.assertEqual(self.stats_httpd.ccs_fd.fileno(), id(self.stats_httpd.ccs_fd))
+        self.assertEqual(self.stats_httpd.http_fd.fileno(), id(self.stats_httpd.http_fd))
+        self.assertEqual(type(self.stats_httpd.xml_template), string.Template)
+        self.assertEqual(type(self.stats_httpd.xsd_template), string.Template)
+        self.assertEqual(type(self.stats_httpd.xsl_template), string.Template)
 
     def tearDown(self):
-        self.ccs_lsnr.close()
-        self.http_lsnr.close()
-        self.assertTrue(self.ccs_lsnr.get_socket().closed)
-        self.assertFalse(self.ccs_lsnr.running)
-        self.assertTrue(self.http_lsnr.get_socket().closed)
+        self.stats_httpd.stop()
+        self.assertTrue(self.stats_httpd.ccs_fd._closed)
+        self.assertTrue(self.stats_httpd.http_fd._closed)
 
-    def test_sockets(self):
-        self.assertEqual(self.ccs_lsnr.get_socket().fileno(), 'dummy')
-        self.assertEqual(self.http_lsnr.get_socket().fileno(), 'dummy')
+    def test_statshttpd_start(self):
+        self.assertFalse(self.stats_httpd.running)
+        self.stats_httpd.start()
+        self.assertFalse(self.stats_httpd.running)
 
-    def test_ccs_listener(self):
-        self.assertIsNone(self.ccs_lsnr.get_spec())
-        self.assertIsNone(self.ccs_lsnr.check_command())
-        self.assertEqual(self.ccs_lsnr.command_handler("status", None),
+    def test_statshttpd_read_template(self):
+        self.assertIsNone(self.stats_httpd.read_template('/path/to/foo/bar'))
+
+    def test_statshttpd_commands(self):
+        self.assertEqual(
+            self.stats_httpd.config_handler(None),
+            isc.config.ccsession.create_answer(0))
+        self.assertEqual(self.stats_httpd.command_handler("status", None),
                          isc.config.ccsession.create_answer(
-                0, "Stats Httpd is alive. (PID: " + str(os.getpid()) + ")"))
-        self.assertTrue(self.ccs_lsnr.running)
-        self.assertEqual(self.ccs_lsnr.command_handler("shutdown", None),
+                0, "Stats Httpd is up. (PID " + str(os.getpid()) + ")"))
+        self.assertFalse(self.stats_httpd.running)
+        self.stats_httpd.running = True
+        self.assertEqual(self.stats_httpd.command_handler("shutdown", None),
                          isc.config.ccsession.create_answer(0))
-        self.assertFalse(self.ccs_lsnr.running)
+        self.assertFalse(self.stats_httpd.running)
         self.assertEqual(
-            self.ccs_lsnr.command_handler("__UNKNOWN_COMMAND__", None),
+            self.stats_httpd.command_handler("__UNKNOWN_COMMAND__", None),
             isc.config.ccsession.create_answer(
                 1, "Unknown command: __UNKNOWN_COMMAND__"))
 
-    def test_http_listener(self):
-        self.assertEqual(self.http_lsnr.get_address(), ('', 8000))
-        self.assertIsNone(self.http_lsnr.handle_request())
+    def test_stats_spec(self):
+        self.stats_httpd.cc_session.group_sendmsg(
+            { 'result': 
+              [ 0, { "auth.queries.tcp": 0,
+                     "auth.queries.udp": 0,
+                     "bind10.boot_time": "1970-01-01T00:00:00Z",
+                     "report_time": "2011-02-24T09:08:32Z",
+                     "stats.boot_time": "2011-02-24T09:08:21Z",
+                     "stats.last_update_time": "2011-02-24T09:08:21Z",
+                     "stats.lname": "4d662005_a at fdvm",
+                     "stats.start_time": "2011-02-24T09:08:21Z",
+                     "stats.timestamp": 1298538512.87378 } 
+                ]
+              }, "Stats" )
+        self.assertEqual(len(self.stats_httpd.get_stats_data()), 2)
+        self.assertEqual(type(self.stats_httpd.get_stats_spec()), list)
+
+    def test_stats_xml(self):
+        self.assertEqual(type(self.stats_httpd.get_stats_xml()), str)
+        self.assertEqual(type(self.stats_httpd.get_stats_xsd()), str)
+        self.assertEqual(type(self.stats_httpd.get_stats_xsl()), str)
 
     def test_http_handler(self):
-        self.assertIsNone(self.http_handler.do_GET())
+        self.assertTrue(self.stats_httpd.httpd.verbose)
+        self.stats_httpd.httpd.handler.path = '/'
+        self.stats_httpd.httpd.handler.do_GET()
+        self.stats_httpd.httpd.handler.do_HEAD()
+        self.stats_httpd.httpd.handler.path = '/bind10-statistics.xsd'
+        self.stats_httpd.httpd.handler.do_GET()
+        self.stats_httpd.httpd.handler.path = '/bind10-statistics.xsl'
+        self.stats_httpd.httpd.handler.do_GET()
+        self.stats_httpd.cc_session.group_sendmsg(
+            { 'result': 
+              [ 0, { "auth.queries.tcp": 0,
+                     "auth.queries.udp": 0,
+                     "bind10.boot_time": "1970-01-01T00:00:00Z",
+                     "report_time": "2011-02-24T09:08:32Z",
+                     "stats.boot_time": "2011-02-24T09:08:21Z",
+                     "stats.last_update_time": "2011-02-24T09:08:21Z",
+                     "stats.lname": "4d662005_a at fdvm",
+                     "stats.start_time": "2011-02-24T09:08:21Z",
+                     "stats.timestamp": 1298538512.87378 } 
+                ]
+              }, "Stats" )
+        self.stats_httpd.httpd.handler.path = '/path/to'
+        self.stats_httpd.httpd.handler.do_GET()
+        self.stats_httpd.httpd.handler.log_message('%s', 'dummyrequest')
 
-    def test_main(self):
-        self.assertEqual(stats_httpd.IS_VERBOSE, True)
-        self.assertRaises(TypeError, stats_httpd.main)
+    def test_no_buildpath(self):
+        """
+        test for not having environment variable "B10_FROM_BUILD"
+        """
+        if "B10_FROM_BUILD" in os.environ:
+            tmppath = os.environ["B10_FROM_BUILD"]
+            os.environ.pop("B10_FROM_BUILD")
+            imp.reload(stats_httpd)
+            os.environ["B10_FROM_BUILD"] = tmppath
+            imp.reload(stats_httpd)
 
 if __name__ == "__main__":
     unittest.main()
diff --git a/src/bin/stats/tests/b10-stats_test.py b/src/bin/stats/tests/b10-stats_test.py
index e4e1a1e..6f5b066 100644
--- a/src/bin/stats/tests/b10-stats_test.py
+++ b/src/bin/stats/tests/b10-stats_test.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2010  Internet Systems Consortium.
+# Copyright (C) 2010, 2011  Internet Systems Consortium.
 #
 # Permission to use, copy, modify, and distribute this software for any
 # purpose with or without fee is hereby granted, provided that the above
@@ -13,8 +13,6 @@
 # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
 # WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-__version__ = "$Revision$"
-
 #
 # Tests for the stats module
 #
@@ -532,7 +530,7 @@ class TestStats2(unittest.TestCase):
         """
         if "B10_FROM_BUILD" in os.environ:
             self.assertEqual(stats.SPECFILE_LOCATION,
-                             os.environ["B10_FROM_BUILD"] + "/src/bin/stats/stats.spec")
+                             os.environ["B10_FROM_BUILD"] + "/stats.spec")
         imp.reload(stats)
         # change path of SPECFILE_LOCATION
         stats.SPECFILE_LOCATION = TEST_SPECFILE_LOCATION
diff --git a/src/bin/stats/tests/dummy_socket.py b/src/bin/stats/tests/dummy_socket.py
deleted file mode 100644
index 53b9496..0000000
--- a/src/bin/stats/tests/dummy_socket.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright (C) 2011  Internet Systems Consortium.
-#
-# Permission to use, copy, modify, and distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SYSTEMS CONSORTIUM
-# DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
-# INTERNET SYSTEMS CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
-# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
-# FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
-# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
-# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-class socket:
-    """
-    This module is a mock-up class of socket
-    """
-    def __init__(self):
-        self.closed = False
-
-    def close(self):
-        self.closed = True
-
-    def fileno(self):
-        return 'dummy'
diff --git a/src/bin/stats/tests/http/server.py b/src/bin/stats/tests/http/server.py
index 5604ad5..98e8016 100644
--- a/src/bin/stats/tests/http/server.py
+++ b/src/bin/stats/tests/http/server.py
@@ -13,7 +13,7 @@
 # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
 # WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-import dummy_socket
+import socket
 
 class StreamWriter:
     """
@@ -30,10 +30,8 @@ class HTTPServer:
     This module is a mock-up class of http.server.HTTPServer
     """
     def __init__(self, server_class, handler_class):
-        self.socket = dummy_socket.socket()
-
-    def get_socket(self):
-        return self.socket
+        self.socket = socket.socket()
+        self.handler = handler_class(None, None, self)
 
     def handle_request(self):
         pass
@@ -46,8 +44,9 @@ class BaseHTTPRequestHandler:
     This module is a mock-up class of http.server.BaseHTTPRequestHandler
     """
 
-    def __init__(self):
+    def __init__(self, request, client_address, server):
         self.path = "/"
+        self.server = server
         self.wfile = StreamWriter()
 
     def send_response(self, code=0):
@@ -58,3 +57,12 @@ class BaseHTTPRequestHandler:
 
     def end_headers(self):
         pass
+
+    def send_error(self, code, message=None):
+        pass
+
+    def address_string(self):
+        return 'dummyhost'
+
+    def log_date_time_string(self):
+        return '[DD/MM/YYYY HH:MI:SS]'
diff --git a/src/bin/stats/tests/isc/cc/session.py b/src/bin/stats/tests/isc/cc/session.py
index 9a50558..6ba44d9 100644
--- a/src/bin/stats/tests/isc/cc/session.py
+++ b/src/bin/stats/tests/isc/cc/session.py
@@ -16,7 +16,7 @@
 # This module is a mock-up class of isc.cc.session
 
 import sys
-import dummy_socket
+import socket
 
 # set a dummy lname
 _TEST_LNAME = '123abc at xxxx'
@@ -37,7 +37,7 @@ class Session:
         self._lname = _TEST_LNAME
         self.message_queue = []
         self.old_message_queue = []
-        self._socket = dummy_socket.socket()
+        self._socket = socket.socket()
         self.verbose = verbose
 
     @property
@@ -51,7 +51,7 @@ class Session:
         return len(self.message_queue)
 
     def enqueue(self, msg=None, env={}):
-        if not self._socket:
+        if self._socket._closed:
             raise SessionError("Session has been closed.")
         seq = self._next_sequence()
         env.update({"seq": 0}) # fixed here
@@ -62,11 +62,11 @@ class Session:
         return seq
 
     def dequeue(self, seq=0):
-        if self._socket.closed:
+        if self._socket._closed:
             raise SessionError("Session has been closed.")
         que = None
         try:
-            que = self.message_queue.pop(seq)
+            que = self.message_queue.pop(0) # always pop at index 0
             self.old_message_queue.append(que)
         except IndexError:
             que = Queue()
@@ -75,7 +75,7 @@ class Session:
         return que
 
     def get_queue(self, seq=None):
-        if self._socket.closed:
+        if self._socket._closed:
             raise SessionError("Session has been closed.")
         if seq is None:
             seq = len(self.message_queue) - 1
@@ -111,7 +111,7 @@ class Session:
                 "reply": routing["seq"] })
 
     def get_message(self, group, to='*'):
-        if self._socket.closed:
+        if self._socket._closed:
             raise SessionError("Session has been closed.")
         que = Queue()
         for q in self.message_queue:
@@ -123,3 +123,8 @@ class Session:
             sys.stdout.write("[Session] get_message: " + str(que.dump()) + "\n")
         return q.msg
 
+    def group_subscribe(self, group, instance = "*"):
+        pass
+
+    def group_unsubscribe(self, group, instance = "*"):
+        pass
diff --git a/src/bin/stats/tests/isc/config/ccsession.py b/src/bin/stats/tests/isc/config/ccsession.py
index 93824c7..54c50fc 100644
--- a/src/bin/stats/tests/isc/config/ccsession.py
+++ b/src/bin/stats/tests/isc/config/ccsession.py
@@ -16,6 +16,7 @@
 # This module is a mock-up class of isc.cc.session
 
 import json
+import os
 from isc.cc.session import Session
 
 COMMAND_CONFIG_UPDATE = "config_update"
@@ -65,10 +66,46 @@ class ModuleSpec:
 class ModuleCCSessionError(Exception):
     pass
 
+class DataNotFoundError(Exception):
+    pass
+
 class ConfigData:
     def __init__(self, specification):
         self.specification = specification
 
+    def get_value(self, identifier):
+        """Returns a tuple where the first item is the value at the
+           given identifier, and the second item is a bool which is
+           true if the value is an unset default. Raises an
+           DataNotFoundError if the identifier is bad"""
+        def _get_value(config_map):
+                if 'item_default' in config_map:
+                    return config_map['item_default'], False
+                elif 'item_type' in config_map:
+                    if config_map['item_type'] == 'boolean':
+                        return bool(), True
+                    elif config_map['item_type'] == 'string':
+                        return str(), True
+                    elif config_map['item_type'] in set(['number', 'integer']):
+                        return int(), True
+                    elif config_map['item_type'] in set(['float', 'double', 'real']):
+                        return float(), True
+                    elif config_map['item_type'] in set(['list', 'array']):
+                        return [ _get_value(conf)
+                                 for conf in spec['list_item_spec'] ], True
+                    elif config_map['item_type'] in set(['map', 'object']):
+                        return dict(
+                            [ (conf['item_name'], _get_value(conf))
+                              for conf in config_map['map_item_spec'] ]), True
+                return None, True
+        for config_map in self.get_module_spec().get_config_spec():
+            if config_map['item_name'] == identifier:
+                return _get_value(config_map)
+        raise DataNotFoundError("item_name %s is not found in the specfile" % identifier)
+
+    def get_module_spec(self):
+        return self.specification
+
 class ModuleCCSession(ConfigData):
     def __init__(self, spec_file_name, config_handler, command_handler, cc_session = None):
         module_spec = module_spec_from_file(spec_file_name)
diff --git a/src/bin/stats/tests/select.py b/src/bin/stats/tests/select.py
new file mode 100644
index 0000000..3578473
--- /dev/null
+++ b/src/bin/stats/tests/select.py
@@ -0,0 +1,38 @@
+# Copyright (C) 2011  Internet Systems Consortium.
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SYSTEMS CONSORTIUM
+# DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
+# INTERNET SYSTEMS CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
+# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+# FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+import socket
+import errno
+
+class error(Exception):
+    pass
+
+def select(rlst, wlst, xlst, timeout):
+    """
+    This module is a mock-up function of select.select
+    """
+    if type(timeout) != int and type(timeout) != float:
+            raise TypeError("Error: %s must be integer or float"
+                            % timeout.__class__.__name__)
+    for s in rlst + wlst + xlst:
+        if type(s) != socket.socket:
+            raise TypeError("Error: %s must be a dummy socket"
+                            % s.__class__.__name__)
+        if s._called > 2:
+            raise error(errno.EINTR)
+        elif s._called > 1:
+            raise error("Something is happened!")
+        s._called = s._called + 1
+    return (rlst, wlst, xlst)
diff --git a/src/bin/stats/tests/socket.py b/src/bin/stats/tests/socket.py
new file mode 100644
index 0000000..260098f
--- /dev/null
+++ b/src/bin/stats/tests/socket.py
@@ -0,0 +1,28 @@
+# Copyright (C) 2011  Internet Systems Consortium.
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SYSTEMS CONSORTIUM
+# DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
+# INTERNET SYSTEMS CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
+# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+# FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+class socket:
+    """
+    This module is a mock-up class of socket
+    """
+    def __init__(self):
+        self._closed = False
+        self._called = 0
+
+    def close(self):
+        self._closed = True
+
+    def fileno(self):
+        return id(self)
diff --git a/src/bin/stats/tests/stats_test.in b/src/bin/stats/tests/stats_test.in
index 579ab57..8686bfa 100644
--- a/src/bin/stats/tests/stats_test.in
+++ b/src/bin/stats/tests/stats_test.in
@@ -21,11 +21,11 @@ export PYTHON_EXEC
 PYTHONPATH=@abs_top_builddir@/src/lib/python:@abs_top_srcdir@/src/bin/stats:@abs_top_srcdir@/src/bin/stats/tests
 export PYTHONPATH
 
-B10_FROM_BUILD=@abs_top_builddir@
-export B10_FROM_BUILD
-
 TEST_PATH=@abs_top_srcdir@/src/bin/stats/tests
 
+B10_FROM_BUILD=${TEST_PATH}/testdata
+export B10_FROM_BUILD
+
 cd ${TEST_PATH}
 ${PYTHON_EXEC} -O b10-stats_test.py $*
 ${PYTHON_EXEC} -O b10-stats-httpd_test.py $*
diff --git a/src/bin/stats/tests/string.py b/src/bin/stats/tests/string.py
new file mode 100644
index 0000000..5ab7f68
--- /dev/null
+++ b/src/bin/stats/tests/string.py
@@ -0,0 +1,25 @@
+# Copyright (C) 2011  Internet Systems Consortium.
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SYSTEMS CONSORTIUM
+# DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
+# INTERNET SYSTEMS CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
+# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+# FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+class Template:
+    """
+    This module is a mock-up class of Template
+    """
+    def __init__(self, template):
+        self.template = template
+
+    def substitute(self, **map):
+        return str(self.template)
+    
diff --git a/src/bin/stats/tests/testdata/Makefile.am b/src/bin/stats/tests/testdata/Makefile.am
index 1b8df6d..a46e0bb 100644
--- a/src/bin/stats/tests/testdata/Makefile.am
+++ b/src/bin/stats/tests/testdata/Makefile.am
@@ -1 +1,12 @@
 EXTRA_DIST = stats_test.spec
+
+noinst_DATA = stats.spec stats_httpd.spec
+
+CLEANFILES = stats.spec stats_httpd.spec
+
+stats.spec: ../../stats.spec.pre.in
+	$(SED) -e "s|@@DATAROOTDIR@@/\@PACKAGE\@|$(abs_srcdir)/../..|" ../../stats.spec.pre.in >$@
+
+stats_httpd.spec: ../../stats_httpd.spec.pre.in
+	$(SED) -e "s|@@DATAROOTDIR@@/\@PACKAGE\@|$(abs_srcdir)/../..|" ../../stats_httpd.spec.pre.in >$@
+




More information about the bind10-changes mailing list