Skip to content

DNSIMPLE: Add compatibility with TXT changes#2745

Merged
tlimoncelli merged 11 commits intoStackExchange:masterfrom
weppos:dnsimple/txt-quoting
Jan 2, 2024
Merged

DNSIMPLE: Add compatibility with TXT changes#2745
tlimoncelli merged 11 commits intoStackExchange:masterfrom
weppos:dnsimple/txt-quoting

Conversation

@weppos
Copy link
Copy Markdown
Contributor

@weppos weppos commented Dec 26, 2023

Description

I work at DNSimple, and I also happen to be a user of this library. 😉

We have recently introduced some TXT changes, that are partially modifying the behavior of TXT records via API. In particular, while we still support sending unquoted TXTs, we now always store RFC-compliant content and we return it.

If you submit an unquoted string, we will normalize and always return the quoted version.

In the past, we used to not normalize the input. You could either submit a quoted/unquoted string, and our system accepted both. The content was eventually sanitized at the name server stack, but occasionally this led to some unexpected conflicts.

The new changes and validations are described here:
https://support.dnsimple.com/articles/txt-record/#validation

Furthermore, we now support longer TXT strings.

Transition period

We rolled out the changes in Dec 2023, and we are now gong though a transitioning phase where we allow both quoted/non-quoted strings in our system. All new values are normalized, existing values are untouched.

We are currently notifying our customers, and we will normalize all entries in our system by February. This means most of the code in this PR that deals with conditional formatting will eventually go away once the content is fully normalized. This affects some of the implementation choices I made that are explained below.

Notes

I had to make a few choices a long the way, in order to implement these changes. They are described below. I am open to feedback:

  1. When checking for the ALIAS alternate record, I explicitly duplicated the check for both quoted-unquoted values. This is a duplicated code, terrible to see, but I went this path as this duplicate check will go away in a few months. Furthermore, we are planning to discontinue the alternate TXT record at some point in 2024.
  2. While fetching records from the API, I originally had a conditional code to decode the TXT only when quoted, and use the target verbatim when non-quoted. However this had the inconvenient of not triggering any attempt to update the legacy values. Ideally, we want to facilitate the upgrade of all TXT contents to the new format. For this reason I am artificially prefixing the string with a "legacy:" string, that will then tell dnscontrol an update is needed.

Examples

This is an example of what you will see when you first run this version, and you have legacy (non-quoted) strings in your DNSimple account:

******************** Domain: example.zone
1 correction (dnsimple)
#1: ± MODIFY TXT example.zone: ("legacy: v=spf1 include:mailgun.org ~all" ttl=3600) -> ("v=spf1 include:mailgun.org ~all" ttl=3600)

Since December 2023 we store and return a RFC-compliant version of the string.
https://support.dnsimple.com/articles/txt-record/#serialization

It means the check for the ALIAS alternate TXT record should consider both possibilities, until the database is fully normalized.
Facilitate the transition until the database is fully encoded.
Artificially prefix the string with "legacy: " so that DNScontrol will find a diff, and attempt to store the string again.
@weppos
Copy link
Copy Markdown
Contributor Author

weppos commented Dec 26, 2023

Tests are passing:

