@@ -18,6 +18,9 @@ package resources
1818import (
1919 "crypto"
2020 "encoding/hex"
21+ "net"
22+ "net/http"
23+ "net/url"
2124 "testing"
2225
2326 rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
@@ -110,3 +113,38 @@ func TestDownloadAndChecksums(t *testing.T) {
110113 _ , err = r .TestLocalArchiveChecksum (tmp )
111114 require .Error (t , err )
112115}
116+
117+ func TestIndexDownloadAndSignatureWithinArchive (t * testing.T ) {
118+ // Spawn test webserver
119+ mux := http .NewServeMux ()
120+ fs := http .FileServer (http .Dir ("testdata" ))
121+ mux .Handle ("/" , fs )
122+ server := & http.Server {Handler : mux }
123+ ln , err := net .Listen ("tcp" , "127.0.0.1:" )
124+ require .NoError (t , err )
125+ defer ln .Close ()
126+ go server .Serve (ln )
127+
128+ validIdxURL , err := url .Parse ("http://" + ln .Addr ().String () + "/valid/package_index.tar.bz2" )
129+ require .NoError (t , err )
130+ idxResource := & IndexResource {URL : validIdxURL }
131+ destDir , err := paths .MkTempDir ("" , "" )
132+ require .NoError (t , err )
133+ defer destDir .RemoveAll ()
134+ err = idxResource .Download (destDir , func (curr * rpc.DownloadProgress ) {})
135+ require .NoError (t , err )
136+ require .True (t , destDir .Join ("package_index.json" ).Exist ())
137+ require .True (t , destDir .Join ("package_index.json.sig" ).Exist ())
138+
139+ invalidIdxURL , err := url .Parse ("http://" + ln .Addr ().String () + "/invalid/package_index.tar.bz2" )
140+ require .NoError (t , err )
141+ invIdxResource := & IndexResource {URL : invalidIdxURL }
142+ invDestDir , err := paths .MkTempDir ("" , "" )
143+ require .NoError (t , err )
144+ defer invDestDir .RemoveAll ()
145+ err = invIdxResource .Download (invDestDir , func (curr * rpc.DownloadProgress ) {})
146+ require .Error (t , err )
147+ require .Contains (t , err .Error (), "invalid signature" )
148+ require .False (t , invDestDir .Join ("package_index.json" ).Exist ())
149+ require .False (t , invDestDir .Join ("package_index.json.sig" ).Exist ())
150+ }
0 commit comments