Skip to content

Commit 755ef1a

Browse files
committed
[tests] Add multi-VPN client regression test for openwisp#1221
Verify that when a device has multiple VPN templates and is deactivated, every VpnClient is deleted, peer cache is invalidated for each VPN server, and all auto-created certificates are revoked. Related to openwisp#1221 Co-Authored-By: mn-ram <mn-ram@users.noreply.github.com>
1 parent 4c35d82 commit 755ef1a

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

openwisp_controller/config/tests/test_vpn.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,35 @@ def test_vpn_client_post_delete_on_device_deactivation(self):
325325
# Certificate should be revoked (auto_cert=True)
326326
self.assertTrue(Cert.objects.get(pk=cert_pk).revoked)
327327

328+
def test_vpn_client_post_delete_multiple_clients(self):
329+
"""Regression test for #1221: when a device has multiple VPN templates,
330+
removing all of them must delete every VpnClient, invalidate peer cache
331+
for each VPN, and revoke all auto-created certificates."""
332+
org = self._get_org()
333+
vpn1 = self._create_vpn(name="vpn1")
334+
vpn2 = self._create_vpn(name="vpn2", ca=vpn1.ca)
335+
t1 = self._create_template(
336+
name="vpn-t1", type="vpn", vpn=vpn1, auto_cert=True
337+
)
338+
t2 = self._create_template(
339+
name="vpn-t2", type="vpn", vpn=vpn2, auto_cert=True
340+
)
341+
d = self._create_device(organization=org)
342+
c = self._create_config(device=d)
343+
c.templates.add(t1, t2)
344+
self.assertEqual(c.vpnclient_set.count(), 2)
345+
vpnclient1 = c.vpnclient_set.get(vpn=vpn1)
346+
vpnclient2 = c.vpnclient_set.get(vpn=vpn2)
347+
cert_pk1 = vpnclient1.cert.pk
348+
cert_pk2 = vpnclient2.cert.pk
349+
with mock.patch.object(Vpn, "_invalidate_peer_cache") as mock_invalidate:
350+
d.deactivate()
351+
self.assertEqual(mock_invalidate.call_count, 2)
352+
self.assertFalse(VpnClient.objects.filter(pk=vpnclient1.pk).exists())
353+
self.assertFalse(VpnClient.objects.filter(pk=vpnclient2.pk).exists())
354+
self.assertTrue(Cert.objects.get(pk=cert_pk1).revoked)
355+
self.assertTrue(Cert.objects.get(pk=cert_pk2).revoked)
356+
328357
def test_vpn_client_get_common_name(self):
329358
vpn = self._create_vpn()
330359
d = self._create_device()

0 commit comments

Comments
 (0)