Source file src/compress/gzip/gunzip_test.go

     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  	"encoding/base64"
    11  	"io"
    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  		"f1l3n4m3.tXt",
   297  		"header with all fields used",
   298  		"",
   299  		[]byte{
   300  			0x1f, 0x8b, 0x08, 0x1e, 0x70, 0xf0, 0xf9, 0x4a,
   301  			0x00, 0xaa, 0x09, 0x00, 0x7a, 0x7a, 0x05, 0x00,
   302  			0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x31, 0x6c,
   303  			0x33, 0x6e, 0x34, 0x6d, 0x33, 0x2e, 0x74, 0x58,
   304  			0x74, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
   305  			0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
   306  			0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
   307  			0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e,
   308  			0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26,
   309  			0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e,
   310  			0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,
   311  			0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e,
   312  			0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,
   313  			0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e,
   314  			0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56,
   315  			0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e,
   316  			0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
   317  			0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e,
   318  			0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
   319  			0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e,
   320  			0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86,
   321  			0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e,
   322  			0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
   323  			0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
   324  			0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6,
   325  			0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae,
   326  			0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
   327  			0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe,
   328  			0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6,
   329  			0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce,
   330  			0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
   331  			0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde,
   332  			0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6,
   333  			0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee,
   334  			0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6,
   335  			0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe,
   336  			0xff, 0x00, 0x92, 0xfd, 0x01, 0x00, 0x00, 0xff,
   337  			0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   338  			0x00,
   339  		},
   340  		nil,
   341  	},
   342  	{
   343  		"",
   344  		"truncated gzip file amid raw-block",
   345  		"hello",
   346  		[]byte{
   347  			0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
   348  			0x00, 0x0c, 0x00, 0xf3, 0xff, 0x68, 0x65, 0x6c, 0x6c, 0x6f,
   349  		},
   350  		io.ErrUnexpectedEOF,
   351  	},
   352  	{
   353  		"",
   354  		"truncated gzip file amid fixed-block",
   355  		"He",
   356  		[]byte{
   357  			0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
   358  			0xf2, 0x48, 0xcd,
   359  		},
   360  		io.ErrUnexpectedEOF,
   361  	},
   362  }
   363  
   364  func TestDecompressor(t *testing.T) {
   365  	// Keep resetting this reader.
   366  	// It is intended behavior that Reader.Reset can be called on a zero-value
   367  	// Reader and be the equivalent as if NewReader was used instead.
   368  	r1 := new(Reader)
   369  
   370  	b := new(bytes.Buffer)
   371  	for _, tt := range gunzipTests {
   372  		// Test NewReader.
   373  		in := bytes.NewReader(tt.gzip)
   374  		r2, err := NewReader(in)
   375  		if err != nil {
   376  			t.Errorf("%s: NewReader: %s", tt.desc, err)
   377  			continue
   378  		}
   379  		defer r2.Close()
   380  		if tt.name != r2.Name {
   381  			t.Errorf("%s: got name %s", tt.desc, r2.Name)
   382  		}
   383  		b.Reset()
   384  		n, err := io.Copy(b, r2)
   385  		if err != tt.err {
   386  			t.Errorf("%s: io.Copy: %v want %v", tt.desc, err, tt.err)
   387  		}
   388  		s := b.String()
   389  		if s != tt.raw {
   390  			t.Errorf("%s: got %d-byte %q want %d-byte %q", tt.desc, n, s, len(tt.raw), tt.raw)
   391  		}
   392  
   393  		// Test Reader.Reset.
   394  		in = bytes.NewReader(tt.gzip)
   395  		err = r1.Reset(in)
   396  		if err != nil {
   397  			t.Errorf("%s: Reset: %s", tt.desc, err)
   398  			continue
   399  		}
   400  		if tt.name != r1.Name {
   401  			t.Errorf("%s: got name %s", tt.desc, r1.Name)
   402  		}
   403  		b.Reset()
   404  		n, err = io.Copy(b, r1)
   405  		if err != tt.err {
   406  			t.Errorf("%s: io.Copy: %v want %v", tt.desc, err, tt.err)
   407  		}
   408  		s = b.String()
   409  		if s != tt.raw {
   410  			t.Errorf("%s: got %d-byte %q want %d-byte %q", tt.desc, n, s, len(tt.raw), tt.raw)
   411  		}
   412  	}
   413  }
   414  
   415  func TestIssue6550(t *testing.T) {
   416  	// Apple’s notarization service will recursively attempt to decompress
   417  	// files in order to find binaries to notarize. Since the service is
   418  	// unable to decompress this file, it may reject the entire toolchain. Use a
   419  	// base64-encoded version to avoid this.
   420  	// See golang.org/issue/34986
   421  	f, err := os.Open("testdata/issue6550.gz.base64")
   422  	if err != nil {
   423  		t.Fatal(err)
   424  	}
   425  	gzip, err := NewReader(base64.NewDecoder(base64.StdEncoding, f))
   426  	if err != nil {
   427  		t.Fatalf("NewReader(testdata/issue6550.gz): %v", err)
   428  	}
   429  	defer gzip.Close()
   430  	done := make(chan bool, 1)
   431  	go func() {
   432  		_, err := io.Copy(io.Discard, gzip)
   433  		if err == nil {
   434  			t.Errorf("Copy succeeded")
   435  		} else {
   436  			t.Logf("Copy failed (correctly): %v", err)
   437  		}
   438  		done <- true
   439  	}()
   440  	select {
   441  	case <-time.After(1 * time.Second):
   442  		t.Errorf("Copy hung")
   443  	case <-done:
   444  		// ok
   445  	}
   446  }
   447  
   448  func TestMultistreamFalse(t *testing.T) {
   449  	// Find concatenation test.
   450  	var tt gunzipTest
   451  	for _, tt = range gunzipTests {
   452  		if strings.HasSuffix(tt.desc, " x2") {
   453  			goto Found
   454  		}
   455  	}
   456  	t.Fatal("cannot find hello.txt x2 in gunzip tests")
   457  
   458  Found:
   459  	br := bytes.NewReader(tt.gzip)
   460  	var r Reader
   461  	if err := r.Reset(br); err != nil {
   462  		t.Fatalf("first reset: %v", err)
   463  	}
   464  
   465  	// Expect two streams with "hello world\n", then real EOF.
   466  	const hello = "hello world\n"
   467  
   468  	r.Multistream(false)
   469  	data, err := io.ReadAll(&r)
   470  	if string(data) != hello || err != nil {
   471  		t.Fatalf("first stream = %q, %v, want %q, %v", string(data), err, hello, nil)
   472  	}
   473  
   474  	if err := r.Reset(br); err != nil {
   475  		t.Fatalf("second reset: %v", err)
   476  	}
   477  	r.Multistream(false)
   478  	data, err = io.ReadAll(&r)
   479  	if string(data) != hello || err != nil {
   480  		t.Fatalf("second stream = %q, %v, want %q, %v", string(data), err, hello, nil)
   481  	}
   482  
   483  	if err := r.Reset(br); err != io.EOF {
   484  		t.Fatalf("third reset: err=%v, want io.EOF", err)
   485  	}
   486  }
   487  
   488  func TestNilStream(t *testing.T) {
   489  	// Go liberally interprets RFC 1952 section 2.2 to mean that a gzip file
   490  	// consist of zero or more members. Thus, we test that a nil stream is okay.
   491  	_, err := NewReader(bytes.NewReader(nil))
   492  	if err != io.EOF {
   493  		t.Fatalf("NewReader(nil) on empty stream: got %v, want io.EOF", err)
   494  	}
   495  }
   496  
   497  func TestTruncatedStreams(t *testing.T) {
   498  	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"
   499  
   500  	// Intentionally iterate starting with at least one byte in the stream.
   501  	for i := 1; i < len(data)-1; i++ {
   502  		r, err := NewReader(strings.NewReader(data[:i]))
   503  		if err != nil {
   504  			if err != io.ErrUnexpectedEOF {
   505  				t.Errorf("NewReader(%d) on truncated stream: got %v, want %v", i, err, io.ErrUnexpectedEOF)
   506  			}
   507  			continue
   508  		}
   509  		_, err = io.Copy(io.Discard, r)
   510  		if ferr, ok := err.(*flate.ReadError); ok {
   511  			err = ferr.Err
   512  		}
   513  		if err != io.ErrUnexpectedEOF {
   514  			t.Errorf("io.Copy(%d) on truncated stream: got %v, want %v", i, err, io.ErrUnexpectedEOF)
   515  		}
   516  	}
   517  }
   518  

View as plain text