@@ -3,8 +3,11 @@ package remote
33import (
44 "bytes"
55 "crypto/md5"
6+ "crypto/tls"
7+ "crypto/x509"
68 "net/http"
79 "net/http/httptest"
10+ "net/url"
811 "os"
912 "testing"
1013 "time"
@@ -36,6 +39,53 @@ func TestAtlasClient(t *testing.T) {
3639 testClient (t , client )
3740}
3841
42+ func TestAtlasClient_noRetryOnBadCerts (t * testing.T ) {
43+ acctest .RemoteTestPrecheck (t )
44+
45+ client , err := atlasFactory (map [string ]string {
46+ "access_token" : "NOT_REQUIRED" ,
47+ "name" : "hashicorp/test-remote-state" ,
48+ })
49+ if err != nil {
50+ t .Fatalf ("bad: %s" , err )
51+ }
52+
53+ ac := client .(* AtlasClient )
54+ // trigger the AtlasClient to build the http client and assign HTTPClient
55+ httpClient , err := ac .http ()
56+ if err != nil {
57+ t .Fatal (err )
58+ }
59+
60+ // remove the CA certs from the client
61+ brokenCfg := & tls.Config {
62+ RootCAs : new (x509.CertPool ),
63+ }
64+ httpClient .HTTPClient .Transport .(* http.Transport ).TLSClientConfig = brokenCfg
65+
66+ // Instrument CheckRetry to make sure we didn't retry
67+ retries := 0
68+ oldCheck := httpClient .CheckRetry
69+ httpClient .CheckRetry = func (resp * http.Response , err error ) (bool , error ) {
70+ if retries > 0 {
71+ t .Fatal ("retried after certificate error" )
72+ }
73+ retries ++
74+ return oldCheck (resp , err )
75+ }
76+
77+ _ , err = client .Get ()
78+ if err != nil {
79+ if err , ok := err .(* url.Error ); ok {
80+ if _ , ok := err .Err .(x509.UnknownAuthorityError ); ok {
81+ return
82+ }
83+ }
84+ }
85+
86+ t .Fatalf ("expected x509.UnknownAuthorityError, got %v" , err )
87+ }
88+
3989func TestAtlasClient_ReportedConflictEqualStates (t * testing.T ) {
4090 fakeAtlas := newFakeAtlas (t , testStateModuleOrderChange )
4191 srv := fakeAtlas .Server ()
0 commit comments