add: ifaces testing
This commit is contained in:
		
							
								
								
									
										4
									
								
								interfaces/18-testing/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								interfaces/18-testing/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  | rosie.unknown | ||||||
|  | rosie.png | ||||||
|  | _other.go | ||||||
|  | toc | ||||||
							
								
								
									
										40
									
								
								interfaces/18-testing/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								interfaces/18-testing/main.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | |||||||
|  | // Copyright © 2018 Inanc Gumus | ||||||
|  | // Learn Go Programming Course | ||||||
|  | // License: https://creativecommons.org/licenses/by-nc-sa/4.0/ | ||||||
|  | // | ||||||
|  | // For more tutorials  : https://learngoprogramming.com | ||||||
|  | // In-person training  : https://www.linkedin.com/in/inancgumus/ | ||||||
|  | // Follow me on twitter: https://twitter.com/inancgumus | ||||||
|  |  | ||||||
|  | package main | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"io" | ||||||
|  | 	"net/http" | ||||||
|  | 	"os" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func main() { | ||||||
|  | 	// resp, err := http.Get("https://inancgumus.github.com/x/rosie.jpg") | ||||||
|  | 	resp, err := http.Get("https://inancgumus.github.com/x/rosie.unknown") | ||||||
|  | 	if err != nil { | ||||||
|  | 		fmt.Fprintln(os.Stderr, err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	defer resp.Body.Close() | ||||||
|  |  | ||||||
|  | 	file, err := os.Create("rosie.png") | ||||||
|  | 	if err != nil { | ||||||
|  | 		fmt.Fprintln(os.Stderr, err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	defer file.Close() | ||||||
|  |  | ||||||
|  | 	n, err := io.Copy(file, pngReader(resp.Body)) | ||||||
|  | 	if err != nil { | ||||||
|  | 		fmt.Fprintln(os.Stderr, err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	fmt.Printf("%d bytes transferred.\n", n) | ||||||
|  | } | ||||||
							
								
								
									
										48
									
								
								interfaces/18-testing/reader.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								interfaces/18-testing/reader.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | |||||||
|  | // Copyright © 2018 Inanc Gumus | ||||||
|  | // Learn Go Programming Course | ||||||
|  | // License: https://creativecommons.org/licenses/by-nc-sa/4.0/ | ||||||
|  | // | ||||||
|  | // For more tutorials  : https://learngoprogramming.com | ||||||
|  | // In-person training  : https://www.linkedin.com/in/inancgumus/ | ||||||
|  | // Follow me on twitter: https://twitter.com/inancgumus | ||||||
|  |  | ||||||
|  | package main | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"bytes" | ||||||
|  | 	"fmt" | ||||||
|  | 	"io" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // reader reads from `r` if the stream starts with a given signature. | ||||||
|  | // otherwise it stops and returns with an error. | ||||||
|  | type signatureReader struct { | ||||||
|  | 	r         io.Reader // reads from the response.Body (or from any reader) | ||||||
|  | 	signature []byte    // stream should start with this initial signature | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Read implements the io.Reader interface. | ||||||
|  | func (sr *signatureReader) Read(b []byte) (n int, err error) { | ||||||
|  | 	n, err = sr.r.Read(b) | ||||||
|  |  | ||||||
|  | 	l := len(sr.signature) | ||||||
|  | 	if l == 0 { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	if lb := len(b); lb < l { | ||||||
|  | 		l = lb | ||||||
|  | 	} | ||||||
|  | 	if got, want := b[:l], sr.signature[:l]; !bytes.Equal(got, want) { | ||||||
|  | 		err = fmt.Errorf("signature doesn't match, got: % x, want: % x", got, want) | ||||||
|  | 	} | ||||||
|  | 	sr.signature = sr.signature[l:] | ||||||
|  | 	return n, err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // create a reader for detecting only the png signatures. | ||||||
|  | func pngReader(r io.Reader) io.Reader { | ||||||
|  | 	return &signatureReader{ | ||||||
|  | 		r:         r, | ||||||
|  | 		signature: []byte("\x89PNG\r\n\x1a\n"), | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										34
									
								
								interfaces/18-testing/reader_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								interfaces/18-testing/reader_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | |||||||
|  | package main | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"io" | ||||||
|  | 	"strings" | ||||||
|  | 	"testing" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func Test_PNG_Reader_Correct_Signature(t *testing.T) { | ||||||
|  | 	const input = "\x89PNG\r\n\x1a\nHELLO" | ||||||
|  |  | ||||||
|  | 	out, err := readSignature(input) | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Fatalf("got: %q; want: <nil> err", err) | ||||||
|  | 	} | ||||||
|  | 	if out != input { | ||||||
|  | 		t.Fatalf("invalid output, got: '%x'; want: '%x'", out, input) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func Test_PNG_Reader_Incorrect_Signature(t *testing.T) { | ||||||
|  | 	_, err := readSignature("\x89INCORRECT") | ||||||
|  | 	if err == nil { | ||||||
|  | 		t.Fatal("got: nil; want: !nil err") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func readSignature(in string) (string, error) { | ||||||
|  | 	r := strings.NewReader(in) | ||||||
|  | 	w := strings.Builder{} | ||||||
|  | 	// _, err := io.Copy(&w, pngReader(r)) | ||||||
|  | 	_, err := io.CopyBuffer(&w, pngReader(r), make([]byte, 1)) | ||||||
|  | 	return w.String(), err | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user