@@ -531,3 +531,83 @@ func TestFileAppendDeadlineBefore(t *testing.T) {
531531 _ , err = writer .Write ([]byte ("foo\n " ))
532532 assert .Error (t , err )
533533}
534+
535+ func skipWithoutEncryptedZone (t * testing.T ) {
536+ if os .Getenv ("TRANSPARENT_ENCRYPTION" ) != "true" {
537+ t .Skip ("Skipping, this test requires encryption zone to make sense" )
538+ }
539+ }
540+
541+ func TestEncryptedZoneWriteChunks (t * testing.T ) {
542+ skipWithoutEncryptedZone (t )
543+
544+ originalText := []byte ("some random plain text, nice to have it quite long" )
545+ client := getClient (t )
546+ writer , err := client .Create ("/_test/kms/write_chunks.txt" )
547+ require .NoError (t , err )
548+
549+ var pos int64 = 0
550+ for _ , x := range []int {5 , 7 , 6 , 4 , 28 } {
551+ _ , err = writer .Write (originalText [pos : pos + int64 (x )])
552+ require .NoError (t , err )
553+ pos += int64 (x )
554+ }
555+ assertClose (t , writer )
556+
557+ reader , err := client .Open ("/_test/kms/write_chunks.txt" )
558+ require .NoError (t , err )
559+
560+ bytes , err := ioutil .ReadAll (reader )
561+ require .NoError (t , err )
562+ assert .Equal (t , originalText , bytes )
563+ }
564+
565+ func TestEncryptedZoneAppendChunks (t * testing.T ) {
566+ skipWithoutEncryptedZone (t )
567+
568+ originalText := []byte ("some random plain text, nice to have it quite long" )
569+ client := getClient (t )
570+ writer , err := client .Create ("/_test/kms/append_chunks.txt" )
571+ require .NoError (t , err )
572+ assertClose (t , writer )
573+
574+ var pos int64 = 0
575+ for _ , x := range []int {5 , 7 , 6 , 4 , 28 } {
576+ writer , err := client .Append ("/_test/kms/append_chunks.txt" )
577+ require .NoError (t , err )
578+ _ , err = writer .Write (originalText [pos : pos + int64 (x )])
579+ require .NoError (t , err )
580+ pos += int64 (x )
581+ assertClose (t , writer )
582+ }
583+
584+ reader , err := client .Open ("/_test/kms/append_chunks.txt" )
585+ require .NoError (t , err )
586+ bytes , err := ioutil .ReadAll (reader )
587+ require .NoError (t , err )
588+ assert .Equal (t , originalText , bytes )
589+ }
590+
591+ func TestEncryptedZoneLargeBlock (t * testing.T ) {
592+ skipWithoutEncryptedZone (t )
593+
594+ // Generate quite large (aesChunkSize * 1.5 bytes) block, so we can trigger encryption in chunks.
595+ str := "some random text"
596+ originalText := []byte (strings .Repeat (str , aesChunkSize * 1.5 / len (str )))
597+ client := getClient (t )
598+
599+ // Create file with small (128Kb) block size, so encrypted chunk will be placed over multiple hdfs blocks.
600+ writer , err := client .CreateFile ("/_test/kms/large_write.txt" , 1 , 131072 , 0755 )
601+ require .NoError (t , err )
602+
603+ _ , err = writer .Write (originalText )
604+ require .NoError (t , err )
605+ assertClose (t , writer )
606+
607+ reader , err := client .Open ("/_test/kms/large_write.txt" )
608+ require .NoError (t , err )
609+
610+ bytes , err := ioutil .ReadAll (reader )
611+ require .NoError (t , err )
612+ assert .Equal (t , originalText , bytes )
613+ }
0 commit comments