Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

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

"""Base test class for DNS authenticators built on Lexicon.""" 

 

import josepy as jose 

import mock 

from requests.exceptions import HTTPError, RequestException 

 

from certbot import errors 

from certbot.plugins import dns_test_common 

from certbot.tests import util as test_util 

 

DOMAIN = 'example.com' 

KEY = jose.JWKRSA.load(test_util.load_vector("rsa512_key.pem")) 

 

# These classes are intended to be subclassed/mixed in, so not all members are defined. 

# pylint: disable=no-member 

 

class BaseLexiconAuthenticatorTest(dns_test_common.BaseAuthenticatorTest): 

 

def test_perform(self): 

self.auth.perform([self.achall]) 

 

expected = [mock.call.add_txt_record(DOMAIN, '_acme-challenge.'+DOMAIN, mock.ANY)] 

self.assertEqual(expected, self.mock_client.mock_calls) 

 

def test_cleanup(self): 

self.auth._attempt_cleanup = True # _attempt_cleanup | pylint: disable=protected-access 

self.auth.cleanup([self.achall]) 

 

expected = [mock.call.del_txt_record(DOMAIN, '_acme-challenge.'+DOMAIN, mock.ANY)] 

self.assertEqual(expected, self.mock_client.mock_calls) 

 

 

class BaseLexiconClientTest(object): 

DOMAIN_NOT_FOUND = Exception('No domain found') 

GENERIC_ERROR = RequestException 

LOGIN_ERROR = HTTPError('400 Client Error: ...') 

UNKNOWN_LOGIN_ERROR = HTTPError('500 Surprise! Error: ...') 

 

record_prefix = "_acme-challenge" 

record_name = record_prefix + "." + DOMAIN 

record_content = "bar" 

 

def test_add_txt_record(self): 

self.client.add_txt_record(DOMAIN, self.record_name, self.record_content) 

 

self.provider_mock.create_record.assert_called_with(type='TXT', 

name=self.record_name, 

content=self.record_content) 

 

def test_add_txt_record_try_twice_to_find_domain(self): 

self.provider_mock.authenticate.side_effect = [self.DOMAIN_NOT_FOUND, ''] 

 

self.client.add_txt_record(DOMAIN, self.record_name, self.record_content) 

 

self.provider_mock.create_record.assert_called_with(type='TXT', 

name=self.record_name, 

content=self.record_content) 

 

def test_add_txt_record_fail_to_find_domain(self): 

self.provider_mock.authenticate.side_effect = [self.DOMAIN_NOT_FOUND, 

self.DOMAIN_NOT_FOUND, 

self.DOMAIN_NOT_FOUND,] 

 

self.assertRaises(errors.PluginError, 

self.client.add_txt_record, 

DOMAIN, self.record_name, self.record_content) 

 

def test_add_txt_record_fail_to_authenticate(self): 

self.provider_mock.authenticate.side_effect = self.LOGIN_ERROR 

 

self.assertRaises(errors.PluginError, 

self.client.add_txt_record, 

DOMAIN, self.record_name, self.record_content) 

 

def test_add_txt_record_fail_to_authenticate_with_unknown_error(self): 

self.provider_mock.authenticate.side_effect = self.UNKNOWN_LOGIN_ERROR 

 

self.assertRaises(errors.PluginError, 

self.client.add_txt_record, 

DOMAIN, self.record_name, self.record_content) 

 

def test_add_txt_record_error_finding_domain(self): 

self.provider_mock.authenticate.side_effect = self.GENERIC_ERROR 

 

self.assertRaises(errors.PluginError, 

self.client.add_txt_record, 

DOMAIN, self.record_name, self.record_content) 

 

def test_add_txt_record_error_adding_record(self): 

self.provider_mock.create_record.side_effect = self.GENERIC_ERROR 

 

self.assertRaises(errors.PluginError, 

self.client.add_txt_record, 

DOMAIN, self.record_name, self.record_content) 

 

def test_del_txt_record(self): 

self.client.del_txt_record(DOMAIN, self.record_name, self.record_content) 

 

self.provider_mock.delete_record.assert_called_with(type='TXT', 

name=self.record_name, 

content=self.record_content) 

 

def test_del_txt_record_fail_to_find_domain(self): 

self.provider_mock.authenticate.side_effect = [self.DOMAIN_NOT_FOUND, 

self.DOMAIN_NOT_FOUND, 

self.DOMAIN_NOT_FOUND, ] 

 

self.client.del_txt_record(DOMAIN, self.record_name, self.record_content) 

 

def test_del_txt_record_fail_to_authenticate(self): 

self.provider_mock.authenticate.side_effect = self.LOGIN_ERROR 

 

self.client.del_txt_record(DOMAIN, self.record_name, self.record_content) 

 

def test_del_txt_record_fail_to_authenticate_with_unknown_error(self): 

self.provider_mock.authenticate.side_effect = self.UNKNOWN_LOGIN_ERROR 

 

self.client.del_txt_record(DOMAIN, self.record_name, self.record_content) 

 

def test_del_txt_record_error_finding_domain(self): 

self.provider_mock.authenticate.side_effect = self.GENERIC_ERROR 

 

self.client.del_txt_record(DOMAIN, self.record_name, self.record_content) 

 

def test_del_txt_record_error_deleting_record(self): 

self.provider_mock.delete_record.side_effect = self.GENERIC_ERROR 

 

self.client.del_txt_record(DOMAIN, self.record_name, self.record_content)