github.com/spotify/syslog-redirector-golang@v0.0.0-20140320174030-4859f03d829a/src/pkg/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  	"io"
    10  	"io/ioutil"
    11  	"os"
    12  	"testing"
    13  	"time"
    14  )
    15  
    16  type gunzipTest struct {
    17  	name string
    18  	desc string
    19  	raw  string
    20  	gzip []byte
    21  	err  error
    22  }
    23  
    24  var gunzipTests = []gunzipTest{
    25  	{ // has 1 empty fixed-huffman block
    26  		"empty.txt",
    27  		"empty.txt",
    28  		"",
    29  		[]byte{
    30  			0x1f, 0x8b, 0x08, 0x08, 0xf7, 0x5e, 0x14, 0x4a,
    31  			0x00, 0x03, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e,
    32  			0x74, 0x78, 0x74, 0x00, 0x03, 0x00, 0x00, 0x00,
    33  			0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    34  		},
    35  		nil,
    36  	},
    37  	{ // has 1 non-empty fixed huffman block
    38  		"hello.txt",
    39  		"hello.txt",
    40  		"hello world\n",
    41  		[]byte{
    42  			0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
    43  			0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
    44  			0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
    45  			0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
    46  			0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
    47  			0x00, 0x00,
    48  		},
    49  		nil,
    50  	},
    51  	{ // concatenation
    52  		"hello.txt",
    53  		"hello.txt x2",
    54  		"hello world\n" +
    55  			"hello world\n",
    56  		[]byte{
    57  			0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
    58  			0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
    59  			0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
    60  			0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
    61  			0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
    62  			0x00, 0x00,
    63  			0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
    64  			0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
    65  			0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
    66  			0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
    67  			0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
    68  			0x00, 0x00,
    69  		},
    70  		nil,
    71  	},
    72  	{ // has a fixed huffman block with some length-distance pairs
    73  		"shesells.txt",
    74  		"shesells.txt",
    75  		"she sells seashells by the seashore\n",
    76  		[]byte{
    77  			0x1f, 0x8b, 0x08, 0x08, 0x72, 0x66, 0x8b, 0x4a,
    78  			0x00, 0x03, 0x73, 0x68, 0x65, 0x73, 0x65, 0x6c,
    79  			0x6c, 0x73, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x2b,
    80  			0xce, 0x48, 0x55, 0x28, 0x4e, 0xcd, 0xc9, 0x29,
    81  			0x06, 0x92, 0x89, 0xc5, 0x19, 0x60, 0x56, 0x52,
    82  			0xa5, 0x42, 0x09, 0x58, 0x18, 0x28, 0x90, 0x5f,
    83  			0x94, 0xca, 0x05, 0x00, 0x76, 0xb0, 0x3b, 0xeb,
    84  			0x24, 0x00, 0x00, 0x00,
    85  		},
    86  		nil,
    87  	},
    88  	{ // has dynamic huffman blocks
    89  		"gettysburg",
    90  		"gettysburg",
    91  		"  Four score and seven years ago our fathers brought forth on\n" +
    92  			"this continent, a new nation, conceived in Liberty, and dedicated\n" +
    93  			"to the proposition that all men are created equal.\n" +
    94  			"  Now we are engaged in a great Civil War, testing whether that\n" +
    95  			"nation, or any nation so conceived and so dedicated, can long\n" +
    96  			"endure.\n" +
    97  			"  We are met on a great battle-field of that war.\n" +
    98  			"  We have come to dedicate a portion of that field, as a final\n" +
    99  			"resting place for those who here gave their lives that that\n" +
   100  			"nation might live.  It is altogether fitting and proper that\n" +
   101  			"we should do this.\n" +
   102  			"  But, in a larger sense, we can not dedicate — we can not\n" +
   103  			"consecrate — we can not hallow — this ground.\n" +
   104  			"  The brave men, living and dead, who struggled here, have\n" +
   105  			"consecrated it, far above our poor power to add or detract.\n" +
   106  			"The world will little note, nor long remember what we say here,\n" +
   107  			"but it can never forget what they did here.\n" +
   108  			"  It is for us the living, rather, to be dedicated here to the\n" +
   109  			"unfinished work which they who fought here have thus far so\n" +
   110  			"nobly advanced.  It is rather for us to be here dedicated to\n" +
   111  			"the great task remaining before us — that from these honored\n" +
   112  			"dead we take increased devotion to that cause for which they\n" +
   113  			"gave the last full measure of devotion —\n" +
   114  			"  that we here highly resolve that these dead shall not have\n" +
   115  			"died in vain — that this nation, under God, shall have a new\n" +
   116  			"birth of freedom — and that government of the people, by the\n" +
   117  			"people, for the people, shall not perish from this earth.\n" +
   118  			"\n" +
   119  			"Abraham Lincoln, November 19, 1863, Gettysburg, Pennsylvania\n",
   120  		[]byte{
   121  			0x1f, 0x8b, 0x08, 0x08, 0xd1, 0x12, 0x2b, 0x4a,
   122  			0x00, 0x03, 0x67, 0x65, 0x74, 0x74, 0x79, 0x73,
   123  			0x62, 0x75, 0x72, 0x67, 0x00, 0x65, 0x54, 0xcd,
   124  			0x6e, 0xd4, 0x30, 0x10, 0xbe, 0xfb, 0x29, 0xe6,
   125  			0x01, 0x42, 0xa5, 0x0a, 0x09, 0xc1, 0x11, 0x90,
   126  			0x40, 0x48, 0xa8, 0xe2, 0x80, 0xd4, 0xf3, 0x24,
   127  			0x9e, 0x24, 0x56, 0xbd, 0x9e, 0xc5, 0x76, 0x76,
   128  			0x95, 0x1b, 0x0f, 0xc1, 0x13, 0xf2, 0x24, 0x7c,
   129  			0x63, 0x77, 0x9b, 0x4a, 0x5c, 0xaa, 0x6e, 0x6c,
   130  			0xcf, 0x7c, 0x7f, 0x33, 0x44, 0x5f, 0x74, 0xcb,
   131  			0x54, 0x26, 0xcd, 0x42, 0x9c, 0x3c, 0x15, 0xb9,
   132  			0x48, 0xa2, 0x5d, 0x38, 0x17, 0xe2, 0x45, 0xc9,
   133  			0x4e, 0x67, 0xae, 0xab, 0xe0, 0xf7, 0x98, 0x75,
   134  			0x5b, 0xd6, 0x4a, 0xb3, 0xe6, 0xba, 0x92, 0x26,
   135  			0x57, 0xd7, 0x50, 0x68, 0xd2, 0x54, 0x43, 0x92,
   136  			0x54, 0x07, 0x62, 0x4a, 0x72, 0xa5, 0xc4, 0x35,
   137  			0x68, 0x1a, 0xec, 0x60, 0x92, 0x70, 0x11, 0x4f,
   138  			0x21, 0xd1, 0xf7, 0x30, 0x4a, 0xae, 0xfb, 0xd0,
   139  			0x9a, 0x78, 0xf1, 0x61, 0xe2, 0x2a, 0xde, 0x55,
   140  			0x25, 0xd4, 0xa6, 0x73, 0xd6, 0xb3, 0x96, 0x60,
   141  			0xef, 0xf0, 0x9b, 0x2b, 0x71, 0x8c, 0x74, 0x02,
   142  			0x10, 0x06, 0xac, 0x29, 0x8b, 0xdd, 0x25, 0xf9,
   143  			0xb5, 0x71, 0xbc, 0x73, 0x44, 0x0f, 0x7a, 0xa5,
   144  			0xab, 0xb4, 0x33, 0x49, 0x0b, 0x2f, 0xbd, 0x03,
   145  			0xd3, 0x62, 0x17, 0xe9, 0x73, 0xb8, 0x84, 0x48,
   146  			0x8f, 0x9c, 0x07, 0xaa, 0x52, 0x00, 0x6d, 0xa1,
   147  			0xeb, 0x2a, 0xc6, 0xa0, 0x95, 0x76, 0x37, 0x78,
   148  			0x9a, 0x81, 0x65, 0x7f, 0x46, 0x4b, 0x45, 0x5f,
   149  			0xe1, 0x6d, 0x42, 0xe8, 0x01, 0x13, 0x5c, 0x38,
   150  			0x51, 0xd4, 0xb4, 0x38, 0x49, 0x7e, 0xcb, 0x62,
   151  			0x28, 0x1e, 0x3b, 0x82, 0x93, 0x54, 0x48, 0xf1,
   152  			0xd2, 0x7d, 0xe4, 0x5a, 0xa3, 0xbc, 0x99, 0x83,
   153  			0x44, 0x4f, 0x3a, 0x77, 0x36, 0x57, 0xce, 0xcf,
   154  			0x2f, 0x56, 0xbe, 0x80, 0x90, 0x9e, 0x84, 0xea,
   155  			0x51, 0x1f, 0x8f, 0xcf, 0x90, 0xd4, 0x60, 0xdc,
   156  			0x5e, 0xb4, 0xf7, 0x10, 0x0b, 0x26, 0xe0, 0xff,
   157  			0xc4, 0xd1, 0xe5, 0x67, 0x2e, 0xe7, 0xc8, 0x93,
   158  			0x98, 0x05, 0xb8, 0xa8, 0x45, 0xc0, 0x4d, 0x09,
   159  			0xdc, 0x84, 0x16, 0x2b, 0x0d, 0x9a, 0x21, 0x53,
   160  			0x04, 0x8b, 0xd2, 0x0b, 0xbd, 0xa2, 0x4c, 0xa7,
   161  			0x60, 0xee, 0xd9, 0xe1, 0x1d, 0xd1, 0xb7, 0x4a,
   162  			0x30, 0x8f, 0x63, 0xd5, 0xa5, 0x8b, 0x33, 0x87,
   163  			0xda, 0x1a, 0x18, 0x79, 0xf3, 0xe3, 0xa6, 0x17,
   164  			0x94, 0x2e, 0xab, 0x6e, 0xa0, 0xe3, 0xcd, 0xac,
   165  			0x50, 0x8c, 0xca, 0xa7, 0x0d, 0x76, 0x37, 0xd1,
   166  			0x23, 0xe7, 0x05, 0x57, 0x8b, 0xa4, 0x22, 0x83,
   167  			0xd9, 0x62, 0x52, 0x25, 0xad, 0x07, 0xbb, 0xbf,
   168  			0xbf, 0xff, 0xbc, 0xfa, 0xee, 0x20, 0x73, 0x91,
   169  			0x29, 0xff, 0x7f, 0x02, 0x71, 0x62, 0x84, 0xb5,
   170  			0xf6, 0xb5, 0x25, 0x6b, 0x41, 0xde, 0x92, 0xb7,
   171  			0x76, 0x3f, 0x91, 0x91, 0x31, 0x1b, 0x41, 0x84,
   172  			0x62, 0x30, 0x0a, 0x37, 0xa4, 0x5e, 0x18, 0x3a,
   173  			0x99, 0x08, 0xa5, 0xe6, 0x6d, 0x59, 0x22, 0xec,
   174  			0x33, 0x39, 0x86, 0x26, 0xf5, 0xab, 0x66, 0xc8,
   175  			0x08, 0x20, 0xcf, 0x0c, 0xd7, 0x47, 0x45, 0x21,
   176  			0x0b, 0xf6, 0x59, 0xd5, 0xfe, 0x5c, 0x8d, 0xaa,
   177  			0x12, 0x7b, 0x6f, 0xa1, 0xf0, 0x52, 0x33, 0x4f,
   178  			0xf5, 0xce, 0x59, 0xd3, 0xab, 0x66, 0x10, 0xbf,
   179  			0x06, 0xc4, 0x31, 0x06, 0x73, 0xd6, 0x80, 0xa2,
   180  			0x78, 0xc2, 0x45, 0xcb, 0x03, 0x65, 0x39, 0xc9,
   181  			0x09, 0xd1, 0x06, 0x04, 0x33, 0x1a, 0x5a, 0xf1,
   182  			0xde, 0x01, 0xb8, 0x71, 0x83, 0xc4, 0xb5, 0xb3,
   183  			0xc3, 0x54, 0x65, 0x33, 0x0d, 0x5a, 0xf7, 0x9b,
   184  			0x90, 0x7c, 0x27, 0x1f, 0x3a, 0x58, 0xa3, 0xd8,
   185  			0xfd, 0x30, 0x5f, 0xb7, 0xd2, 0x66, 0xa2, 0x93,
   186  			0x1c, 0x28, 0xb7, 0xe9, 0x1b, 0x0c, 0xe1, 0x28,
   187  			0x47, 0x26, 0xbb, 0xe9, 0x7d, 0x7e, 0xdc, 0x96,
   188  			0x10, 0x92, 0x50, 0x56, 0x7c, 0x06, 0xe2, 0x27,
   189  			0xb4, 0x08, 0xd3, 0xda, 0x7b, 0x98, 0x34, 0x73,
   190  			0x9f, 0xdb, 0xf6, 0x62, 0xed, 0x31, 0x41, 0x13,
   191  			0xd3, 0xa2, 0xa8, 0x4b, 0x3a, 0xc6, 0x1d, 0xe4,
   192  			0x2f, 0x8c, 0xf8, 0xfb, 0x97, 0x64, 0xf4, 0xb6,
   193  			0x2f, 0x80, 0x5a, 0xf3, 0x56, 0xe0, 0x40, 0x50,
   194  			0xd5, 0x19, 0xd0, 0x1e, 0xfc, 0xca, 0xe5, 0xc9,
   195  			0xd4, 0x60, 0x00, 0x81, 0x2e, 0xa3, 0xcc, 0xb6,
   196  			0x52, 0xf0, 0xb4, 0xdb, 0x69, 0x99, 0xce, 0x7a,
   197  			0x32, 0x4c, 0x08, 0xed, 0xaa, 0x10, 0x10, 0xe3,
   198  			0x6f, 0xee, 0x99, 0x68, 0x95, 0x9f, 0x04, 0x71,
   199  			0xb2, 0x49, 0x2f, 0x62, 0xa6, 0x5e, 0xb4, 0xef,
   200  			0x02, 0xed, 0x4f, 0x27, 0xde, 0x4a, 0x0f, 0xfd,
   201  			0xc1, 0xcc, 0xdd, 0x02, 0x8f, 0x08, 0x16, 0x54,
   202  			0xdf, 0xda, 0xca, 0xe0, 0x82, 0xf1, 0xb4, 0x31,
   203  			0x7a, 0xa9, 0x81, 0xfe, 0x90, 0xb7, 0x3e, 0xdb,
   204  			0xd3, 0x35, 0xc0, 0x20, 0x80, 0x33, 0x46, 0x4a,
   205  			0x63, 0xab, 0xd1, 0x0d, 0x29, 0xd2, 0xe2, 0x84,
   206  			0xb8, 0xdb, 0xfa, 0xe9, 0x89, 0x44, 0x86, 0x7c,
   207  			0xe8, 0x0b, 0xe6, 0x02, 0x6a, 0x07, 0x9b, 0x96,
   208  			0xd0, 0xdb, 0x2e, 0x41, 0x4c, 0xa1, 0xd5, 0x57,
   209  			0x45, 0x14, 0xfb, 0xe3, 0xa6, 0x72, 0x5b, 0x87,
   210  			0x6e, 0x0c, 0x6d, 0x5b, 0xce, 0xe0, 0x2f, 0xe2,
   211  			0x21, 0x81, 0x95, 0xb0, 0xe8, 0xb6, 0x32, 0x0b,
   212  			0xb2, 0x98, 0x13, 0x52, 0x5d, 0xfb, 0xec, 0x63,
   213  			0x17, 0x8a, 0x9e, 0x23, 0x22, 0x36, 0xee, 0xcd,
   214  			0xda, 0xdb, 0xcf, 0x3e, 0xf1, 0xc7, 0xf1, 0x01,
   215  			0x12, 0x93, 0x0a, 0xeb, 0x6f, 0xf2, 0x02, 0x15,
   216  			0x96, 0x77, 0x5d, 0xef, 0x9c, 0xfb, 0x88, 0x91,
   217  			0x59, 0xf9, 0x84, 0xdd, 0x9b, 0x26, 0x8d, 0x80,
   218  			0xf9, 0x80, 0x66, 0x2d, 0xac, 0xf7, 0x1f, 0x06,
   219  			0xba, 0x7f, 0xff, 0xee, 0xed, 0x40, 0x5f, 0xa5,
   220  			0xd6, 0xbd, 0x8c, 0x5b, 0x46, 0xd2, 0x7e, 0x48,
   221  			0x4a, 0x65, 0x8f, 0x08, 0x42, 0x60, 0xf7, 0x0f,
   222  			0xb9, 0x16, 0x0b, 0x0c, 0x1a, 0x06, 0x00, 0x00,
   223  		},
   224  		nil,
   225  	},
   226  	{ // has 1 non-empty fixed huffman block then garbage
   227  		"hello.txt",
   228  		"hello.txt + garbage",
   229  		"hello world\n",
   230  		[]byte{
   231  			0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
   232  			0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
   233  			0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
   234  			0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
   235  			0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
   236  			0x00, 0x00, 'g', 'a', 'r', 'b', 'a', 'g', 'e', '!', '!', '!',
   237  		},
   238  		ErrHeader,
   239  	},
   240  	{ // has 1 non-empty fixed huffman block not enough header
   241  		"hello.txt",
   242  		"hello.txt + garbage",
   243  		"hello world\n",
   244  		[]byte{
   245  			0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
   246  			0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
   247  			0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
   248  			0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
   249  			0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
   250  			0x00, 0x00, gzipID1,
   251  		},
   252  		io.ErrUnexpectedEOF,
   253  	},
   254  	{ // has 1 non-empty fixed huffman block but corrupt checksum
   255  		"hello.txt",
   256  		"hello.txt + corrupt checksum",
   257  		"hello world\n",
   258  		[]byte{
   259  			0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
   260  			0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
   261  			0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
   262  			0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
   263  			0x02, 0x00, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x00,
   264  			0x00, 0x00,
   265  		},
   266  		ErrChecksum,
   267  	},
   268  	{ // has 1 non-empty fixed huffman block but corrupt size
   269  		"hello.txt",
   270  		"hello.txt + corrupt size",
   271  		"hello world\n",
   272  		[]byte{
   273  			0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
   274  			0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
   275  			0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
   276  			0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
   277  			0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0xff, 0x00,
   278  			0x00, 0x00,
   279  		},
   280  		ErrChecksum,
   281  	},
   282  }
   283  
   284  func TestDecompressor(t *testing.T) {
   285  	b := new(bytes.Buffer)
   286  	for _, tt := range gunzipTests {
   287  		in := bytes.NewBuffer(tt.gzip)
   288  		gzip, err := NewReader(in)
   289  		if err != nil {
   290  			t.Errorf("%s: NewReader: %s", tt.name, err)
   291  			continue
   292  		}
   293  		defer gzip.Close()
   294  		if tt.name != gzip.Name {
   295  			t.Errorf("%s: got name %s", tt.name, gzip.Name)
   296  		}
   297  		b.Reset()
   298  		n, err := io.Copy(b, gzip)
   299  		if err != tt.err {
   300  			t.Errorf("%s: io.Copy: %v want %v", tt.name, err, tt.err)
   301  		}
   302  		s := b.String()
   303  		if s != tt.raw {
   304  			t.Errorf("%s: got %d-byte %q want %d-byte %q", tt.name, n, s, len(tt.raw), tt.raw)
   305  		}
   306  	}
   307  }
   308  
   309  func TestIssue6550(t *testing.T) {
   310  	f, err := os.Open("testdata/issue6550.gz")
   311  	if err != nil {
   312  		t.Fatal(err)
   313  	}
   314  	gzip, err := NewReader(f)
   315  	if err != nil {
   316  		t.Fatalf("NewReader(testdata/issue6550.gz): %v", err)
   317  	}
   318  	defer gzip.Close()
   319  	done := make(chan bool, 1)
   320  	go func() {
   321  		_, err := io.Copy(ioutil.Discard, gzip)
   322  		if err == nil {
   323  			t.Errorf("Copy succeeded")
   324  		} else {
   325  			t.Logf("Copy failed (correctly): %v", err)
   326  		}
   327  		done <- true
   328  	}()
   329  	select {
   330  	case <-time.After(1 * time.Second):
   331  		t.Errorf("Copy hung")
   332  	case <-done:
   333  		// ok
   334  	}
   335  }