Skip to content

Commit 82ce4c2

Browse files
committed
Add initial unit testing for SSM messenger
1 parent c5eb530 commit 82ce4c2

File tree

5 files changed

+275
-86
lines changed

5 files changed

+275
-86
lines changed

caso/messenger/ssm.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ def push(self, records):
196196
serialized_record = json.loads(record.json(**opts))
197197
for k, v in serialized_record.items():
198198
aux.append(f"{k}: {v}")
199+
aux.sort()
199200
entries_cloud.append("\n".join(aux))
200201
elif isinstance(record, caso.record.IPRecord):
201202
entries_ip.append(record.json(**opts))

caso/tests/conftest.py

Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
# -*- coding: utf-8 -*-
2+
3+
# Copyright 2014 Spanish National Research Council (CSIC)
4+
#
5+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
6+
# not use this file except in compliance with the License. You may obtain
7+
# a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing, software
12+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14+
# License for the specific language governing permissions and limitations
15+
# under the License.
16+
17+
"""Fixtures for cASO tests."""
18+
19+
import datetime
20+
21+
import pytest
22+
23+
import caso.record
24+
25+
now = datetime.datetime(2023, 5, 25, 21, 59, 6, 0)
26+
27+
valid_records_fields = [
28+
dict(
29+
uuid="721cf1db-0e0f-4c24-a5ea-cd75e0f303e8",
30+
site_name="TEST-Site",
31+
name="VM Name 1",
32+
user_id="a4519d7d-f60a-4908-9d63-7d9e17422188",
33+
group_id="03b6a6c4-cf2b-48b9-82f1-69c52b9f30af",
34+
fqan="VO 1 FQAN",
35+
start_time=now - datetime.timedelta(days=5),
36+
end_time=now,
37+
compute_service="Fake Cloud Service",
38+
status="ACTIVE",
39+
image_id="b39a8ed9-e15d-4b71-ada2-daf88efbac0a",
40+
user_dn="User DN",
41+
benchmark_type=None,
42+
benchmark_value=None,
43+
memory=16,
44+
cpu_count=8,
45+
disk=250,
46+
public_ip_count=7,
47+
),
48+
dict(
49+
uuid="a53738e1-13eb-4047-800c-067d14ce3d22",
50+
site_name="TEST-Site",
51+
name="VM Name 2",
52+
user_id="a4519d7d-f60a-4908-9d63-7d9e17422188",
53+
group_id="03b6a6c4-cf2b-48b9-82f1-69c52b9f30af",
54+
fqan="VO 2 FQAN",
55+
start_time=now - datetime.timedelta(days=6),
56+
end_time=now,
57+
compute_service="Fake Cloud Service",
58+
status="ACTIVE",
59+
image_id="b39a8ed9-e15d-4b71-ada2-daf88efbac0a",
60+
user_dn="User DN",
61+
benchmark_type=None,
62+
benchmark_value=None,
63+
memory=16,
64+
cpu_count=8,
65+
disk=250,
66+
public_ip_count=7,
67+
),
68+
]
69+
70+
valid_records_dict = [
71+
{
72+
"CloudComputeService": "Fake Cloud Service",
73+
"CpuCount": 8,
74+
"CpuDuration": 3456000,
75+
"Disk": 250,
76+
"StartTime": 1684612746,
77+
"EndTime": 1685044746,
78+
"FQAN": "VO 1 FQAN",
79+
"GlobalUserName": "User DN",
80+
"ImageId": "b39a8ed9-e15d-4b71-ada2-daf88efbac0a",
81+
"LocalGroupId": "03b6a6c4-cf2b-48b9-82f1-69c52b9f30af",
82+
"LocalUserId": "a4519d7d-f60a-4908-9d63-7d9e17422188",
83+
"MachineName": "VM Name 1",
84+
"Memory": 16,
85+
"PublicIPCount": 7,
86+
"SiteName": "TEST-Site",
87+
"Status": "ACTIVE",
88+
"VMUUID": "721cf1db-0e0f-4c24-a5ea-cd75e0f303e8",
89+
"WallDuration": 432000,
90+
},
91+
{
92+
"CloudComputeService": "Fake Cloud Service",
93+
"CpuCount": 8,
94+
"CpuDuration": 3456000,
95+
"Disk": 250,
96+
"StartTime": 1684526346,
97+
"EndTime": 1685044746,
98+
"FQAN": "VO 2 FQAN",
99+
"GlobalUserName": "User DN",
100+
"ImageId": "b39a8ed9-e15d-4b71-ada2-daf88efbac0a",
101+
"LocalGroupId": "03b6a6c4-cf2b-48b9-82f1-69c52b9f30af",
102+
"LocalUserId": "a4519d7d-f60a-4908-9d63-7d9e17422188",
103+
"MachineName": "VM Name 2",
104+
"Memory": 16,
105+
"PublicIPCount": 7,
106+
"SiteName": "TEST-Site",
107+
"Status": "ACTIVE",
108+
"VMUUID": "a53738e1-13eb-4047-800c-067d14ce3d22",
109+
"WallDuration": 432000,
110+
},
111+
]
112+
113+
# Record fixtures
114+
115+
116+
@pytest.fixture(scope="module")
117+
def cloud_record():
118+
"""Get a fixture for the CloudRecord."""
119+
record = caso.record.CloudRecord(**valid_records_fields[0])
120+
# Remove this when moving to Pydantic 2
121+
record.wall_duration = 432000
122+
record.cpu_duration = 3456000
123+
return record
124+
125+
126+
@pytest.fixture(scope="module")
127+
def another_cloud_record():
128+
"""Get another fixture for the CloudRecord."""
129+
record = caso.record.CloudRecord(**valid_records_fields[1])
130+
record.wall_duration = 432000
131+
record.cpu_duration = 3456000
132+
return record
133+
134+
135+
@pytest.fixture(scope="module")
136+
def valid_record():
137+
"""Get a fixture for a valid record."""
138+
return valid_records_dict[0]
139+
140+
141+
@pytest.fixture(scope="module")
142+
def valid_records():
143+
"""Get a fixture for valid records as a dict."""
144+
return valid_records_dict
145+
146+
147+
@pytest.fixture(scope="module")
148+
def another_valid_record():
149+
"""Get another fixture for a valid record as a dict."""
150+
return valid_records_dict[0]
151+
152+
153+
@pytest.fixture(scope="module")
154+
def cloud_record_list(cloud_record, another_cloud_record):
155+
"""Get a fixture for a list of valid records."""
156+
return [cloud_record, another_cloud_record]
157+
158+
159+
# SSM entries
160+
161+
162+
@pytest.fixture
163+
def expected_entries_cloud():
164+
"""Get a fixture for all cloud entries."""
165+
ssm_entries = [
166+
"CloudComputeService: Fake Cloud Service\n"
167+
"CpuCount: 8\n"
168+
"CpuDuration: 3456000\n"
169+
"Disk: 250\n"
170+
"EndTime: 1685044746\n"
171+
"FQAN: VO 1 FQAN\n"
172+
"GlobalUserName: User DN\n"
173+
"ImageId: b39a8ed9-e15d-4b71-ada2-daf88efbac0a\n"
174+
"LocalGroupId: 03b6a6c4-cf2b-48b9-82f1-69c52b9f30af\n"
175+
"LocalUserId: a4519d7d-f60a-4908-9d63-7d9e17422188\n"
176+
"MachineName: VM Name 1\n"
177+
"Memory: 16\n"
178+
"PublicIPCount: 7\n"
179+
"SiteName: TEST-Site\n"
180+
"StartTime: 1684612746\n"
181+
"Status: ACTIVE\n"
182+
"VMUUID: 721cf1db-0e0f-4c24-a5ea-cd75e0f303e8\n"
183+
"WallDuration: 432000",
184+
"CloudComputeService: Fake Cloud Service\n"
185+
"CpuCount: 8\n"
186+
"CpuDuration: 3456000\n"
187+
"Disk: 250\n"
188+
"EndTime: 1685044746\n"
189+
"FQAN: VO 2 FQAN\n"
190+
"GlobalUserName: User DN\n"
191+
"ImageId: b39a8ed9-e15d-4b71-ada2-daf88efbac0a\n"
192+
"LocalGroupId: 03b6a6c4-cf2b-48b9-82f1-69c52b9f30af\n"
193+
"LocalUserId: a4519d7d-f60a-4908-9d63-7d9e17422188\n"
194+
"MachineName: VM Name 2\n"
195+
"Memory: 16\n"
196+
"PublicIPCount: 7\n"
197+
"SiteName: TEST-Site\n"
198+
"StartTime: 1684526346\n"
199+
"Status: ACTIVE\n"
200+
"VMUUID: a53738e1-13eb-4047-800c-067d14ce3d22\n"
201+
"WallDuration: 432000",
202+
]
203+
204+
return ssm_entries

