Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[sonic-py-common] Add unit test framework #5238

Merged
merged 8 commits into from
Aug 24, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 0 additions & 6 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,6 @@ platform/*/docker-*/Dockerfile
# Installer-related files and directories
installer/x86_64/platforms/

src/sonic-py-common/**/*.pyc
src/sonic-py-common/.eggs/
src/sonic-py-common/build
src/sonic-py-common/dist
src/sonic-py-common/sonic_py_common.egg-info

# Misc. files
asic_config_checksum
files/Aboot/boot0
Expand Down
27 changes: 18 additions & 9 deletions sonic-slave-buster/Dockerfile.j2
Original file line number Diff line number Diff line change
Expand Up @@ -209,8 +209,10 @@ RUN apt-get update && apt-get install -y \
clang \
pylint \
python-pytest \
python3-pytest \
gcovr \
python-pytest-cov \
python3-pytest-cov \
python-parse \
# For snmpd
default-libmysqlclient-dev \
Expand Down Expand Up @@ -339,6 +341,21 @@ RUN export VERSION=1.14.2 \
&& echo 'export PATH=$PATH:$GOROOT/bin' >> /etc/bash.bashrc \
&& rm go$VERSION.linux-*.tar.gz

# For building Python packages
RUN pip install setuptools==40.8.0
RUN pip3 install setuptools==49.6.00

# For running Python unit tests
RUN pip install pytest-runner==4.4
RUN pip3 install pytest-runner==5.2
RUN pip install mockredispy==2.9.3
RUN pip3 install mockredispy==2.9.3

# For Python 2 unit tests, we need 'mock'. The last version of 'mock'
# which supports Python 2 is 3.0.5. In Python 3, 'mock' is part of 'unittest'
# in the standard library
RUN pip install mock==3.0.5

# For p4 build
RUN pip install \
ctypesgen==1.0.2 \
Expand All @@ -357,25 +374,17 @@ RUN apt-get purge -y python-click
# For sonic utilities testing
RUN pip install click natsort tabulate netifaces==0.10.7 fastentrypoints

# For sonic snmpagent mock testing
RUN pip3 install mockredispy==2.9.3

RUN pip3 install "PyYAML>=5.1"

# For sonic-platform-common testing
RUN pip3 install redis

# For supervisor build
RUN pip install meld3 mock
RUN pip install meld3

# For vs image build
RUN pip install pexpect==4.6.0

# For sonic-utilities build
RUN pip install mockredispy==2.9.3
RUN pip install pytest-runner==4.4
RUN pip install setuptools==40.8.0

# For sonic-swss-common testing
RUN pip install Pympler==0.8

Expand Down
13 changes: 13 additions & 0 deletions src/sonic-py-common/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
**/*.pyc

# Distribution / packaging
*.egg-info/
.eggs/
build/
dist/

# Unit test / coverage reports
.cache
.coverage
coverage.xml
htmlcov/
2 changes: 2 additions & 0 deletions src/sonic-py-common/pytest.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[pytest]
addopts = --cov=sonic_py_common --cov-report html --cov-report term --cov-report xml
2 changes: 2 additions & 0 deletions src/sonic-py-common/setup.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[aliases]
test=pytest
8 changes: 8 additions & 0 deletions src/sonic-py-common/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,13 @@
packages=[
'sonic_py_common',
],
setup_requires= [
'pytest-runner'
],
tests_require=[
'pytest',
'mock==3.0.5' # For python 2. Version >=4.0.0 drops support for py2
],
classifiers=[
'Intended Audience :: Developers',
'Operating System :: Linux',
Expand All @@ -35,5 +42,6 @@
'Programming Language :: Python',
],
keywords='SONiC sonic PYTHON python COMMON common',
test_suite = 'setup.get_test_suite'
)

2 changes: 1 addition & 1 deletion src/sonic-py-common/sonic_py_common/device_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import yaml
from natsort import natsorted

# TODD: Replace with swsscommon
# TODO: Replace with swsscommon
from swsssdk import ConfigDBConnector, SonicDBConfig

USR_SHARE_SONIC_PATH = "/usr/share/sonic"
Expand Down
Empty file.
75 changes: 75 additions & 0 deletions src/sonic-py-common/tests/device_info_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import os
import sys

# TODO: Remove this if/else block once we no longer support Python 2
if sys.version_info.major == 3:
from unittest import mock
else:
# Expect the 'mock' package for python 2
# https://pypi.python.org/pypi/mock
import mock

from sonic_py_common import device_info


# TODO: Remove this if/else block once we no longer support Python 2
if sys.version_info.major == 3:
BUILTINS = "builtins"
else:
BUILTINS = "__builtin__"

MACHINE_CONF_CONTENTS = """\
onie_version=2016.11-5.1.0008-9600
onie_vendor_id=33049
onie_machine_rev=0
onie_arch=x86_64
onie_config_version=1
onie_build_date="2017-04-26T11:01+0300"
onie_partition_type=gpt
onie_kernel_version=4.10.11
onie_firmware=auto
onie_switch_asic=mlnx
onie_skip_ethmgmt_macs=yes
onie_machine=mlnx_msn2700
onie_platform=x86_64-mlnx_msn2700-r0"""

EXPECTED_GET_MACHINE_INFO_RESULT = {
'onie_arch': 'x86_64',
'onie_skip_ethmgmt_macs': 'yes',
'onie_platform': 'x86_64-mlnx_msn2700-r0',
'onie_machine_rev': '0',
'onie_version': '2016.11-5.1.0008-9600',
'onie_machine': 'mlnx_msn2700',
'onie_config_version': '1',
'onie_partition_type': 'gpt',
'onie_build_date': '"2017-04-26T11:01+0300"',
'onie_switch_asic': 'mlnx',
'onie_vendor_id': '33049',
'onie_firmware': 'auto',
'onie_kernel_version': '4.10.11'
}


class TestDeviceInfo(object):
@classmethod
def setup_class(cls):
print("SETUP")

def test_get_machine_info(self):
with mock.patch("os.path.isfile") as mock_isfile:
mock_isfile.return_value = True
open_mocked = mock.mock_open(read_data=MACHINE_CONF_CONTENTS)
with mock.patch("{}.open".format(BUILTINS), open_mocked):
result = device_info.get_machine_info()
assert result == EXPECTED_GET_MACHINE_INFO_RESULT
open_mocked.assert_called_once_with("/host/machine.conf")

def test_get_platform(self):
with mock.patch("sonic_py_common.device_info.get_machine_info") as get_machine_info_mocked:
get_machine_info_mocked.return_value = EXPECTED_GET_MACHINE_INFO_RESULT
result = device_info.get_platform()
assert result == "x86_64-mlnx_msn2700-r0"

@classmethod
def teardown_class(cls):
print("TEARDOWN")