File: test_synology_dsm_5.py

package info (click to toggle)
python-synologydsm-api 2.7.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,364 kB
  • sloc: python: 27,201; sh: 25; makefile: 2
file content (213 lines) | stat: -rw-r--r-- 8,645 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
"""Synology DSM tests."""

# pylint: disable=protected-access
import pytest

from synology_dsm.const import API_AUTH
from synology_dsm.exceptions import SynologyDSMLogin2SARequiredException

from . import (
    VALID_HOST,
    VALID_HTTPS,
    VALID_OTP,
    VALID_PASSWORD,
    VALID_PORT,
    VALID_USER_2SA,
    SynologyDSMMock,
)
from .const import DEVICE_TOKEN, SESSION_ID


class TestSynologyDSM5:
    """SynologyDSM 5test cases."""

    @pytest.mark.asyncio
    async def test_login(self, dsm_5):
        """Test login."""
        assert await dsm_5.login()
        assert dsm_5.apis.get(API_AUTH)
        assert dsm_5._session_id == SESSION_ID
        assert dsm_5._syno_token is None

    @pytest.mark.asyncio
    async def test_login_2sa(self):
        """Test login with 2SA."""
        dsm_5 = SynologyDSMMock(
            None,
            VALID_HOST,
            VALID_PORT,
            VALID_USER_2SA,
            VALID_PASSWORD,
            VALID_HTTPS,
        )
        dsm_5.dsm_version = 5
        with pytest.raises(SynologyDSMLogin2SARequiredException):
            await dsm_5.login()
        await dsm_5.login(VALID_OTP)

        assert dsm_5._session_id == SESSION_ID
        assert dsm_5._syno_token is None
        assert dsm_5._device_token == DEVICE_TOKEN
        assert dsm_5.device_token == DEVICE_TOKEN

    @pytest.mark.asyncio
    async def test_login_2sa_new_session(self):
        """Test login with 2SA and a new session with granted device."""
        dsm_5 = SynologyDSMMock(
            None,
            VALID_HOST,
            VALID_PORT,
            VALID_USER_2SA,
            VALID_PASSWORD,
            VALID_HTTPS,
            device_token=DEVICE_TOKEN,
        )
        dsm_5.dsm_version = 5
        assert await dsm_5.login()

        assert dsm_5._session_id == SESSION_ID
        assert dsm_5._syno_token is None
        assert dsm_5._device_token == DEVICE_TOKEN
        assert dsm_5.device_token == DEVICE_TOKEN

    @pytest.mark.asyncio
    async def test_information(self, dsm_5):
        """Test information."""
        assert await dsm_5.login()
        assert dsm_5.information
        await dsm_5.information.update()
        assert dsm_5.information.model == "DS3615xs"
        assert dsm_5.information.ram == 6144
        assert dsm_5.information.serial == "B3J4N01003"
        assert dsm_5.information.temperature == 40
        assert not dsm_5.information.temperature_warn
        assert dsm_5.information.uptime == 3897
        assert dsm_5.information.version == "5967"
        assert dsm_5.information.version_string == "DSM 5.2-5967 Update 9"
        assert dsm_5.information.awesome_version == "5.2.0.9"

    @pytest.mark.asyncio
    async def test_network(self, dsm_5):
        """Test network."""
        assert await dsm_5.login()
        assert dsm_5.network
        await dsm_5.network.update()
        assert dsm_5.network.dns
        assert dsm_5.network.gateway
        assert dsm_5.network.hostname
        assert dsm_5.network.interfaces
        assert dsm_5.network.interface("eth0")
        assert dsm_5.network.interface("eth1") is None
        assert dsm_5.network.macs
        assert dsm_5.network.workgroup

    @pytest.mark.asyncio
    async def test_storage(self, dsm_5):
        """Test storage roots."""
        assert await dsm_5.login()
        assert dsm_5.storage
        await dsm_5.storage.update()
        assert dsm_5.storage.disks
        assert dsm_5.storage.env
        assert dsm_5.storage.storage_pools == []
        assert dsm_5.storage.volumes

    @pytest.mark.asyncio
    async def test_storage_volumes(self, dsm_5):
        """Test storage volumes."""
        assert await dsm_5.login()
        await dsm_5.storage.update()
        # Basics
        assert dsm_5.storage.volumes_ids
        for volume_id in dsm_5.storage.volumes_ids:
            if volume_id == "test_volume":
                continue
            assert dsm_5.storage.volume_status(volume_id)
            assert dsm_5.storage.volume_device_type(volume_id)
            assert dsm_5.storage.volume_size_total(volume_id)
            assert dsm_5.storage.volume_size_total(volume_id, True)
            assert dsm_5.storage.volume_size_used(volume_id)
            assert dsm_5.storage.volume_size_used(volume_id, True)
            assert dsm_5.storage.volume_percentage_used(volume_id)
            assert (
                dsm_5.storage.volume_disk_temp_avg(volume_id) is None
            )  # because of empty storagePools
            assert (
                dsm_5.storage.volume_disk_temp_max(volume_id) is None
            )  # because of empty storagePools

        # Existing volume
        assert dsm_5.storage.volume_status("volume_1") == "normal"
        assert dsm_5.storage.volume_device_type("volume_1") == "raid_5"
        assert dsm_5.storage.volume_size_total("volume_1") == 8846249701376
        assert dsm_5.storage.volume_size_total("volume_1", True) == "8.0Tb"
        assert dsm_5.storage.volume_size_used("volume_1") == 5719795761152
        assert dsm_5.storage.volume_size_used("volume_1", True) == "5.2Tb"
        assert dsm_5.storage.volume_percentage_used("volume_1") == 64.7
        assert (
            dsm_5.storage.volume_disk_temp_avg("volume_1") is None
        )  # because of empty storagePools
        assert (
            dsm_5.storage.volume_disk_temp_max("volume_1") is None
        )  # because of empty storagePools

        # Non existing volume
        assert not dsm_5.storage.volume_status("not_a_volume")
        assert not dsm_5.storage.volume_device_type("not_a_volume")
        assert not dsm_5.storage.volume_size_total("not_a_volume")
        assert not dsm_5.storage.volume_size_total("not_a_volume", True)
        assert not dsm_5.storage.volume_size_used("not_a_volume")
        assert not dsm_5.storage.volume_size_used("not_a_volume", True)
        assert not dsm_5.storage.volume_percentage_used("not_a_volume")
        assert not dsm_5.storage.volume_disk_temp_avg("not_a_volume")
        assert not dsm_5.storage.volume_disk_temp_max("not_a_volume")

        # Test volume
        assert dsm_5.storage.volume_status("test_volume") is None
        assert dsm_5.storage.volume_device_type("test_volume") is None
        assert dsm_5.storage.volume_size_total("test_volume") is None
        assert dsm_5.storage.volume_size_total("test_volume", True) is None
        assert dsm_5.storage.volume_size_used("test_volume") is None
        assert dsm_5.storage.volume_size_used("test_volume", True) is None
        assert dsm_5.storage.volume_percentage_used("test_volume") is None
        assert dsm_5.storage.volume_disk_temp_avg("test_volume") is None
        assert dsm_5.storage.volume_disk_temp_max("test_volume") is None

    @pytest.mark.asyncio
    async def test_storage_disks(self, dsm_5):
        """Test storage disks."""
        assert await dsm_5.login()
        await dsm_5.storage.update()
        # Basics
        assert dsm_5.storage.disks_ids
        for disk_id in dsm_5.storage.disks_ids:
            if disk_id == "test_disk":
                continue
            assert "Disk" in dsm_5.storage.disk_name(disk_id)
            assert "/dev/" in dsm_5.storage.disk_device(disk_id)
            if disk_id == "sda":
                assert dsm_5.storage.disk_smart_status(disk_id) == "90%"
            else:
                assert dsm_5.storage.disk_smart_status(disk_id) == "safe"
            assert dsm_5.storage.disk_status(disk_id) == "normal"
            assert not dsm_5.storage.disk_exceed_bad_sector_thr(disk_id)
            assert not dsm_5.storage.disk_below_remain_life_thr(disk_id)
            assert dsm_5.storage.disk_temp(disk_id)

        # Non existing disk
        assert not dsm_5.storage.disk_name("not_a_disk")
        assert not dsm_5.storage.disk_device("not_a_disk")
        assert not dsm_5.storage.disk_smart_status("not_a_disk")
        assert not dsm_5.storage.disk_status("not_a_disk")
        assert not dsm_5.storage.disk_exceed_bad_sector_thr("not_a_disk")
        assert not dsm_5.storage.disk_below_remain_life_thr("not_a_disk")
        assert not dsm_5.storage.disk_temp("not_a_disk")

        # Test disk
        assert dsm_5.storage.disk_name("test_disk") is None
        assert dsm_5.storage.disk_device("test_disk") is None
        assert dsm_5.storage.disk_smart_status("test_disk") is None
        assert dsm_5.storage.disk_status("test_disk") is None
        assert dsm_5.storage.disk_exceed_bad_sector_thr("test_disk") is None
        assert dsm_5.storage.disk_below_remain_life_thr("test_disk") is None
        assert dsm_5.storage.disk_temp("test_disk") is None