caso/tests/test_record.py

Lines changed: 29 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -18,134 +18,77 @@
1818

1919
import datetime
2020
import json
21-
import uuid
2221

2322
import pytest
2423

25-
import caso.record
26-
27-
valid_record_fields = dict(
28-
uuid=str(uuid.uuid4()),
29-
site_name="TEST-Site",
30-
name="VM Name",
31-
user_id=str(uuid.uuid4()),
32-
group_id=str(uuid.uuid4()),
33-
fqan="VO FQAN",
34-
start_time=datetime.datetime.now() - datetime.timedelta(days=5),
35-
end_time=datetime.datetime.now(),
36-
compute_service="Fake Cloud Service",
37-
status="ACTIVE",
38-
image_id=str(uuid.uuid4()),
39-
user_dn="User DN",
40-
benchmark_type=None,
41-
benchmark_value=None,
42-
memory=16,
43-
cpu_count=8,
44-
disk=250,
45-
public_ip_count=7,
46-
)
47-
48-
valid_record = {
49-
"CloudComputeService": "Fake Cloud Service",
50-
"CpuCount": 8,
51-
"CpuDuration": 3456000,
52-
"Disk": 250,
53-
"StartTime": int(valid_record_fields["start_time"].timestamp()),
54-
"EndTime": int(valid_record_fields["end_time"].timestamp()),
55-
"FQAN": "VO FQAN",
56-
"GlobalUserName": "User DN",
57-
"ImageId": valid_record_fields["image_id"],
58-
"LocalGroupId": valid_record_fields["group_id"],
59-
"LocalUserId": valid_record_fields["user_id"],
60-
"MachineName": "VM Name",
61-
"Memory": 16,
62-
"PublicIPCount": 7,
63-
"SiteName": "TEST-Site",
64-
"Status": "ACTIVE",
65-
"VMUUID": valid_record_fields["uuid"],
66-
"WallDuration": 432000,
67-
}
68-
6924