go test -v -provider DNSIMPLE
=== RUN   TestDNSProviders
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/00:A:Create_A
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/00:A:Change_A_target
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#01
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/01:Apex:Create_A
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/01:Apex:Change_A_target
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#02
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/02:Protocol-Wildcard:Create_wildcard
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/02:Protocol-Wildcard:Delete_wildcard
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#03
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/03:AAAA:Create_AAAA
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/03:AAAA:Change_AAAA_target
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#04
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/04:CNAME:Create_a_CNAME
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/04:CNAME:Change_CNAME_target
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#05
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/05:MX:Create_MX
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/05:MX:Change_MX_target
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/05:MX:Change_MX_p
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#06
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/06:TXT:Create_TXT
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/06:TXT:Change_TXT_target
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#07
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/07:ManyAtOnce:CreateManyAtLabel
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/07:ManyAtOnce:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/07:ManyAtOnce:Create_an_A_record
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/07:ManyAtOnce:Add_at_label1
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/07:ManyAtOnce:Add_at_label2
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#08
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/08:manyTypesAtOnce:CreateManyTypesAtLabel
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/08:manyTypesAtOnce:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/08:manyTypesAtOnce:Create_an_A_record
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/08:manyTypesAtOnce:Add_Type_At_Label
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/08:manyTypesAtOnce:Add_Type_At_Label#01
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#09
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/09:Attl:Create_Arc
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/09:Attl:Change_TTL
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#10
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/10:TTL:Start
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/10:TTL:Change_a_ttl
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/10:TTL:Change_single_target_from_set
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/10:TTL:Change_all_ttls
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#11
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/11:add_to_label_and_change_orig_ttl:Setup
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/11:add_to_label_and_change_orig_ttl:Add_at_same_label,_new_ttl
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#12
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/12:TypeChange:Create_A
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/12:TypeChange:Change_to_MX
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/12:TypeChange:Change_back_to_A
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#13
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/13:TypeChangeHard:Create_a_CNAME
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/13:TypeChangeHard:Change_to_A_record
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/13:TypeChangeHard:Change_back_to_CNAME
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#14
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/14:CNAME:Record_pointing_to_@
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#15
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/15:MX:Record_pointing_to_@
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/15:MX:Null_MX
    integration_test.go:225: ***SKIPPED(PROVIDER DOES NOT SUPPORT '[mx has null target]' ::"15:MX")
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/16:NS_***SKIPPED(excluded_by_not("DNSIMPLE"))***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#16
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:a_0-byte_TXT
    integration_test.go:225: ***SKIPPED(PROVIDER DOES NOT SUPPORT '[txtstring is empty]' ::"17:complex TXT")
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:a_254-byte_TXT
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:a_255-byte_TXT
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:a_256-byte_TXT
    integration_test.go:225: ***SKIPPED(PROVIDER DOES NOT SUPPORT '[TXT records longer than 255 octets (chars)]' ::"17:complex TXT")
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:a_509-byte_TXT
    integration_test.go:225: ***SKIPPED(PROVIDER DOES NOT SUPPORT '[TXT records longer than 255 octets (chars)]' ::"17:complex TXT")
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:a_510-byte_TXT
    integration_test.go:225: ***SKIPPED(PROVIDER DOES NOT SUPPORT '[TXT records longer than 255 octets (chars)]' ::"17:complex TXT")
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:a_511-byte_TXT
    integration_test.go:225: ***SKIPPED(PROVIDER DOES NOT SUPPORT '[TXT records longer than 255 octets (chars)]' ::"17:complex TXT")
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:a_764-byte_TXT
    integration_test.go:225: ***SKIPPED(PROVIDER DOES NOT SUPPORT '[TXT records longer than 255 octets (chars)]' ::"17:complex TXT")
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:a_765-byte_TXT
    integration_test.go:225: ***SKIPPED(PROVIDER DOES NOT SUPPORT '[TXT records longer than 255 octets (chars)]' ::"17:complex TXT")
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:a_766-byte_TXT
    integration_test.go:225: ***SKIPPED(PROVIDER DOES NOT SUPPORT '[TXT records longer than 255 octets (chars)]' ::"17:complex TXT")
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_with_1_single-quote
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_with_1_backtick
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_with_1_dq-1interior
    integration_test.go:225: ***SKIPPED(PROVIDER DOES NOT SUPPORT '[txtstring contains unpaired doublequotes]' ::"17:complex TXT")
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_with_2_dq-2interior
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_with_1_dq-left
    integration_test.go:225: ***SKIPPED(PROVIDER DOES NOT SUPPORT '[txtstring contains unpaired doublequotes]' ::"17:complex TXT")
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_with_1_dq-right
    integration_test.go:225: ***SKIPPED(PROVIDER DOES NOT SUPPORT '[txtstring contains unpaired doublequotes]' ::"17:complex TXT")
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_with_semicolon
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_with_semicolon_ws
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_interior_ws
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_trailing_ws
    integration_test.go:225: ***SKIPPED(PROVIDER DOES NOT SUPPORT '[txtstring ends with space]' ::"17:complex TXT")
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:Create_a_TXT/SPF
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_with_1_backslash
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_with_2_backslash
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_with_3_backslash
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_with_4_backslash
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#17
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/18:TXT_backslashes:TXT_with_backslashs
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#18
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/19:Case_Sensitivity:Create_CAPS
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/19:Case_Sensitivity:Downcase_label
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/19:Case_Sensitivity:Downcase_target
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/19:Case_Sensitivity:Upcase_both
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#19
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/20:testByLabel:initial
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/20:testByLabel:changeOne
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/20:testByLabel:deleteOne
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/20:testByLabel:addOne
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#20
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/21:testByRecordSet:initial
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/21:testByRecordSet:changeOne
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/21:testByRecordSet:deleteOne
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/21:testByRecordSet:addOne
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#21
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/22:IDNA:Internationalized_name
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/22:IDNA:Change_IDN
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/22:IDNA:Internationalized_CNAME_Target
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#22
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/23:IDNAs_in_CNAME_targets:IDN_CNAME_AND_Target
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#23
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/24:pager101:99_records
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/24:pager101:100_records
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/24:pager101:101_records
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/25:pager601_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/26:pager1201_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#24
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/27:CAA:CAA_record
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/27:CAA:CAA_change_tag
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/27:CAA:CAA_change_target
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/27:CAA:CAA_change_flag
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/27:CAA:CAA_many_records
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/27:CAA:CAA_whitespace
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/28:LOC_***SKIPPED(CanUseLOC_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#25
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_record
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_second_record
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_delete_record
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_change_target
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_change_order
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_change_preference
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_change_flags
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_change_service
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_change_regexp
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#26
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/30:PTR:Create_PTR_record
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/30:PTR:Modify_PTR_record
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/31:SOA_***SKIPPED(CanUseSOA_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#27
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:SRV_record
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Second_SRV_record,_same_prio
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:3_SRV
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Delete_one
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Change_Target
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Change_Priority
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Change_Weight
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Change_Port
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Null_Target
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#28
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/33:SRV:Create_SRV333
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/33:SRV:Change_TTL999
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#29
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/34:SSHFP:SSHFP_record
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/34:SSHFP:SSHFP_change_algorithm
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/34:SSHFP:SSHFP_change_fingerprint_and_type
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/35:TLSA_***SKIPPED(CanUseTLSA_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/36:DS_***SKIPPED(CanUseDS_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/37:DS_(children_only)_***SKIPPED(CanUseDSForChildren_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/38:DS_(children_only)_CLOUDNS_***SKIPPED(CanUseDSForChildren_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/39:DHCID_***SKIPPED(CanUseDHCID_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#30
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/40:ALIAS_on_apex:ALIAS_at_root
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/40:ALIAS_on_apex:change_it
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#31
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/41:ALIAS_on_subdomain:ALIAS_at_subdomain
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/41:ALIAS_on_subdomain:change_it
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/42:AZURE_ALIAS_A_***SKIPPED(CanUseAzureAlias_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/43:AZURE_ALIAS_CNAME_***SKIPPED(CanUseAzureAlias_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/44:R53_ALIAS2_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/45:R53_ALIAS_ORDER_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/46:R53_ALIAS_CNAME_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/47:R53_ALIAS_Loop_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/48:R53_alias_pre-existing_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/49:R53_alias_evaluate_target_health_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/50:CF_REDIRECT_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/51:CF_PROXY_A_create_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/52:CF_PROXY_A_off_to_X_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/53:CF_PROXY_A_on_to_X_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/54:CF_PROXY_A_full1_to_X_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/55:CF_PROXY_A_full2_to_X_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/56:CF_PROXY_CNAME_create_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/57:CF_PROXY_CNAME_off_to_X_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/58:CF_PROXY_CNAME_on_to_X_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/59:CF_PROXY_CNAME_full_to_X_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/60:CF_WORKER_ROUTE_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/61:NS1_URLFWD_tests_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#32
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/62:IGNORE_main:Create_some_records
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/62:IGNORE_main:ignore_label=foo
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/62:IGNORE_main:ignore_type=txt
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/62:IGNORE_main:ignore_target=1.2.3.4
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/62:IGNORE_main:ignore_manytypes
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#33
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/63:IGNORE_apex:Create_some_records
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/63:IGNORE_apex:ignore_label=apex
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/63:IGNORE_apex:ignore_type=txt
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/63:IGNORE_apex:ignore_target=1.2.3.4
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/63:IGNORE_apex:ignore_manytypes
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#34
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/64:IGNORE_NAME_function:Create_some_records
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/64:IGNORE_NAME_function:ignore_foo
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/64:IGNORE_NAME_function:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/64:IGNORE_NAME_function:Create_some_records#01
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/64:IGNORE_NAME_function:ignore_*.foo
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/64:IGNORE_NAME_function:Empty#01
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/64:IGNORE_NAME_function:Create_some_records#02
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/64:IGNORE_NAME_function:ignore_*.foo_while_we_add_1
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#35
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/65:IGNORE_NAME_apex:Create_some_records
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/65:IGNORE_NAME_apex:ignore_apex
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/65:IGNORE_NAME_apex:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/65:IGNORE_NAME_apex:Add_a_new_record_-_ignoring_apex
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#36
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/66:IGNORE_TARGET_function_CNAME:Create_some_records
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/66:IGNORE_TARGET_function_CNAME:ignoring_CNAME=test.foo.com.
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/66:IGNORE_TARGET_function_CNAME:ignoring_CNAME=test.foo.com._and_add
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#37
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/67:IGNORE_TARGET_function_CNAME*:Create_some_records
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/67:IGNORE_TARGET_function_CNAME*:ignoring_CNAME=test.foo.com.
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/67:IGNORE_TARGET_function_CNAME*:ignoring_CNAME=test.foo.com._and_add
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#38
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/68:IGNORE_TARGET_function_CNAME**:Create_some_records
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/68:IGNORE_TARGET_function_CNAME**:ignoring_CNAME=test.foo.com.
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/68:IGNORE_TARGET_function_CNAME**:ignoring_CNAME=test.foo.com._and_add
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#39
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/69:IGNORE_TARGET_b2285:Create_some_records
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/69:IGNORE_TARGET_b2285:Add_a_new_record_-_ignoring_test.foo.com.
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/70:structured_TXT_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/71:structured_TXT_as_native_records_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#40
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/72:final:final
--- PASS: TestDNSProviders (198.55s)
    --- PASS: TestDNSProviders/dnscontrol-20231226122119.com (198.55s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty (1.84s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/00:A:Create_A (0.73s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/00:A:Change_A_target (0.78s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#01 (0.43s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/01:Apex:Create_A (0.88s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/01:Apex:Change_A_target (0.78s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#02 (0.53s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/02:Protocol-Wildcard:Create_wildcard (1.04s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/02:Protocol-Wildcard:Delete_wildcard (0.79s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#03 (0.45s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/03:AAAA:Create_AAAA (0.86s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/03:AAAA:Change_AAAA_target (0.79s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#04 (0.44s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/04:CNAME:Create_a_CNAME (0.88s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/04:CNAME:Change_CNAME_target (0.78s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#05 (0.45s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/05:MX:Create_MX (0.77s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/05:MX:Change_MX_target (0.75s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/05:MX:Change_MX_p (0.71s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#06 (0.52s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/06:TXT:Create_TXT (0.87s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/06:TXT:Change_TXT_target (0.72s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#07 (0.73s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/07:ManyAtOnce:CreateManyAtLabel (1.16s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/07:ManyAtOnce:Empty (0.77s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/07:ManyAtOnce:Create_an_A_record (0.71s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/07:ManyAtOnce:Add_at_label1 (0.75s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/07:ManyAtOnce:Add_at_label2 (0.69s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#08 (0.79s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/08:manyTypesAtOnce:CreateManyTypesAtLabel (1.02s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/08:manyTypesAtOnce:Empty (0.77s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/08:manyTypesAtOnce:Create_an_A_record (0.69s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/08:manyTypesAtOnce:Add_Type_At_Label (0.76s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/08:manyTypesAtOnce:Add_Type_At_Label#01 (0.70s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#09 (0.79s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/09:Attl:Create_Arc (0.68s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/09:Attl:Change_TTL (0.75s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#10 (0.50s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/10:TTL:Start (1.05s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/10:TTL:Change_a_ttl (0.69s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/10:TTL:Change_single_target_from_set (0.68s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/10:TTL:Change_all_ttls (1.40s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#11 (0.80s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/11:add_to_label_and_change_orig_ttl:Setup (0.75s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/11:add_to_label_and_change_orig_ttl:Add_at_same_label,_new_ttl (0.93s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#12 (0.70s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/12:TypeChange:Create_A (0.87s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/12:TypeChange:Change_to_MX (0.96s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/12:TypeChange:Change_back_to_A (1.05s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#13 (0.61s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/13:TypeChangeHard:Create_a_CNAME (0.78s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/13:TypeChangeHard:Change_to_A_record (0.92s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/13:TypeChangeHard:Change_back_to_CNAME (0.92s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#14 (0.53s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/14:CNAME:Record_pointing_to_@ (1.04s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#15 (0.70s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/15:MX:Record_pointing_to_@ (1.01s)
        --- SKIP: TestDNSProviders/dnscontrol-20231226122119.com/15:MX:Null_MX (0.00s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/16:NS_***SKIPPED(excluded_by_not("DNSIMPLE"))***:Empty (0.63s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#16 (0.29s)
        --- SKIP: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:a_0-byte_TXT (0.00s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:a_254-byte_TXT (0.69s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:a_255-byte_TXT (0.88s)
        --- SKIP: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:a_256-byte_TXT (0.00s)
        --- SKIP: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:a_509-byte_TXT (0.00s)
        --- SKIP: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:a_510-byte_TXT (0.00s)
        --- SKIP: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:a_511-byte_TXT (0.00s)
        --- SKIP: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:a_764-byte_TXT (0.00s)
        --- SKIP: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:a_765-byte_TXT (0.00s)
        --- SKIP: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:a_766-byte_TXT (0.00s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_with_1_single-quote (1.18s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_with_1_backtick (0.91s)
        --- SKIP: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_with_1_dq-1interior (0.00s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_with_2_dq-2interior (0.85s)
        --- SKIP: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_with_1_dq-left (0.00s)
        --- SKIP: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_with_1_dq-right (0.00s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_with_semicolon (0.97s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_with_semicolon_ws (0.91s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_interior_ws (0.92s)
        --- SKIP: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_trailing_ws (0.00s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:Create_a_TXT/SPF (0.85s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_with_1_backslash (0.98s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_with_2_backslash (0.93s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_with_3_backslash (0.91s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:TXT_with_4_backslash (0.84s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#17 (0.51s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/18:TXT_backslashes:TXT_with_backslashs (1.40s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#18 (0.96s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/19:Case_Sensitivity:Create_CAPS (0.75s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/19:Case_Sensitivity:Downcase_label (0.69s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/19:Case_Sensitivity:Downcase_target (0.90s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/19:Case_Sensitivity:Upcase_both (0.90s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#19 (0.92s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/20:testByLabel:initial (0.85s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/20:testByLabel:changeOne (0.74s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/20:testByLabel:deleteOne (0.76s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/20:testByLabel:addOne (0.79s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#20 (0.70s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/21:testByRecordSet:initial (1.40s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/21:testByRecordSet:changeOne (0.78s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/21:testByRecordSet:deleteOne (0.70s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/21:testByRecordSet:addOne (0.74s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#21 (1.11s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/22:IDNA:Internationalized_name (0.76s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/22:IDNA:Change_IDN (0.76s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/22:IDNA:Internationalized_CNAME_Target (0.92s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#22 (0.42s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/23:IDNAs_in_CNAME_targets:IDN_CNAME_AND_Target (0.75s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#23 (0.42s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/24:pager101:99_records (18.46s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/24:pager101:100_records (1.73s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/24:pager101:101_records (1.70s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/25:pager601_***SKIPPED(disabled_by_only)***:Empty (19.01s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/26:pager1201_***SKIPPED(disabled_by_only)***:Empty (0.28s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#24 (0.36s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/27:CAA:CAA_record (0.74s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/27:CAA:CAA_change_tag (0.89s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/27:CAA:CAA_change_target (0.82s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/27:CAA:CAA_change_flag (1.29s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/27:CAA:CAA_many_records (1.05s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/27:CAA:CAA_whitespace (0.99s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/28:LOC_***SKIPPED(CanUseLOC_not_supported)***:Empty (0.58s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#25 (0.32s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_record (0.86s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_second_record (0.91s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_delete_record (0.86s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_change_target (0.85s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_change_order (0.91s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_change_preference (0.86s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_change_flags (0.80s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_change_service (0.76s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_change_regexp (1.19s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#26 (0.59s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/30:PTR:Create_PTR_record (0.98s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/30:PTR:Modify_PTR_record (1.05s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/31:SOA_***SKIPPED(CanUseSOA_not_supported)***:Empty (0.56s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#27 (0.50s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:SRV_record (1.04s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Second_SRV_record,_same_prio (1.04s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:3_SRV (1.05s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Delete_one (1.05s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Change_Target (1.05s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Change_Priority (1.04s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Change_Weight (1.07s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Change_Port (1.04s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Empty (0.72s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Null_Target (0.84s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#28 (0.45s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/33:SRV:Create_SRV333 (0.74s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/33:SRV:Change_TTL999 (0.78s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#29 (0.52s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/34:SSHFP:SSHFP_record (0.79s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/34:SSHFP:SSHFP_change_algorithm (0.78s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/34:SSHFP:SSHFP_change_fingerprint_and_type (1.05s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/35:TLSA_***SKIPPED(CanUseTLSA_not_supported)***:Empty (0.52s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/36:DS_***SKIPPED(CanUseDS_not_supported)***:Empty (0.28s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/37:DS_(children_only)_***SKIPPED(CanUseDSForChildren_not_supported)***:Empty (0.28s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/38:DS_(children_only)_CLOUDNS_***SKIPPED(CanUseDSForChildren_not_supported)***:Empty (0.28s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/39:DHCID_***SKIPPED(CanUseDHCID_not_supported)***:Empty (0.34s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#30 (0.27s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/40:ALIAS_on_apex:ALIAS_at_root (0.77s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/40:ALIAS_on_apex:change_it (0.77s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#31 (0.48s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/41:ALIAS_on_subdomain:ALIAS_at_subdomain (0.84s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/41:ALIAS_on_subdomain:change_it (0.77s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/42:AZURE_ALIAS_A_***SKIPPED(CanUseAzureAlias_not_supported)***:Empty (0.50s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/43:AZURE_ALIAS_CNAME_***SKIPPED(CanUseAzureAlias_not_supported)***:Empty (0.30s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/44:R53_ALIAS2_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty (0.28s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/45:R53_ALIAS_ORDER_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty (0.28s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/46:R53_ALIAS_CNAME_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty (0.35s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/47:R53_ALIAS_Loop_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty (0.28s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/48:R53_alias_pre-existing_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty (0.28s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/49:R53_alias_evaluate_target_health_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty (0.28s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/50:CF_REDIRECT_***SKIPPED(disabled_by_only)***:Empty (0.35s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/51:CF_PROXY_A_create_***SKIPPED(disabled_by_only)***:Empty (0.28s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/52:CF_PROXY_A_off_to_X_***SKIPPED(disabled_by_only)***:Empty (0.28s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/53:CF_PROXY_A_on_to_X_***SKIPPED(disabled_by_only)***:Empty (0.36s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/54:CF_PROXY_A_full1_to_X_***SKIPPED(disabled_by_only)***:Empty (0.28s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/55:CF_PROXY_A_full2_to_X_***SKIPPED(disabled_by_only)***:Empty (0.28s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/56:CF_PROXY_CNAME_create_***SKIPPED(disabled_by_only)***:Empty (0.28s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/57:CF_PROXY_CNAME_off_to_X_***SKIPPED(disabled_by_only)***:Empty (0.35s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/58:CF_PROXY_CNAME_on_to_X_***SKIPPED(disabled_by_only)***:Empty (0.29s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/59:CF_PROXY_CNAME_full_to_X_***SKIPPED(disabled_by_only)***:Empty (0.28s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/60:CF_WORKER_ROUTE_***SKIPPED(disabled_by_only)***:Empty (0.35s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/61:NS1_URLFWD_tests_***SKIPPED(disabled_by_only)***:Empty (0.28s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#32 (0.28s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/62:IGNORE_main:Create_some_records (1.15s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/62:IGNORE_main:ignore_label=foo (0.55s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/62:IGNORE_main:ignore_type=txt (0.63s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/62:IGNORE_main:ignore_target=1.2.3.4 (0.57s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/62:IGNORE_main:ignore_manytypes (0.57s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#33 (0.85s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/63:IGNORE_apex:Create_some_records (0.88s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/63:IGNORE_apex:ignore_label=apex (0.26s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/63:IGNORE_apex:ignore_type=txt (0.53s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/63:IGNORE_apex:ignore_target=1.2.3.4 (0.52s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/63:IGNORE_apex:ignore_manytypes (0.26s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#34 (0.69s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/64:IGNORE_NAME_function:Create_some_records (1.02s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/64:IGNORE_NAME_function:ignore_foo (0.52s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/64:IGNORE_NAME_function:Empty (0.78s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/64:IGNORE_NAME_function:Create_some_records#01 (1.09s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/64:IGNORE_NAME_function:ignore_*.foo (0.53s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/64:IGNORE_NAME_function:Empty#01 (0.97s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/64:IGNORE_NAME_function:Create_some_records#02 (0.96s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/64:IGNORE_NAME_function:ignore_*.foo_while_we_add_1 (0.69s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#35 (0.80s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/65:IGNORE_NAME_apex:Create_some_records (1.39s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/65:IGNORE_NAME_apex:ignore_apex (0.53s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/65:IGNORE_NAME_apex:Empty (0.95s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/65:IGNORE_NAME_apex:Add_a_new_record_-_ignoring_apex (1.28s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#36 (0.78s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/66:IGNORE_TARGET_function_CNAME:Create_some_records (0.91s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/66:IGNORE_TARGET_function_CNAME:ignoring_CNAME=test.foo.com. (0.52s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/66:IGNORE_TARGET_function_CNAME:ignoring_CNAME=test.foo.com._and_add (0.92s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#37 (0.96s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/67:IGNORE_TARGET_function_CNAME*:Create_some_records (1.14s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/67:IGNORE_TARGET_function_CNAME*:ignoring_CNAME=test.foo.com. (0.53s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/67:IGNORE_TARGET_function_CNAME*:ignoring_CNAME=test.foo.com._and_add (0.92s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#38 (1.22s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/68:IGNORE_TARGET_function_CNAME**:Create_some_records (1.13s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/68:IGNORE_TARGET_function_CNAME**:ignoring_CNAME=test.foo.com. (0.52s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/68:IGNORE_TARGET_function_CNAME**:ignoring_CNAME=test.foo.com._and_add (0.92s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#39 (1.13s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/69:IGNORE_TARGET_b2285:Create_some_records (0.96s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/69:IGNORE_TARGET_b2285:Add_a_new_record_-_ignoring_test.foo.com. (0.26s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/70:structured_TXT_***SKIPPED(disabled_by_only)***:Empty (0.67s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/71:structured_TXT_as_native_records_***SKIPPED(disabled_by_only)***:Empty (0.26s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#40 (0.27s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/72:final:final (0.69s)
=== RUN   TestDualProviders
    integration_test.go:348: Skipping.  DocDualHost == Cannot
--- SKIP: TestDualProviders (0.00s)
=== RUN   TestNameserverDots
    integration_test.go:412: Skipping.  DocDualHost == Cannot
--- SKIP: TestNameserverDots (0.00s)
PASS
ok  	github.com/StackExchange/dnscontrol/v4/integrationTest	198.985s

They were failing before, with the current version:

go test -v -provider DNSIMPLE
=== RUN   TestDNSProviders
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/00:A:Create_A
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/00:A:Change_A_target
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#01
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/01:Apex:Create_A
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/01:Apex:Change_A_target
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#02
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/02:Protocol-Wildcard:Create_wildcard
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/02:Protocol-Wildcard:Delete_wildcard
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#03
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/03:AAAA:Create_AAAA
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/03:AAAA:Change_AAAA_target
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#04
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/04:CNAME:Create_a_CNAME
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/04:CNAME:Change_CNAME_target
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#05
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/05:MX:Create_MX
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/05:MX:Change_MX_target
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/05:MX:Change_MX_p
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#06
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/06:TXT:Create_TXT
    integration_test.go:268: Expected 0 corrections on second run, but found 1.
    integration_test.go:270: UNEXPECTED #0: ± MODIFY TXT testtxt.dnscontrol-20231226122119.com: ("\"simple\"" ttl=300) -> ("simple" ttl=300)
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#07
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/07:ManyAtOnce:CreateManyAtLabel
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/07:ManyAtOnce:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/07:ManyAtOnce:Create_an_A_record
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/07:ManyAtOnce:Add_at_label1
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/07:ManyAtOnce:Add_at_label2
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#08
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/08:manyTypesAtOnce:CreateManyTypesAtLabel
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/08:manyTypesAtOnce:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/08:manyTypesAtOnce:Create_an_A_record
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/08:manyTypesAtOnce:Add_Type_At_Label
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/08:manyTypesAtOnce:Add_Type_At_Label#01
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#09
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/09:Attl:Create_Arc
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/09:Attl:Change_TTL
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#10
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/10:TTL:Start
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/10:TTL:Change_a_ttl
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/10:TTL:Change_single_target_from_set
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/10:TTL:Change_all_ttls
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#11
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/11:add_to_label_and_change_orig_ttl:Setup
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/11:add_to_label_and_change_orig_ttl:Add_at_same_label,_new_ttl
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#12
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/12:TypeChange:Create_A
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/12:TypeChange:Change_to_MX
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/12:TypeChange:Change_back_to_A
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#13
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/13:TypeChangeHard:Create_a_CNAME
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/13:TypeChangeHard:Change_to_A_record
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/13:TypeChangeHard:Change_back_to_CNAME
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#14
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/14:CNAME:Record_pointing_to_@
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#15
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/15:MX:Record_pointing_to_@
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/15:MX:Null_MX
    integration_test.go:225: ***SKIPPED(PROVIDER DOES NOT SUPPORT '[mx has null target]' ::"15:MX")
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/16:NS_***SKIPPED(excluded_by_not("DNSIMPLE"))***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#16
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:a_0-byte_TXT
    integration_test.go:225: ***SKIPPED(PROVIDER DOES NOT SUPPORT '[txtstring is empty]' ::"17:complex TXT")
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:a_254-byte_TXT
    integration_test.go:268: Expected 0 corrections on second run, but found 1.
    integration_test.go:270: UNEXPECTED #0: ± MODIFY TXT foo254.dnscontrol-20231226122119.com: ("\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "\"" ttl=300) -> ("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" ttl=300)
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#17
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/18:TXT_backslashes:TXT_with_backslashs
    integration_test.go:268: Expected 0 corrections on second run, but found 4.
    integration_test.go:270: UNEXPECTED #0: ± MODIFY TXT fooosbs1.dnscontrol-20231226122119.com: ("\"1back\\\\slash\"" ttl=300) -> ("1back\\slash" ttl=300)
    integration_test.go:270: UNEXPECTED #1: ± MODIFY TXT fooosbs2.dnscontrol-20231226122119.com: ("\"2back\\\\\\\\slash\"" ttl=300) -> ("2back\\\\slash" ttl=300)
    integration_test.go:270: UNEXPECTED #2: ± MODIFY TXT fooosbs3.dnscontrol-20231226122119.com: ("\"3back\\\\\\\\\\\\slash\"" ttl=300) -> ("3back\\\\\\slash" ttl=300)
    integration_test.go:270: UNEXPECTED #3: ± MODIFY TXT fooosbs4.dnscontrol-20231226122119.com: ("\"4back\\\\\\\\\\\\\\\\slash\"" ttl=300) -> ("4back\\\\\\\\slash" ttl=300)
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#18
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/19:Case_Sensitivity:Create_CAPS
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/19:Case_Sensitivity:Downcase_label
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/19:Case_Sensitivity:Downcase_target
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/19:Case_Sensitivity:Upcase_both
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#19
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/20:testByLabel:initial
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/20:testByLabel:changeOne
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/20:testByLabel:deleteOne
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/20:testByLabel:addOne
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#20
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/21:testByRecordSet:initial
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/21:testByRecordSet:changeOne
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/21:testByRecordSet:deleteOne
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/21:testByRecordSet:addOne
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#21
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/22:IDNA:Internationalized_name
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/22:IDNA:Change_IDN
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/22:IDNA:Internationalized_CNAME_Target
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#22
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/23:IDNAs_in_CNAME_targets:IDN_CNAME_AND_Target
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#23
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/24:pager101:99_records
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/24:pager101:100_records
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/24:pager101:101_records
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/25:pager601_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/26:pager1201_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#24
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/27:CAA:CAA_record
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/27:CAA:CAA_change_tag
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/27:CAA:CAA_change_target
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/27:CAA:CAA_change_flag
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/27:CAA:CAA_many_records
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/27:CAA:CAA_whitespace
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/28:LOC_***SKIPPED(CanUseLOC_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#25
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_record
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_second_record
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_delete_record
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_change_target
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_change_order
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_change_preference
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_change_flags
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_change_service
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_change_regexp
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#26
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/30:PTR:Create_PTR_record
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/30:PTR:Modify_PTR_record
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/31:SOA_***SKIPPED(CanUseSOA_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#27
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:SRV_record
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Second_SRV_record,_same_prio
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:3_SRV
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Delete_one
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Change_Target
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Change_Priority
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Change_Weight
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Change_Port
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Null_Target
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#28
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/33:SRV:Create_SRV333
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/33:SRV:Change_TTL999
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#29
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/34:SSHFP:SSHFP_record
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/34:SSHFP:SSHFP_change_algorithm
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/34:SSHFP:SSHFP_change_fingerprint_and_type
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/35:TLSA_***SKIPPED(CanUseTLSA_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/36:DS_***SKIPPED(CanUseDS_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/37:DS_(children_only)_***SKIPPED(CanUseDSForChildren_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/38:DS_(children_only)_CLOUDNS_***SKIPPED(CanUseDSForChildren_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/39:DHCID_***SKIPPED(CanUseDHCID_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#30
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/40:ALIAS_on_apex:ALIAS_at_root
    integration_test.go:268: Expected 0 corrections on second run, but found 1.
    integration_test.go:270: UNEXPECTED #0: - DELETE TXT dnscontrol-20231226122119.com "\"ALIAS for foo.com\"" ttl=300
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#31
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/41:ALIAS_on_subdomain:ALIAS_at_subdomain
    integration_test.go:268: Expected 0 corrections on second run, but found 1.
    integration_test.go:270: UNEXPECTED #0: - DELETE TXT test.dnscontrol-20231226122119.com "\"ALIAS for foo.com\"" ttl=300
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/42:AZURE_ALIAS_A_***SKIPPED(CanUseAzureAlias_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/43:AZURE_ALIAS_CNAME_***SKIPPED(CanUseAzureAlias_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/44:R53_ALIAS2_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/45:R53_ALIAS_ORDER_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/46:R53_ALIAS_CNAME_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/47:R53_ALIAS_Loop_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/48:R53_alias_pre-existing_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/49:R53_alias_evaluate_target_health_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/50:CF_REDIRECT_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/51:CF_PROXY_A_create_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/52:CF_PROXY_A_off_to_X_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/53:CF_PROXY_A_on_to_X_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/54:CF_PROXY_A_full1_to_X_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/55:CF_PROXY_A_full2_to_X_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/56:CF_PROXY_CNAME_create_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/57:CF_PROXY_CNAME_off_to_X_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/58:CF_PROXY_CNAME_on_to_X_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/59:CF_PROXY_CNAME_full_to_X_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/60:CF_WORKER_ROUTE_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/61:NS1_URLFWD_tests_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#32
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/62:IGNORE_main:Create_some_records
    integration_test.go:268: Expected 0 corrections on second run, but found 1.
    integration_test.go:270: UNEXPECTED #0: ± MODIFY TXT foo.dnscontrol-20231226122119.com: ("\"simple\"" ttl=300) -> ("simple" ttl=300)
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#33
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/63:IGNORE_apex:Create_some_records
    integration_test.go:268: Expected 0 corrections on second run, but found 1.
    integration_test.go:270: UNEXPECTED #0: ± MODIFY TXT dnscontrol-20231226122119.com: ("\"simple\"" ttl=300) -> ("simple" ttl=300)
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#34
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/64:IGNORE_NAME_function:Create_some_records
    integration_test.go:268: Expected 0 corrections on second run, but found 1.
    integration_test.go:270: UNEXPECTED #0: ± MODIFY TXT foo.dnscontrol-20231226122119.com: ("\"simple\"" ttl=300) -> ("simple" ttl=300)
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#35
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/65:IGNORE_NAME_apex:Create_some_records
    integration_test.go:268: Expected 0 corrections on second run, but found 2.
    integration_test.go:270: UNEXPECTED #0: ± MODIFY TXT dnscontrol-20231226122119.com: ("\"simple\"" ttl=300) -> ("simple" ttl=300)
    integration_test.go:270: UNEXPECTED #1: ± MODIFY TXT bar.dnscontrol-20231226122119.com: ("\"stringbar\"" ttl=300) -> ("stringbar" ttl=300)
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#36
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/66:IGNORE_TARGET_function_CNAME:Create_some_records
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/66:IGNORE_TARGET_function_CNAME:ignoring_CNAME=test.foo.com.
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/66:IGNORE_TARGET_function_CNAME:ignoring_CNAME=test.foo.com._and_add
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#37
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/67:IGNORE_TARGET_function_CNAME*:Create_some_records
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/67:IGNORE_TARGET_function_CNAME*:ignoring_CNAME=test.foo.com.
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/67:IGNORE_TARGET_function_CNAME*:ignoring_CNAME=test.foo.com._and_add
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#38
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/68:IGNORE_TARGET_function_CNAME**:Create_some_records
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/68:IGNORE_TARGET_function_CNAME**:ignoring_CNAME=test.foo.com.
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/68:IGNORE_TARGET_function_CNAME**:ignoring_CNAME=test.foo.com._and_add
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#39
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/69:IGNORE_TARGET_b2285:Create_some_records
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/69:IGNORE_TARGET_b2285:Add_a_new_record_-_ignoring_test.foo.com.
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/70:structured_TXT_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/71:structured_TXT_as_native_records_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#40
=== RUN   TestDNSProviders/dnscontrol-20231226122119.com/72:final:final
    integration_test.go:268: Expected 0 corrections on second run, but found 1.
    integration_test.go:270: UNEXPECTED #0: ± MODIFY TXT final.dnscontrol-20231226122119.com: ("\"TestDNSProviders was successful!\"" ttl=300) -> ("TestDNSProviders was successful!" ttl=300)
--- FAIL: TestDNSProviders (167.80s)
    --- FAIL: TestDNSProviders/dnscontrol-20231226122119.com (167.80s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty (1.84s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/00:A:Create_A (0.67s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/00:A:Change_A_target (0.68s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#01 (0.42s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/01:Apex:Create_A (0.75s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/01:Apex:Change_A_target (0.74s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#02 (0.44s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/02:Protocol-Wildcard:Create_wildcard (0.88s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/02:Protocol-Wildcard:Delete_wildcard (0.67s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#03 (0.42s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/03:AAAA:Create_AAAA (0.73s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/03:AAAA:Change_AAAA_target (0.70s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#04 (0.44s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/04:CNAME:Create_a_CNAME (0.73s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/04:CNAME:Change_CNAME_target (0.76s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#05 (0.44s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/05:MX:Create_MX (0.77s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/05:MX:Change_MX_target (0.76s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/05:MX:Change_MX_p (0.67s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#06 (0.42s)
        --- FAIL: TestDNSProviders/dnscontrol-20231226122119.com/06:TXT:Create_TXT (0.68s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#07 (0.49s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/07:ManyAtOnce:CreateManyAtLabel (1.28s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/07:ManyAtOnce:Empty (0.87s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/07:ManyAtOnce:Create_an_A_record (0.84s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/07:ManyAtOnce:Add_at_label1 (0.70s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/07:ManyAtOnce:Add_at_label2 (0.87s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#08 (0.80s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/08:manyTypesAtOnce:CreateManyTypesAtLabel (1.08s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/08:manyTypesAtOnce:Empty (0.80s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/08:manyTypesAtOnce:Create_an_A_record (0.78s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/08:manyTypesAtOnce:Add_Type_At_Label (0.90s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/08:manyTypesAtOnce:Add_Type_At_Label#01 (0.90s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#09 (0.78s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/09:Attl:Create_Arc (0.78s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/09:Attl:Change_TTL (0.70s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#10 (0.43s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/10:TTL:Start (1.11s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/10:TTL:Change_a_ttl (0.78s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/10:TTL:Change_single_target_from_set (0.68s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/10:TTL:Change_all_ttls (1.03s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#11 (1.10s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/11:add_to_label_and_change_orig_ttl:Setup (0.86s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/11:add_to_label_and_change_orig_ttl:Add_at_same_label,_new_ttl (1.03s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#12 (0.71s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/12:TypeChange:Create_A (0.87s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/12:TypeChange:Change_to_MX (1.05s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/12:TypeChange:Change_back_to_A (1.05s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#13 (0.52s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/13:TypeChangeHard:Create_a_CNAME (0.81s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/13:TypeChangeHard:Change_to_A_record (1.04s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/13:TypeChangeHard:Change_back_to_CNAME (0.92s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#14 (0.55s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/14:CNAME:Record_pointing_to_@ (1.00s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#15 (0.65s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/15:MX:Record_pointing_to_@ (0.93s)
        --- SKIP: TestDNSProviders/dnscontrol-20231226122119.com/15:MX:Null_MX (0.00s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/16:NS_***SKIPPED(excluded_by_not("DNSIMPLE"))***:Empty (0.64s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#16 (0.28s)
        --- SKIP: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:a_0-byte_TXT (0.00s)
        --- FAIL: TestDNSProviders/dnscontrol-20231226122119.com/17:complex_TXT:a_254-byte_TXT (0.80s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#17 (0.45s)
        --- FAIL: TestDNSProviders/dnscontrol-20231226122119.com/18:TXT_backslashes:TXT_with_backslashs (1.36s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#18 (1.06s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/19:Case_Sensitivity:Create_CAPS (1.04s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/19:Case_Sensitivity:Downcase_label (0.81s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/19:Case_Sensitivity:Downcase_target (0.76s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/19:Case_Sensitivity:Upcase_both (0.82s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#19 (0.76s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/20:testByLabel:initial (1.05s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/20:testByLabel:changeOne (0.80s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/20:testByLabel:deleteOne (0.77s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/20:testByLabel:addOne (0.80s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#20 (0.64s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/21:testByRecordSet:initial (1.47s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/21:testByRecordSet:changeOne (0.89s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/21:testByRecordSet:deleteOne (0.75s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/21:testByRecordSet:addOne (0.82s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#21 (1.28s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/22:IDNA:Internationalized_name (0.81s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/22:IDNA:Change_IDN (0.74s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/22:IDNA:Internationalized_CNAME_Target (0.97s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#22 (0.48s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/23:IDNAs_in_CNAME_targets:IDN_CNAME_AND_Target (0.96s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#23 (0.42s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/24:pager101:99_records (18.83s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/24:pager101:100_records (1.47s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/24:pager101:101_records (1.54s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/25:pager601_***SKIPPED(disabled_by_only)***:Empty (18.49s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/26:pager1201_***SKIPPED(disabled_by_only)***:Empty (0.26s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#24 (0.26s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/27:CAA:CAA_record (0.68s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/27:CAA:CAA_change_tag (0.69s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/27:CAA:CAA_change_target (0.76s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/27:CAA:CAA_change_flag (0.75s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/27:CAA:CAA_many_records (0.70s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/27:CAA:CAA_whitespace (0.87s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/28:LOC_***SKIPPED(CanUseLOC_not_supported)***:Empty (0.57s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#25 (0.36s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_record (0.69s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_second_record (0.75s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_delete_record (0.68s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_change_target (0.69s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_change_order (1.06s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_change_preference (0.85s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_change_flags (0.73s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_change_service (0.85s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/29:NAPTR:NAPTR_change_regexp (0.73s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#26 (0.49s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/30:PTR:Create_PTR_record (0.87s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/30:PTR:Modify_PTR_record (0.73s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/31:SOA_***SKIPPED(CanUseSOA_not_supported)***:Empty (0.50s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#27 (0.35s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:SRV_record (0.73s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Second_SRV_record,_same_prio (0.84s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:3_SRV (0.73s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Delete_one (0.84s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Change_Target (0.73s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Change_Priority (0.85s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Change_Weight (0.73s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Change_Port (0.84s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Empty (0.63s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/32:SRV:Null_Target (0.81s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#28 (0.53s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/33:SRV:Create_SRV333 (0.80s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/33:SRV:Change_TTL999 (1.02s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#29 (0.44s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/34:SSHFP:SSHFP_record (0.68s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/34:SSHFP:SSHFP_change_algorithm (0.75s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/34:SSHFP:SSHFP_change_fingerprint_and_type (0.75s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/35:TLSA_***SKIPPED(CanUseTLSA_not_supported)***:Empty (0.46s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/36:DS_***SKIPPED(CanUseDS_not_supported)***:Empty (0.34s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/37:DS_(children_only)_***SKIPPED(CanUseDSForChildren_not_supported)***:Empty (0.25s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/38:DS_(children_only)_CLOUDNS_***SKIPPED(CanUseDSForChildren_not_supported)***:Empty (0.27s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/39:DHCID_***SKIPPED(CanUseDHCID_not_supported)***:Empty (0.25s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#30 (0.27s)
        --- FAIL: TestDNSProviders/dnscontrol-20231226122119.com/40:ALIAS_on_apex:ALIAS_at_root (0.79s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#31 (0.61s)
        --- FAIL: TestDNSProviders/dnscontrol-20231226122119.com/41:ALIAS_on_subdomain:ALIAS_at_subdomain (0.83s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/42:AZURE_ALIAS_A_***SKIPPED(CanUseAzureAlias_not_supported)***:Empty (0.62s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/43:AZURE_ALIAS_CNAME_***SKIPPED(CanUseAzureAlias_not_supported)***:Empty (0.30s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/44:R53_ALIAS2_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty (0.25s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/45:R53_ALIAS_ORDER_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty (0.27s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/46:R53_ALIAS_CNAME_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty (0.26s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/47:R53_ALIAS_Loop_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty (0.27s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/48:R53_alias_pre-existing_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty (0.25s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/49:R53_alias_evaluate_target_health_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty (0.27s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/50:CF_REDIRECT_***SKIPPED(disabled_by_only)***:Empty (0.26s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/51:CF_PROXY_A_create_***SKIPPED(disabled_by_only)***:Empty (0.27s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/52:CF_PROXY_A_off_to_X_***SKIPPED(disabled_by_only)***:Empty (0.25s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/53:CF_PROXY_A_on_to_X_***SKIPPED(disabled_by_only)***:Empty (0.27s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/54:CF_PROXY_A_full1_to_X_***SKIPPED(disabled_by_only)***:Empty (0.26s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/55:CF_PROXY_A_full2_to_X_***SKIPPED(disabled_by_only)***:Empty (0.26s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/56:CF_PROXY_CNAME_create_***SKIPPED(disabled_by_only)***:Empty (0.25s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/57:CF_PROXY_CNAME_off_to_X_***SKIPPED(disabled_by_only)***:Empty (0.27s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/58:CF_PROXY_CNAME_on_to_X_***SKIPPED(disabled_by_only)***:Empty (0.25s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/59:CF_PROXY_CNAME_full_to_X_***SKIPPED(disabled_by_only)***:Empty (0.28s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/60:CF_WORKER_ROUTE_***SKIPPED(disabled_by_only)***:Empty (0.26s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/61:NS1_URLFWD_tests_***SKIPPED(disabled_by_only)***:Empty (0.39s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#32 (0.40s)
        --- FAIL: TestDNSProviders/dnscontrol-20231226122119.com/62:IGNORE_main:Create_some_records (1.31s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#33 (0.79s)
        --- FAIL: TestDNSProviders/dnscontrol-20231226122119.com/63:IGNORE_apex:Create_some_records (0.96s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#34 (0.70s)
        --- FAIL: TestDNSProviders/dnscontrol-20231226122119.com/64:IGNORE_NAME_function:Create_some_records (1.10s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#35 (0.78s)
        --- FAIL: TestDNSProviders/dnscontrol-20231226122119.com/65:IGNORE_NAME_apex:Create_some_records (1.32s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#36 (0.95s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/66:IGNORE_TARGET_function_CNAME:Create_some_records (0.92s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/66:IGNORE_TARGET_function_CNAME:ignoring_CNAME=test.foo.com. (0.51s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/66:IGNORE_TARGET_function_CNAME:ignoring_CNAME=test.foo.com._and_add (0.90s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#37 (0.96s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/67:IGNORE_TARGET_function_CNAME*:Create_some_records (1.13s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/67:IGNORE_TARGET_function_CNAME*:ignoring_CNAME=test.foo.com. (0.52s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/67:IGNORE_TARGET_function_CNAME*:ignoring_CNAME=test.foo.com._and_add (0.92s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#38 (1.13s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/68:IGNORE_TARGET_function_CNAME**:Create_some_records (1.10s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/68:IGNORE_TARGET_function_CNAME**:ignoring_CNAME=test.foo.com. (0.53s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/68:IGNORE_TARGET_function_CNAME**:ignoring_CNAME=test.foo.com._and_add (1.09s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#39 (1.26s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/69:IGNORE_TARGET_b2285:Create_some_records (0.84s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/69:IGNORE_TARGET_b2285:Add_a_new_record_-_ignoring_test.foo.com. (0.33s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/70:structured_TXT_***SKIPPED(disabled_by_only)***:Empty (0.58s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/71:structured_TXT_as_native_records_***SKIPPED(disabled_by_only)***:Empty (0.25s)
        --- PASS: TestDNSProviders/dnscontrol-20231226122119.com/Clean_Slate:Empty#40 (0.34s)
        --- FAIL: TestDNSProviders/dnscontrol-20231226122119.com/72:final:final (0.69s)
=== RUN   TestDualProviders
    integration_test.go:348: Skipping.  DocDualHost == Cannot
--- SKIP: TestDualProviders (0.00s)
=== RUN   TestNameserverDots
    integration_test.go:412: Skipping.  DocDualHost == Cannot
--- SKIP: TestNameserverDots (0.00s)
FAIL
exit status 1
FAIL	github.com/StackExchange/dnscontrol/v4/integrationTest	168.155s

Copy link
Copy Markdown
Contributor

@philpennock philpennock left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Works for me with our domains.

Would be good to have clarification in the DNSimple docs that the string quoting is the RFC-format -- it would be poor to have DNSControl and DNSimple disagree on quoting of characters.

@tlimoncelli
Copy link
Copy Markdown
Contributor

Looks good!

I agree with point (1) and (2). (1) A little duplication that makes it easy to clean up later is better than complex code, (2) I like how you mutate the string to force an update... I might use that in the future for other projects.

Best,
Tom

CC @onlyhavecans for visibility

@weppos
Copy link
Copy Markdown
Contributor Author

weppos commented Dec 28, 2023

Thanks for your feedback @tlimoncelli. I incorporated some additional changes from @philpennock proposal, I think this PR is now good to go.

// new client
client := dnsimpleapi.NewClient(tc)
client.SetUserAgent("DNSControl")
client.SetUserAgent(fmt.Sprintf("%s/%s", "dnscontrol", version.Banner()))
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@tlimoncelli, @weppos better early than late, this change will conflict/break with #2737.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the heads up @cafferata, really appreciated.

I don't want to cause any delay in this or the other PR. Therefore, I reverted the change. It was not essential and could be easily applied later on.

Prevent conflict with #2737
See #2745 (review)

This reverts commit 455c35b.
Copy link
Copy Markdown
Contributor

@philpennock philpennock left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Still LGTM but if this is an official DNSimple update then hopefully you can do better than my "assumed to be" text in the docs on the limitations. 😆

@tlimoncelli
Copy link
Copy Markdown
Contributor

I'm super excited to get a PR from the CTO of https://github.com/dnsimple himself! Thank you so much for contributing to this project.

Please let me know if there's anything we can do to make DNSControl better for DNSimple users. If you have a OTE or testing account we can add DNSimple to the CICD pipeline.

@tlimoncelli tlimoncelli merged commit 4cd3c78 into StackExchange:master Jan 2, 2024
@weppos
Copy link
Copy Markdown
Contributor Author

weppos commented Jan 3, 2024

Still LGTM but if this is an official DNSimple update then hopefully you can do better than my "assumed to be" text in the docs on the limitations. 😆

It's a fair request! 😉 I'll engage the team to review and clarify, we'll follow up with a new PR soon. I plan to cleanup the compatibility branching anyways after the transitioning period is over.

@weppos weppos deleted the dnsimple/txt-quoting branch January 3, 2024 13:34
@weppos
Copy link
Copy Markdown
Contributor Author

weppos commented Jan 3, 2024

I'm super excited to get a PR from the CTO of https://github.com/dnsimple himself! Thank you so much for contributing to this project.

Hi @tlimoncelli, thanks a lot for maintaining this project. I really appreciate the effort. I am using it for all my personal domains, and I'm really happy with it. I know other DNSimple team members also use it.

Please let me know if there's anything we can do to make DNSControl better for DNSimple users. If you have a OTE or testing account we can add DNSimple to the CICD pipeline.

Absolutely! We have a sandbox environment (the equivalent of an OTE) you can use for integration tests: https://sandbox.dnsimple.com/dashboard

You can find more information about the environment at this link, including the example of credit card numbers you can use to activate a stub subscription.
https://developer.dnsimple.com/sandbox/

Let me know if you have any questions, I'll be happy to assist you in setting up the integration.

@ggalmazor
Copy link
Copy Markdown

Hi there! As per @weppos' request, we have checked the code that's responsible for enforcing this limit on TXT records, and here are our insights:

  • We are indeed counting Unicode characters, not bytes.
  • The limitation of a maximum of 1000 characters long TXT records doesn't come from DNS specs. It's a business concern that was designed into our service to prevent abuse and reduce security risks

Having said that, it's clear we should make this explicit in our docs so that we will be fixing that as soon as possible.

On the other hand, we also wanted to take the opportunity to understand better the use case in dnscontrol, so any feedback or special requirements you might have regarding this or other aspects of our service will be greatly appreciated.

@philpennock
Copy link
Copy Markdown
Contributor

philpennock commented Jan 6, 2024

My use-case is DKIM keys, and when I was unbreaking, I needed to find the actual value to set as a limit, and I just found "characters".

@tlimoncelli @weppos The documentation and the check will need updating. There are going to be open questions across providers around things like normalization forms and if strings are re-normalized on their end, to handle combining characters etc, but if we assume that DNS providers are going to be reasonable and use the string as given in an API call as the value to publish, without messing with it, then the UTF-8 encoding at least means we know how many runes there will be, and we can hopefully assume that's how the DNS providers who limit on "Unicode characters" are measuring things.

So I suspect that:

  1. rejectif.TxtLongerThan() needs a sibling rejectif.TxtRunecountLongerThan() method
    • Import unicode/utf8 and use utf8.RuneCountInString() to get this
  2. which the DNSimple provider should be using
  3. and the DNSimple folks will handle this work and test the limit edge cases? :) 🙏

@tlimoncelli
Copy link
Copy Markdown
Contributor

I have a question for @weppos about how the 1000 chars are counted. Some providers count the escape chars, not just the payload:

  • The string XXX"XXX is encoded in the API as "XXX\"XXX". Is that counted as 7 or 10? (at least one provider counts that as 10)
  • A string with 256 X chars is encoded as "XX(250chars)XXX" "X". Is that counted as 255 or 260?

Right now the code tests the payload (7 and 256). Is that correct or should it count those as 10 and 260 respectively?

As far as Unicode... I thought the RFCs (and I'll have to check) said that TXT records were just the printable 7-bit ascii chars. (The RFCs use the term "octets" to mean 8-bit bytes.... because they were written before the world standardized on 8 bits in a byte!) In that case, we should reject illegal chars at the UI level. I'd be glad to be corrected.

@philpennock
Copy link
Copy Markdown
Contributor

RFC 1035 just defines TXT as holding TXT-DATA, defined as One or more <character-string>s. and in section 3.3 says:

<character-string> is a single length octet followed by that number of characters. <character-string> is treated as binary information, and can be up to 256 characters in length (including the length octet).

So TXT can be anything, and there are no character set constraints. It doesn't have to be UTF-8. It can contain NUL characters, because it's length-prefixed.

Thus my original false assumption that "character" would be octets.

@philpennock
Copy link
Copy Markdown
Contributor

Look up the TXT records in DNS, with a tcpdump running to see the actual hex codes and strings on the wire, for:

  • txttest1.test.globnix.net : contains an embedded NUL
  • txttest2.test.globnix.net: contains a UTF-8 representation of a EURO SIGN (0x20AC -> %E2%82%AC)
  • txttest3.test.globnix.net: contains an embedded CRLF sequence

Using dig, you'll see the output in the same escape sequence used when writing the zonefile. RFC 4343 covers the escaping mechanism used by Bind zonefiles, and while it doesn't explicitly say that the same applies within double-quotes, in practice it does. The zonefile in question has:

txttest0        IN      TXT     "txttest goes up to 5"
txttest1        IN      TXT     "null\000inside"
txttest2        IN      TXT     "utf-8 \226\130\172 EURO SIGN 0x20ac"
txttest3        IN      TXT     "cr\013\010lf"
txttest4        IN      TXT     ""
txttest5        IN      TXT     "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345"

There's a lot more stress-tests in that zone-file. It's open AXFR from nlns.globnix.net if you want to grab a copy. (Attribution would be nice before capturing for re-use 😄 )

PJEilers pushed a commit to realtimeregister/dnscontrol that referenced this pull request Jan 8, 2024
@weppos
Copy link
Copy Markdown
Contributor Author

weppos commented Jan 19, 2024

@tlimoncelli @philpennock thanks for your research and questions. I was unable to follow up promptly in the last few weeks due to a busy schedule and some critical deadlines.

I'll take a look at your questions next week, and will follow up.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants