@@ -49,7 +49,8 @@ CLASS ltc_awsex_cl_s3_actions DEFINITION FOR TESTING DURATION SHORT RISK LEVEL D
4949 put_object_legal_hold FOR TESTING RAISING /aws1/cx_rt_generic,
5050 put_object_retention FOR TESTING RAISING /aws1/cx_rt_generic,
5151 get_object_lock_conf FOR TESTING RAISING /aws1/cx_rt_generic,
52- put_object_lock_conf FOR TESTING RAISING /aws1/cx_rt_generic.
52+ put_object_lock_conf FOR TESTING RAISING /aws1/cx_rt_generic,
53+ list_buckets FOR TESTING RAISING /aws1/cx_rt_generic.
5354
5455 CLASS-METHODS class_setup RAISING /aws1/cx_rt_generic /awsex/cx_generic.
5556 CLASS-METHODS class_teardown RAISING /aws1/cx_rt_generic /awsex/cx_generic.
@@ -459,6 +460,8 @@ CLASS ltc_awsex_cl_s3_actions IMPLEMENTATION.
459460 DATA lt_cors_rules TYPE /aws1/cl_s3_corsrule=>tt_corsrules.
460461 DATA lt_methods TYPE /aws1/cl_s3_allowedmethods_w=>tt_allowedmethods.
461462 DATA lt_origins TYPE /aws1/cl_s3_allowedorigins_w=>tt_allowedorigins.
463+ DATA lv_retry TYPE i .
464+ DATA lv_cors_set TYPE abap_bool VALUE abap_false .
462465
463466 APPEND NEW /aws1/cl_s3_allowedmethods_w( iv_value = 'GET' ) TO lt_methods.
464467 APPEND NEW /aws1/cl_s3_allowedorigins_w( iv_value = '*' ) TO lt_origins.
@@ -467,30 +470,73 @@ CLASS ltc_awsex_cl_s3_actions IMPLEMENTATION.
467470 it_allowedmethods = lt_methods
468471 it_allowedorigins = lt_origins ) TO lt_cors_rules.
469472
470- ao_s3->putbucketcors(
471- iv_bucket = av_bucket
472- io_corsconfiguration = NEW /aws1/cl_s3_corsconfiguration( it_corsrules = lt_cors_rules ) ).
473+ " Set CORS configuration and retry if needed
474+ DO 3 TIMES .
475+ lv_retry = sy -index .
476+ TRY .
477+ ao_s3->putbucketcors(
478+ iv_bucket = av_bucket
479+ io_corsconfiguration = NEW /aws1/cl_s3_corsconfiguration( it_corsrules = lt_cors_rules ) ).
480+
481+ " Wait for CORS configuration to propagate
482+ WAIT UP TO 2 SECONDS .
483+
484+ " Verify CORS was set by reading it back
485+ DATA (lo_verify ) = ao_s3->getbucketcors( iv_bucket = av_bucket ).
486+ IF lo_verify IS BOUND AND lo_verify->get_corsrules( ) IS NOT INITIAL .
487+ lv_cors_set = abap_true .
488+ EXIT .
489+ ENDIF .
490+
491+ CATCH /aws1/cx_s3_clientexc INTO DATA (lo_setup_ex ).
492+ " Retry on client exception
493+ IF lv_retry = 3 .
494+ cl_abap_unit_assert=>fail( msg = | Failed to set CORS configuration after 3 attempts: { lo_setup_ex->get_text( ) } | ).
495+ ENDIF .
496+ WAIT UP TO 1 SECONDS .
497+ ENDTRY .
498+ ENDDO .
473499
474- " Now test getting the CORS configuration
500+ " Verify CORS was successfully set
501+ cl_abap_unit_assert=>assert_true(
502+ act = lv_cors_set
503+ msg = | CORS configuration was not set after 3 attempts| ).
504+
505+ " Now test getting the CORS configuration using the action method
475506 DATA lo_result TYPE REF TO /aws1/cl_s3_getbktcorsoutput.
476- ao_s3_actions->get_bucket_cors(
477- EXPORTING
478- iv_bucket_name = av_bucket
479- IMPORTING
480- oo_result = lo_result ).
507+ TRY .
508+ ao_s3_actions->get_bucket_cors(
509+ EXPORTING
510+ iv_bucket_name = av_bucket
511+ IMPORTING
512+ oo_result = lo_result ).
481513
482- cl_abap_unit_assert=>assert_bound(
483- act = lo_result
484- msg = | Could not get bucket CORS configuration| ).
514+ cl_abap_unit_assert=>assert_bound(
515+ act = lo_result
516+ msg = | Could not get bucket CORS configuration| ).
517+
518+ cl_abap_unit_assert=>assert_not_initial(
519+ act = lo_result->get_corsrules( )
520+ msg = | CORS rules are empty| ).
521+
522+ CATCH /aws1/cx_s3_clientexc INTO DATA (lo_ex ).
523+ cl_abap_unit_assert=>fail( msg = | CORS configuration test failed: { lo_ex->get_text( ) } | ).
524+ ENDTRY .
485525
486526 " Cleanup
487- ao_s3->deletebucketcors( iv_bucket = av_bucket ).
527+ TRY .
528+ ao_s3->deletebucketcors( iv_bucket = av_bucket ).
529+ CATCH /aws1/cx_rt_generic.
530+ " Ignore cleanup errors
531+ ENDTRY .
488532 ENDMETHOD .
489533
490534 METHOD put_bucket_cors .
491535 DATA lt_cors_rules TYPE /aws1/cl_s3_corsrule=>tt_corsrules.
492536 DATA lt_methods TYPE /aws1/cl_s3_allowedmethods_w=>tt_allowedmethods.
493537 DATA lt_origins TYPE /aws1/cl_s3_allowedorigins_w=>tt_allowedorigins.
538+ DATA lv_retry TYPE i .
539+ DATA lv_cors_set TYPE abap_bool VALUE abap_false .
494540
495541 APPEND NEW /aws1/cl_s3_allowedmethods_w( iv_value = 'PUT' ) TO lt_methods.
496542 APPEND NEW /aws1/cl_s3_allowedmethods_w( iv_value = 'POST' ) TO lt_methods.
@@ -501,18 +547,54 @@ CLASS ltc_awsex_cl_s3_actions IMPLEMENTATION.
501547 it_allowedmethods = lt_methods
502548 it_allowedorigins = lt_origins ) TO lt_cors_rules.
503549
504- ao_s3_actions->put_bucket_cors(
505- iv_bucket_name = av_bucket
506- it_cors_rules = lt_cors_rules ).
550+ " Set CORS configuration with retry logic
551+ DO 3 TIMES .
552+ lv_retry = sy -index .
553+ TRY .
554+ ao_s3_actions->put_bucket_cors(
555+ iv_bucket_name = av_bucket
556+ it_cors_rules = lt_cors_rules ).
507557
508- " Verify CORS was set
509- DATA (lo_cors ) = ao_s3->getbucketcors( iv_bucket = av_bucket ).
510- cl_abap_unit_assert=>assert_not_initial(
511- act = lo_cors->get_corsrules( )
512- msg = | CORS configuration was not set| ).
558+ " Wait for CORS configuration to propagate
559+ WAIT UP TO 2 SECONDS .
560+
561+ " Verify CORS was set by reading it back
562+ DATA (lo_cors ) = ao_s3->getbucketcors( iv_bucket = av_bucket ).
563+ IF lo_cors IS BOUND AND lo_cors->get_corsrules( ) IS NOT INITIAL .
564+ lv_cors_set = abap_true .
565+ EXIT .
566+ ENDIF .
567+
568+ CATCH /aws1/cx_s3_clientexc INTO DATA (lo_ex ).
569+ " Retry on client exception
570+ IF lv_retry = 3 .
571+ cl_abap_unit_assert=>fail( msg = | Failed to set CORS configuration after 3 attempts: { lo_ex->get_text( ) } | ).
572+ ENDIF .
573+ WAIT UP TO 1 SECONDS .
574+ ENDTRY .
575+ ENDDO .
576+
577+ " Verify CORS was successfully set
578+ cl_abap_unit_assert=>assert_true(
579+ act = lv_cors_set
580+ msg = | CORS configuration was not set after 3 attempts| ).
581+
582+ " Verify the CORS rules content
583+ TRY .
584+ DATA (lo_verify ) = ao_s3->getbucketcors( iv_bucket = av_bucket ).
585+ cl_abap_unit_assert=>assert_not_initial(
586+ act = lo_verify->get_corsrules( )
587+ msg = | CORS configuration rules are empty| ).
588+ CATCH /aws1/cx_s3_clientexc INTO DATA (lo_verify_ex ).
589+ cl_abap_unit_assert=>fail( msg = | Could not verify CORS configuration: { lo_verify_ex->get_text( ) } | ).
590+ ENDTRY .
513591
514592 " Cleanup
515- ao_s3->deletebucketcors( iv_bucket = av_bucket ).
593+ TRY .
594+ ao_s3->deletebucketcors( iv_bucket = av_bucket ).
595+ CATCH /aws1/cx_rt_generic.
596+ " Ignore cleanup errors
597+ ENDTRY .
516598 ENDMETHOD .
517599
518600 METHOD delete_bucket_cors .
@@ -679,24 +761,63 @@ CLASS ltc_awsex_cl_s3_actions IMPLEMENTATION.
679761
680762 METHOD put_bucket_lifecycle_conf .
681763 DATA lt_rules TYPE /aws1/cl_s3_lifecyclerule=>tt_lifecyclerules.
764+ DATA lv_retry TYPE i .
765+ DATA lv_lifecycle_set TYPE abap_bool VALUE abap_false .
766+
682767 APPEND NEW /aws1/cl_s3_lifecyclerule(
683768 iv_id = 'TestRule'
684769 iv_status = 'Enabled'
685770 io_filter = NEW /aws1/cl_s3_lcrulefilter( iv_prefix = 'archive/' )
686771 io_expiration = NEW /aws1/cl_s3_lifecycleexpir( iv_days = 60 ) ) TO lt_rules.
687772
688- ao_s3_actions->put_bucket_lifecycle_conf(
689- iv_bucket_name = av_bucket
690- it_lifecycle_rule = lt_rules ).
773+ " Set lifecycle configuration with retry logic
774+ DO 3 TIMES .
775+ lv_retry = sy -index .
776+ TRY .
777+ ao_s3_actions->put_bucket_lifecycle_conf(
778+ iv_bucket_name = av_bucket
779+ it_lifecycle_rule = lt_rules ).
691780
692- " Verify lifecycle was set
693- DATA (lo_lc ) = ao_s3->getbucketlifecycleconf( iv_bucket = av_bucket ).
694- cl_abap_unit_assert=>assert_not_initial(
695- act = lo_lc->get_rules( )
696- msg = | Lifecycle configuration was not set| ).
781+ " Wait for lifecycle configuration to propagate
782+ WAIT UP TO 2 SECONDS .
783+
784+ " Verify lifecycle was set by reading it back
785+ DATA (lo_lc ) = ao_s3->getbucketlifecycleconf( iv_bucket = av_bucket ).
786+ IF lo_lc IS BOUND AND lo_lc->get_rules( ) IS NOT INITIAL .
787+ lv_lifecycle_set = abap_true .
788+ EXIT .
789+ ENDIF .
790+
791+ CATCH /aws1/cx_s3_clientexc INTO DATA (lo_ex ).
792+ " Retry on client exception
793+ IF lv_retry = 3 .
794+ cl_abap_unit_assert=>fail( msg = | Failed to set lifecycle configuration after 3 attempts: { lo_ex->get_text( ) } | ).
795+ ENDIF .
796+ WAIT UP TO 1 SECONDS .
797+ ENDTRY .
798+ ENDDO .
799+
800+ " Verify lifecycle was successfully set
801+ cl_abap_unit_assert=>assert_true(
802+ act = lv_lifecycle_set
803+ msg = | Lifecycle configuration was not set after 3 attempts| ).
804+
805+ " Verify the rules content
806+ TRY .
807+ DATA (lo_verify ) = ao_s3->getbucketlifecycleconf( iv_bucket = av_bucket ).
808+ cl_abap_unit_assert=>assert_not_initial(
809+ act = lo_verify->get_rules( )
810+ msg = | Lifecycle configuration rules are empty| ).
811+ CATCH /aws1/cx_s3_clientexc INTO DATA (lo_verify_ex ).
812+ cl_abap_unit_assert=>fail( msg = | Could not verify lifecycle configuration: { lo_verify_ex->get_text( ) } | ).
813+ ENDTRY .
697814
698815 " Cleanup
699- ao_s3->deletebucketlifecycle( iv_bucket = av_bucket ).
816+ TRY .
817+ ao_s3->deletebucketlifecycle( iv_bucket = av_bucket ).
818+ CATCH /aws1/cx_rt_generic.
819+ " Ignore cleanup errors
820+ ENDTRY .
700821 ENDMETHOD .
701822
702823 METHOD delete_bucket_lifecycle .
@@ -1103,4 +1224,30 @@ CLASS ltc_awsex_cl_s3_actions IMPLEMENTATION.
11031224 ENDTRY .
11041225 ENDMETHOD .
11051226
1227+ METHOD list_buckets .
1228+ DATA lo_result TYPE REF TO /aws1/cl_s3_listbucketsoutput.
1229+
1230+ ao_s3_actions->list_buckets(
1231+ IMPORTING
1232+ oo_result = lo_result ).
1233+
1234+ " Verify we got buckets back
1235+ cl_abap_unit_assert=>assert_bound(
1236+ act = lo_result
1237+ msg = | Could not list buckets| ).
1238+
1239+ " Verify that our test buckets are in the list
1240+ DATA (lv_found_bucket ) = abap_false .
1241+ LOOP AT lo_result->get_buckets( ) INTO DATA (lo_bucket ).
1242+ IF lo_bucket->get_name( ) = av_bucket.
1243+ lv_found_bucket = abap_true .
1244+ EXIT .
1245+ ENDIF .
1246+ ENDLOOP .
1247+
1248+ cl_abap_unit_assert=>assert_true(
1249+ act = lv_found_bucket
1250+ msg = | Test bucket { av_bucket } not found in bucket list| ).
1251+ ENDMETHOD .
1252+
11061253ENDCLASS .
0 commit comments