CMake: Add CTest support to match Autotools checks
An ENABLE_TESTS CMake option is provided so that users can disable
testing if they don't want it. Instructions for how to use this
included in the INSTALL.cmake.md file.
If you run `ctest`, each testcase will write out a log file to the
<build>/unit_tests directory.
As with Autotools' make check, the test files are from test/.split
and unit_tests/.split files, but for CMake these are generated at
build time instead of at test time.
On Posix systems, sets the LD_LIBRARY_PATH so that ClamAV-compiled
libraries can be loaded when running tests.
On Windows systems, CTest will identify and collect all library
dependencies and assemble a temporarily install under the
build/unit_tests directory so that the libraries can be loaded when
running tests.
The same feature is used on Windows when using CMake to install to
collect all DLL dependencies so that users don't have to install them
manually afterwards.
Each of the CTest tests are run using a custom wrapper around Python's
unittest framework, which is also responsible for finding and inserting
valgrind into the valgrind tests on Posix systems.
Unlike with Autotools, the CMake CTest Valgrind-tests are enabled by
default, if Valgrind can be found. There's no need to set VG=1.
CTest's memcheck module is NOT supported, because we use Python to
orchestrate our tests.
Added a bunch of Windows compatibility changes to the unit tests.
These were primarily changing / to PATHSEP and making adjustments
to use Win32 C headers and ifdef out the POSIX ones which aren't
available on Windows. Also disabled a bunch of tests on Win32
that don't work on Windows, notably the mmap ones and FD-passing
(i.e. FILEDES) ones.
Add JSON_C_HAVE_INTTYPES_H definition to clamav-config.h to eliminate
warnings on Windows where json.h is included after inttypes.h because
json-c's inttypes replacement relies on it.
This is a it of a hack and may be removed if json-c fixes their
inttypes header stuff in the future.
Add preprocessor definitions on Windows to disable MSVC warnings about
CRT secure and nonstandard functions. While there may be a better
solution, this is needed to be able to see other more serious warnings.
Add missing file comment block and copyright statement for clamsubmit.c.
Also change json-c/json.h include filename to json.h in clamsubmit.c.
The directory name is not required.
Changed the hash table data integer type from long, which is poorly
defined, to size_t -- which is capable of storing a pointer. Fixed a
bunch of casts regarding this variable to eliminate warnings.
Fixed two bugs causing utf8 encoding unit tests to fail on Windows:
- The in_size variable should be the number of bytes, not the character
count. This was was causing the SHIFT_JIS (japanese codepage) to UTF8
transcoding test to only transcode half the bytes.
- It turns out that the MultiByteToWideChar() API can't transcode
UTF16-BE to UTF16-LE. The solution is to just iterate over the buffer
and flip the bytes on each uint16_t. This but was causing the UTF16-BE
to UTF8 tests to fail.
I also split up the utf8 transcoding tests into separate tests so I
could see all of the failures instead of just the first one.
Added a flags parameter to the unit test function to open testfiles
because it turns out that on Windows if a file contains the \r\n it will
replace it with just \n if you opened the file as a text file instead of
as binary. However, if we open the CBC files as binary, then a bunch of
bytecode tests fail. So I've changed the tests to open the CBC files in
the bytecode tests as text files and open all other files as binary.
Ported the feature tests from shell scripts to Python using a modified
version of our QA test-framework, which is largely compatible and will
allow us to migrate some QA tests into this repo. I'd like to add GitHub
Actions pipelines in the future so that all public PR's get some testing
before anyone has to manually review them.
The clamd --log option was missing from the help string, though it
definitely works. I've added it in this commit.
It appears that clamd.c was never clang-format'd, so this commit also
reformats clamd.c.
Some of the check_clamd tests expected the path returned by clamd to
match character for character with original path sent to clamd. However,
as we now evaluate real paths before a scan, the path returned by clamd
isn't going to match the relative (and possibly symlink-ridden) path
passed to clamdscan. I fixed this test by changing the test to search
for the basename: <signature> FOUND within the response instead of
matching the exact path.
Autotools: Link check_clamd with libclamav so we can use our utility
functions in check_clamd.c.
5 years ago
|
|
|
# Copyright (C) 2020 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
|
|
|
|
|
|
|
|
"""
|
|
|
|
Run freshclam tests
|
|
|
|
"""
|
|
|
|
|
|
|
|
import getpass
|
|
|
|
from multiprocessing import Process, Pipe
|
CMake: Add CTest support to match Autotools checks
An ENABLE_TESTS CMake option is provided so that users can disable
testing if they don't want it. Instructions for how to use this
included in the INSTALL.cmake.md file.
If you run `ctest`, each testcase will write out a log file to the
<build>/unit_tests directory.
As with Autotools' make check, the test files are from test/.split
and unit_tests/.split files, but for CMake these are generated at
build time instead of at test time.
On Posix systems, sets the LD_LIBRARY_PATH so that ClamAV-compiled
libraries can be loaded when running tests.
On Windows systems, CTest will identify and collect all library
dependencies and assemble a temporarily install under the
build/unit_tests directory so that the libraries can be loaded when
running tests.
The same feature is used on Windows when using CMake to install to
collect all DLL dependencies so that users don't have to install them
manually afterwards.
Each of the CTest tests are run using a custom wrapper around Python's
unittest framework, which is also responsible for finding and inserting
valgrind into the valgrind tests on Posix systems.
Unlike with Autotools, the CMake CTest Valgrind-tests are enabled by
default, if Valgrind can be found. There's no need to set VG=1.
CTest's memcheck module is NOT supported, because we use Python to
orchestrate our tests.
Added a bunch of Windows compatibility changes to the unit tests.
These were primarily changing / to PATHSEP and making adjustments
to use Win32 C headers and ifdef out the POSIX ones which aren't
available on Windows. Also disabled a bunch of tests on Win32
that don't work on Windows, notably the mmap ones and FD-passing
(i.e. FILEDES) ones.
Add JSON_C_HAVE_INTTYPES_H definition to clamav-config.h to eliminate
warnings on Windows where json.h is included after inttypes.h because
json-c's inttypes replacement relies on it.
This is a it of a hack and may be removed if json-c fixes their
inttypes header stuff in the future.
Add preprocessor definitions on Windows to disable MSVC warnings about
CRT secure and nonstandard functions. While there may be a better
solution, this is needed to be able to see other more serious warnings.
Add missing file comment block and copyright statement for clamsubmit.c.
Also change json-c/json.h include filename to json.h in clamsubmit.c.
The directory name is not required.
Changed the hash table data integer type from long, which is poorly
defined, to size_t -- which is capable of storing a pointer. Fixed a
bunch of casts regarding this variable to eliminate warnings.
Fixed two bugs causing utf8 encoding unit tests to fail on Windows:
- The in_size variable should be the number of bytes, not the character
count. This was was causing the SHIFT_JIS (japanese codepage) to UTF8
transcoding test to only transcode half the bytes.
- It turns out that the MultiByteToWideChar() API can't transcode
UTF16-BE to UTF16-LE. The solution is to just iterate over the buffer
and flip the bytes on each uint16_t. This but was causing the UTF16-BE
to UTF8 tests to fail.
I also split up the utf8 transcoding tests into separate tests so I
could see all of the failures instead of just the first one.
Added a flags parameter to the unit test function to open testfiles
because it turns out that on Windows if a file contains the \r\n it will
replace it with just \n if you opened the file as a text file instead of
as binary. However, if we open the CBC files as binary, then a bunch of
bytecode tests fail. So I've changed the tests to open the CBC files in
the bytecode tests as text files and open all other files as binary.
Ported the feature tests from shell scripts to Python using a modified
version of our QA test-framework, which is largely compatible and will
allow us to migrate some QA tests into this repo. I'd like to add GitHub
Actions pipelines in the future so that all public PR's get some testing
before anyone has to manually review them.
The clamd --log option was missing from the help string, though it
definitely works. I've added it in this commit.
It appears that clamd.c was never clang-format'd, so this commit also
reformats clamd.c.
Some of the check_clamd tests expected the path returned by clamd to
match character for character with original path sent to clamd. However,
as we now evaluate real paths before a scan, the path returned by clamd
isn't going to match the relative (and possibly symlink-ridden) path
passed to clamdscan. I fixed this test by changing the test to search
for the basename: <signature> FOUND within the response instead of
matching the exact path.
Autotools: Link check_clamd with libclamav so we can use our utility
functions in check_clamd.c.
5 years ago
|
|
|
import os
|
|
|
|
from pathlib import Path
|
|
|
|
import platform
|
|
|
|
import shutil
|
|
|
|
import subprocess
|
|
|
|
import sys
|
|
|
|
import time
|
|
|
|
import unittest
|
|
|
|
from functools import partial
|
CMake: Add CTest support to match Autotools checks
An ENABLE_TESTS CMake option is provided so that users can disable
testing if they don't want it. Instructions for how to use this
included in the INSTALL.cmake.md file.
If you run `ctest`, each testcase will write out a log file to the
<build>/unit_tests directory.
As with Autotools' make check, the test files are from test/.split
and unit_tests/.split files, but for CMake these are generated at
build time instead of at test time.
On Posix systems, sets the LD_LIBRARY_PATH so that ClamAV-compiled
libraries can be loaded when running tests.
On Windows systems, CTest will identify and collect all library
dependencies and assemble a temporarily install under the
build/unit_tests directory so that the libraries can be loaded when
running tests.
The same feature is used on Windows when using CMake to install to
collect all DLL dependencies so that users don't have to install them
manually afterwards.
Each of the CTest tests are run using a custom wrapper around Python's
unittest framework, which is also responsible for finding and inserting
valgrind into the valgrind tests on Posix systems.
Unlike with Autotools, the CMake CTest Valgrind-tests are enabled by
default, if Valgrind can be found. There's no need to set VG=1.
CTest's memcheck module is NOT supported, because we use Python to
orchestrate our tests.
Added a bunch of Windows compatibility changes to the unit tests.
These were primarily changing / to PATHSEP and making adjustments
to use Win32 C headers and ifdef out the POSIX ones which aren't
available on Windows. Also disabled a bunch of tests on Win32
that don't work on Windows, notably the mmap ones and FD-passing
(i.e. FILEDES) ones.
Add JSON_C_HAVE_INTTYPES_H definition to clamav-config.h to eliminate
warnings on Windows where json.h is included after inttypes.h because
json-c's inttypes replacement relies on it.
This is a it of a hack and may be removed if json-c fixes their
inttypes header stuff in the future.
Add preprocessor definitions on Windows to disable MSVC warnings about
CRT secure and nonstandard functions. While there may be a better
solution, this is needed to be able to see other more serious warnings.
Add missing file comment block and copyright statement for clamsubmit.c.
Also change json-c/json.h include filename to json.h in clamsubmit.c.
The directory name is not required.
Changed the hash table data integer type from long, which is poorly
defined, to size_t -- which is capable of storing a pointer. Fixed a
bunch of casts regarding this variable to eliminate warnings.
Fixed two bugs causing utf8 encoding unit tests to fail on Windows:
- The in_size variable should be the number of bytes, not the character
count. This was was causing the SHIFT_JIS (japanese codepage) to UTF8
transcoding test to only transcode half the bytes.
- It turns out that the MultiByteToWideChar() API can't transcode
UTF16-BE to UTF16-LE. The solution is to just iterate over the buffer
and flip the bytes on each uint16_t. This but was causing the UTF16-BE
to UTF8 tests to fail.
I also split up the utf8 transcoding tests into separate tests so I
could see all of the failures instead of just the first one.
Added a flags parameter to the unit test function to open testfiles
because it turns out that on Windows if a file contains the \r\n it will
replace it with just \n if you opened the file as a text file instead of
as binary. However, if we open the CBC files as binary, then a bunch of
bytecode tests fail. So I've changed the tests to open the CBC files in
the bytecode tests as text files and open all other files as binary.
Ported the feature tests from shell scripts to Python using a modified
version of our QA test-framework, which is largely compatible and will
allow us to migrate some QA tests into this repo. I'd like to add GitHub
Actions pipelines in the future so that all public PR's get some testing
before anyone has to manually review them.
The clamd --log option was missing from the help string, though it
definitely works. I've added it in this commit.
It appears that clamd.c was never clang-format'd, so this commit also
reformats clamd.c.
Some of the check_clamd tests expected the path returned by clamd to
match character for character with original path sent to clamd. However,
as we now evaluate real paths before a scan, the path returned by clamd
isn't going to match the relative (and possibly symlink-ridden) path
passed to clamdscan. I fixed this test by changing the test to search
for the basename: <signature> FOUND within the response instead of
matching the exact path.
Autotools: Link check_clamd with libclamav so we can use our utility
functions in check_clamd.c.
5 years ago
|
|
|
|
|
|
|
from http.server import HTTPServer, BaseHTTPRequestHandler
|
|
|
|
import cgi
|
CMake: Add CTest support to match Autotools checks
An ENABLE_TESTS CMake option is provided so that users can disable
testing if they don't want it. Instructions for how to use this
included in the INSTALL.cmake.md file.
If you run `ctest`, each testcase will write out a log file to the
<build>/unit_tests directory.
As with Autotools' make check, the test files are from test/.split
and unit_tests/.split files, but for CMake these are generated at
build time instead of at test time.
On Posix systems, sets the LD_LIBRARY_PATH so that ClamAV-compiled
libraries can be loaded when running tests.
On Windows systems, CTest will identify and collect all library
dependencies and assemble a temporarily install under the
build/unit_tests directory so that the libraries can be loaded when
running tests.
The same feature is used on Windows when using CMake to install to
collect all DLL dependencies so that users don't have to install them
manually afterwards.
Each of the CTest tests are run using a custom wrapper around Python's
unittest framework, which is also responsible for finding and inserting
valgrind into the valgrind tests on Posix systems.
Unlike with Autotools, the CMake CTest Valgrind-tests are enabled by
default, if Valgrind can be found. There's no need to set VG=1.
CTest's memcheck module is NOT supported, because we use Python to
orchestrate our tests.
Added a bunch of Windows compatibility changes to the unit tests.
These were primarily changing / to PATHSEP and making adjustments
to use Win32 C headers and ifdef out the POSIX ones which aren't
available on Windows. Also disabled a bunch of tests on Win32
that don't work on Windows, notably the mmap ones and FD-passing
(i.e. FILEDES) ones.
Add JSON_C_HAVE_INTTYPES_H definition to clamav-config.h to eliminate
warnings on Windows where json.h is included after inttypes.h because
json-c's inttypes replacement relies on it.
This is a it of a hack and may be removed if json-c fixes their
inttypes header stuff in the future.
Add preprocessor definitions on Windows to disable MSVC warnings about
CRT secure and nonstandard functions. While there may be a better
solution, this is needed to be able to see other more serious warnings.
Add missing file comment block and copyright statement for clamsubmit.c.
Also change json-c/json.h include filename to json.h in clamsubmit.c.
The directory name is not required.
Changed the hash table data integer type from long, which is poorly
defined, to size_t -- which is capable of storing a pointer. Fixed a
bunch of casts regarding this variable to eliminate warnings.
Fixed two bugs causing utf8 encoding unit tests to fail on Windows:
- The in_size variable should be the number of bytes, not the character
count. This was was causing the SHIFT_JIS (japanese codepage) to UTF8
transcoding test to only transcode half the bytes.
- It turns out that the MultiByteToWideChar() API can't transcode
UTF16-BE to UTF16-LE. The solution is to just iterate over the buffer
and flip the bytes on each uint16_t. This but was causing the UTF16-BE
to UTF8 tests to fail.
I also split up the utf8 transcoding tests into separate tests so I
could see all of the failures instead of just the first one.
Added a flags parameter to the unit test function to open testfiles
because it turns out that on Windows if a file contains the \r\n it will
replace it with just \n if you opened the file as a text file instead of
as binary. However, if we open the CBC files as binary, then a bunch of
bytecode tests fail. So I've changed the tests to open the CBC files in
the bytecode tests as text files and open all other files as binary.
Ported the feature tests from shell scripts to Python using a modified
version of our QA test-framework, which is largely compatible and will
allow us to migrate some QA tests into this repo. I'd like to add GitHub
Actions pipelines in the future so that all public PR's get some testing
before anyone has to manually review them.
The clamd --log option was missing from the help string, though it
definitely works. I've added it in this commit.
It appears that clamd.c was never clang-format'd, so this commit also
reformats clamd.c.
Some of the check_clamd tests expected the path returned by clamd to
match character for character with original path sent to clamd. However,
as we now evaluate real paths before a scan, the path returned by clamd
isn't going to match the relative (and possibly symlink-ridden) path
passed to clamdscan. I fixed this test by changing the test to search
for the basename: <signature> FOUND within the response instead of
matching the exact path.
Autotools: Link check_clamd with libclamav so we can use our utility
functions in check_clamd.c.
5 years ago
|
|
|
|
|
|
|
import testcase
|
CMake: Add CTest support to match Autotools checks
An ENABLE_TESTS CMake option is provided so that users can disable
testing if they don't want it. Instructions for how to use this
included in the INSTALL.cmake.md file.
If you run `ctest`, each testcase will write out a log file to the
<build>/unit_tests directory.
As with Autotools' make check, the test files are from test/.split
and unit_tests/.split files, but for CMake these are generated at
build time instead of at test time.
On Posix systems, sets the LD_LIBRARY_PATH so that ClamAV-compiled
libraries can be loaded when running tests.
On Windows systems, CTest will identify and collect all library
dependencies and assemble a temporarily install under the
build/unit_tests directory so that the libraries can be loaded when
running tests.
The same feature is used on Windows when using CMake to install to
collect all DLL dependencies so that users don't have to install them
manually afterwards.
Each of the CTest tests are run using a custom wrapper around Python's
unittest framework, which is also responsible for finding and inserting
valgrind into the valgrind tests on Posix systems.
Unlike with Autotools, the CMake CTest Valgrind-tests are enabled by
default, if Valgrind can be found. There's no need to set VG=1.
CTest's memcheck module is NOT supported, because we use Python to
orchestrate our tests.
Added a bunch of Windows compatibility changes to the unit tests.
These were primarily changing / to PATHSEP and making adjustments
to use Win32 C headers and ifdef out the POSIX ones which aren't
available on Windows. Also disabled a bunch of tests on Win32
that don't work on Windows, notably the mmap ones and FD-passing
(i.e. FILEDES) ones.
Add JSON_C_HAVE_INTTYPES_H definition to clamav-config.h to eliminate
warnings on Windows where json.h is included after inttypes.h because
json-c's inttypes replacement relies on it.
This is a it of a hack and may be removed if json-c fixes their
inttypes header stuff in the future.
Add preprocessor definitions on Windows to disable MSVC warnings about
CRT secure and nonstandard functions. While there may be a better
solution, this is needed to be able to see other more serious warnings.
Add missing file comment block and copyright statement for clamsubmit.c.
Also change json-c/json.h include filename to json.h in clamsubmit.c.
The directory name is not required.
Changed the hash table data integer type from long, which is poorly
defined, to size_t -- which is capable of storing a pointer. Fixed a
bunch of casts regarding this variable to eliminate warnings.
Fixed two bugs causing utf8 encoding unit tests to fail on Windows:
- The in_size variable should be the number of bytes, not the character
count. This was was causing the SHIFT_JIS (japanese codepage) to UTF8
transcoding test to only transcode half the bytes.
- It turns out that the MultiByteToWideChar() API can't transcode
UTF16-BE to UTF16-LE. The solution is to just iterate over the buffer
and flip the bytes on each uint16_t. This but was causing the UTF16-BE
to UTF8 tests to fail.
I also split up the utf8 transcoding tests into separate tests so I
could see all of the failures instead of just the first one.
Added a flags parameter to the unit test function to open testfiles
because it turns out that on Windows if a file contains the \r\n it will
replace it with just \n if you opened the file as a text file instead of
as binary. However, if we open the CBC files as binary, then a bunch of
bytecode tests fail. So I've changed the tests to open the CBC files in
the bytecode tests as text files and open all other files as binary.
Ported the feature tests from shell scripts to Python using a modified
version of our QA test-framework, which is largely compatible and will
allow us to migrate some QA tests into this repo. I'd like to add GitHub
Actions pipelines in the future so that all public PR's get some testing
before anyone has to manually review them.
The clamd --log option was missing from the help string, though it
definitely works. I've added it in this commit.
It appears that clamd.c was never clang-format'd, so this commit also
reformats clamd.c.
Some of the check_clamd tests expected the path returned by clamd to
match character for character with original path sent to clamd. However,
as we now evaluate real paths before a scan, the path returned by clamd
isn't going to match the relative (and possibly symlink-ridden) path
passed to clamdscan. I fixed this test by changing the test to search
for the basename: <signature> FOUND within the response instead of
matching the exact path.
Autotools: Link check_clamd with libclamav so we can use our utility
functions in check_clamd.c.
5 years ago
|
|
|
|
|
|
|
os_platform = platform.platform()
|
|
|
|
operating_system = os_platform.split('-')[0].lower()
|
|
|
|
|
|
|
|
|
|
|
|
class TC(testcase.TestCase):
|
|
|
|
@classmethod
|
|
|
|
def setUpClass(cls):
|
|
|
|
super(TC, cls).setUpClass()
|
|
|
|
|
|
|
|
# Prepare a directory to host our test databases
|
|
|
|
TC.path_www = Path(TC.path_tmp, 'www')
|
|
|
|
TC.path_www.mkdir()
|
|
|
|
|
|
|
|
TC.path_db = Path(TC.path_tmp, 'database')
|
|
|
|
TC.freshclam_pid = Path(TC.path_tmp, 'freshclam-test.pid')
|
|
|
|
TC.freshclam_config = Path(TC.path_tmp, 'freshclam-test.conf')
|
|
|
|
|
|
|
|
TC.mock_mirror_port = 8001 # Chosen instead of 8000 because CVD-Update tool serves on 8000 by default.
|
|
|
|
# TODO: Ideally we'd find an open port to use for these tests instead of crossing our fingers.
|
|
|
|
TC.mock_mirror = None
|
CMake: Add CTest support to match Autotools checks
An ENABLE_TESTS CMake option is provided so that users can disable
testing if they don't want it. Instructions for how to use this
included in the INSTALL.cmake.md file.
If you run `ctest`, each testcase will write out a log file to the
<build>/unit_tests directory.
As with Autotools' make check, the test files are from test/.split
and unit_tests/.split files, but for CMake these are generated at
build time instead of at test time.
On Posix systems, sets the LD_LIBRARY_PATH so that ClamAV-compiled
libraries can be loaded when running tests.
On Windows systems, CTest will identify and collect all library
dependencies and assemble a temporarily install under the
build/unit_tests directory so that the libraries can be loaded when
running tests.
The same feature is used on Windows when using CMake to install to
collect all DLL dependencies so that users don't have to install them
manually afterwards.
Each of the CTest tests are run using a custom wrapper around Python's
unittest framework, which is also responsible for finding and inserting
valgrind into the valgrind tests on Posix systems.
Unlike with Autotools, the CMake CTest Valgrind-tests are enabled by
default, if Valgrind can be found. There's no need to set VG=1.
CTest's memcheck module is NOT supported, because we use Python to
orchestrate our tests.
Added a bunch of Windows compatibility changes to the unit tests.
These were primarily changing / to PATHSEP and making adjustments
to use Win32 C headers and ifdef out the POSIX ones which aren't
available on Windows. Also disabled a bunch of tests on Win32
that don't work on Windows, notably the mmap ones and FD-passing
(i.e. FILEDES) ones.
Add JSON_C_HAVE_INTTYPES_H definition to clamav-config.h to eliminate
warnings on Windows where json.h is included after inttypes.h because
json-c's inttypes replacement relies on it.
This is a it of a hack and may be removed if json-c fixes their
inttypes header stuff in the future.
Add preprocessor definitions on Windows to disable MSVC warnings about
CRT secure and nonstandard functions. While there may be a better
solution, this is needed to be able to see other more serious warnings.
Add missing file comment block and copyright statement for clamsubmit.c.
Also change json-c/json.h include filename to json.h in clamsubmit.c.
The directory name is not required.
Changed the hash table data integer type from long, which is poorly
defined, to size_t -- which is capable of storing a pointer. Fixed a
bunch of casts regarding this variable to eliminate warnings.
Fixed two bugs causing utf8 encoding unit tests to fail on Windows:
- The in_size variable should be the number of bytes, not the character
count. This was was causing the SHIFT_JIS (japanese codepage) to UTF8
transcoding test to only transcode half the bytes.
- It turns out that the MultiByteToWideChar() API can't transcode
UTF16-BE to UTF16-LE. The solution is to just iterate over the buffer
and flip the bytes on each uint16_t. This but was causing the UTF16-BE
to UTF8 tests to fail.
I also split up the utf8 transcoding tests into separate tests so I
could see all of the failures instead of just the first one.
Added a flags parameter to the unit test function to open testfiles
because it turns out that on Windows if a file contains the \r\n it will
replace it with just \n if you opened the file as a text file instead of
as binary. However, if we open the CBC files as binary, then a bunch of
bytecode tests fail. So I've changed the tests to open the CBC files in
the bytecode tests as text files and open all other files as binary.
Ported the feature tests from shell scripts to Python using a modified
version of our QA test-framework, which is largely compatible and will
allow us to migrate some QA tests into this repo. I'd like to add GitHub
Actions pipelines in the future so that all public PR's get some testing
before anyone has to manually review them.
The clamd --log option was missing from the help string, though it
definitely works. I've added it in this commit.
It appears that clamd.c was never clang-format'd, so this commit also
reformats clamd.c.
Some of the check_clamd tests expected the path returned by clamd to
match character for character with original path sent to clamd. However,
as we now evaluate real paths before a scan, the path returned by clamd
isn't going to match the relative (and possibly symlink-ridden) path
passed to clamdscan. I fixed this test by changing the test to search
for the basename: <signature> FOUND within the response instead of
matching the exact path.
Autotools: Link check_clamd with libclamav so we can use our utility
functions in check_clamd.c.
5 years ago
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def tearDownClass(cls):
|
|
|
|
super(TC, cls).tearDownClass()
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
super(TC, self).setUp()
|
|
|
|
|
|
|
|
def tearDown(self):
|
|
|
|
if TC.mock_mirror != None:
|
|
|
|
TC.mock_mirror.terminate()
|
|
|
|
TC.mock_mirror = None
|
|
|
|
|
|
|
|
# Clear the database directory
|
|
|
|
try:
|
|
|
|
shutil.rmtree(self.path_db)
|
|
|
|
except Exception:
|
|
|
|
pass
|
|
|
|
self.path_db.mkdir()
|
|
|
|
|
|
|
|
# Clear the www directory
|
|
|
|
try:
|
|
|
|
shutil.rmtree(self.path_www)
|
|
|
|
except Exception:
|
|
|
|
pass
|
|
|
|
self.path_www.mkdir()
|
|
|
|
|
CMake: Add CTest support to match Autotools checks
An ENABLE_TESTS CMake option is provided so that users can disable
testing if they don't want it. Instructions for how to use this
included in the INSTALL.cmake.md file.
If you run `ctest`, each testcase will write out a log file to the
<build>/unit_tests directory.
As with Autotools' make check, the test files are from test/.split
and unit_tests/.split files, but for CMake these are generated at
build time instead of at test time.
On Posix systems, sets the LD_LIBRARY_PATH so that ClamAV-compiled
libraries can be loaded when running tests.
On Windows systems, CTest will identify and collect all library
dependencies and assemble a temporarily install under the
build/unit_tests directory so that the libraries can be loaded when
running tests.
The same feature is used on Windows when using CMake to install to
collect all DLL dependencies so that users don't have to install them
manually afterwards.
Each of the CTest tests are run using a custom wrapper around Python's
unittest framework, which is also responsible for finding and inserting
valgrind into the valgrind tests on Posix systems.
Unlike with Autotools, the CMake CTest Valgrind-tests are enabled by
default, if Valgrind can be found. There's no need to set VG=1.
CTest's memcheck module is NOT supported, because we use Python to
orchestrate our tests.
Added a bunch of Windows compatibility changes to the unit tests.
These were primarily changing / to PATHSEP and making adjustments
to use Win32 C headers and ifdef out the POSIX ones which aren't
available on Windows. Also disabled a bunch of tests on Win32
that don't work on Windows, notably the mmap ones and FD-passing
(i.e. FILEDES) ones.
Add JSON_C_HAVE_INTTYPES_H definition to clamav-config.h to eliminate
warnings on Windows where json.h is included after inttypes.h because
json-c's inttypes replacement relies on it.
This is a it of a hack and may be removed if json-c fixes their
inttypes header stuff in the future.
Add preprocessor definitions on Windows to disable MSVC warnings about
CRT secure and nonstandard functions. While there may be a better
solution, this is needed to be able to see other more serious warnings.
Add missing file comment block and copyright statement for clamsubmit.c.
Also change json-c/json.h include filename to json.h in clamsubmit.c.
The directory name is not required.
Changed the hash table data integer type from long, which is poorly
defined, to size_t -- which is capable of storing a pointer. Fixed a
bunch of casts regarding this variable to eliminate warnings.
Fixed two bugs causing utf8 encoding unit tests to fail on Windows:
- The in_size variable should be the number of bytes, not the character
count. This was was causing the SHIFT_JIS (japanese codepage) to UTF8
transcoding test to only transcode half the bytes.
- It turns out that the MultiByteToWideChar() API can't transcode
UTF16-BE to UTF16-LE. The solution is to just iterate over the buffer
and flip the bytes on each uint16_t. This but was causing the UTF16-BE
to UTF8 tests to fail.
I also split up the utf8 transcoding tests into separate tests so I
could see all of the failures instead of just the first one.
Added a flags parameter to the unit test function to open testfiles
because it turns out that on Windows if a file contains the \r\n it will
replace it with just \n if you opened the file as a text file instead of
as binary. However, if we open the CBC files as binary, then a bunch of
bytecode tests fail. So I've changed the tests to open the CBC files in
the bytecode tests as text files and open all other files as binary.
Ported the feature tests from shell scripts to Python using a modified
version of our QA test-framework, which is largely compatible and will
allow us to migrate some QA tests into this repo. I'd like to add GitHub
Actions pipelines in the future so that all public PR's get some testing
before anyone has to manually review them.
The clamd --log option was missing from the help string, though it
definitely works. I've added it in this commit.
It appears that clamd.c was never clang-format'd, so this commit also
reformats clamd.c.
Some of the check_clamd tests expected the path returned by clamd to
match character for character with original path sent to clamd. However,
as we now evaluate real paths before a scan, the path returned by clamd
isn't going to match the relative (and possibly symlink-ridden) path
passed to clamdscan. I fixed this test by changing the test to search
for the basename: <signature> FOUND within the response instead of
matching the exact path.
Autotools: Link check_clamd with libclamav so we can use our utility
functions in check_clamd.c.
5 years ago
|
|
|
super(TC, self).tearDown()
|
|
|
|
self.verify_valgrind_log()
|
|
|
|
|
|
|
|
def test_freshclam_00_version(self):
|
|
|
|
self.step_name('freshclam version test')
|
|
|
|
|
|
|
|
if TC.freshclam_config.exists():
|
|
|
|
os.remove(str(TC.freshclam_config))
|
|
|
|
|
|
|
|
TC.freshclam_config.write_text('''
|
|
|
|
DatabaseMirror http://localhost:{port}
|
|
|
|
'''.format(
|
|
|
|
freshclam_pid=TC.freshclam_pid,
|
|
|
|
path_db=TC.path_db,
|
|
|
|
port=TC.mock_mirror_port,
|
|
|
|
))
|
|
|
|
|
|
|
|
command = '{valgrind} {valgrind_args} {freshclam} --config-file={freshclam_config} -V'.format(
|
|
|
|
valgrind=TC.valgrind, valgrind_args=TC.valgrind_args, freshclam=TC.freshclam, freshclam_config=TC.freshclam_config
|
|
|
|
)
|
CMake: Add CTest support to match Autotools checks
An ENABLE_TESTS CMake option is provided so that users can disable
testing if they don't want it. Instructions for how to use this
included in the INSTALL.cmake.md file.
If you run `ctest`, each testcase will write out a log file to the
<build>/unit_tests directory.
As with Autotools' make check, the test files are from test/.split
and unit_tests/.split files, but for CMake these are generated at
build time instead of at test time.
On Posix systems, sets the LD_LIBRARY_PATH so that ClamAV-compiled
libraries can be loaded when running tests.
On Windows systems, CTest will identify and collect all library
dependencies and assemble a temporarily install under the
build/unit_tests directory so that the libraries can be loaded when
running tests.
The same feature is used on Windows when using CMake to install to
collect all DLL dependencies so that users don't have to install them
manually afterwards.
Each of the CTest tests are run using a custom wrapper around Python's
unittest framework, which is also responsible for finding and inserting
valgrind into the valgrind tests on Posix systems.
Unlike with Autotools, the CMake CTest Valgrind-tests are enabled by
default, if Valgrind can be found. There's no need to set VG=1.
CTest's memcheck module is NOT supported, because we use Python to
orchestrate our tests.
Added a bunch of Windows compatibility changes to the unit tests.
These were primarily changing / to PATHSEP and making adjustments
to use Win32 C headers and ifdef out the POSIX ones which aren't
available on Windows. Also disabled a bunch of tests on Win32
that don't work on Windows, notably the mmap ones and FD-passing
(i.e. FILEDES) ones.
Add JSON_C_HAVE_INTTYPES_H definition to clamav-config.h to eliminate
warnings on Windows where json.h is included after inttypes.h because
json-c's inttypes replacement relies on it.
This is a it of a hack and may be removed if json-c fixes their
inttypes header stuff in the future.
Add preprocessor definitions on Windows to disable MSVC warnings about
CRT secure and nonstandard functions. While there may be a better
solution, this is needed to be able to see other more serious warnings.
Add missing file comment block and copyright statement for clamsubmit.c.
Also change json-c/json.h include filename to json.h in clamsubmit.c.
The directory name is not required.
Changed the hash table data integer type from long, which is poorly
defined, to size_t -- which is capable of storing a pointer. Fixed a
bunch of casts regarding this variable to eliminate warnings.
Fixed two bugs causing utf8 encoding unit tests to fail on Windows:
- The in_size variable should be the number of bytes, not the character
count. This was was causing the SHIFT_JIS (japanese codepage) to UTF8
transcoding test to only transcode half the bytes.
- It turns out that the MultiByteToWideChar() API can't transcode
UTF16-BE to UTF16-LE. The solution is to just iterate over the buffer
and flip the bytes on each uint16_t. This but was causing the UTF16-BE
to UTF8 tests to fail.
I also split up the utf8 transcoding tests into separate tests so I
could see all of the failures instead of just the first one.
Added a flags parameter to the unit test function to open testfiles
because it turns out that on Windows if a file contains the \r\n it will
replace it with just \n if you opened the file as a text file instead of
as binary. However, if we open the CBC files as binary, then a bunch of
bytecode tests fail. So I've changed the tests to open the CBC files in
the bytecode tests as text files and open all other files as binary.
Ported the feature tests from shell scripts to Python using a modified
version of our QA test-framework, which is largely compatible and will
allow us to migrate some QA tests into this repo. I'd like to add GitHub
Actions pipelines in the future so that all public PR's get some testing
before anyone has to manually review them.
The clamd --log option was missing from the help string, though it
definitely works. I've added it in this commit.
It appears that clamd.c was never clang-format'd, so this commit also
reformats clamd.c.
Some of the check_clamd tests expected the path returned by clamd to
match character for character with original path sent to clamd. However,
as we now evaluate real paths before a scan, the path returned by clamd
isn't going to match the relative (and possibly symlink-ridden) path
passed to clamdscan. I fixed this test by changing the test to search
for the basename: <signature> FOUND within the response instead of
matching the exact path.
Autotools: Link check_clamd with libclamav so we can use our utility
functions in check_clamd.c.
5 years ago
|
|
|
output = self.execute_command(command)
|
|
|
|
|
|
|
|
assert output.ec == 0 # success
|
|
|
|
|
|
|
|
expected_results = [
|
|
|
|
'ClamAV {}'.format(TC.version),
|
CMake: Add CTest support to match Autotools checks
An ENABLE_TESTS CMake option is provided so that users can disable
testing if they don't want it. Instructions for how to use this
included in the INSTALL.cmake.md file.
If you run `ctest`, each testcase will write out a log file to the
<build>/unit_tests directory.
As with Autotools' make check, the test files are from test/.split
and unit_tests/.split files, but for CMake these are generated at
build time instead of at test time.
On Posix systems, sets the LD_LIBRARY_PATH so that ClamAV-compiled
libraries can be loaded when running tests.
On Windows systems, CTest will identify and collect all library
dependencies and assemble a temporarily install under the
build/unit_tests directory so that the libraries can be loaded when
running tests.
The same feature is used on Windows when using CMake to install to
collect all DLL dependencies so that users don't have to install them
manually afterwards.
Each of the CTest tests are run using a custom wrapper around Python's
unittest framework, which is also responsible for finding and inserting
valgrind into the valgrind tests on Posix systems.
Unlike with Autotools, the CMake CTest Valgrind-tests are enabled by
default, if Valgrind can be found. There's no need to set VG=1.
CTest's memcheck module is NOT supported, because we use Python to
orchestrate our tests.
Added a bunch of Windows compatibility changes to the unit tests.
These were primarily changing / to PATHSEP and making adjustments
to use Win32 C headers and ifdef out the POSIX ones which aren't
available on Windows. Also disabled a bunch of tests on Win32
that don't work on Windows, notably the mmap ones and FD-passing
(i.e. FILEDES) ones.
Add JSON_C_HAVE_INTTYPES_H definition to clamav-config.h to eliminate
warnings on Windows where json.h is included after inttypes.h because
json-c's inttypes replacement relies on it.
This is a it of a hack and may be removed if json-c fixes their
inttypes header stuff in the future.
Add preprocessor definitions on Windows to disable MSVC warnings about
CRT secure and nonstandard functions. While there may be a better
solution, this is needed to be able to see other more serious warnings.
Add missing file comment block and copyright statement for clamsubmit.c.
Also change json-c/json.h include filename to json.h in clamsubmit.c.
The directory name is not required.
Changed the hash table data integer type from long, which is poorly
defined, to size_t -- which is capable of storing a pointer. Fixed a
bunch of casts regarding this variable to eliminate warnings.
Fixed two bugs causing utf8 encoding unit tests to fail on Windows:
- The in_size variable should be the number of bytes, not the character
count. This was was causing the SHIFT_JIS (japanese codepage) to UTF8
transcoding test to only transcode half the bytes.
- It turns out that the MultiByteToWideChar() API can't transcode
UTF16-BE to UTF16-LE. The solution is to just iterate over the buffer
and flip the bytes on each uint16_t. This but was causing the UTF16-BE
to UTF8 tests to fail.
I also split up the utf8 transcoding tests into separate tests so I
could see all of the failures instead of just the first one.
Added a flags parameter to the unit test function to open testfiles
because it turns out that on Windows if a file contains the \r\n it will
replace it with just \n if you opened the file as a text file instead of
as binary. However, if we open the CBC files as binary, then a bunch of
bytecode tests fail. So I've changed the tests to open the CBC files in
the bytecode tests as text files and open all other files as binary.
Ported the feature tests from shell scripts to Python using a modified
version of our QA test-framework, which is largely compatible and will
allow us to migrate some QA tests into this repo. I'd like to add GitHub
Actions pipelines in the future so that all public PR's get some testing
before anyone has to manually review them.
The clamd --log option was missing from the help string, though it
definitely works. I've added it in this commit.
It appears that clamd.c was never clang-format'd, so this commit also
reformats clamd.c.
Some of the check_clamd tests expected the path returned by clamd to
match character for character with original path sent to clamd. However,
as we now evaluate real paths before a scan, the path returned by clamd
isn't going to match the relative (and possibly symlink-ridden) path
passed to clamdscan. I fixed this test by changing the test to search
for the basename: <signature> FOUND within the response instead of
matching the exact path.
Autotools: Link check_clamd with libclamav so we can use our utility
functions in check_clamd.c.
5 years ago
|
|
|
]
|
|
|
|
self.verify_output(output.out, expected=expected_results)
|
|
|
|
|
|
|
|
def test_freshclam_01_file_copy(self):
|
|
|
|
self.step_name('Basic freshclam test using file:// to "download" clamav.hdb')
|
|
|
|
|
|
|
|
if TC.freshclam_config.exists():
|
|
|
|
os.remove(str(TC.freshclam_config))
|
|
|
|
|
|
|
|
# Select database files for test
|
|
|
|
shutil.copy(
|
|
|
|
str(TC.path_build / 'unit_tests' / 'clamav.hdb'),
|
|
|
|
str(TC.path_www),
|
|
|
|
)
|
|
|
|
|
|
|
|
TC.freshclam_config.write_text('''
|
|
|
|
DatabaseMirror http://localhost:{port}
|
|
|
|
PidFile {freshclam_pid}
|
|
|
|
LogVerbose yes
|
|
|
|
LogFileMaxSize 0
|
|
|
|
LogTime yes
|
|
|
|
DatabaseDirectory {path_db}
|
|
|
|
DatabaseCustomURL file://{file_db}
|
|
|
|
ExcludeDatabase daily
|
|
|
|
ExcludeDatabase main
|
|
|
|
ExcludeDatabase bytecode
|
|
|
|
DatabaseOwner {user}
|
|
|
|
'''.format(
|
|
|
|
freshclam_pid=TC.freshclam_pid,
|
|
|
|
path_db=TC.path_db,
|
|
|
|
file_db=TC.path_www / "clamav.hdb",
|
|
|
|
port=TC.mock_mirror_port,
|
|
|
|
user=getpass.getuser(),
|
|
|
|
))
|
|
|
|
|
|
|
|
command = '{valgrind} {valgrind_args} {freshclam} --config-file={freshclam_config}'.format(
|
|
|
|
valgrind=TC.valgrind, valgrind_args=TC.valgrind_args, freshclam=TC.freshclam, freshclam_config=TC.freshclam_config
|
|
|
|
)
|
CMake: Add CTest support to match Autotools checks
An ENABLE_TESTS CMake option is provided so that users can disable
testing if they don't want it. Instructions for how to use this
included in the INSTALL.cmake.md file.
If you run `ctest`, each testcase will write out a log file to the
<build>/unit_tests directory.
As with Autotools' make check, the test files are from test/.split
and unit_tests/.split files, but for CMake these are generated at
build time instead of at test time.
On Posix systems, sets the LD_LIBRARY_PATH so that ClamAV-compiled
libraries can be loaded when running tests.
On Windows systems, CTest will identify and collect all library
dependencies and assemble a temporarily install under the
build/unit_tests directory so that the libraries can be loaded when
running tests.
The same feature is used on Windows when using CMake to install to
collect all DLL dependencies so that users don't have to install them
manually afterwards.
Each of the CTest tests are run using a custom wrapper around Python's
unittest framework, which is also responsible for finding and inserting
valgrind into the valgrind tests on Posix systems.
Unlike with Autotools, the CMake CTest Valgrind-tests are enabled by
default, if Valgrind can be found. There's no need to set VG=1.
CTest's memcheck module is NOT supported, because we use Python to
orchestrate our tests.
Added a bunch of Windows compatibility changes to the unit tests.
These were primarily changing / to PATHSEP and making adjustments
to use Win32 C headers and ifdef out the POSIX ones which aren't
available on Windows. Also disabled a bunch of tests on Win32
that don't work on Windows, notably the mmap ones and FD-passing
(i.e. FILEDES) ones.
Add JSON_C_HAVE_INTTYPES_H definition to clamav-config.h to eliminate
warnings on Windows where json.h is included after inttypes.h because
json-c's inttypes replacement relies on it.
This is a it of a hack and may be removed if json-c fixes their
inttypes header stuff in the future.
Add preprocessor definitions on Windows to disable MSVC warnings about
CRT secure and nonstandard functions. While there may be a better
solution, this is needed to be able to see other more serious warnings.
Add missing file comment block and copyright statement for clamsubmit.c.
Also change json-c/json.h include filename to json.h in clamsubmit.c.
The directory name is not required.
Changed the hash table data integer type from long, which is poorly
defined, to size_t -- which is capable of storing a pointer. Fixed a
bunch of casts regarding this variable to eliminate warnings.
Fixed two bugs causing utf8 encoding unit tests to fail on Windows:
- The in_size variable should be the number of bytes, not the character
count. This was was causing the SHIFT_JIS (japanese codepage) to UTF8
transcoding test to only transcode half the bytes.
- It turns out that the MultiByteToWideChar() API can't transcode
UTF16-BE to UTF16-LE. The solution is to just iterate over the buffer
and flip the bytes on each uint16_t. This but was causing the UTF16-BE
to UTF8 tests to fail.
I also split up the utf8 transcoding tests into separate tests so I
could see all of the failures instead of just the first one.
Added a flags parameter to the unit test function to open testfiles
because it turns out that on Windows if a file contains the \r\n it will
replace it with just \n if you opened the file as a text file instead of
as binary. However, if we open the CBC files as binary, then a bunch of
bytecode tests fail. So I've changed the tests to open the CBC files in
the bytecode tests as text files and open all other files as binary.
Ported the feature tests from shell scripts to Python using a modified
version of our QA test-framework, which is largely compatible and will
allow us to migrate some QA tests into this repo. I'd like to add GitHub
Actions pipelines in the future so that all public PR's get some testing
before anyone has to manually review them.
The clamd --log option was missing from the help string, though it
definitely works. I've added it in this commit.
It appears that clamd.c was never clang-format'd, so this commit also
reformats clamd.c.
Some of the check_clamd tests expected the path returned by clamd to
match character for character with original path sent to clamd. However,
as we now evaluate real paths before a scan, the path returned by clamd
isn't going to match the relative (and possibly symlink-ridden) path
passed to clamdscan. I fixed this test by changing the test to search
for the basename: <signature> FOUND within the response instead of
matching the exact path.
Autotools: Link check_clamd with libclamav so we can use our utility
functions in check_clamd.c.
5 years ago
|
|
|
output = self.execute_command(command)
|
|
|
|
|
|
|
|
assert output.ec == 0 # success
|
|
|
|
|
|
|
|
expected_results = [
|
|
|
|
'Downloading clamav.hdb',
|
|
|
|
'Database test passed.',
|
|
|
|
'clamav.hdb updated',
|
CMake: Add CTest support to match Autotools checks
An ENABLE_TESTS CMake option is provided so that users can disable
testing if they don't want it. Instructions for how to use this
included in the INSTALL.cmake.md file.
If you run `ctest`, each testcase will write out a log file to the
<build>/unit_tests directory.
As with Autotools' make check, the test files are from test/.split
and unit_tests/.split files, but for CMake these are generated at
build time instead of at test time.
On Posix systems, sets the LD_LIBRARY_PATH so that ClamAV-compiled
libraries can be loaded when running tests.
On Windows systems, CTest will identify and collect all library
dependencies and assemble a temporarily install under the
build/unit_tests directory so that the libraries can be loaded when
running tests.
The same feature is used on Windows when using CMake to install to
collect all DLL dependencies so that users don't have to install them
manually afterwards.
Each of the CTest tests are run using a custom wrapper around Python's
unittest framework, which is also responsible for finding and inserting
valgrind into the valgrind tests on Posix systems.
Unlike with Autotools, the CMake CTest Valgrind-tests are enabled by
default, if Valgrind can be found. There's no need to set VG=1.
CTest's memcheck module is NOT supported, because we use Python to
orchestrate our tests.
Added a bunch of Windows compatibility changes to the unit tests.
These were primarily changing / to PATHSEP and making adjustments
to use Win32 C headers and ifdef out the POSIX ones which aren't
available on Windows. Also disabled a bunch of tests on Win32
that don't work on Windows, notably the mmap ones and FD-passing
(i.e. FILEDES) ones.
Add JSON_C_HAVE_INTTYPES_H definition to clamav-config.h to eliminate
warnings on Windows where json.h is included after inttypes.h because
json-c's inttypes replacement relies on it.
This is a it of a hack and may be removed if json-c fixes their
inttypes header stuff in the future.
Add preprocessor definitions on Windows to disable MSVC warnings about
CRT secure and nonstandard functions. While there may be a better
solution, this is needed to be able to see other more serious warnings.
Add missing file comment block and copyright statement for clamsubmit.c.
Also change json-c/json.h include filename to json.h in clamsubmit.c.
The directory name is not required.
Changed the hash table data integer type from long, which is poorly
defined, to size_t -- which is capable of storing a pointer. Fixed a
bunch of casts regarding this variable to eliminate warnings.
Fixed two bugs causing utf8 encoding unit tests to fail on Windows:
- The in_size variable should be the number of bytes, not the character
count. This was was causing the SHIFT_JIS (japanese codepage) to UTF8
transcoding test to only transcode half the bytes.
- It turns out that the MultiByteToWideChar() API can't transcode
UTF16-BE to UTF16-LE. The solution is to just iterate over the buffer
and flip the bytes on each uint16_t. This but was causing the UTF16-BE
to UTF8 tests to fail.
I also split up the utf8 transcoding tests into separate tests so I
could see all of the failures instead of just the first one.
Added a flags parameter to the unit test function to open testfiles
because it turns out that on Windows if a file contains the \r\n it will
replace it with just \n if you opened the file as a text file instead of
as binary. However, if we open the CBC files as binary, then a bunch of
bytecode tests fail. So I've changed the tests to open the CBC files in
the bytecode tests as text files and open all other files as binary.
Ported the feature tests from shell scripts to Python using a modified
version of our QA test-framework, which is largely compatible and will
allow us to migrate some QA tests into this repo. I'd like to add GitHub
Actions pipelines in the future so that all public PR's get some testing
before anyone has to manually review them.
The clamd --log option was missing from the help string, though it
definitely works. I've added it in this commit.
It appears that clamd.c was never clang-format'd, so this commit also
reformats clamd.c.
Some of the check_clamd tests expected the path returned by clamd to
match character for character with original path sent to clamd. However,
as we now evaluate real paths before a scan, the path returned by clamd
isn't going to match the relative (and possibly symlink-ridden) path
passed to clamdscan. I fixed this test by changing the test to search
for the basename: <signature> FOUND within the response instead of
matching the exact path.
Autotools: Link check_clamd with libclamav so we can use our utility
functions in check_clamd.c.
5 years ago
|
|
|
]
|
|
|
|
self.verify_output(output.out, expected=expected_results)
|
|
|
|
|
|
|
|
def test_freshclam_02_http_403(self):
|
|
|
|
self.step_name('Verify correct behavior when receiving 403 (forbidden)')
|
|
|
|
|
|
|
|
# Start our mock database mirror.
|
|
|
|
TC.mock_mirror = Process(target=mock_database_mirror, args=(WebServerHandler_02,))
|
|
|
|
TC.mock_mirror.start()
|
|
|
|
|
|
|
|
if TC.freshclam_config.exists():
|
|
|
|
os.remove(str(TC.freshclam_config))
|
|
|
|
|
|
|
|
TC.freshclam_config.write_text('''
|
|
|
|
DatabaseMirror http://localhost:{port}
|
|
|
|
DNSDatabaseInfo no
|
|
|
|
PidFile {freshclam_pid}
|
|
|
|
LogVerbose yes
|
|
|
|
LogFileMaxSize 0
|
|
|
|
LogTime yes
|
|
|
|
DatabaseDirectory {path_db}
|
|
|
|
DatabaseOwner {user}
|
|
|
|
'''.format(
|
|
|
|
freshclam_pid=TC.freshclam_pid,
|
|
|
|
path_db=TC.path_db,
|
|
|
|
port=TC.mock_mirror_port,
|
|
|
|
user=getpass.getuser(),
|
|
|
|
))
|
|
|
|
command = '{valgrind} {valgrind_args} {freshclam} --config-file={freshclam_config} --update-db=daily'.format(
|
|
|
|
valgrind=TC.valgrind, valgrind_args=TC.valgrind_args, freshclam=TC.freshclam, freshclam_config=TC.freshclam_config
|
|
|
|
)
|
|
|
|
output = self.execute_command(command)
|
|
|
|
|
|
|
|
assert output.ec == 17 # forbidden
|
|
|
|
|
|
|
|
expected_results = [
|
|
|
|
'FreshClam received error code 403',
|
|
|
|
'Forbidden',
|
|
|
|
]
|
|
|
|
self.verify_output(output.out, expected=expected_results)
|
|
|
|
|
|
|
|
def test_freshclam_03_http_403_daemonized(self):
|
|
|
|
self.step_name('Verify correct behavior when receiving 403 (forbidden) and daemonized')
|
|
|
|
|
|
|
|
# Start our mock database mirror.
|
|
|
|
TC.mock_mirror = Process(target=mock_database_mirror, args=(WebServerHandler_02,))
|
|
|
|
TC.mock_mirror.start()
|
|
|
|
|
|
|
|
if TC.freshclam_config.exists():
|
|
|
|
os.remove(str(TC.freshclam_config))
|
|
|
|
|
|
|
|
TC.freshclam_config.write_text('''
|
|
|
|
DatabaseMirror http://localhost:{port}
|
|
|
|
DNSDatabaseInfo no
|
|
|
|
PidFile {freshclam_pid}
|
|
|
|
LogVerbose yes
|
|
|
|
LogFileMaxSize 0
|
|
|
|
LogTime yes
|
|
|
|
DatabaseDirectory {path_db}
|
|
|
|
DatabaseOwner {user}
|
|
|
|
'''.format(
|
|
|
|
freshclam_pid=TC.freshclam_pid,
|
|
|
|
path_db=TC.path_db,
|
|
|
|
port=TC.mock_mirror_port,
|
|
|
|
user=getpass.getuser(),
|
|
|
|
))
|
|
|
|
command = '{valgrind} {valgrind_args} {freshclam} --config-file={freshclam_config} --update-db=daily --daemon -F'.format(
|
|
|
|
valgrind=TC.valgrind, valgrind_args=TC.valgrind_args, freshclam=TC.freshclam, freshclam_config=TC.freshclam_config
|
|
|
|
)
|
|
|
|
output = self.execute_command(command)
|
|
|
|
|
|
|
|
assert output.ec == 17 # forbidden
|
|
|
|
|
|
|
|
expected_results = [
|
|
|
|
'FreshClam received error code 403',
|
|
|
|
'Forbidden',
|
|
|
|
]
|
|
|
|
self.verify_output(output.out, expected=expected_results)
|
|
|
|
|
|
|
|
def test_freshclam_04_http_429(self):
|
|
|
|
self.step_name('Verify correct behavior when receiving 429 (too-many-requests)')
|
|
|
|
|
|
|
|
# Start our mock database mirror.
|
|
|
|
TC.mock_mirror = Process(target=mock_database_mirror, args=(WebServerHandler_04,TC.mock_mirror_port))
|
|
|
|
TC.mock_mirror.start()
|
|
|
|
|
|
|
|
if TC.freshclam_config.exists():
|
|
|
|
os.remove(str(TC.freshclam_config))
|
|
|
|
|
|
|
|
TC.freshclam_config.write_text('''
|
|
|
|
DatabaseMirror http://localhost:{port}
|
|
|
|
DNSDatabaseInfo no
|
|
|
|
PidFile {freshclam_pid}
|
|
|
|
LogVerbose yes
|
|
|
|
LogFileMaxSize 0
|
|
|
|
LogTime yes
|
|
|
|
DatabaseDirectory {path_db}
|
|
|
|
DatabaseOwner {user}
|
|
|
|
'''.format(
|
|
|
|
freshclam_pid=TC.freshclam_pid,
|
|
|
|
path_db=TC.path_db,
|
|
|
|
port=TC.mock_mirror_port,
|
|
|
|
user=getpass.getuser(),
|
|
|
|
))
|
|
|
|
command = '{valgrind} {valgrind_args} {freshclam} --config-file={freshclam_config} --update-db=daily'.format(
|
|
|
|
valgrind=TC.valgrind, valgrind_args=TC.valgrind_args, freshclam=TC.freshclam, freshclam_config=TC.freshclam_config
|
|
|
|
)
|
|
|
|
output = self.execute_command(command)
|
|
|
|
|
|
|
|
assert output.ec == 0 # success
|
|
|
|
|
|
|
|
expected_results = [
|
|
|
|
'FreshClam received error code 429',
|
|
|
|
'You are on cool-down',
|
|
|
|
]
|
|
|
|
self.verify_output(output.out, expected=expected_results)
|
|
|
|
|
|
|
|
def test_freshclam_05_cdiff_update(self):
|
|
|
|
self.step_name('Verify that freshclam can update from an older CVD to a newer with CDIFF patches')
|
|
|
|
|
|
|
|
# start with this CVD
|
|
|
|
shutil.copy(TC.path_source / 'unit_tests' / 'test_db' / 'test-1.cvd', TC.path_db / 'test.cvd')
|
|
|
|
|
|
|
|
# advertise this CVD (by sending the header response to Range requests)
|
|
|
|
shutil.copy(TC.path_source / 'unit_tests' / 'test_db' / 'test-6.cvd', TC.path_www / 'test.cvd.advertised')
|
|
|
|
|
|
|
|
# using these CDIFFs
|
|
|
|
shutil.copy(TC.path_source / 'unit_tests' / 'test_db' / 'test-2.cdiff', TC.path_www)
|
|
|
|
shutil.copy(TC.path_source / 'unit_tests' / 'test_db' / 'test-3.cdiff', TC.path_www)
|
|
|
|
shutil.copy(TC.path_source / 'unit_tests' / 'test_db' / 'test-4.cdiff', TC.path_www)
|
|
|
|
shutil.copy(TC.path_source / 'unit_tests' / 'test_db' / 'test-5.cdiff', TC.path_www)
|
|
|
|
shutil.copy(TC.path_source / 'unit_tests' / 'test_db' / 'test-6.cdiff', TC.path_www)
|
|
|
|
|
|
|
|
handler = partial(WebServerHandler_WWW, TC.path_www)
|
|
|
|
TC.mock_mirror = Process(target=mock_database_mirror, args=(handler, TC.mock_mirror_port))
|
|
|
|
TC.mock_mirror.start()
|
|
|
|
|
|
|
|
if TC.freshclam_config.exists():
|
|
|
|
os.remove(str(TC.freshclam_config))
|
|
|
|
|
|
|
|
TC.freshclam_config.write_text('''
|
|
|
|
DatabaseMirror http://localhost:{port}
|
|
|
|
DNSDatabaseInfo no
|
|
|
|
PidFile {freshclam_pid}
|
|
|
|
LogVerbose yes
|
|
|
|
LogFileMaxSize 0
|
|
|
|
LogTime yes
|
|
|
|
DatabaseDirectory {path_db}
|
|
|
|
DatabaseOwner {user}
|
|
|
|
'''.format(
|
|
|
|
freshclam_pid=TC.freshclam_pid,
|
|
|
|
path_db=TC.path_db,
|
|
|
|
port=TC.mock_mirror_port,
|
|
|
|
user=getpass.getuser(),
|
|
|
|
))
|
|
|
|
command = '{valgrind} {valgrind_args} {freshclam} --config-file={freshclam_config} --update-db=test'.format(
|
|
|
|
valgrind=TC.valgrind, valgrind_args=TC.valgrind_args, freshclam=TC.freshclam, freshclam_config=TC.freshclam_config
|
|
|
|
)
|
|
|
|
output = self.execute_command(command)
|
|
|
|
|
|
|
|
assert output.ec == 0 # success
|
|
|
|
|
|
|
|
expected_results = [
|
|
|
|
'test.cld updated',
|
|
|
|
]
|
|
|
|
unexpected_results = [
|
|
|
|
'already up-to-date'
|
|
|
|
]
|
|
|
|
self.verify_output(output.out, expected=expected_results, unexpected=unexpected_results)
|
|
|
|
|
|
|
|
def test_freshclam_06_cdiff_partial_minus_1(self):
|
|
|
|
self.step_name('Verify that freshclam will accept a partial update with 1 missing cdiff')
|
|
|
|
|
|
|
|
# start with this CVD
|
|
|
|
shutil.copy(TC.path_source / 'unit_tests' / 'test_db' / 'test-3.cvd', TC.path_db / 'test.cvd')
|
|
|
|
|
|
|
|
# advertise this CVD (by sending the header response to Range requests)
|
|
|
|
shutil.copy(TC.path_source / 'unit_tests' / 'test_db' / 'test-6.cvd', TC.path_www / 'test.cvd.advertised')
|
|
|
|
|
|
|
|
# using these CDIFFs
|
|
|
|
shutil.copy(TC.path_source / 'unit_tests' / 'test_db' / 'test-4.cdiff', TC.path_www)
|
|
|
|
shutil.copy(TC.path_source / 'unit_tests' / 'test_db' / 'test-5.cdiff', TC.path_www)
|
|
|
|
#shutil.copy(TC.path_source / 'unit_tests' / 'test_db' / 'test-6.cdiff', TC.path_www) # <-- don't give them the last CDIFF
|
|
|
|
|
|
|
|
handler = partial(WebServerHandler_WWW, TC.path_www)
|
|
|
|
TC.mock_mirror = Process(target=mock_database_mirror, args=(handler, TC.mock_mirror_port))
|
|
|
|
TC.mock_mirror.start()
|
|
|
|
|
|
|
|
if TC.freshclam_config.exists():
|
|
|
|
os.remove(str(TC.freshclam_config))
|
|
|
|
|
|
|
|
TC.freshclam_config.write_text('''
|
|
|
|
DatabaseMirror http://localhost:{port}
|
|
|
|
DNSDatabaseInfo no
|
|
|
|
PidFile {freshclam_pid}
|
|
|
|
LogVerbose yes
|
|
|
|
LogFileMaxSize 0
|
|
|
|
LogTime yes
|
|
|
|
DatabaseDirectory {path_db}
|
|
|
|
DatabaseOwner {user}
|
|
|
|
'''.format(
|
|
|
|
freshclam_pid=TC.freshclam_pid,
|
|
|
|
path_db=TC.path_db,
|
|
|
|
port=TC.mock_mirror_port,
|
|
|
|
user=getpass.getuser(),
|
|
|
|
))
|
|
|
|
command = '{valgrind} {valgrind_args} {freshclam} --config-file={freshclam_config} --update-db=test'.format(
|
|
|
|
valgrind=TC.valgrind, valgrind_args=TC.valgrind_args, freshclam=TC.freshclam, freshclam_config=TC.freshclam_config
|
|
|
|
)
|
|
|
|
output = self.execute_command(command)
|
|
|
|
|
|
|
|
assert output.ec == 0 # success
|
|
|
|
|
|
|
|
expected_results = [
|
|
|
|
'Downloaded 2 patches for test, which is fewer than the 3 expected patches',
|
|
|
|
'We\'ll settle for this partial-update, at least for now',
|
|
|
|
'test.cld updated',
|
|
|
|
]
|
|
|
|
unexpected_results = [
|
|
|
|
'already up-to-date'
|
|
|
|
]
|
|
|
|
self.verify_output(output.out, expected=expected_results, unexpected=unexpected_results)
|
|
|
|
|
|
|
|
#
|
|
|
|
# Try again, we should be 1 behind which is tolerable and should not trigger a full CVD download
|
|
|
|
#
|
|
|
|
command = '{valgrind} {valgrind_args} {freshclam} --config-file={freshclam_config} --update-db=test'.format(
|
|
|
|
valgrind=TC.valgrind, valgrind_args=TC.valgrind_args, freshclam=TC.freshclam, freshclam_config=TC.freshclam_config
|
|
|
|
)
|
|
|
|
output = self.execute_command(command)
|
|
|
|
|
|
|
|
assert output.ec == 0 # success
|
|
|
|
|
|
|
|
expected_results = [
|
|
|
|
'The database server doesn\'t have the latest patch',
|
|
|
|
'The server will likely have updated if you check again in a few hours',
|
|
|
|
]
|
|
|
|
unexpected_results = [
|
|
|
|
'test.cld updated',
|
|
|
|
'test.cvd updated',
|
|
|
|
]
|
|
|
|
self.verify_output(output.out, expected=expected_results, unexpected=unexpected_results)
|
|
|
|
|
|
|
|
def test_freshclam_07_cdiff_partial_minus_2(self):
|
|
|
|
self.step_name('Verify that freshclam behavior with 2 missing cdiffs')
|
|
|
|
|
|
|
|
# start with this CVD
|
|
|
|
shutil.copy(TC.path_source / 'unit_tests' / 'test_db' / 'test-3.cvd', TC.path_db / 'test.cvd')
|
|
|
|
|
|
|
|
# advertise this CVD (by sending the header response to Range requests)
|
|
|
|
shutil.copy(TC.path_source / 'unit_tests' / 'test_db' / 'test-6.cvd', TC.path_www / 'test.cvd.advertised')
|
|
|
|
|
|
|
|
# serve this CVD when requested instead of the advertised one
|
|
|
|
shutil.copy(TC.path_source / 'unit_tests' / 'test_db' / 'test-6.cvd', TC.path_www / 'test.cvd.served')
|
|
|
|
|
|
|
|
# using these CDIFFs
|
|
|
|
shutil.copy(TC.path_source / 'unit_tests' / 'test_db' / 'test-4.cdiff', TC.path_www)
|
|
|
|
# shutil.copy(TC.path_source / 'unit_tests' / 'test_db' / 'test-5.cdiff', TC.path_www) <--- dont' give them the second to last, either!
|
|
|
|
# shutil.copy(TC.path_source / 'unit_tests' / 'test_db' / 'test-6.cdiff', TC.path_www) <--- don't give them the last CDIFF
|
|
|
|
|
|
|
|
handler = partial(WebServerHandler_WWW, TC.path_www)
|
|
|
|
TC.mock_mirror = Process(target=mock_database_mirror, args=(handler, TC.mock_mirror_port))
|
|
|
|
TC.mock_mirror.start()
|
|
|
|
|
|
|
|
if TC.freshclam_config.exists():
|
|
|
|
os.remove(str(TC.freshclam_config))
|
|
|
|
|
|
|
|
TC.freshclam_config.write_text('''
|
|
|
|
DatabaseMirror http://localhost:{port}
|
|
|
|
DNSDatabaseInfo no
|
|
|
|
PidFile {freshclam_pid}
|
|
|
|
LogVerbose yes
|
|
|
|
LogFileMaxSize 0
|
|
|
|
LogTime yes
|
|
|
|
DatabaseDirectory {path_db}
|
|
|
|
DatabaseOwner {user}
|
|
|
|
'''.format(
|
|
|
|
freshclam_pid=TC.freshclam_pid,
|
|
|
|
path_db=TC.path_db,
|
|
|
|
port=TC.mock_mirror_port,
|
|
|
|
user=getpass.getuser(),
|
|
|
|
))
|
|
|
|
command = '{valgrind} {valgrind_args} {freshclam} --config-file={freshclam_config} --update-db=test'.format(
|
|
|
|
valgrind=TC.valgrind, valgrind_args=TC.valgrind_args, freshclam=TC.freshclam, freshclam_config=TC.freshclam_config
|
|
|
|
)
|
|
|
|
output = self.execute_command(command)
|
|
|
|
|
|
|
|
assert output.ec == 0 # success
|
|
|
|
|
|
|
|
expected_results = [
|
|
|
|
'Downloaded 1 patches for test, which is fewer than the 3 expected patches',
|
|
|
|
'We\'ll settle for this partial-update, at least for now',
|
|
|
|
'test.cld updated',
|
|
|
|
]
|
|
|
|
unexpected_results = [
|
|
|
|
'already up-to-date'
|
|
|
|
]
|
|
|
|
self.verify_output(output.out, expected=expected_results, unexpected=unexpected_results)
|
|
|
|
|
|
|
|
#
|
|
|
|
# Try again, we should be 2 behind which is NOT tolerable and SHOULD trigger a full CVD download
|
|
|
|
#
|
|
|
|
command = '{valgrind} {valgrind_args} {freshclam} --config-file={freshclam_config} --update-db=test'.format(
|
|
|
|
valgrind=TC.valgrind, valgrind_args=TC.valgrind_args, freshclam=TC.freshclam, freshclam_config=TC.freshclam_config
|
|
|
|
)
|
|
|
|
output = self.execute_command(command)
|
|
|
|
|
|
|
|
assert output.ec == 0 # success
|
|
|
|
|
|
|
|
expected_results = [
|
|
|
|
'Incremental update failed, trying to download test.cvd',
|
|
|
|
'test.cvd updated',
|
|
|
|
]
|
|
|
|
unexpected_results = [
|
|
|
|
'test.cld updated',
|
|
|
|
]
|
|
|
|
self.verify_output(output.out, expected=expected_results, unexpected=unexpected_results)
|
|
|
|
|
|
|
|
def test_freshclam_07_no_cdiff_out_of_date_cvd(self):
|
|
|
|
self.step_name('Verify that freshclam will properly handle an out-of-date CVD update after a zero-byte CDIFF')
|
|
|
|
|
|
|
|
# start with this CVD
|
|
|
|
shutil.copy(TC.path_source / 'unit_tests' / 'test_db' / 'test-3.cvd', TC.path_db / 'test.cvd')
|
|
|
|
|
|
|
|
# advertise this CVD (by sending the header response to Range requests)
|
|
|
|
shutil.copy(TC.path_source / 'unit_tests' / 'test_db' / 'test-6.cvd', TC.path_www / 'test.cvd.advertised')
|
|
|
|
|
|
|
|
# serve this CVD when requested instead of the advertised one
|
|
|
|
shutil.copy(TC.path_source / 'unit_tests' / 'test_db' / 'test-5.cvd', TC.path_www / 'test.cvd.served')
|
|
|
|
|
|
|
|
# Serve a zero-byte test-4.cdiff instead of the real test-4.cdiff. This should trigger a whole CVD download.
|
|
|
|
with (TC.path_www / 'test-4.cdiff').open('w') as fp:
|
|
|
|
pass
|
|
|
|
|
|
|
|
handler = partial(WebServerHandler_WWW, TC.path_www)
|
|
|
|
TC.mock_mirror = Process(target=mock_database_mirror, args=(handler, TC.mock_mirror_port))
|
|
|
|
TC.mock_mirror.start()
|
|
|
|
|
|
|
|
if TC.freshclam_config.exists():
|
|
|
|
os.remove(str(TC.freshclam_config))
|
|
|
|
|
|
|
|
TC.freshclam_config.write_text('''
|
|
|
|
DatabaseMirror http://localhost:{port}
|
|
|
|
DNSDatabaseInfo no
|
|
|
|
PidFile {freshclam_pid}
|
|
|
|
LogVerbose yes
|
|
|
|
LogFileMaxSize 0
|
|
|
|
LogTime yes
|
|
|
|
DatabaseDirectory {path_db}
|
|
|
|
DatabaseOwner {user}
|
|
|
|
'''.format(
|
|
|
|
freshclam_pid=TC.freshclam_pid,
|
|
|
|
path_db=TC.path_db,
|
|
|
|
port=TC.mock_mirror_port,
|
|
|
|
user=getpass.getuser(),
|
|
|
|
))
|
|
|
|
command = '{valgrind} {valgrind_args} {freshclam} --config-file={freshclam_config} --update-db=test'.format(
|
|
|
|
valgrind=TC.valgrind, valgrind_args=TC.valgrind_args, freshclam=TC.freshclam, freshclam_config=TC.freshclam_config
|
|
|
|
)
|
|
|
|
output = self.execute_command(command)
|
|
|
|
|
|
|
|
assert output.ec == 0 # success
|
|
|
|
|
|
|
|
expected_results = [
|
|
|
|
'Incremental updates either failed or are disabled, so we\'ll have to settle for a slightly out-of-date database.',
|
|
|
|
]
|
|
|
|
unexpected_results = [
|
|
|
|
'already up-to-date'
|
|
|
|
]
|
|
|
|
self.verify_output(output.out, expected=expected_results, unexpected=unexpected_results)
|
|
|
|
|
|
|
|
def mock_database_mirror(handler, port=8001):
|
|
|
|
'''
|
|
|
|
Process entry point for our HTTP Server to mock a database mirror.
|
|
|
|
'''
|
|
|
|
try:
|
|
|
|
server = HTTPServer(('', port), handler)
|
|
|
|
print("Web server is running on port {}".format(port))
|
|
|
|
server.serve_forever()
|
|
|
|
|
|
|
|
except KeyboardInterrupt:
|
|
|
|
print("^C entered, stopping web server...")
|
|
|
|
server.socket.close()
|
|
|
|
|
|
|
|
class WebServerHandler_02(BaseHTTPRequestHandler):
|
|
|
|
'''
|
|
|
|
Web server handler to send 403 (Forbidden) if a whole file is requested.
|
|
|
|
Will send a CVD header if a Range-requeset is received.
|
|
|
|
'''
|
|
|
|
def do_GET(self):
|
|
|
|
if 'Range' in self.headers:
|
|
|
|
# HACK: This will send a CVD header so FreshClam thinks there is an update.
|
|
|
|
# This is needed so we can operate with `DNSDatabaseInfo no` in case
|
|
|
|
# someone wants to run these tests without internet access.
|
|
|
|
self.send_response(206) # Partial file
|
|
|
|
self.send_header('Content-type', 'application/octet-stream')
|
|
|
|
self.end_headers()
|
|
|
|
page =b'ClamAV-VDB:21 Sep 2020 09-52 -0400:25934:4320797:63:2ee5a3e4285b496656117ae3809b6040:gMj7NXhxfew0+bToOF8GX7xPHPGXhOSD+CSuf3E7SHhLmVZCJUVhPS01h42I0W1py7L+BmM2yhPIW8t/oGPFw8+hdD4DU/ceET15wnPWU4lsJJeRkl46Z4D8INe9Oq36ixT1xEIkERogPE3qr6wszmjT2Xe2VcmydTXN2GfPQX:raynman:1600696324 '
|
|
|
|
self.wfile.write(page)
|
|
|
|
|
|
|
|
else:
|
|
|
|
# Send the 403 FORBIDDEN header.
|
|
|
|
self.send_response(403) # Forbidden (blocked)
|
|
|
|
self.send_header('Content-type', 'text/html')
|
|
|
|
self.end_headers()
|
|
|
|
|
|
|
|
page= b'''<html><body>
|
|
|
|
No CVD for you!
|
|
|
|
</body></html>'''
|
|
|
|
self.wfile.write(page)
|
|
|
|
|
|
|
|
class WebServerHandler_04(BaseHTTPRequestHandler):
|
|
|
|
'''
|
|
|
|
Web server handler to send 429 (Too-Many-Requests) if a whole file is requested.
|
|
|
|
Will send a CVD header if a Range-requeset is received.
|
|
|
|
'''
|
|
|
|
def do_GET(self):
|
|
|
|
if 'Range' in self.headers:
|
|
|
|
# HACK: This will send a CVD header so FreshClam thinks there is an update.
|
|
|
|
# This is needed so we can operate with `DNSDatabaseInfo no` in case
|
|
|
|
# someone wants to run these tests without internet access.
|
|
|
|
self.send_response(206) # Partial file
|
|
|
|
self.send_header('Content-type', 'application/octet-stream')
|
|
|
|
self.end_headers()
|
|
|
|
page =b'ClamAV-VDB:21 Sep 2020 09-52 -0400:25934:4320797:63:2ee5a3e4285b496656117ae3809b6040:gMj7NXhxfew0+bToOF8GX7xPHPGXhOSD+CSuf3E7SHhLmVZCJUVhPS01h42I0W1py7L+BmM2yhPIW8t/oGPFw8+hdD4DU/ceET15wnPWU4lsJJeRkl46Z4D8INe9Oq36ixT1xEIkERogPE3qr6wszmjT2Xe2VcmydTXN2GfPQX:raynman:1600696324 '
|
|
|
|
self.wfile.write(page)
|
|
|
|
|
|
|
|
else:
|
|
|
|
# Send the 429 Too-Many-Requests header.
|
|
|
|
self.send_response(429) # Too-Many-Requests (rate limiting)
|
|
|
|
self.send_header('Content-type', 'text/html')
|
|
|
|
self.send_header('Retry-After', '60') # Try again in a minute ;-)!
|
|
|
|
self.end_headers()
|
|
|
|
|
|
|
|
page= b'''<html><body>
|
|
|
|
Retry later please!
|
|
|
|
</body></html>'''
|
|
|
|
self.wfile.write(page)
|
|
|
|
|
|
|
|
class WebServerHandler_WWW(BaseHTTPRequestHandler):
|
|
|
|
'''
|
|
|
|
Make an HTTP server handler that has a configurable directory for hosting files.
|
|
|
|
|
|
|
|
Server handler to send a CVD header of `test.cvd.advertised` indicating an update is available,
|
|
|
|
and then to serve up CDIFFs that should allow the test to do an incremental update.
|
|
|
|
|
|
|
|
If `test.cvd` is requested, it will serve up `test.cvd.served` (not `test.cvd.advertised`)
|
|
|
|
'''
|
|
|
|
|
|
|
|
def __init__(self, path_www, *args, **kwargs):
|
|
|
|
self.path_www = path_www
|
|
|
|
super().__init__(*args, **kwargs)
|
|
|
|
|
|
|
|
def do_GET(self):
|
|
|
|
requested_file = self.path_www / self.path.lstrip('/')
|
|
|
|
print("Mock Server: Test requested: {}".format(requested_file))
|
|
|
|
|
|
|
|
if 'Range' in self.headers:
|
|
|
|
# This will send a CVD header so FreshClam thinks there is an update.
|
|
|
|
(range_start, range_end) = self.headers['Range'].split('=')[-1].split('-')
|
|
|
|
print("Mock Server: But they only want bytes {} through {} ...".format(range_start, range_end))
|
|
|
|
|
|
|
|
if requested_file.name.endswith('.cvd'):
|
|
|
|
response_file = requested_file.parent / f'{requested_file}.advertised'
|
|
|
|
else:
|
|
|
|
response_file = requested_file
|
|
|
|
|
|
|
|
if not response_file.exists():
|
|
|
|
self.send_error(404, "{} Not Found".format(self.path.lstrip('/')))
|
|
|
|
else:
|
|
|
|
with response_file.open('rb') as the_file:
|
|
|
|
self.send_response(206) # Partial file
|
|
|
|
self.send_header('Content-type', 'application/octet-stream')
|
|
|
|
self.end_headers()
|
|
|
|
|
|
|
|
the_file.seek(int(range_start))
|
|
|
|
page = the_file.read(int(range_end) - int(range_start) + 1)
|
|
|
|
|
|
|
|
bytes_written = self.wfile.write(page)
|
|
|
|
print("Mock Server: Sending {} bytes back to client.".format(bytes_written))
|
|
|
|
|
|
|
|
else:
|
|
|
|
# Send back some whole files
|
|
|
|
if requested_file.name.endswith('.cvd'):
|
|
|
|
response_file = requested_file.parent / f'{requested_file}.served'
|
|
|
|
else:
|
|
|
|
response_file = requested_file
|
|
|
|
|
|
|
|
if not response_file.exists():
|
|
|
|
self.send_error(404, "{} Not Found".format(self.path.lstrip('/')))
|
|
|
|
else:
|
|
|
|
with response_file.open('rb') as the_file:
|
|
|
|
self.send_response(200) # Partial file
|
|
|
|
self.send_header('Content-type', 'application/octet-stream')
|
|
|
|
self.end_headers()
|
|
|
|
|
|
|
|
page = the_file.read()
|
|
|
|
|
|
|
|
bytes_written = self.wfile.write(page)
|
|
|
|
print("Mock Server: Sending {} bytes back to client.".format(bytes_written))
|