github.com/aporeto-inc/trireme-lib@v10.358.0+incompatible/utils/frontman/driver_windows_test.go (about)

     1  // +build windows,ignore
     2  
     3  package frontman
     4  
     5  // TODO(windows): these tests need to be moved to integration tests when possible
     6  
     7  import (
     8  	"testing"
     9  	"unsafe"
    10  
    11  	. "github.com/smartystreets/goconvey/convey"
    12  )
    13  
    14  func TestFrontmanStructLayout(t *testing.T) {
    15  
    16  	Convey("Given a Frontman PDB", t, func() {
    17  
    18  		pdb, err := abi.FindFrontmanPdb()
    19  		So(err, ShouldBeNil)
    20  
    21  		Convey("The layout of DestInfo and DEST_INFO should be the same", func() {
    22  			layout, err := pdb.GetStructLayout("_DEST_INFO")
    23  			So(err, ShouldBeNil)
    24  			So(unsafe.Sizeof(DestInfo{}), ShouldEqual, layout.Size)
    25  			// WCHAR* IPAddress
    26  			index := 0
    27  			So("IPAddress", ShouldEqual, layout.Members[index].Name)
    28  			So(unsafe.Offsetof(DestInfo{}.IpAddr), ShouldEqual, layout.Members[index].Offset)
    29  			// USHORT Port
    30  			index++
    31  			So("Port", ShouldEqual, layout.Members[index].Name)
    32  			So(unsafe.Offsetof(DestInfo{}.Port), ShouldEqual, layout.Members[index].Offset)
    33  			// INT32 Outbound
    34  			index++
    35  			So("Outbound", ShouldEqual, layout.Members[index].Name)
    36  			So(unsafe.Offsetof(DestInfo{}.Outbound), ShouldEqual, layout.Members[index].Offset)
    37  			// UINT64 ProcessId
    38  			index++
    39  			So("ProcessId", ShouldEqual, layout.Members[index].Name)
    40  			So(unsafe.Offsetof(DestInfo{}.ProcessId), ShouldEqual, layout.Members[index].Offset)
    41  			// LPVOID DestHandle
    42  			index++
    43  			So("DestHandle", ShouldEqual, layout.Members[index].Name)
    44  			So(unsafe.Offsetof(DestInfo{}.DestHandle), ShouldEqual, layout.Members[index].Offset)
    45  		})
    46  
    47  		Convey("The layout of PacketInfo and FRONTMAN_PACKET_INFO should be the same", func() {
    48  			layout, err := pdb.GetStructLayout("FRONTMAN_PACKET_INFO")
    49  			So(err, ShouldBeNil)
    50  			So(unsafe.Sizeof(PacketInfo{}), ShouldEqual, layout.Size)
    51  			// UINT8 Ipv4
    52  			index := 0
    53  			So("Ipv4", ShouldEqual, layout.Members[index].Name)
    54  			So(unsafe.Offsetof(PacketInfo{}.Ipv4), ShouldEqual, layout.Members[index].Offset)
    55  			// UINT8 Protocol
    56  			index++
    57  			So("Protocol", ShouldEqual, layout.Members[index].Name)
    58  			So(unsafe.Offsetof(PacketInfo{}.Protocol), ShouldEqual, layout.Members[index].Offset)
    59  			// UINT8 Outbound
    60  			index++
    61  			So("Outbound", ShouldEqual, layout.Members[index].Name)
    62  			So(unsafe.Offsetof(PacketInfo{}.Outbound), ShouldEqual, layout.Members[index].Offset)
    63  			// UINT8 Drop
    64  			index++
    65  			So("Drop", ShouldEqual, layout.Members[index].Name)
    66  			So(unsafe.Offsetof(PacketInfo{}.Drop), ShouldEqual, layout.Members[index].Offset)
    67  			// UINT8 IngoreFlow [sic]
    68  			index++
    69  			So("IngoreFlow", ShouldEqual, layout.Members[index].Name)
    70  			So(unsafe.Offsetof(PacketInfo{}.IgnoreFlow), ShouldEqual, layout.Members[index].Offset)
    71  			// skip reserved
    72  			index += 3
    73  			// UINT16 LocalPort
    74  			index++
    75  			So("LocalPort", ShouldEqual, layout.Members[index].Name)
    76  			So(unsafe.Offsetof(PacketInfo{}.LocalPort), ShouldEqual, layout.Members[index].Offset)
    77  			// UINT16 RemotePort
    78  			index++
    79  			So("RemotePort", ShouldEqual, layout.Members[index].Name)
    80  			So(unsafe.Offsetof(PacketInfo{}.RemotePort), ShouldEqual, layout.Members[index].Offset)
    81  			// UINT32 LocalAddr[4]
    82  			index++
    83  			So("LocalAddr", ShouldEqual, layout.Members[index].Name)
    84  			So(unsafe.Offsetof(PacketInfo{}.LocalAddr), ShouldEqual, layout.Members[index].Offset)
    85  			// UINT32 RemoteAddr[4]
    86  			index++
    87  			So("RemoteAddr", ShouldEqual, layout.Members[index].Name)
    88  			So(unsafe.Offsetof(PacketInfo{}.RemoteAddr), ShouldEqual, layout.Members[index].Offset)
    89  			// UINT32 IfIdx
    90  			index++
    91  			So("IfIdx", ShouldEqual, layout.Members[index].Name)
    92  			So(unsafe.Offsetof(PacketInfo{}.IfIdx), ShouldEqual, layout.Members[index].Offset)
    93  			// UINT32 SubIfIdx
    94  			index++
    95  			So("SubIfIdx", ShouldEqual, layout.Members[index].Name)
    96  			So(unsafe.Offsetof(PacketInfo{}.SubIfIdx), ShouldEqual, layout.Members[index].Offset)
    97  			// UINT32 PacketSize
    98  			index++
    99  			So("PacketSize", ShouldEqual, layout.Members[index].Name)
   100  			So(unsafe.Offsetof(PacketInfo{}.PacketSize), ShouldEqual, layout.Members[index].Offset)
   101  			// UINT32 Mark
   102  			index++
   103  			So("Mark", ShouldEqual, layout.Members[index].Name)
   104  			So(unsafe.Offsetof(PacketInfo{}.Mark), ShouldEqual, layout.Members[index].Offset)
   105  			// UINT64 StartTimeReceivedFromNetwork
   106  			index++
   107  			So("StartTimeReceivedFromNetwork", ShouldEqual, layout.Members[index].Name)
   108  			So(unsafe.Offsetof(PacketInfo{}.StartTimeReceivedFromNetwork), ShouldEqual, layout.Members[index].Offset)
   109  			// UINT64 StartTimeSentToUserLand
   110  			index++
   111  			So("StartTimeSentToUserLand", ShouldEqual, layout.Members[index].Name)
   112  			So(unsafe.Offsetof(PacketInfo{}.StartTimeSentToUserLand), ShouldEqual, layout.Members[index].Offset)
   113  		})
   114  
   115  		Convey("The layout of RuleSpec and RULE_SPEC should be the same", func() {
   116  			layout, err := pdb.GetStructLayout("RULE_SPEC")
   117  			So(err, ShouldBeNil)
   118  			So(unsafe.Sizeof(RuleSpec{}), ShouldEqual, layout.Size)
   119  			// UINT8 Action
   120  			index := 0
   121  			So("Action", ShouldEqual, layout.Members[index].Name)
   122  			So(unsafe.Offsetof(RuleSpec{}.Action), ShouldEqual, layout.Members[index].Offset)
   123  			// UINT8 Log
   124  			index++
   125  			So("Log", ShouldEqual, layout.Members[index].Name)
   126  			So(unsafe.Offsetof(RuleSpec{}.Log), ShouldEqual, layout.Members[index].Offset)
   127  			// UINT8 Protocol
   128  			index++
   129  			So("Protocol", ShouldEqual, layout.Members[index].Name)
   130  			So(unsafe.Offsetof(RuleSpec{}.Protocol), ShouldEqual, layout.Members[index].Offset)
   131  			// UINT8 ProtocolSpecified
   132  			index++
   133  			So("ProtocolSpecified", ShouldEqual, layout.Members[index].Name)
   134  			So(unsafe.Offsetof(RuleSpec{}.ProtocolSpecified), ShouldEqual, layout.Members[index].Offset)
   135  			// UINT8 IcmpType
   136  			index++
   137  			So("IcmpType", ShouldEqual, layout.Members[index].Name)
   138  			So(unsafe.Offsetof(RuleSpec{}.IcmpType), ShouldEqual, layout.Members[index].Offset)
   139  			// UINT8 IcmpTypeSpecified
   140  			index++
   141  			So("IcmpTypeSpecified", ShouldEqual, layout.Members[index].Name)
   142  			So(unsafe.Offsetof(RuleSpec{}.IcmpTypeSpecified), ShouldEqual, layout.Members[index].Offset)
   143  			// UINT8 IcmpCode
   144  			index++
   145  			So("IcmpCode", ShouldEqual, layout.Members[index].Name)
   146  			So(unsafe.Offsetof(RuleSpec{}.IcmpCode), ShouldEqual, layout.Members[index].Offset)
   147  			// UINT8 IcmpCodeSpecified
   148  			index++
   149  			So("IcmpCodeSpecified", ShouldEqual, layout.Members[index].Name)
   150  			So(unsafe.Offsetof(RuleSpec{}.IcmpCodeSpecified), ShouldEqual, layout.Members[index].Offset)
   151  			// UINT8 AleAuthConnect
   152  			index++
   153  			So("AleAuthConnect", ShouldEqual, layout.Members[index].Name)
   154  			So(unsafe.Offsetof(RuleSpec{}.AleAuthConnect), ShouldEqual, layout.Members[index].Offset)
   155  			// skip reserved
   156  			index++
   157  			// UINT16 ProxyPort
   158  			index++
   159  			So("ProxyPort", ShouldEqual, layout.Members[index].Name)
   160  			So(unsafe.Offsetof(RuleSpec{}.ProxyPort), ShouldEqual, layout.Members[index].Offset)
   161  			// INT16 BytesMatchStart
   162  			index++
   163  			So("BytesMatchStart", ShouldEqual, layout.Members[index].Name)
   164  			So(unsafe.Offsetof(RuleSpec{}.BytesMatchStart), ShouldEqual, layout.Members[index].Offset)
   165  			// INT32 BytesMatchOffset
   166  			index++
   167  			So("BytesMatchOffset", ShouldEqual, layout.Members[index].Name)
   168  			So(unsafe.Offsetof(RuleSpec{}.BytesMatchOffset), ShouldEqual, layout.Members[index].Offset)
   169  			// INT32 BytesMatchSize
   170  			index++
   171  			So("BytesMatchSize", ShouldEqual, layout.Members[index].Name)
   172  			So(unsafe.Offsetof(RuleSpec{}.BytesMatchSize), ShouldEqual, layout.Members[index].Offset)
   173  			// PBYTE BytesMatch
   174  			index++
   175  			So("BytesMatch", ShouldEqual, layout.Members[index].Name)
   176  			So(unsafe.Offsetof(RuleSpec{}.BytesMatch), ShouldEqual, layout.Members[index].Offset)
   177  			// UINT32 Mark
   178  			index++
   179  			So("Mark", ShouldEqual, layout.Members[index].Name)
   180  			So(unsafe.Offsetof(RuleSpec{}.Mark), ShouldEqual, layout.Members[index].Offset)
   181  			// UINT32 GroupId
   182  			index++
   183  			So("GroupId", ShouldEqual, layout.Members[index].Name)
   184  			So(unsafe.Offsetof(RuleSpec{}.GroupId), ShouldEqual, layout.Members[index].Offset)
   185  			// INT32 SrcPortCount
   186  			index++
   187  			So("SrcPortCount", ShouldEqual, layout.Members[index].Name)
   188  			So(unsafe.Offsetof(RuleSpec{}.SrcPortCount), ShouldEqual, layout.Members[index].Offset)
   189  			// INT32 DstPortCount
   190  			index++
   191  			So("DstPortCount", ShouldEqual, layout.Members[index].Name)
   192  			So(unsafe.Offsetof(RuleSpec{}.DstPortCount), ShouldEqual, layout.Members[index].Offset)
   193  			// PPORT_RANGE SrcPorts
   194  			index++
   195  			So("SrcPorts", ShouldEqual, layout.Members[index].Name)
   196  			So(unsafe.Offsetof(RuleSpec{}.SrcPorts), ShouldEqual, layout.Members[index].Offset)
   197  			// PPORT_RANGE DstPorts
   198  			index++
   199  			So("DstPorts", ShouldEqual, layout.Members[index].Name)
   200  			So(unsafe.Offsetof(RuleSpec{}.DstPorts), ShouldEqual, layout.Members[index].Offset)
   201  			// LPCWCH LogPrefix
   202  			index++
   203  			So("LogPrefix", ShouldEqual, layout.Members[index].Name)
   204  			So(unsafe.Offsetof(RuleSpec{}.LogPrefix), ShouldEqual, layout.Members[index].Offset)
   205  			// LPCWCH Application
   206  			index++
   207  			So("Application", ShouldEqual, layout.Members[index].Name)
   208  			So(unsafe.Offsetof(RuleSpec{}.Application), ShouldEqual, layout.Members[index].Offset)
   209  		})
   210  
   211  		Convey("The layout of IpsetRuleSpec and IPSET_RULE_SPEC should be the same", func() {
   212  			layout, err := pdb.GetStructLayout("IPSET_RULE_SPEC")
   213  			So(err, ShouldBeNil)
   214  			So(unsafe.Sizeof(IpsetRuleSpec{}), ShouldEqual, layout.Size)
   215  			// UINT8 NotIpset
   216  			index := 0
   217  			So("NotIpset", ShouldEqual, layout.Members[index].Name)
   218  			So(unsafe.Offsetof(IpsetRuleSpec{}.NotIpset), ShouldEqual, layout.Members[index].Offset)
   219  			// UINT8 IpsetDstIp
   220  			index++
   221  			So("IpsetDstIp", ShouldEqual, layout.Members[index].Name)
   222  			So(unsafe.Offsetof(IpsetRuleSpec{}.IpsetDstIp), ShouldEqual, layout.Members[index].Offset)
   223  			// UINT8 IpsetDstPort
   224  			index++
   225  			So("IpsetDstPort", ShouldEqual, layout.Members[index].Name)
   226  			So(unsafe.Offsetof(IpsetRuleSpec{}.IpsetDstPort), ShouldEqual, layout.Members[index].Offset)
   227  			// UINT8 IpsetSrcIp
   228  			index++
   229  			So("IpsetSrcIp", ShouldEqual, layout.Members[index].Name)
   230  			So(unsafe.Offsetof(IpsetRuleSpec{}.IpsetSrcIp), ShouldEqual, layout.Members[index].Offset)
   231  			// UINT8 IpsetSrcPort
   232  			index++
   233  			So("IpsetSrcPort", ShouldEqual, layout.Members[index].Name)
   234  			So(unsafe.Offsetof(IpsetRuleSpec{}.IpsetSrcPort), ShouldEqual, layout.Members[index].Offset)
   235  			// skip reserved
   236  			index++
   237  			// LPCWCH IpsetName
   238  			index++
   239  			So("IpsetName", ShouldEqual, layout.Members[index].Name)
   240  			So(unsafe.Offsetof(IpsetRuleSpec{}.IpsetName), ShouldEqual, layout.Members[index].Offset)
   241  		})
   242  
   243  		Convey("The layout of PortRange and PORT_RANGE should be the same", func() {
   244  			layout, err := pdb.GetStructLayout("PORT_RANGE")
   245  			So(err, ShouldBeNil)
   246  			So(unsafe.Sizeof(PortRange{}), ShouldEqual, layout.Size)
   247  			// UINT16 PortStart
   248  			index := 0
   249  			So("PortStart", ShouldEqual, layout.Members[index].Name)
   250  			So(unsafe.Offsetof(PortRange{}.PortStart), ShouldEqual, layout.Members[index].Offset)
   251  			// UINT16 PortEnd
   252  			index++
   253  			So("PortEnd", ShouldEqual, layout.Members[index].Name)
   254  			So(unsafe.Offsetof(PortRange{}.PortEnd), ShouldEqual, layout.Members[index].Offset)
   255  		})
   256  
   257  		Convey("The layout of LogPacketInfo and FRONTMAN_LOG_PACKET_INFO should be the same", func() {
   258  			layout, err := pdb.GetStructLayout("FRONTMAN_LOG_PACKET_INFO")
   259  			So(err, ShouldBeNil)
   260  			So(unsafe.Sizeof(LogPacketInfo{}), ShouldEqual, layout.Size)
   261  			// UINT8 Ipv4
   262  			index := 0
   263  			So("Ipv4", ShouldEqual, layout.Members[index].Name)
   264  			So(unsafe.Offsetof(LogPacketInfo{}.Ipv4), ShouldEqual, layout.Members[index].Offset)
   265  			// UINT8 Protocol
   266  			index++
   267  			So("Protocol", ShouldEqual, layout.Members[index].Name)
   268  			So(unsafe.Offsetof(LogPacketInfo{}.Protocol), ShouldEqual, layout.Members[index].Offset)
   269  			// UINT8 Outbound
   270  			index++
   271  			So("Outbound", ShouldEqual, layout.Members[index].Name)
   272  			So(unsafe.Offsetof(LogPacketInfo{}.Outbound), ShouldEqual, layout.Members[index].Offset)
   273  			// skip reserved
   274  			index++
   275  			// UINT16 LocalPort
   276  			index++
   277  			So("LocalPort", ShouldEqual, layout.Members[index].Name)
   278  			So(unsafe.Offsetof(LogPacketInfo{}.LocalPort), ShouldEqual, layout.Members[index].Offset)
   279  			// UINT16 RemotePort
   280  			index++
   281  			So("RemotePort", ShouldEqual, layout.Members[index].Name)
   282  			So(unsafe.Offsetof(LogPacketInfo{}.RemotePort), ShouldEqual, layout.Members[index].Offset)
   283  			// UINT32 LocalAddr[4]
   284  			index++
   285  			So("LocalAddr", ShouldEqual, layout.Members[index].Name)
   286  			So(unsafe.Offsetof(LogPacketInfo{}.LocalAddr), ShouldEqual, layout.Members[index].Offset)
   287  			// // UINT32 RemoteAddr[4]
   288  			index++
   289  			So("RemoteAddr", ShouldEqual, layout.Members[index].Name)
   290  			So(unsafe.Offsetof(LogPacketInfo{}.RemoteAddr), ShouldEqual, layout.Members[index].Offset)
   291  			// UINT32 PacketSize
   292  			index++
   293  			So("PacketSize", ShouldEqual, layout.Members[index].Name)
   294  			So(unsafe.Offsetof(LogPacketInfo{}.PacketSize), ShouldEqual, layout.Members[index].Offset)
   295  			// UINT32 GroupId
   296  			index++
   297  			So("GroupId", ShouldEqual, layout.Members[index].Name)
   298  			So(unsafe.Offsetof(LogPacketInfo{}.GroupId), ShouldEqual, layout.Members[index].Offset)
   299  			// WCHAR LogPrefix[LOGPREFIX_MAX_LENGTH]
   300  			index++
   301  			So("LogPrefix", ShouldEqual, layout.Members[index].Name)
   302  			So(unsafe.Offsetof(LogPacketInfo{}.LogPrefix), ShouldEqual, layout.Members[index].Offset)
   303  		})
   304  
   305  	})
   306  
   307  }
   308  
   309  func TestFrontmanFunctionArguments(t *testing.T) {
   310  
   311  	const pointerSize = unsafe.Sizeof(uintptr(0))
   312  
   313  	Convey("Given a Frontman PDB", t, func() {
   314  
   315  		pdb, err := abi.FindFrontmanPdb()
   316  		So(err, ShouldBeNil)
   317  
   318  		Convey("The arguments to FrontmanGetDestInfo should be as expected", func() {
   319  			funcArgs, err := pdb.GetFunctionArguments("FrontmanGetDestInfo")
   320  			So(err, ShouldBeNil)
   321  			So(len(funcArgs), ShouldEqual, 3)
   322  			So(funcArgs[0].Size, ShouldEqual, pointerSize)
   323  			So(funcArgs[1].Size, ShouldEqual, pointerSize)
   324  			So(funcArgs[2].Size, ShouldEqual, pointerSize)
   325  		})
   326  
   327  		Convey("The arguments to FrontmanApplyDestHandle should be as expected", func() {
   328  			funcArgs, err := pdb.GetFunctionArguments("FrontmanApplyDestHandle")
   329  			So(err, ShouldBeNil)
   330  			So(len(funcArgs), ShouldEqual, 2)
   331  			So(funcArgs[0].Size, ShouldEqual, pointerSize)
   332  			So(funcArgs[1].Size, ShouldEqual, pointerSize)
   333  		})
   334  
   335  		Convey("The arguments to FrontmanFreeDestHandle should be as expected", func() {
   336  			funcArgs, err := pdb.GetFunctionArguments("FrontmanFreeDestHandle")
   337  			So(err, ShouldBeNil)
   338  			So(len(funcArgs), ShouldEqual, 1)
   339  			So(funcArgs[0].Size, ShouldEqual, pointerSize)
   340  		})
   341  
   342  		Convey("The arguments to IpsetProvider_NewIpset should be as expected", func() {
   343  			funcArgs, err := pdb.GetFunctionArguments("IpsetProvider_NewIpset")
   344  			So(err, ShouldBeNil)
   345  			So(len(funcArgs), ShouldEqual, 4)
   346  			So(funcArgs[0].Size, ShouldEqual, pointerSize)
   347  			So(funcArgs[1].Size, ShouldEqual, pointerSize)
   348  			So(funcArgs[2].Size, ShouldEqual, pointerSize)
   349  			So(funcArgs[3].Size, ShouldEqual, pointerSize)
   350  		})
   351  
   352  		Convey("The arguments to IpsetProvider_GetIpset should be as expected", func() {
   353  			funcArgs, err := pdb.GetFunctionArguments("IpsetProvider_GetIpset")
   354  			So(err, ShouldBeNil)
   355  			So(len(funcArgs), ShouldEqual, 3)
   356  			So(funcArgs[0].Size, ShouldEqual, pointerSize)
   357  			So(funcArgs[1].Size, ShouldEqual, pointerSize)
   358  			So(funcArgs[2].Size, ShouldEqual, pointerSize)
   359  		})
   360  
   361  		Convey("The arguments to IpsetProvider_DestroyAll should be as expected", func() {
   362  			funcArgs, err := pdb.GetFunctionArguments("IpsetProvider_DestroyAll")
   363  			So(err, ShouldBeNil)
   364  			So(len(funcArgs), ShouldEqual, 2)
   365  			So(funcArgs[0].Size, ShouldEqual, pointerSize)
   366  			So(funcArgs[1].Size, ShouldEqual, pointerSize)
   367  		})
   368  
   369  		Convey("The arguments to IpsetProvider_ListIPSets should be as expected", func() {
   370  			funcArgs, err := pdb.GetFunctionArguments("IpsetProvider_ListIPSets")
   371  			So(err, ShouldBeNil)
   372  			So(len(funcArgs), ShouldEqual, 4)
   373  			So(funcArgs[0].Size, ShouldEqual, pointerSize)
   374  			So(funcArgs[1].Size, ShouldEqual, pointerSize)
   375  			So(funcArgs[2].Size, ShouldEqual, unsafe.Sizeof(uint32(0)))
   376  			So(funcArgs[3].Size, ShouldEqual, pointerSize)
   377  		})
   378  
   379  		Convey("The arguments to IpsetProvider_ListIPSetsDetail should be as expected", func() {
   380  			funcArgs, err := pdb.GetFunctionArguments("IpsetProvider_ListIPSetsDetail")
   381  			So(err, ShouldBeNil)
   382  			So(len(funcArgs), ShouldEqual, 5)
   383  			So(funcArgs[0].Size, ShouldEqual, pointerSize)
   384  			So(funcArgs[1].Size, ShouldEqual, unsafe.Sizeof(int32(0)))
   385  			So(funcArgs[2].Size, ShouldEqual, pointerSize)
   386  			So(funcArgs[3].Size, ShouldEqual, unsafe.Sizeof(uint32(0)))
   387  			So(funcArgs[4].Size, ShouldEqual, pointerSize)
   388  		})
   389  
   390  		Convey("The arguments to Ipset_Add should be as expected", func() {
   391  			funcArgs, err := pdb.GetFunctionArguments("Ipset_Add")
   392  			So(err, ShouldBeNil)
   393  			So(len(funcArgs), ShouldEqual, 4)
   394  			So(funcArgs[0].Size, ShouldEqual, pointerSize)
   395  			So(funcArgs[1].Size, ShouldEqual, pointerSize)
   396  			So(funcArgs[2].Size, ShouldEqual, pointerSize)
   397  			So(funcArgs[3].Size, ShouldEqual, unsafe.Sizeof(uint32(0)))
   398  		})
   399  
   400  		Convey("The arguments to Ipset_AddOption should be as expected", func() {
   401  			funcArgs, err := pdb.GetFunctionArguments("Ipset_AddOption")
   402  			So(err, ShouldBeNil)
   403  			So(len(funcArgs), ShouldEqual, 5)
   404  			So(funcArgs[0].Size, ShouldEqual, pointerSize)
   405  			So(funcArgs[1].Size, ShouldEqual, pointerSize)
   406  			So(funcArgs[2].Size, ShouldEqual, pointerSize)
   407  			So(funcArgs[3].Size, ShouldEqual, pointerSize)
   408  			So(funcArgs[4].Size, ShouldEqual, unsafe.Sizeof(uint32(0)))
   409  		})
   410  
   411  		Convey("The arguments to Ipset_Delete should be as expected", func() {
   412  			funcArgs, err := pdb.GetFunctionArguments("Ipset_Delete")
   413  			So(err, ShouldBeNil)
   414  			So(len(funcArgs), ShouldEqual, 3)
   415  			So(funcArgs[0].Size, ShouldEqual, pointerSize)
   416  			So(funcArgs[1].Size, ShouldEqual, pointerSize)
   417  			So(funcArgs[2].Size, ShouldEqual, pointerSize)
   418  		})
   419  
   420  		Convey("The arguments to Ipset_Destroy should be as expected", func() {
   421  			funcArgs, err := pdb.GetFunctionArguments("Ipset_Destroy")
   422  			So(err, ShouldBeNil)
   423  			So(len(funcArgs), ShouldEqual, 2)
   424  			So(funcArgs[0].Size, ShouldEqual, pointerSize)
   425  			So(funcArgs[1].Size, ShouldEqual, pointerSize)
   426  		})
   427  
   428  		Convey("The arguments to Ipset_Flush should be as expected", func() {
   429  			funcArgs, err := pdb.GetFunctionArguments("Ipset_Flush")
   430  			So(err, ShouldBeNil)
   431  			So(len(funcArgs), ShouldEqual, 2)
   432  			So(funcArgs[0].Size, ShouldEqual, pointerSize)
   433  			So(funcArgs[1].Size, ShouldEqual, pointerSize)
   434  		})
   435  
   436  		Convey("The arguments to Ipset_Test should be as expected", func() {
   437  			funcArgs, err := pdb.GetFunctionArguments("Ipset_Test")
   438  			So(err, ShouldBeNil)
   439  			So(len(funcArgs), ShouldEqual, 3)
   440  			So(funcArgs[0].Size, ShouldEqual, pointerSize)
   441  			So(funcArgs[1].Size, ShouldEqual, pointerSize)
   442  			So(funcArgs[2].Size, ShouldEqual, pointerSize)
   443  		})
   444  
   445  		Convey("The arguments to PacketFilterStart should be as expected", func() {
   446  			funcArgs, err := pdb.GetFunctionArguments("PacketFilterStart")
   447  			So(err, ShouldBeNil)
   448  			So(len(funcArgs), ShouldEqual, 4)
   449  			So(funcArgs[0].Size, ShouldEqual, pointerSize)
   450  			So(funcArgs[1].Size, ShouldEqual, pointerSize)
   451  			So(funcArgs[2].Size, ShouldEqual, pointerSize)
   452  			So(funcArgs[3].Size, ShouldEqual, pointerSize)
   453  		})
   454  
   455  		Convey("The arguments to PacketFilterClose should be as expected", func() {
   456  			funcArgs, err := pdb.GetFunctionArguments("PacketFilterClose")
   457  			So(err, ShouldBeNil)
   458  			So(len(funcArgs), ShouldEqual, 0)
   459  		})
   460  
   461  		Convey("The arguments to PacketFilterForwardPacket should be as expected", func() {
   462  			funcArgs, err := pdb.GetFunctionArguments("PacketFilterForwardPacket")
   463  			So(err, ShouldBeNil)
   464  			So(len(funcArgs), ShouldEqual, 2)
   465  			So(funcArgs[0].Size, ShouldEqual, pointerSize)
   466  			So(funcArgs[1].Size, ShouldEqual, pointerSize)
   467  		})
   468  
   469  		Convey("The arguments to AppendFilter should be as expected", func() {
   470  			funcArgs, err := pdb.GetFunctionArguments("AppendFilter")
   471  			So(err, ShouldBeNil)
   472  			So(len(funcArgs), ShouldEqual, 3)
   473  			So(funcArgs[0].Size, ShouldEqual, pointerSize)
   474  			So(funcArgs[1].Size, ShouldEqual, unsafe.Sizeof(uint32(0)))
   475  			So(funcArgs[2].Size, ShouldEqual, pointerSize)
   476  		})
   477  
   478  		Convey("The arguments to InsertFilter should be as expected", func() {
   479  			funcArgs, err := pdb.GetFunctionArguments("InsertFilter")
   480  			So(err, ShouldBeNil)
   481  			So(len(funcArgs), ShouldEqual, 4)
   482  			So(funcArgs[0].Size, ShouldEqual, pointerSize)
   483  			So(funcArgs[1].Size, ShouldEqual, unsafe.Sizeof(uint32(0)))
   484  			So(funcArgs[2].Size, ShouldEqual, unsafe.Sizeof(uint32(0)))
   485  			So(funcArgs[3].Size, ShouldEqual, pointerSize)
   486  		})
   487  
   488  		Convey("The arguments to DestroyFilter should be as expected", func() {
   489  			funcArgs, err := pdb.GetFunctionArguments("DestroyFilter")
   490  			So(err, ShouldBeNil)
   491  			So(len(funcArgs), ShouldEqual, 2)
   492  			So(funcArgs[0].Size, ShouldEqual, pointerSize)
   493  			So(funcArgs[1].Size, ShouldEqual, pointerSize)
   494  		})
   495  
   496  		Convey("The arguments to EmptyFilter should be as expected", func() {
   497  			funcArgs, err := pdb.GetFunctionArguments("EmptyFilter")
   498  			So(err, ShouldBeNil)
   499  			So(len(funcArgs), ShouldEqual, 2)
   500  			So(funcArgs[0].Size, ShouldEqual, pointerSize)
   501  			So(funcArgs[1].Size, ShouldEqual, pointerSize)
   502  		})
   503  
   504  		Convey("The arguments to GetFilterList should be as expected", func() {
   505  			funcArgs, err := pdb.GetFunctionArguments("GetFilterList")
   506  			So(err, ShouldBeNil)
   507  			So(len(funcArgs), ShouldEqual, 5)
   508  			So(funcArgs[0].Size, ShouldEqual, pointerSize)
   509  			So(funcArgs[1].Size, ShouldEqual, unsafe.Sizeof(uint32(0)))
   510  			So(funcArgs[2].Size, ShouldEqual, pointerSize)
   511  			So(funcArgs[3].Size, ShouldEqual, unsafe.Sizeof(uint32(0)))
   512  			So(funcArgs[4].Size, ShouldEqual, pointerSize)
   513  		})
   514  
   515  		Convey("The arguments to AppendFilterCriteria should be as expected", func() {
   516  			funcArgs, err := pdb.GetFunctionArguments("AppendFilterCriteria")
   517  			So(err, ShouldBeNil)
   518  			So(len(funcArgs), ShouldEqual, 6)
   519  			So(funcArgs[0].Size, ShouldEqual, pointerSize)
   520  			So(funcArgs[1].Size, ShouldEqual, pointerSize)
   521  			So(funcArgs[2].Size, ShouldEqual, pointerSize)
   522  			So(funcArgs[3].Size, ShouldEqual, pointerSize)
   523  			So(funcArgs[4].Size, ShouldEqual, pointerSize)
   524  			So(funcArgs[5].Size, ShouldEqual, unsafe.Sizeof(uint32(0)))
   525  		})
   526  
   527  		Convey("The arguments to DeleteFilterCriteria should be as expected", func() {
   528  			funcArgs, err := pdb.GetFunctionArguments("DeleteFilterCriteria")
   529  			So(err, ShouldBeNil)
   530  			So(len(funcArgs), ShouldEqual, 3)
   531  			So(funcArgs[0].Size, ShouldEqual, pointerSize)
   532  			So(funcArgs[1].Size, ShouldEqual, pointerSize)
   533  			So(funcArgs[2].Size, ShouldEqual, pointerSize)
   534  		})
   535  
   536  		Convey("The arguments to GetCriteriaList should be as expected", func() {
   537  			funcArgs, err := pdb.GetFunctionArguments("GetCriteriaList")
   538  			So(err, ShouldBeNil)
   539  			So(len(funcArgs), ShouldEqual, 5)
   540  			So(funcArgs[0].Size, ShouldEqual, pointerSize)
   541  			So(funcArgs[1].Size, ShouldEqual, unsafe.Sizeof(int32(0)))
   542  			So(funcArgs[2].Size, ShouldEqual, pointerSize)
   543  			So(funcArgs[3].Size, ShouldEqual, unsafe.Sizeof(uint32(0)))
   544  			So(funcArgs[4].Size, ShouldEqual, pointerSize)
   545  		})
   546  
   547  	})
   548  
   549  }