@@ -61,9 +61,7 @@ import (
6161 * keys. Use the alternative (AES_GCM_CTR_V1) algorithm.
6262 */
6363
64- var (
65- tempdir string
66- )
64+ var tempdir string
6765
6866type EncryptionConfigTestSuite struct {
6967 suite.Suite
@@ -79,13 +77,16 @@ type EncryptionConfigTestSuite struct {
7977 columnEncryptionKey2 string
8078}
8179
82- func (en * EncryptionConfigTestSuite ) encryptFile (configs * parquet.FileEncryptionProperties , filename string ) {
80+ func (en * EncryptionConfigTestSuite ) encryptFile (configs * parquet.FileEncryptionProperties , filename string , writerOpts ... parquet. WriterProperty ) {
8381 filename = filepath .Join (tempdir , filename )
8482
85- props := parquet .NewWriterProperties (
83+ opts := [] parquet.WriterProperty {
8684 parquet .WithPageIndexEnabled (true ),
8785 parquet .WithCompression (compress .Codecs .Snappy ),
88- parquet .WithEncryptionProperties (configs ))
86+ parquet .WithEncryptionProperties (configs ),
87+ }
88+ opts = append (opts , writerOpts ... )
89+ props := parquet .NewWriterProperties (opts ... )
8990 outFile , err := os .Create (filename )
9091 en .Require ().NoError (err )
9192 en .Require ().NotNil (outFile )
@@ -135,20 +136,18 @@ func (en *EncryptionConfigTestSuite) encryptFile(configs *parquet.FileEncryption
135136
136137 // write the int64 column, each row repeats twice
137138 int64Writer := nextColumn ().(* file.Int64ColumnChunkWriter )
138- for i := 0 ; i < 2 * en .rowsPerRG ; i ++ {
139+ for i := 0 ; i < en .rowsPerRG ; i ++ {
139140 var (
140- defLevel = [1 ]int16 {1 }
141- repLevel = [1 ]int16 {0 }
142- value = int64 (i ) * 1000 * 1000 * 1000 * 1000
141+ defLevels = []int16 {1 , 1 }
142+ repLevels = []int16 {0 , 1 }
143+ values = []int64 {
144+ int64 (i * 2 ) * 1000 * 1000 * 1000 * 1000 ,
145+ int64 (i * 2 + 1 ) * 1000 * 1000 * 1000 * 1000 ,
146+ }
143147 )
144- if i % 2 == 0 {
145- repLevel [0 ] = 0
146- } else {
147- repLevel [0 ] = 1
148- }
149148
150- n , err := int64Writer .WriteBatch ([] int64 { value }, defLevel [:], repLevel [:] )
151- en .EqualValues (1 , n )
149+ n , err := int64Writer .WriteBatch (values , defLevels , repLevels )
150+ en .EqualValues (2 , n )
152151 en .Require ().NoError (err )
153152 }
154153
@@ -263,7 +262,11 @@ func (en *EncryptionConfigTestSuite) SetupSuite() {
263262// (uniform encryption)
264263func (en * EncryptionConfigTestSuite ) TestUniformEncryption () {
265264 props := parquet .NewFileEncryptionProperties (en .footerEncryptionKey , parquet .WithFooterKeyMetadata ("kf" ))
266- en .encryptFile (props , "tmp_uniform_encryption.parquet.encrypted" )
265+ en .encryptFile (props .Clone ("" ), "tmp_uniform_encryption.parquet.encrypted" )
266+ en .encryptFile (props .Clone ("" ), "tmp_uniform_encryption.parquet.uncompressed.encrypted" , parquet .WithCompression (compress .Codecs .Uncompressed ))
267+ en .encryptFile (props .Clone ("" ), "tmp_uniform_encryption.parquet.v2.encrypted" , parquet .WithDataPageVersion (parquet .DataPageV2 ))
268+ en .encryptFile (props .Clone ("" ), "tmp_uniform_encryption.parquet.v2.uncompressed.encrypted" , parquet .WithCompression (compress .Codecs .Uncompressed ),
269+ parquet .WithDataPageVersion (parquet .DataPageV2 ))
267270}
268271
269272// Encryption config 2: Encrypt Two Columns and the Footer, with different keys
@@ -273,7 +276,11 @@ func (en *EncryptionConfigTestSuite) TestEncryptTwoColumnsAndFooter() {
273276 encryptCols [en .pathToFloatField ] = parquet .NewColumnEncryptionProperties (en .pathToFloatField , parquet .WithKey (en .columnEncryptionKey2 ), parquet .WithKeyID ("kc2" ))
274277
275278 props := parquet .NewFileEncryptionProperties (en .footerEncryptionKey , parquet .WithFooterKeyMetadata ("kf" ), parquet .WithEncryptedColumns (encryptCols ))
276- en .encryptFile (props , "tmp_encrypt_columns_and_footer.parquet.encrypted" )
279+ en .encryptFile (props .Clone ("" ), "tmp_encrypt_columns_and_footer.parquet.encrypted" )
280+ en .encryptFile (props .Clone ("" ), "tmp_encrypt_columns_and_footer.parquet.uncompressed.encrypted" , parquet .WithCompression (compress .Codecs .Uncompressed ))
281+ en .encryptFile (props .Clone ("" ), "tmp_encrypt_columns_and_footer.parquet.v2.encrypted" , parquet .WithDataPageVersion (parquet .DataPageV2 ))
282+ en .encryptFile (props .Clone ("" ), "tmp_encrypt_columns_and_footer.parquet.v2.uncompressed.encrypted" , parquet .WithCompression (compress .Codecs .Uncompressed ),
283+ parquet .WithDataPageVersion (parquet .DataPageV2 ))
277284}
278285
279286// Encryption Config 3: encrypt two columns, with different keys.
@@ -285,7 +292,11 @@ func (en *EncryptionConfigTestSuite) TestEncryptTwoColumnsPlaintextFooter() {
285292 encryptCols [en .pathToFloatField ] = parquet .NewColumnEncryptionProperties (en .pathToFloatField , parquet .WithKey (en .columnEncryptionKey2 ), parquet .WithKeyID ("kc2" ))
286293
287294 props := parquet .NewFileEncryptionProperties (en .footerEncryptionKey , parquet .WithFooterKeyMetadata ("kf" ), parquet .WithEncryptedColumns (encryptCols ), parquet .WithPlaintextFooter ())
288- en .encryptFile (props , "tmp_encrypt_columns_plaintext_footer.parquet.encrypted" )
295+ en .encryptFile (props .Clone ("" ), "tmp_encrypt_columns_plaintext_footer.parquet.encrypted" )
296+ en .encryptFile (props .Clone ("" ), "tmp_encrypt_columns_plaintext_footer.parquet.uncompressed.encrypted" , parquet .WithCompression (compress .Codecs .Uncompressed ))
297+ en .encryptFile (props .Clone ("" ), "tmp_encrypt_columns_plaintext_footer.parquet.v2.encrypted" , parquet .WithDataPageVersion (parquet .DataPageV2 ))
298+ en .encryptFile (props .Clone ("" ), "tmp_encrypt_columns_plaintext_footer.parquet.v2.uncompressed.encrypted" , parquet .WithCompression (compress .Codecs .Uncompressed ),
299+ parquet .WithDataPageVersion (parquet .DataPageV2 ))
289300}
290301
291302// Encryption Config 4: Encrypt two columns and the footer, with different keys
@@ -296,7 +307,11 @@ func (en *EncryptionConfigTestSuite) TestEncryptTwoColumnsAndFooterWithAadPrefix
296307 encryptCols [en .pathToFloatField ] = parquet .NewColumnEncryptionProperties (en .pathToFloatField , parquet .WithKey (en .columnEncryptionKey2 ), parquet .WithKeyID ("kc2" ))
297308
298309 props := parquet .NewFileEncryptionProperties (en .footerEncryptionKey , parquet .WithFooterKeyMetadata ("kf" ), parquet .WithEncryptedColumns (encryptCols ), parquet .WithAadPrefix (en .fileName ))
299- en .encryptFile (props , "tmp_encrypt_columns_and_footer_aad.parquet.encrypted" )
310+ en .encryptFile (props .Clone ("" ), "tmp_encrypt_columns_and_footer_aad.parquet.encrypted" )
311+ en .encryptFile (props .Clone ("" ), "tmp_encrypt_columns_and_footer_aad.parquet.uncompressed.encrypted" , parquet .WithCompression (compress .Codecs .Uncompressed ))
312+ en .encryptFile (props .Clone ("" ), "tmp_encrypt_columns_and_footer_aad.parquet.v2.encrypted" , parquet .WithDataPageVersion (parquet .DataPageV2 ))
313+ en .encryptFile (props .Clone ("" ), "tmp_encrypt_columns_and_footer_aad.parquet.v2.uncompressed.encrypted" , parquet .WithCompression (compress .Codecs .Uncompressed ),
314+ parquet .WithDataPageVersion (parquet .DataPageV2 ))
300315}
301316
302317// Encryption Config 5: Encrypt Two columns and the footer, with different keys
@@ -307,7 +322,11 @@ func (en *EncryptionConfigTestSuite) TestEncryptTwoColumnsAndFooterWithAadPrefix
307322 encryptCols [en .pathToFloatField ] = parquet .NewColumnEncryptionProperties (en .pathToFloatField , parquet .WithKey (en .columnEncryptionKey2 ), parquet .WithKeyID ("kc2" ))
308323
309324 props := parquet .NewFileEncryptionProperties (en .footerEncryptionKey , parquet .WithFooterKeyMetadata ("kf" ), parquet .WithAadPrefix (en .fileName ), parquet .DisableAadPrefixStorage ())
310- en .encryptFile (props , "tmp_encrypt_columns_and_footer_disable_aad_storage.parquet.encrypted" )
325+ en .encryptFile (props .Clone ("" ), "tmp_encrypt_columns_and_footer_disable_aad_storage.parquet.encrypted" )
326+ en .encryptFile (props .Clone ("" ), "tmp_encrypt_columns_and_footer_disable_aad_storage.parquet.uncompressed.encrypted" , parquet .WithCompression (compress .Codecs .Uncompressed ))
327+ en .encryptFile (props .Clone ("" ), "tmp_encrypt_columns_and_footer_disable_aad_storage.parquet.v2.encrypted" , parquet .WithDataPageVersion (parquet .DataPageV2 ))
328+ en .encryptFile (props .Clone ("" ), "tmp_encrypt_columns_and_footer_disable_aad_storage.parquet.v2.uncompressed.encrypted" , parquet .WithCompression (compress .Codecs .Uncompressed ),
329+ parquet .WithDataPageVersion (parquet .DataPageV2 ))
311330}
312331
313332// Encryption Config 6: Encrypt two columns and the footer, with different keys.
@@ -318,7 +337,11 @@ func (en *EncryptionConfigTestSuite) TestEncryptTwoColumnsAndFooterAesGcmCtr() {
318337 encryptCols [en .pathToFloatField ] = parquet .NewColumnEncryptionProperties (en .pathToFloatField , parquet .WithKey (en .columnEncryptionKey2 ), parquet .WithKeyID ("kc2" ))
319338
320339 props := parquet .NewFileEncryptionProperties (en .footerEncryptionKey , parquet .WithFooterKeyMetadata ("kf" ), parquet .WithEncryptedColumns (encryptCols ), parquet .WithAlg (parquet .AesCtr ))
321- en .encryptFile (props , "tmp_encrypt_columns_and_footer_ctr.parquet.encrypted" )
340+ en .encryptFile (props .Clone ("" ), "tmp_encrypt_columns_and_footer_ctr.parquet.encrypted" )
341+ en .encryptFile (props .Clone ("" ), "tmp_encrypt_columns_and_footer_ctr.parquet.uncompressed.encrypted" , parquet .WithCompression (compress .Codecs .Uncompressed ))
342+ en .encryptFile (props .Clone ("" ), "tmp_encrypt_columns_and_footer_ctr.parquet.v2.encrypted" , parquet .WithDataPageVersion (parquet .DataPageV2 ))
343+ en .encryptFile (props .Clone ("" ), "tmp_encrypt_columns_and_footer_ctr.parquet.v2.uncompressed.encrypted" , parquet .WithCompression (compress .Codecs .Uncompressed ),
344+ parquet .WithDataPageVersion (parquet .DataPageV2 ))
322345}
323346
324347func TestFileEncryption (t * testing.T ) {
0 commit comments