github.com/miolini/go@v0.0.0-20160405192216-fca68c8cb408/src/compress/gzip/gunzip_test.go (about)

     1  // Copyright 2009 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package gzip
     6  
     7  import (
     8  	"bytes"
     9  	"compress/flate"
    10  	"io"
    11  	"io/ioutil"
    12  	"os"
    13  	"strings"
    14  	"testing"
    15  	"time"
    16  )
    17  
    18  type gunzipTest struct {
    19  	name string
    20  	desc string
    21  	raw  string
    22  	gzip []byte
    23  	err  error
    24  }
    25  
    26  var gunzipTests = []gunzipTest{
    27  	{ // has 1 empty fixed-huffman block
    28  		"empty.txt",
    29  		"empty.txt",
    30  		"",
    31  		[]byte{
    32  			0x1f, 0x8b, 0x08, 0x08, 0xf7, 0x5e, 0x14, 0x4a,
    33  			0x00, 0x03, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e,
    34  			0x74, 0x78, 0x74, 0x00, 0x03, 0x00, 0x00, 0x00,
    35  			0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    36  		},
    37  		nil,
    38  	},
    39  	{
    40  		"",
    41  		"empty - with no file name",
    42  		"",
    43  		[]byte{
    44  			0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88,
    45  			0x00, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x00,
    46  			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    47  		},
    48  		nil,
    49  	},
    50  	{ // has 1 non-empty fixed huffman block
    51  		"hello.txt",
    52  		"hello.txt",
    53  		"hello world\n",
    54  		[]byte{
    55  			0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
    56  			0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
    57  			0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
    58  			0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
    59  			0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
    60  			0x00, 0x00,
    61  		},
    62  		nil,
    63  	},
    64  	{ // concatenation
    65  		"hello.txt",
    66  		"hello.txt x2",
    67  		"hello world\n" +
    68  			"hello world\n",
    69  		[]byte{
    70  			0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
    71  			0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
    72  			0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
    73  			0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
    74  			0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
    75  			0x00, 0x00,
    76  			0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
    77  			0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
    78  			0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
    79  			0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
    80  			0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
    81  			0x00, 0x00,
    82  		},
    83  		nil,
    84  	},
    85  	{ // has a fixed huffman block with some length-distance pairs
    86  		"shesells.txt",
    87  		"shesells.txt",
    88  		"she sells seashells by the seashore\n",
    89  		[]byte{
    90  			0x1f, 0x8b, 0x08, 0x08, 0x72, 0x66, 0x8b, 0x4a,
    91  			0x00, 0x03, 0x73, 0x68, 0x65, 0x73, 0x65, 0x6c,
    92  			0x6c, 0x73, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x2b,
    93  			0xce, 0x48, 0x55, 0x28, 0x4e, 0xcd, 0xc9, 0x29,
    94  			0x06, 0x92, 0x89, 0xc5, 0x19, 0x60, 0x56, 0x52,
    95  			0xa5, 0x42, 0x09, 0x58, 0x18, 0x28, 0x90, 0x5f,
    96  			0x94, 0xca, 0x05, 0x00, 0x76, 0xb0, 0x3b, 0xeb,
    97  			0x24, 0x00, 0x00, 0x00,
    98  		},
    99  		nil,
   100  	},
   101  	{ // has dynamic huffman blocks
   102  		"gettysburg",
   103  		"gettysburg",
   104  		"  Four score and seven years ago our fathers brought forth on\n" +
   105  			"this continent, a new nation, conceived in Liberty, and dedicated\n" +
   106  			"to the proposition that all men are created equal.\n" +
   107  			"  Now we are engaged in a great Civil War, testing whether that\n" +
   108  			"nation, or any nation so conceived and so dedicated, can long\n" +
   109  			"endure.\n" +
   110  			"  We are met on a great battle-field of that war.\n" +
   111  			"  We have come to dedicate a portion of that field, as a final\n" +
   112  			"resting place for those who here gave their lives that that\n" +
   113  			"nation might live.  It is altogether fitting and proper that\n" +
   114  			"we should do this.\n" +
   115  			"  But, in a larger sense, we can not dedicate — we can not\n" +
   116  			"consecrate — we can not hallow — this ground.\n" +
   117  			"  The brave men, living and dead, who struggled here, have\n" +
   118  			"consecrated it, far above our poor power to add or detract.\n" +
   119  			"The world will little note, nor long remember what we say here,\n" +
   120  			"but it can never forget what they did here.\n" +
   121  			"  It is for us the living, rather, to be dedicated here to the\n" +
   122  			"unfinished work which they who fought here have thus far so\n" +
   123  			"nobly advanced.  It is rather for us to be here dedicated to\n" +
   124  			"the great task remaining before us — that from these honored\n" +
   125  			"dead we take increased devotion to that cause for which they\n" +
   126  			"gave the last full measure of devotion —\n" +
   127  			"  that we here highly resolve that these dead shall not have\n" +
   128  			"died in vain — that this nation, under God, shall have a new\n" +
   129  			"birth of freedom — and that government of the people, by the\n" +
   130  			"people, for the people, shall not perish from this earth.\n" +
   131  			"\n" +
   132  			"Abraham Lincoln, November 19, 1863, Gettysburg, Pennsylvania\n",
   133  		[]byte{
   134  			0x1f, 0x8b, 0x08, 0x08, 0xd1, 0x12, 0x2b, 0x4a,
   135  			0x00, 0x03, 0x67, 0x65, 0x74, 0x74, 0x79, 0x73,
   136  			0x62, 0x75, 0x72, 0x67, 0x00, 0x65, 0x54, 0xcd,
   137  			0x6e, 0xd4, 0x30, 0x10, 0xbe, 0xfb, 0x29, 0xe6,
   138  			0x01, 0x42, 0xa5, 0x0a, 0x09, 0xc1, 0x11, 0x90,
   139  			0x40, 0x48, 0xa8, 0xe2, 0x80, 0xd4, 0xf3, 0x24,
   140  			0x9e, 0x24, 0x56, 0xbd, 0x9e, 0xc5, 0x76, 0x76,
   141  			0x95, 0x1b, 0x0f, 0xc1, 0x13, 0xf2, 0x24, 0x7c,
   142  			0x63, 0x77, 0x9b, 0x4a, 0x5c, 0xaa, 0x6e, 0x6c,
   143  			0xcf, 0x7c, 0x7f, 0x33, 0x44, 0x5f, 0x74, 0xcb,
   144  			0x54, 0x26, 0xcd, 0x42, 0x9c, 0x3c, 0x15, 0xb9,
   145  			0x48, 0xa2, 0x5d, 0x38, 0x17, 0xe2, 0x45, 0xc9,
   146  			0x4e, 0x67, 0xae, 0xab, 0xe0, 0xf7, 0x98, 0x75,
   147  			0x5b, 0xd6, 0x4a, 0xb3, 0xe6, 0xba, 0x92, 0x26,
   148  			0x57, 0xd7, 0x50, 0x68, 0xd2, 0x54, 0x43, 0x92,
   149  			0x54, 0x07, 0x62, 0x4a, 0x72, 0xa5, 0xc4, 0x35,
   150  			0x68, 0x1a, 0xec, 0x60, 0x92, 0x70, 0x11, 0x4f,
   151  			0x21, 0xd1, 0xf7, 0x30, 0x4a, 0xae, 0xfb, 0xd0,
   152  			0x9a, 0x78, 0xf1, 0x61, 0xe2, 0x2a, 0xde, 0x55,
   153  			0x25, 0xd4, 0xa6, 0x73, 0xd6, 0xb3, 0x96, 0x60,
   154  			0xef, 0xf0, 0x9b, 0x2b, 0x71, 0x8c, 0x74, 0x02,
   155  			0x10, 0x06, 0xac, 0x29, 0x8b, 0xdd, 0x25, 0xf9,
   156  			0xb5, 0x71, 0xbc, 0x73, 0x44, 0x0f, 0x7a, 0xa5,
   157  			0xab, 0xb4, 0x33, 0x49, 0x0b, 0x2f, 0xbd, 0x03,
   158  			0xd3, 0x62, 0x17, 0xe9, 0x73, 0xb8, 0x84, 0x48,
   159  			0x8f, 0x9c, 0x07, 0xaa, 0x52, 0x00, 0x6d, 0xa1,
   160  			0xeb, 0x2a, 0xc6, 0xa0, 0x95, 0x76, 0x37, 0x78,
   161  			0x9a, 0x81, 0x65, 0x7f, 0x46, 0x4b, 0x45, 0x5f,
   162  			0xe1, 0x6d, 0x42, 0xe8, 0x01, 0x13, 0x5c, 0x38,
   163  			0x51, 0xd4, 0xb4, 0x38, 0x49, 0x7e, 0xcb, 0x62,
   164  			0x28, 0x1e, 0x3b, 0x82, 0x93, 0x54, 0x48, 0xf1,
   165  			0xd2, 0x7d, 0xe4, 0x5a, 0xa3, 0xbc, 0x99, 0x83,
   166  			0x44, 0x4f, 0x3a, 0x77, 0x36, 0x57, 0xce, 0xcf,
   167  			0x2f, 0x56, 0xbe, 0x80, 0x90, 0x9e, 0x84, 0xea,
   168  			0x51, 0x1f, 0x8f, 0xcf, 0x90, 0xd4, 0x60, 0xdc,
   169  			0x5e, 0xb4, 0xf7, 0x10, 0x0b, 0x26, 0xe0, 0xff,
   170  			0xc4, 0xd1, 0xe5, 0x67, 0x2e, 0xe7, 0xc8, 0x93,
   171  			0x98, 0x05, 0xb8, 0xa8, 0x45, 0xc0, 0x4d, 0x09,
   172  			0xdc, 0x84, 0x16, 0x2b, 0x0d, 0x9a, 0x21, 0x53,
   173  			0x04, 0x8b, 0xd2, 0x0b, 0xbd, 0xa2, 0x4c, 0xa7,
   174  			0x60, 0xee, 0xd9, 0xe1, 0x1d, 0xd1, 0xb7, 0x4a,
   175  			0x30, 0x8f, 0x63, 0xd5, 0xa5, 0x8b, 0x33, 0x87,
   176  			0xda, 0x1a, 0x18, 0x79, 0xf3, 0xe3, 0xa6, 0x17,
   177  			0x94, 0x2e, 0xab, 0x6e, 0xa0, 0xe3, 0xcd, 0xac,
   178  			0x50, 0x8c, 0xca, 0xa7, 0x0d, 0x76, 0x37, 0xd1,
   179  			0x23, 0xe7, 0x05, 0x57, 0x8b, 0xa4, 0x22, 0x83,
   180  			0xd9, 0x62, 0x52, 0x25, 0xad, 0x07, 0xbb, 0xbf,
   181  			0xbf, 0xff, 0xbc, 0xfa, 0xee, 0x20, 0x73, 0x91,
   182  			0x29, 0xff, 0x7f, 0x02, 0x71, 0x62, 0x84, 0xb5,
   183  			0xf6, 0xb5, 0x25, 0x6b, 0x41, 0xde, 0x92, 0xb7,
   184  			0x76, 0x3f, 0x91, 0x91, 0x31, 0x1b, 0x41, 0x84,
   185  			0x62, 0x30, 0x0a, 0x37, 0xa4, 0x5e, 0x18, 0x3a,
   186  			0x99, 0x08, 0xa5, 0xe6, 0x6d, 0x59, 0x22, 0xec,
   187  			0x33, 0x39, 0x86, 0x26, 0xf5, 0xab, 0x66, 0xc8,
   188  			0x08, 0x20, 0xcf, 0x0c, 0xd7, 0x47, 0x45, 0x21,
   189  			0x0b, 0xf6, 0x59, 0xd5, 0xfe, 0x5c, 0x8d, 0xaa,
   190  			0x12, 0x7b, 0x6f, 0xa1, 0xf0, 0x52, 0x33, 0x4f,
   191  			0xf5, 0xce, 0x59, 0xd3, 0xab, 0x66, 0x10, 0xbf,
   192  			0x06, 0xc4, 0x31, 0x06, 0x73, 0xd6, 0x80, 0xa2,
   193  			0x78, 0xc2, 0x45, 0xcb, 0x03, 0x65, 0x39, 0xc9,
   194  			0x09, 0xd1, 0x06, 0x04, 0x33, 0x1a, 0x5a, 0xf1,
   195  			0xde, 0x01, 0xb8, 0x71, 0x83, 0xc4, 0xb5, 0xb3,
   196  			0xc3, 0x54, 0x65, 0x33, 0x0d, 0x5a, 0xf7, 0x9b,
   197  			0x90, 0x7c, 0x27, 0x1f, 0x3a, 0x58, 0xa3, 0xd8,
   198  			0xfd, 0x30, 0x5f, 0xb7, 0xd2, 0x66, 0xa2, 0x93,
   199  			0x1c, 0x28, 0xb7, 0xe9, 0x1b, 0x0c, 0xe1, 0x28,
   200  			0x47, 0x26, 0xbb, 0xe9, 0x7d, 0x7e, 0xdc, 0x96,
   201  			0x10, 0x92, 0x50, 0x56, 0x7c, 0x06, 0xe2, 0x27,
   202  			0xb4, 0x08, 0xd3, 0xda, 0x7b, 0x98, 0x34, 0x73,
   203  			0x9f, 0xdb, 0xf6, 0x62, 0xed, 0x31, 0x41, 0x13,
   204  			0xd3, 0xa2, 0xa8, 0x4b, 0x3a, 0xc6, 0x1d, 0xe4,
   205  			0x2f, 0x8c, 0xf8, 0xfb, 0x97, 0x64, 0xf4, 0xb6,
   206  			0x2f, 0x80, 0x5a, 0xf3, 0x56, 0xe0, 0x40, 0x50,
   207  			0xd5, 0x19, 0xd0, 0x1e, 0xfc, 0xca, 0xe5, 0xc9,
   208  			0xd4, 0x60, 0x00, 0x81, 0x2e, 0xa3, 0xcc, 0xb6,
   209  			0x52, 0xf0, 0xb4, 0xdb, 0x69, 0x99, 0xce, 0x7a,
   210  			0x32, 0x4c, 0x08, 0xed, 0xaa, 0x10, 0x10, 0xe3,
   211  			0x6f, 0xee, 0x99, 0x68, 0x95, 0x9f, 0x04, 0x71,
   212  			0xb2, 0x49, 0x2f, 0x62, 0xa6, 0x5e, 0xb4, 0xef,
   213  			0x02, 0xed, 0x4f, 0x27, 0xde, 0x4a, 0x0f, 0xfd,
   214  			0xc1, 0xcc, 0xdd, 0x02, 0x8f, 0x08, 0x16, 0x54,
   215  			0xdf, 0xda, 0xca, 0xe0, 0x82, 0xf1, 0xb4, 0x31,
   216  			0x7a, 0xa9, 0x81, 0xfe, 0x90, 0xb7, 0x3e, 0xdb,
   217  			0xd3, 0x35, 0xc0, 0x20, 0x80, 0x33, 0x46, 0x4a,
   218  			0x63, 0xab, 0xd1, 0x0d, 0x29, 0xd2, 0xe2, 0x84,
   219  			0xb8, 0xdb, 0xfa, 0xe9, 0x89, 0x44, 0x86, 0x7c,
   220  			0xe8, 0x0b, 0xe6, 0x02, 0x6a, 0x07, 0x9b, 0x96,
   221  			0xd0, 0xdb, 0x2e, 0x41, 0x4c, 0xa1, 0xd5, 0x57,
   222  			0x45, 0x14, 0xfb, 0xe3, 0xa6, 0x72, 0x5b, 0x87,
   223  			0x6e, 0x0c, 0x6d, 0x5b, 0xce, 0xe0, 0x2f, 0xe2,
   224  			0x21, 0x81, 0x95, 0xb0, 0xe8, 0xb6, 0x32, 0x0b,
   225  			0xb2, 0x98, 0x13, 0x52, 0x5d, 0xfb, 0xec, 0x63,
   226  			0x17, 0x8a, 0x9e, 0x23, 0x22, 0x36, 0xee, 0xcd,
   227  			0xda, 0xdb, 0xcf, 0x3e, 0xf1, 0xc7, 0xf1, 0x01,
   228  			0x12, 0x93, 0x0a, 0xeb, 0x6f, 0xf2, 0x02, 0x15,
   229  			0x96, 0x77, 0x5d, 0xef, 0x9c, 0xfb, 0x88, 0x91,
   230  			0x59, 0xf9, 0x84, 0xdd, 0x9b, 0x26, 0x8d, 0x80,
   231  			0xf9, 0x80, 0x66, 0x2d, 0xac, 0xf7, 0x1f, 0x06,
   232  			0xba, 0x7f, 0xff, 0xee, 0xed, 0x40, 0x5f, 0xa5,
   233  			0xd6, 0xbd, 0x8c, 0x5b, 0x46, 0xd2, 0x7e, 0x48,
   234  			0x4a, 0x65, 0x8f, 0x08, 0x42, 0x60, 0xf7, 0x0f,
   235  			0xb9, 0x16, 0x0b, 0x0c, 0x1a, 0x06, 0x00, 0x00,
   236  		},
   237  		nil,
   238  	},
   239  	{ // has 1 non-empty fixed huffman block then garbage
   240  		"hello.txt",
   241  		"hello.txt + garbage",
   242  		"hello world\n",
   243  		[]byte{
   244  			0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
   245  			0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
   246  			0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
   247  			0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
   248  			0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
   249  			0x00, 0x00, 'g', 'a', 'r', 'b', 'a', 'g', 'e', '!', '!', '!',
   250  		},
   251  		ErrHeader,
   252  	},
   253  	{ // has 1 non-empty fixed huffman block not enough header
   254  		"hello.txt",
   255  		"hello.txt + garbage",
   256  		"hello world\n",
   257  		[]byte{
   258  			0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
   259  			0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
   260  			0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
   261  			0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
   262  			0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
   263  			0x00, 0x00, gzipID1,
   264  		},
   265  		io.ErrUnexpectedEOF,
   266  	},
   267  	{ // has 1 non-empty fixed huffman block but corrupt checksum
   268  		"hello.txt",
   269  		"hello.txt + corrupt checksum",
   270  		"hello world\n",
   271  		[]byte{
   272  			0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
   273  			0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
   274  			0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
   275  			0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
   276  			0x02, 0x00, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x00,
   277  			0x00, 0x00,
   278  		},
   279  		ErrChecksum,
   280  	},
   281  	{ // has 1 non-empty fixed huffman block but corrupt size
   282  		"hello.txt",
   283  		"hello.txt + corrupt size",
   284  		"hello world\n",
   285  		[]byte{
   286  			0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
   287  			0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
   288  			0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
   289  			0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
   290  			0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0xff, 0x00,
   291  			0x00, 0x00,
   292  		},
   293  		ErrChecksum,
   294  	},
   295  }
   296  
   297  func TestDecompressor(t *testing.T) {
   298  	// Keep resetting this reader.
   299  	// It is intended behavior that Reader.Reset can be called on a zero-value
   300  	// Reader and be the equivalent as if NewReader was used instead.
   301  	r1 := new(Reader)
   302  
   303  	b := new(bytes.Buffer)
   304  	for _, tt := range gunzipTests {
   305  		// Test NewReader.
   306  		in := bytes.NewReader(tt.gzip)
   307  		r2, err := NewReader(in)
   308  		if err != nil {
   309  			t.Errorf("%s: NewReader: %s", tt.desc, err)
   310  			continue
   311  		}
   312  		defer r2.Close()
   313  		if tt.name != r2.Name {
   314  			t.Errorf("%s: got name %s", tt.desc, r2.Name)
   315  		}
   316  		b.Reset()
   317  		n, err := io.Copy(b, r2)
   318  		if err != tt.err {
   319  			t.Errorf("%s: io.Copy: %v want %v", tt.desc, err, tt.err)
   320  		}
   321  		s := b.String()
   322  		if s != tt.raw {
   323  			t.Errorf("%s: got %d-byte %q want %d-byte %q", tt.desc, n, s, len(tt.raw), tt.raw)
   324  		}
   325  
   326  		// Test Reader.Reset.
   327  		in = bytes.NewReader(tt.gzip)
   328  		err = r1.Reset(in)
   329  		if err != nil {
   330  			t.Errorf("%s: Reset: %s", tt.desc, err)
   331  			continue
   332  		}
   333  		if tt.name != r1.Name {
   334  			t.Errorf("%s: got name %s", tt.desc, r1.Name)
   335  		}
   336  		b.Reset()
   337  		n, err = io.Copy(b, r1)
   338  		if err != tt.err {
   339  			t.Errorf("%s: io.Copy: %v want %v", tt.desc, err, tt.err)
   340  		}
   341  		s = b.String()
   342  		if s != tt.raw {
   343  			t.Errorf("%s: got %d-byte %q want %d-byte %q", tt.desc, n, s, len(tt.raw), tt.raw)
   344  		}
   345  	}
   346  }
   347  
   348  func TestIssue6550(t *testing.T) {
   349  	f, err := os.Open("testdata/issue6550.gz")
   350  	if err != nil {
   351  		t.Fatal(err)
   352  	}
   353  	gzip, err := NewReader(f)
   354  	if err != nil {
   355  		t.Fatalf("NewReader(testdata/issue6550.gz): %v", err)
   356  	}
   357  	defer gzip.Close()
   358  	done := make(chan bool, 1)
   359  	go func() {
   360  		_, err := io.Copy(ioutil.Discard, gzip)
   361  		if err == nil {
   362  			t.Errorf("Copy succeeded")
   363  		} else {
   364  			t.Logf("Copy failed (correctly): %v", err)
   365  		}
   366  		done <- true
   367  	}()
   368  	select {
   369  	case <-time.After(1 * time.Second):
   370  		t.Errorf("Copy hung")
   371  	case <-done:
   372  		// ok
   373  	}
   374  }
   375  
   376  func TestMultistreamFalse(t *testing.T) {
   377  	// Find concatenation test.
   378  	var tt gunzipTest
   379  	for _, tt = range gunzipTests {
   380  		if strings.HasSuffix(tt.desc, " x2") {
   381  			goto Found
   382  		}
   383  	}
   384  	t.Fatal("cannot find hello.txt x2 in gunzip tests")
   385  
   386  Found:
   387  	br := bytes.NewReader(tt.gzip)
   388  	var r Reader
   389  	if err := r.Reset(br); err != nil {
   390  		t.Fatalf("first reset: %v", err)
   391  	}
   392  
   393  	// Expect two streams with "hello world\n", then real EOF.
   394  	const hello = "hello world\n"
   395  
   396  	r.Multistream(false)
   397  	data, err := ioutil.ReadAll(&r)
   398  	if string(data) != hello || err != nil {
   399  		t.Fatalf("first stream = %q, %v, want %q, %v", string(data), err, hello, nil)
   400  	}
   401  
   402  	if err := r.Reset(br); err != nil {
   403  		t.Fatalf("second reset: %v", err)
   404  	}
   405  	r.Multistream(false)
   406  	data, err = ioutil.ReadAll(&r)
   407  	if string(data) != hello || err != nil {
   408  		t.Fatalf("second stream = %q, %v, want %q, %v", string(data), err, hello, nil)
   409  	}
   410  
   411  	if err := r.Reset(br); err != io.EOF {
   412  		t.Fatalf("third reset: err=%v, want io.EOF", err)
   413  	}
   414  }
   415  
   416  func TestNilStream(t *testing.T) {
   417  	// Go liberally interprets RFC 1952 section 2.2 to mean that a gzip file
   418  	// consist of zero or more members. Thus, we test that a nil stream is okay.
   419  	_, err := NewReader(bytes.NewReader(nil))
   420  	if err != io.EOF {
   421  		t.Fatalf("NewReader(nil) on empty stream: got %v, want io.EOF", err)
   422  	}
   423  }
   424  
   425  func TestTruncatedStreams(t *testing.T) {
   426  	const data = "\x1f\x8b\b\x04\x00\tn\x88\x00\xff\a\x00foo bar\xcbH\xcd\xc9\xc9\xd7Q(\xcf/\xcaI\x01\x04:r\xab\xff\f\x00\x00\x00"
   427  
   428  	// Intentionally iterate starting with at least one byte in the stream.
   429  	for i := 1; i < len(data)-1; i++ {
   430  		r, err := NewReader(strings.NewReader(data[:i]))
   431  		if err != nil {
   432  			if err != io.ErrUnexpectedEOF {
   433  				t.Errorf("NewReader(%d) on truncated stream: got %v, want %v", i, err, io.ErrUnexpectedEOF)
   434  			}
   435  			continue
   436  		}
   437  		_, err = io.Copy(ioutil.Discard, r)
   438  		if ferr, ok := err.(*flate.ReadError); ok {
   439  			err = ferr.Err
   440  		}
   441  		if err != io.ErrUnexpectedEOF {
   442  			t.Errorf("io.Copy(%d) on truncated stream: got %v, want %v", i, err, io.ErrUnexpectedEOF)
   443  		}
   444  	}
   445  }