filter_test.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package ldap
  2. import (
  3. "reflect"
  4. "testing"
  5. "github.com/nmcclain/asn1-ber"
  6. )
  7. type compileTest struct {
  8. filterStr string
  9. filterType uint8
  10. }
  11. var testFilters = []compileTest{
  12. compileTest{filterStr: "(&(sn=Miller)(givenName=Bob))", filterType: FilterAnd},
  13. compileTest{filterStr: "(|(sn=Miller)(givenName=Bob))", filterType: FilterOr},
  14. compileTest{filterStr: "(!(sn=Miller))", filterType: FilterNot},
  15. compileTest{filterStr: "(sn=Miller)", filterType: FilterEqualityMatch},
  16. compileTest{filterStr: "(sn=Mill*)", filterType: FilterSubstrings},
  17. compileTest{filterStr: "(sn=*Mill)", filterType: FilterSubstrings},
  18. compileTest{filterStr: "(sn=*Mill*)", filterType: FilterSubstrings},
  19. compileTest{filterStr: "(sn>=Miller)", filterType: FilterGreaterOrEqual},
  20. compileTest{filterStr: "(sn<=Miller)", filterType: FilterLessOrEqual},
  21. compileTest{filterStr: "(sn=*)", filterType: FilterPresent},
  22. compileTest{filterStr: "(sn~=Miller)", filterType: FilterApproxMatch},
  23. // compileTest{ filterStr: "()", filterType: FilterExtensibleMatch },
  24. }
  25. func TestFilter(t *testing.T) {
  26. // Test Compiler and Decompiler
  27. for _, i := range testFilters {
  28. filter, err := CompileFilter(i.filterStr)
  29. if err != nil {
  30. t.Errorf("Problem compiling %s - %s", i.filterStr, err.Error())
  31. } else if filter.Tag != uint8(i.filterType) {
  32. t.Errorf("%q Expected %q got %q", i.filterStr, FilterMap[i.filterType], FilterMap[filter.Tag])
  33. } else {
  34. o, err := DecompileFilter(filter)
  35. if err != nil {
  36. t.Errorf("Problem compiling %s - %s", i.filterStr, err.Error())
  37. } else if i.filterStr != o {
  38. t.Errorf("%q expected, got %q", i.filterStr, o)
  39. }
  40. }
  41. }
  42. }
  43. type binTestFilter struct {
  44. bin []byte
  45. str string
  46. }
  47. var binTestFilters = []binTestFilter{
  48. {bin: []byte{0x87, 0x06, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72}, str: "(member=*)"},
  49. }
  50. func TestFiltersDecode(t *testing.T) {
  51. for i, test := range binTestFilters {
  52. p := ber.DecodePacket(test.bin)
  53. if filter, err := DecompileFilter(p); err != nil {
  54. t.Errorf("binTestFilters[%d], DecompileFilter returned : %s", i, err)
  55. } else if filter != test.str {
  56. t.Errorf("binTestFilters[%d], %q expected, got %q", i, test.str, filter)
  57. }
  58. }
  59. }
  60. func TestFiltersEncode(t *testing.T) {
  61. for i, test := range binTestFilters {
  62. p, err := CompileFilter(test.str)
  63. if err != nil {
  64. t.Errorf("binTestFilters[%d], CompileFilter returned : %s", i, err)
  65. continue
  66. }
  67. b := p.Bytes()
  68. if !reflect.DeepEqual(b, test.bin) {
  69. t.Errorf("binTestFilters[%d], %q expected for CompileFilter(%q), got %q", i, test.bin, test.str, b)
  70. }
  71. }
  72. }
  73. func BenchmarkFilterCompile(b *testing.B) {
  74. b.StopTimer()
  75. filters := make([]string, len(testFilters))
  76. // Test Compiler and Decompiler
  77. for idx, i := range testFilters {
  78. filters[idx] = i.filterStr
  79. }
  80. maxIdx := len(filters)
  81. b.StartTimer()
  82. for i := 0; i < b.N; i++ {
  83. CompileFilter(filters[i%maxIdx])
  84. }
  85. }
  86. func BenchmarkFilterDecompile(b *testing.B) {
  87. b.StopTimer()
  88. filters := make([]*ber.Packet, len(testFilters))
  89. // Test Compiler and Decompiler
  90. for idx, i := range testFilters {
  91. filters[idx], _ = CompileFilter(i.filterStr)
  92. }
  93. maxIdx := len(filters)
  94. b.StartTimer()
  95. for i := 0; i < b.N; i++ {
  96. DecompileFilter(filters[i%maxIdx])
  97. }
  98. }
  99. func TestGetFilterObjectClass(t *testing.T) {
  100. c, err := GetFilterObjectClass("(objectClass=*)")
  101. if err != nil {
  102. t.Errorf("GetFilterObjectClass failed")
  103. }
  104. if c != "" {
  105. t.Errorf("GetFilterObjectClass failed")
  106. }
  107. c, err = GetFilterObjectClass("(objectClass=posixAccount)")
  108. if err != nil {
  109. t.Errorf("GetFilterObjectClass failed")
  110. }
  111. if c != "posixaccount" {
  112. t.Errorf("GetFilterObjectClass failed")
  113. }
  114. c, err = GetFilterObjectClass("(&(cn=awesome)(objectClass=posixGroup))")
  115. if err != nil {
  116. t.Errorf("GetFilterObjectClass failed")
  117. }
  118. if c != "posixgroup" {
  119. t.Errorf("GetFilterObjectClass failed")
  120. }
  121. }