11package pin
22
33import (
4+ "crypto/tls"
45 "io/ioutil"
56 "net/http"
67 "net/http/httptest"
7- "net/url "
8+ "path/filepath "
89 "strings"
910 "testing"
1011)
1112
12- var (
13- testFilesDir = "../../../testfiles/pinactions/immutableActionResponses/"
14- )
13+ type customTransport struct {
14+ base http.RoundTripper
15+ baseURL string
16+ }
17+
18+ func (t * customTransport ) RoundTrip (req * http.Request ) (* http.Response , error ) {
19+ if strings .Contains (req .URL .Host , "ghcr.io" ) {
20+ req2 := req .Clone (req .Context ())
21+ req2 .URL .Scheme = "https"
22+ req2 .URL .Host = strings .TrimPrefix (t .baseURL , "https://" )
23+ return t .base .RoundTrip (req2 )
24+ }
25+ return t .base .RoundTrip (req )
26+ }
1527
16- func createTestServer (t * testing.T ) * httptest.Server {
17- return httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
28+ func createGhesTestServer (t * testing.T ) * httptest.Server {
29+ return httptest .NewTLSServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
1830
1931 w .Header ().Set ("Content-Type" , "application/json" )
2032
33+ if ! strings .Contains (r .Host , "ghcr.io" ) {
34+ w .WriteHeader (http .StatusNotFound )
35+ return
36+ }
2137 // Mock manifest endpoints
2238 switch r .URL .Path {
2339
40+ case "/v2/" : // simulate ping request
41+ w .WriteHeader (http .StatusOK )
42+
2443 case "/token" :
2544 // for immutable actions, since image will be present in registry...it returns 200 OK with token
2645 // otherwise it returns 403 Forbidden
@@ -29,6 +48,7 @@ func createTestServer(t *testing.T) *httptest.Server {
2948 case "repository:actions/checkout:pull" :
3049 fallthrough
3150 case "repository:step-security/wait-for-secrets:pull" :
51+
3252 w .WriteHeader (http .StatusOK )
3353 w .Write ([]byte (`{"token": "test-token", "access_token": "test-token"}` ))
3454 default :
@@ -38,6 +58,8 @@ func createTestServer(t *testing.T) *httptest.Server {
3858
3959 case "/v2/actions/checkout/manifests/4.2.2" :
4060 fallthrough
61+ case "/v2/actions/checkout/manifests/1.2.0" :
62+ fallthrough
4163 case "/v2/step-security/wait-for-secrets/manifests/1.2.0" :
4264 w .Write (readHttpResponseForAction (t , r .URL .Path ))
4365 case "/v2/actions/checkout/manifests/1.2.3" : // since this version doesn't exist
@@ -51,23 +73,29 @@ func createTestServer(t *testing.T) *httptest.Server {
5173
5274func Test_isImmutableAction (t * testing.T ) {
5375 // Create test server that mocks GitHub Container Registry
54- server := createTestServer (t )
76+ server := createGhesTestServer (t )
5577 defer server .Close ()
5678
5779 // Create a custom client that redirects ghcr.io to our test server
5880 originalClient := http .DefaultClient
5981 http .DefaultClient = & http.Client {
60- Transport : & http.Transport {
61- Proxy : func (req * http.Request ) (* url.URL , error ) {
62- if strings .Contains (req .URL .Host , "ghcr.io" ) {
63- return url .Parse (server .URL )
64- }
65- return nil , nil
82+ Transport : & customTransport {
83+ base : & http.Transport {
84+ TLSClientConfig : & tls.Config {
85+ InsecureSkipVerify : true ,
86+ },
6687 },
88+ baseURL : server .URL ,
6789 },
6890 }
91+
92+ // update default transport
93+ OriginalTransport := http .DefaultTransport
94+ http .DefaultTransport = http .DefaultClient .Transport
95+
6996 defer func () {
7097 http .DefaultClient = originalClient
98+ http .DefaultTransport = OriginalTransport
7199 }()
72100
73101 tests := []struct {
@@ -120,14 +148,15 @@ func Test_isImmutableAction(t *testing.T) {
120148
121149func readHttpResponseForAction (t * testing.T , actionPath string ) []byte {
122150 // remove v2 prefix from action path
123- actionPath = strings .TrimPrefix (actionPath , "v2/" )
151+ actionPath = strings .TrimPrefix (actionPath , "/ v2/" )
124152
125- fileName := strings .ReplaceAll (actionPath , "/" , "-" )
126- respFilePath := testFilesDir + fileName
153+ fileName := strings .ReplaceAll (actionPath , "/" , "-" ) + ".json"
154+ testFilesDir := "../../../testfiles/pinactions/immutableActionResponses/"
155+ respFilePath := filepath .Join (testFilesDir , fileName )
127156
128157 resp , err := ioutil .ReadFile (respFilePath )
129158 if err != nil {
130- t .Fatalf ("error reading test file" )
159+ t .Fatalf ("error reading test file:%v" , err )
131160 }
132161
133162 return resp
0 commit comments