@@ -2,6 +2,7 @@ package frameworks_test
22
33import (
44 "os"
5+ "path/filepath"
56 "testing"
67
78 "github.com/cloudfoundry/java-buildpack/src/java/frameworks"
@@ -541,3 +542,306 @@ func TestVCAPServicesEmptyCredentials(t *testing.T) {
541542// - Framework registry error handling tests
542543// - Credential validation tests (without actual installation)
543544// ==============================================================================
545+
546+ // TestJavaOptsFrameworkDetect tests Java Opts framework detection
547+ func TestJavaOptsFrameworkDetect (t * testing.T ) {
548+ tmpDir , err := os .MkdirTemp ("" , "java-buildpack-test-*" )
549+ if err != nil {
550+ t .Fatalf ("Failed to create temp dir: %v" , err )
551+ }
552+ defer os .RemoveAll (tmpDir )
553+
554+ logger := libbuildpack .NewLogger (os .Stdout )
555+ manifest := & libbuildpack.Manifest {}
556+ stager := libbuildpack .NewStager ([]string {tmpDir , "" , "0" }, logger , manifest )
557+
558+ ctx := & frameworks.Context {
559+ Stager : stager ,
560+ Manifest : manifest ,
561+ Log : logger ,
562+ }
563+
564+ framework := frameworks .NewJavaOptsFramework (ctx )
565+
566+ // Test with no configuration (from_environment: true by default)
567+ os .Unsetenv ("JBP_CONFIG_JAVA_OPTS" )
568+ name , err := framework .Detect ()
569+ if err != nil {
570+ t .Fatalf ("Expected no error, got: %v" , err )
571+ }
572+ if name != "Java Opts" {
573+ t .Errorf ("Expected 'Java Opts' (from_environment: true by default), got: %s" , name )
574+ }
575+
576+ // Test with JBP_CONFIG_JAVA_OPTS environment variable
577+ os .Setenv ("JBP_CONFIG_JAVA_OPTS" , "{java_opts: [\" -Xmx512m\" ]}" )
578+ defer os .Unsetenv ("JBP_CONFIG_JAVA_OPTS" )
579+
580+ name , err = framework .Detect ()
581+ if err != nil {
582+ t .Fatalf ("Expected no error, got: %v" , err )
583+ }
584+ if name != "Java Opts" {
585+ t .Errorf ("Expected 'Java Opts', got: %s" , name )
586+ }
587+ }
588+
589+ // TestJavaOptsFrameworkSupply tests Java Opts framework supply (should be no-op)
590+ func TestJavaOptsFrameworkSupply (t * testing.T ) {
591+ tmpDir , err := os .MkdirTemp ("" , "java-buildpack-test-*" )
592+ if err != nil {
593+ t .Fatalf ("Failed to create temp dir: %v" , err )
594+ }
595+ defer os .RemoveAll (tmpDir )
596+
597+ logger := libbuildpack .NewLogger (os .Stdout )
598+ manifest := & libbuildpack.Manifest {}
599+ stager := libbuildpack .NewStager ([]string {tmpDir , "" , "0" }, logger , manifest )
600+
601+ ctx := & frameworks.Context {
602+ Stager : stager ,
603+ Manifest : manifest ,
604+ Log : logger ,
605+ }
606+
607+ framework := frameworks .NewJavaOptsFramework (ctx )
608+
609+ // Supply should be a no-op (no error)
610+ err = framework .Supply ()
611+ if err != nil {
612+ t .Errorf ("Expected no error from Supply(), got: %v" , err )
613+ }
614+ }
615+
616+ // TestJavaOptsConfigParsing tests parsing of java_opts configuration
617+ func TestJavaOptsConfigParsing (t * testing.T ) {
618+ // Test with custom java_opts
619+ os .Setenv ("JBP_CONFIG_JAVA_OPTS" , "{java_opts: [\" -Xmx512m\" , \" -XX:+UseG1GC\" ]}" )
620+ defer os .Unsetenv ("JBP_CONFIG_JAVA_OPTS" )
621+
622+ tmpDir , err := os .MkdirTemp ("" , "java-buildpack-test-*" )
623+ if err != nil {
624+ t .Fatalf ("Failed to create temp dir: %v" , err )
625+ }
626+ defer os .RemoveAll (tmpDir )
627+
628+ logger := libbuildpack .NewLogger (os .Stdout )
629+ manifest := & libbuildpack.Manifest {}
630+ stager := libbuildpack .NewStager ([]string {tmpDir , "" , "0" }, logger , manifest )
631+
632+ ctx := & frameworks.Context {
633+ Stager : stager ,
634+ Manifest : manifest ,
635+ Log : logger ,
636+ }
637+
638+ framework := frameworks .NewJavaOptsFramework (ctx )
639+
640+ // Should detect with custom opts
641+ name , err := framework .Detect ()
642+ if err != nil {
643+ t .Fatalf ("Expected no error, got: %v" , err )
644+ }
645+ if name != "Java Opts" {
646+ t .Errorf ("Expected 'Java Opts', got: %s" , name )
647+ }
648+ }
649+
650+ // TestJavaOptsFromEnvironmentDisabled tests behavior when from_environment is false
651+ func TestJavaOptsFromEnvironmentDisabled (t * testing.T ) {
652+ // Disable from_environment
653+ os .Setenv ("JBP_CONFIG_JAVA_OPTS" , "{from_environment: false}" )
654+ defer os .Unsetenv ("JBP_CONFIG_JAVA_OPTS" )
655+
656+ tmpDir , err := os .MkdirTemp ("" , "java-buildpack-test-*" )
657+ if err != nil {
658+ t .Fatalf ("Failed to create temp dir: %v" , err )
659+ }
660+ defer os .RemoveAll (tmpDir )
661+
662+ logger := libbuildpack .NewLogger (os .Stdout )
663+ manifest := & libbuildpack.Manifest {}
664+ stager := libbuildpack .NewStager ([]string {tmpDir , "" , "0" }, logger , manifest )
665+
666+ ctx := & frameworks.Context {
667+ Stager : stager ,
668+ Manifest : manifest ,
669+ Log : logger ,
670+ }
671+
672+ framework := frameworks .NewJavaOptsFramework (ctx )
673+
674+ // Should not detect when from_environment is false and no custom opts
675+ name , err := framework .Detect ()
676+ if err != nil {
677+ t .Fatalf ("Expected no error, got: %v" , err )
678+ }
679+ if name != "" {
680+ t .Errorf ("Expected no detection when from_environment is false, got: %s" , name )
681+ }
682+ }
683+
684+ // TestSpringAutoReconfigurationDetect tests Spring Auto-reconfiguration detection
685+ func TestSpringAutoReconfigurationDetect (t * testing.T ) {
686+ tmpDir , err := os .MkdirTemp ("" , "java-buildpack-test-*" )
687+ if err != nil {
688+ t .Fatalf ("Failed to create temp dir: %v" , err )
689+ }
690+ defer os .RemoveAll (tmpDir )
691+
692+ // Create BOOT-INF/lib directory structure
693+ bootInfLib := filepath .Join (tmpDir , "BOOT-INF" , "lib" )
694+ if err := os .MkdirAll (bootInfLib , 0755 ); err != nil {
695+ t .Fatalf ("Failed to create BOOT-INF/lib: %v" , err )
696+ }
697+
698+ // Create spring-core JAR
699+ springCoreJar := filepath .Join (bootInfLib , "spring-core-5.3.29.jar" )
700+ if err := os .WriteFile (springCoreJar , []byte ("fake jar" ), 0644 ); err != nil {
701+ t .Fatalf ("Failed to create spring-core JAR: %v" , err )
702+ }
703+
704+ logger := libbuildpack .NewLogger (os .Stdout )
705+ manifest := & libbuildpack.Manifest {}
706+ stager := libbuildpack .NewStager ([]string {tmpDir , "" , "0" }, logger , manifest )
707+
708+ ctx := & frameworks.Context {
709+ Stager : stager ,
710+ Manifest : manifest ,
711+ Log : logger ,
712+ }
713+
714+ framework := frameworks .NewSpringAutoReconfigurationFramework (ctx )
715+
716+ // Should detect Spring application
717+ name , err := framework .Detect ()
718+ if err != nil {
719+ t .Fatalf ("Expected no error, got: %v" , err )
720+ }
721+ if name != "Spring Auto-reconfiguration" {
722+ t .Errorf ("Expected 'Spring Auto-reconfiguration', got: %s" , name )
723+ }
724+ }
725+
726+ // TestSpringAutoReconfigurationNoSpring tests no detection without Spring
727+ func TestSpringAutoReconfigurationNoSpring (t * testing.T ) {
728+ tmpDir , err := os .MkdirTemp ("" , "java-buildpack-test-*" )
729+ if err != nil {
730+ t .Fatalf ("Failed to create temp dir: %v" , err )
731+ }
732+ defer os .RemoveAll (tmpDir )
733+
734+ logger := libbuildpack .NewLogger (os .Stdout )
735+ manifest := & libbuildpack.Manifest {}
736+ stager := libbuildpack .NewStager ([]string {tmpDir , "" , "0" }, logger , manifest )
737+
738+ ctx := & frameworks.Context {
739+ Stager : stager ,
740+ Manifest : manifest ,
741+ Log : logger ,
742+ }
743+
744+ framework := frameworks .NewSpringAutoReconfigurationFramework (ctx )
745+
746+ // Should not detect without Spring
747+ name , err := framework .Detect ()
748+ if err != nil {
749+ t .Fatalf ("Expected no error, got: %v" , err )
750+ }
751+ if name != "" {
752+ t .Errorf ("Expected no detection without Spring, got: %s" , name )
753+ }
754+ }
755+
756+ // TestSpringAutoReconfigurationSkipWithJavaCfEnv tests skipping when java-cfenv is present
757+ func TestSpringAutoReconfigurationSkipWithJavaCfEnv (t * testing.T ) {
758+ tmpDir , err := os .MkdirTemp ("" , "java-buildpack-test-*" )
759+ if err != nil {
760+ t .Fatalf ("Failed to create temp dir: %v" , err )
761+ }
762+ defer os .RemoveAll (tmpDir )
763+
764+ // Create BOOT-INF/lib directory structure
765+ bootInfLib := filepath .Join (tmpDir , "BOOT-INF" , "lib" )
766+ if err := os .MkdirAll (bootInfLib , 0755 ); err != nil {
767+ t .Fatalf ("Failed to create BOOT-INF/lib: %v" , err )
768+ }
769+
770+ // Create both spring-core and java-cfenv JARs
771+ springCoreJar := filepath .Join (bootInfLib , "spring-core-5.3.29.jar" )
772+ if err := os .WriteFile (springCoreJar , []byte ("fake jar" ), 0644 ); err != nil {
773+ t .Fatalf ("Failed to create spring-core JAR: %v" , err )
774+ }
775+
776+ javaCfEnvJar := filepath .Join (bootInfLib , "java-cfenv-boot-3.1.5.jar" )
777+ if err := os .WriteFile (javaCfEnvJar , []byte ("fake jar" ), 0644 ); err != nil {
778+ t .Fatalf ("Failed to create java-cfenv JAR: %v" , err )
779+ }
780+
781+ logger := libbuildpack .NewLogger (os .Stdout )
782+ manifest := & libbuildpack.Manifest {}
783+ stager := libbuildpack .NewStager ([]string {tmpDir , "" , "0" }, logger , manifest )
784+
785+ ctx := & frameworks.Context {
786+ Stager : stager ,
787+ Manifest : manifest ,
788+ Log : logger ,
789+ }
790+
791+ framework := frameworks .NewSpringAutoReconfigurationFramework (ctx )
792+
793+ // Should NOT detect when java-cfenv is present
794+ name , err := framework .Detect ()
795+ if err != nil {
796+ t .Fatalf ("Expected no error, got: %v" , err )
797+ }
798+ if name != "" {
799+ t .Errorf ("Expected no detection with java-cfenv present, got: %s" , name )
800+ }
801+ }
802+
803+ // TestSpringAutoReconfigurationDisabled tests disabled via environment variable
804+ func TestSpringAutoReconfigurationDisabled (t * testing.T ) {
805+ tmpDir , err := os .MkdirTemp ("" , "java-buildpack-test-*" )
806+ if err != nil {
807+ t .Fatalf ("Failed to create temp dir: %v" , err )
808+ }
809+ defer os .RemoveAll (tmpDir )
810+
811+ // Create BOOT-INF/lib directory structure
812+ bootInfLib := filepath .Join (tmpDir , "BOOT-INF" , "lib" )
813+ if err := os .MkdirAll (bootInfLib , 0755 ); err != nil {
814+ t .Fatalf ("Failed to create BOOT-INF/lib: %v" , err )
815+ }
816+
817+ // Create spring-core JAR
818+ springCoreJar := filepath .Join (bootInfLib , "spring-core-5.3.29.jar" )
819+ if err := os .WriteFile (springCoreJar , []byte ("fake jar" ), 0644 ); err != nil {
820+ t .Fatalf ("Failed to create spring-core JAR: %v" , err )
821+ }
822+
823+ // Disable Spring Auto-reconfiguration
824+ os .Setenv ("JBP_CONFIG_SPRING_AUTO_RECONFIGURATION" , "{enabled: false}" )
825+ defer os .Unsetenv ("JBP_CONFIG_SPRING_AUTO_RECONFIGURATION" )
826+
827+ logger := libbuildpack .NewLogger (os .Stdout )
828+ manifest := & libbuildpack.Manifest {}
829+ stager := libbuildpack .NewStager ([]string {tmpDir , "" , "0" }, logger , manifest )
830+
831+ ctx := & frameworks.Context {
832+ Stager : stager ,
833+ Manifest : manifest ,
834+ Log : logger ,
835+ }
836+
837+ framework := frameworks .NewSpringAutoReconfigurationFramework (ctx )
838+
839+ // Should NOT detect when explicitly disabled
840+ name , err := framework .Detect ()
841+ if err != nil {
842+ t .Fatalf ("Expected no error, got: %v" , err )
843+ }
844+ if name != "" {
845+ t .Errorf ("Expected no detection when disabled, got: %s" , name )
846+ }
847+ }
0 commit comments