kubesphere.io/s2irun@v3.2.1+incompatible/pkg/scripts/download_test.go (about) 1 package scripts 2 3 import ( 4 "fmt" 5 "io" 6 "io/ioutil" 7 "net/http" 8 "net/url" 9 "os" 10 "strings" 11 "testing" 12 13 s2ierr "github.com/kubesphere/s2irun/pkg/errors" 14 ) 15 16 type FakeHTTPGet struct { 17 url string 18 content string 19 err error 20 body io.ReadCloser 21 statusCode int 22 } 23 24 func (f *FakeHTTPGet) get(url string) (*http.Response, error) { 25 f.url = url 26 f.body = ioutil.NopCloser(strings.NewReader(f.content)) 27 return &http.Response{ 28 Body: f.body, 29 StatusCode: f.statusCode, 30 }, f.err 31 } 32 33 func getHTTPReader() (*HTTPURLReader, *FakeHTTPGet) { 34 sr := &HTTPURLReader{} 35 g := &FakeHTTPGet{content: "test content", statusCode: 200} 36 sr.Get = g.get 37 return sr, g 38 } 39 40 func TestHTTPRead(t *testing.T) { 41 u, _ := url.Parse("http://test.url/test") 42 sr, fg := getHTTPReader() 43 rc, err := sr.Read(u) 44 if rc != fg.body { 45 t.Errorf("Unexpected readcloser returned: %#v", rc) 46 } 47 if err != nil { 48 t.Errorf("Unexpected error returned: %v", err) 49 } 50 } 51 52 func TestHTTPReadGetError(t *testing.T) { 53 u, _ := url.Parse("http://test.url/test") 54 sr, fg := getHTTPReader() 55 fg.err = fmt.Errorf("URL Error") 56 rc, err := sr.Read(u) 57 if rc != nil { 58 t.Errorf("Unexpected stream returned: %#v", rc) 59 } 60 if err != fg.err { 61 t.Errorf("Unexpected error returned: %#v", err) 62 } 63 } 64 65 func TestHTTPReadErrorCode(t *testing.T) { 66 u, _ := url.Parse("http://test.url/test") 67 sr, fg := getHTTPReader() 68 fg.statusCode = 500 69 rc, err := sr.Read(u) 70 if rc != nil { 71 t.Errorf("Unexpected stream returned: %#v", rc) 72 } 73 if err == nil { 74 t.Errorf("Error expeccted and not returned") 75 } 76 } 77 78 type FakeSchemeReader struct { 79 content string 80 err error 81 } 82 83 func (f *FakeSchemeReader) Read(url *url.URL) (io.ReadCloser, error) { 84 return ioutil.NopCloser(strings.NewReader(f.content)), f.err 85 } 86 87 func getDownloader() (Downloader, *FakeSchemeReader) { 88 fakeReader := &FakeSchemeReader{} 89 return &downloader{ 90 schemeReaders: map[string]schemeReader{ 91 "http": fakeReader, 92 "https": fakeReader, 93 "file": fakeReader, 94 }, 95 }, fakeReader 96 } 97 98 func TestDownload(t *testing.T) { 99 dl, fr := getDownloader() 100 fr.content = "test file content" 101 temp, err := ioutil.TempFile("", "testdownload") 102 if err != nil { 103 t.Fatalf("Cannot create temp directory for test: %v", err) 104 } 105 defer os.Remove(temp.Name()) 106 u, _ := url.Parse("http://www.test.url/a/file") 107 temp.Close() 108 info, err := dl.Download(u, temp.Name()) 109 if err != nil { 110 t.Fatalf("Unexpected error: %v", err) 111 } 112 if len(info.Location) == 0 { 113 t.Errorf("Expected info.Location to be set, got %v", info) 114 } 115 content, _ := ioutil.ReadFile(temp.Name()) 116 if string(content) != fr.content { 117 t.Errorf("Unexpected file content: %s", string(content)) 118 } 119 } 120 121 func TestNoDownload(t *testing.T) { 122 dl := &downloader{ 123 schemeReaders: map[string]schemeReader{ 124 "image": &ImageReader{}, 125 }, 126 } 127 u, _ := url.Parse("image:///tmp/testfile") 128 _, err := dl.Download(u, "") 129 if err == nil { 130 t.Error("Expected error with information about scripts inside the image!") 131 } 132 if e, ok := err.(s2ierr.Error); !ok || e.ErrorCode != s2ierr.ScriptsInsideImageError { 133 t.Errorf("Unexpected error %v", err) 134 } 135 } 136 137 func TestNoDownloader(t *testing.T) { 138 dl := &downloader{ 139 schemeReaders: map[string]schemeReader{}, 140 } 141 u, _ := url.Parse("http://www.test.url/a/file") 142 _, err := dl.Download(u, "") 143 if err == nil { 144 t.Errorf("Expected error, got nil!") 145 } 146 }