7025
@pytest.mark.skip(reason="Pydantic 1 does not support computed fields")
71-
def test_cloud_record():
26+
def test_cloud_record(cloud_record):
7227
"""Test a cloud record is correctly generated."""
73-
record = caso.record.CloudRecord(**valid_record_fields)
74-
7528
wall = datetime.timedelta(days=5).total_seconds()
76-
cpu = wall * record.cpu_count
29+
cpu = wall * cloud_record.cpu_count
7730

78-
assert record.wall_duration == wall
79-
assert record.cpu_duration == cpu
31+
assert cloud_record.wall_duration == wall
32+
assert cloud_record.cpu_duration == cpu
8033

81-
assert isinstance(record.start_time, datetime.datetime)
82-
assert isinstance(record.end_time, datetime.datetime)
34+
assert isinstance(cloud_record.start_time, datetime.datetime)
35+
assert isinstance(cloud_record.end_time, datetime.datetime)
8336

8437

8538
@pytest.mark.skip(reason="Pydantic 1 does not support computed fields")
86-
def test_cloud_record_map_opts():
39+
def test_cloud_record_map_opts(cloud_record, valid_record):
8740
"""Test a cloud record is correctly rendered."""
88-
record = caso.record.CloudRecord(**valid_record_fields)
89-
9041
opts = {
9142
"by_alias": True,
9243
"exclude_unset": True,
9344
"exclude_none": True,
9445
}
9546

96-
assert json.loads(record.json(**opts)) == valid_record
47+
assert json.loads(cloud_record.json(**opts)) == valid_record
9748

9849

99-
def test_cloud_record_map_opts_custom_wall_cpu():
50+
def test_cloud_record_map_opts_custom_wall_cpu(cloud_record, valid_record):
10051
"""Test a cloud record is correctly rendered with custom wall and cpu times."""
101-
record = caso.record.CloudRecord(**valid_record_fields)
102-
10352
wall = datetime.timedelta(days=5).total_seconds()
104-
cpu = wall * record.cpu_count
105-
record.wall_duration = wall
106-
record.cpu_duration = cpu
53+
cpu = wall * cloud_record.cpu_count
54+
cloud_record.wall_duration = wall
55+
cloud_record.cpu_duration = cpu
10756

10857
opts = {
10958
"by_alias": True,
11059
"exclude_unset": True,
11160
"exclude_none": True,
11261
}
11362

114-
assert json.loads(record.json(**opts)) == valid_record
63+
assert json.loads(cloud_record.json(**opts)) == valid_record
11564

11665

11766
@pytest.mark.skip(reason="Pydantic 1 does not support computed fields")
118-
def test_cloud_record_custom_wall():
67+
def test_cloud_record_custom_wall(cloud_record):
11968
"""Test a cloud record is correctly rendered with custom wall time."""
120-
record = caso.record.CloudRecord(**valid_record_fields)
121-
12269
wall = 200
123-
cpu = wall * record.cpu_count
124-
record.wall_duration = wall
125-
assert record.wall_duration == wall
126-
assert record.cpu_duration == cpu
70+
cpu = wall * cloud_record.cpu_count
71+
cloud_record.wall_duration = wall
72+
assert cloud_record.wall_duration == wall
73+
assert cloud_record.cpu_duration == cpu
12774

12875

129-
def test_cloud_record_custom_wall_cpu():
76+
def test_cloud_record_custom_wall_cpu(cloud_record):
13077
"""Test a cloud record is correctly generated with custom wall and cpu time."""
131-
record = caso.record.CloudRecord(**valid_record_fields)
132-
13378
wall = 200
134-
cpu = wall * record.cpu_count
135-
record.wall_duration = wall
136-
record.cpu_duration = cpu
79+
cpu = wall * cloud_record.cpu_count
80+
cloud_record.wall_duration = wall
81+
cloud_record.cpu_duration = cpu
13782

138-
assert record.wall_duration == wall
139-
assert record.cpu_duration == cpu
83+
assert cloud_record.wall_duration == wall
84+
assert cloud_record.cpu_duration == cpu
14085

14186

14287
@pytest.mark.skip(reason="Pydantic 1 does not support computed fields")
143-
def test_cloud_record_custom_cpu():
88+
def test_cloud_record_custom_cpu(cloud_record):
14489
"""Test a cloud record is correctly rendered with custom cpu time."""
145-
record = caso.record.CloudRecord(**valid_record_fields)
146-
14790
wall = datetime.timedelta(days=5).total_seconds()
148-
cpu = wall * record.cpu_count * 10
149-
record.cpu_duration = cpu
150-
assert record.wall_duration == wall
151-
assert record.cpu_duration == cpu
91+
cpu = wall * cloud_record.cpu_count * 10
92+
cloud_record.cpu_duration = cpu
93+
assert cloud_record.wall_duration == wall
94+
assert cloud_record.cpu_duration == cpu

0 commit comments

Comments
 (0)