mirror of
https://github.com/fatedier/frp.git
synced 2024-12-12 09:41:19 +01:00
update vendors
This commit is contained in:
parent
6a99f0caf7
commit
4277405c0e
56
vendor/github.com/fatedier/kcp-go/README.md
generated
vendored
56
vendor/github.com/fatedier/kcp-go/README.md
generated
vendored
@ -34,6 +34,7 @@ This library intents to provide a **smooth, resilient, ordered, error-checked an
|
|||||||
1. Packet level encryption support with [AES](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard), [TEA](https://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm), [3DES](https://en.wikipedia.org/wiki/Triple_DES), [Blowfish](https://en.wikipedia.org/wiki/Blowfish_(cipher)), [Cast5](https://en.wikipedia.org/wiki/CAST-128), [Salsa20]( https://en.wikipedia.org/wiki/Salsa20), etc. in [CFB](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher_Feedback_.28CFB.29) mode, which generates completely anonymous packet.
|
1. Packet level encryption support with [AES](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard), [TEA](https://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm), [3DES](https://en.wikipedia.org/wiki/Triple_DES), [Blowfish](https://en.wikipedia.org/wiki/Blowfish_(cipher)), [Cast5](https://en.wikipedia.org/wiki/CAST-128), [Salsa20]( https://en.wikipedia.org/wiki/Salsa20), etc. in [CFB](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher_Feedback_.28CFB.29) mode, which generates completely anonymous packet.
|
||||||
1. Only **A fixed number of goroutines** will be created for the entire server application, costs in **context switch** between goroutines have been taken into consideration.
|
1. Only **A fixed number of goroutines** will be created for the entire server application, costs in **context switch** between goroutines have been taken into consideration.
|
||||||
1. Compatible with [skywind3000's](https://github.com/skywind3000) C version with various improvements.
|
1. Compatible with [skywind3000's](https://github.com/skywind3000) C version with various improvements.
|
||||||
|
1. Platform-dependent optimizations: [sendmmsg](http://man7.org/linux/man-pages/man2/sendmmsg.2.html) and [recvmmsg](http://man7.org/linux/man-pages/man2/recvmmsg.2.html) were expoloited for linux.
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
@ -43,6 +44,24 @@ For complete documentation, see the associated [Godoc](https://godoc.org/github.
|
|||||||
|
|
||||||
<img src="frame.png" alt="Frame Format" height="109px" />
|
<img src="frame.png" alt="Frame Format" height="109px" />
|
||||||
|
|
||||||
|
```
|
||||||
|
NONCE:
|
||||||
|
16bytes cryptographically secure random number, nonce changes for every packet.
|
||||||
|
|
||||||
|
CRC32:
|
||||||
|
CRC-32 checksum of data using the IEEE polynomial
|
||||||
|
|
||||||
|
FEC TYPE:
|
||||||
|
typeData = 0xF1
|
||||||
|
typeParity = 0xF2
|
||||||
|
|
||||||
|
FEC SEQID:
|
||||||
|
monotonically increasing in range: [0, (0xffffffff/shardSize) * shardSize - 1]
|
||||||
|
|
||||||
|
SIZE:
|
||||||
|
The size of KCP frame plus 2
|
||||||
|
```
|
||||||
|
|
||||||
```
|
```
|
||||||
+-----------------+
|
+-----------------+
|
||||||
| SESSION |
|
| SESSION |
|
||||||
@ -65,16 +84,11 @@ For complete documentation, see the associated [Godoc](https://godoc.org/github.
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
## Usage
|
## Examples
|
||||||
|
|
||||||
Client: [full demo](https://github.com/xtaci/kcptun/blob/master/client/main.go)
|
1. [simple examples](https://github.com/xtaci/kcp-go/tree/master/examples)
|
||||||
```go
|
2. [kcptun client](https://github.com/xtaci/kcptun/blob/master/client/main.go)
|
||||||
kcpconn, err := kcp.DialWithOptions("192.168.0.1:10000", nil, 10, 3)
|
3. [kcptun server](https://github.com/xtaci/kcptun/blob/master/server/main.go)
|
||||||
```
|
|
||||||
Server: [full demo](https://github.com/xtaci/kcptun/blob/master/server/main.go)
|
|
||||||
```go
|
|
||||||
lis, err := kcp.ListenWithOptions(":10000", nil, 10, 3)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Benchmark
|
## Benchmark
|
||||||
```
|
```
|
||||||
@ -128,6 +142,10 @@ PASS
|
|||||||
ok github.com/xtaci/kcp-go 50.349s
|
ok github.com/xtaci/kcp-go 50.349s
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Typical Flame Graph
|
||||||
|
![Flame Graph in kcptun](flame.png)
|
||||||
|
|
||||||
## Key Design Considerations
|
## Key Design Considerations
|
||||||
|
|
||||||
1. slice vs. container/list
|
1. slice vs. container/list
|
||||||
@ -159,6 +177,18 @@ BenchmarkNow-4 100000000 15.6 ns/op
|
|||||||
|
|
||||||
In kcp-go, after each `kcp.output()` function call, current clock time will be updated upon return, and for a single `kcp.flush()` operation, current time will be queried from system once. For most of the time, 5000 connections costs 5000 * 15.6ns = 78us(a fixed cost while no packet needs to be sent), as for 10MB/s data transfering with 1400 MTU, `kcp.output()` will be called around 7500 times and costs 117us for `time.Now()` in **every second**.
|
In kcp-go, after each `kcp.output()` function call, current clock time will be updated upon return, and for a single `kcp.flush()` operation, current time will be queried from system once. For most of the time, 5000 connections costs 5000 * 15.6ns = 78us(a fixed cost while no packet needs to be sent), as for 10MB/s data transfering with 1400 MTU, `kcp.output()` will be called around 7500 times and costs 117us for `time.Now()` in **every second**.
|
||||||
|
|
||||||
|
3. Memory management
|
||||||
|
|
||||||
|
Primary memory allocation are done from a global buffer pool xmit.Buf, in kcp-go, when we need to allocate some bytes, we can get from that pool, and a fixed-capacity 1500 bytes(mtuLimit) will be returned, the rx queue, tx queue and fec queue all receive bytes from there, and they will return the bytes to the pool after using to prevent unnecessary zer0ing of bytes. The pool mechanism maintained a high watermark for slice objects, these in-flight objects from the pool will survive from the perodical garbage collection, meanwhile the pool kept the ability to return the memory to runtime if in idle.
|
||||||
|
|
||||||
|
4. Information security
|
||||||
|
|
||||||
|
kcp-go is shipped with builtin packet encryption powered by various block encryption algorithms and works in [Cipher Feedback Mode](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher_Feedback_(CFB)), for each packet to be sent, the encryption process will start from encrypting a [nonce](https://en.wikipedia.org/wiki/Cryptographic_nonce) from the [system entropy](https://en.wikipedia.org/wiki//dev/random), so encryption to same plaintexts never leads to a same ciphertexts thereafter.
|
||||||
|
|
||||||
|
The contents of the packets are completely anonymous with encryption, including the headers(FEC,KCP), checksums and contents. Note that, no matter which encryption method you choose on you upper layer, if you disable encryption, the transmit will be insecure somehow, since the header is ***PLAINTEXT*** to everyone it would be susceptible to header tampering, such as jamming the *sliding window size*, *round-trip time*, *FEC property* and *checksums*. ```AES-128``` is suggested for minimal encryption since modern CPUs are shipped with [AES-NI](https://en.wikipedia.org/wiki/AES_instruction_set) instructions and performs even better than `salsa20`(check the table above).
|
||||||
|
|
||||||
|
Other possible attacks to kcp-go includes: a) [traffic analysis](https://en.wikipedia.org/wiki/Traffic_analysis), dataflow on specific websites may have pattern while interchanging data, but this type of eavesdropping has been mitigated by adapting [smux](https://github.com/xtaci/smux) to mix data streams so as to introduce noises, perfect solution to this has not appeared yet, theroretically by shuffling/mixing messages on larger scale network may mitigate this problem. b) [replay attack](https://en.wikipedia.org/wiki/Replay_attack), since the asymmetrical encryption has not been introduced into kcp-go for some reason, capturing the packets and replay them on a different machine is possible, (notice: hijacking the session and decrypting the contents is still *impossible*), so upper layers should contain a asymmetrical encryption system to guarantee the authenticity of each message(to process message exactly once), such as HTTPS/OpenSSL/LibreSSL, only by signing the requests with private keys can eliminate this type of attack.
|
||||||
|
|
||||||
## Connection Termination
|
## Connection Termination
|
||||||
|
|
||||||
Control messages like **SYN/FIN/RST** in TCP **are not defined** in KCP, you need some **keepalive/heartbeat mechanism** in the application-level. A real world example is to use some **multiplexing** protocol over session, such as [smux](https://github.com/xtaci/smux)(with embedded keepalive mechanism), see [kcptun](https://github.com/xtaci/kcptun) for example.
|
Control messages like **SYN/FIN/RST** in TCP **are not defined** in KCP, you need some **keepalive/heartbeat mechanism** in the application-level. A real world example is to use some **multiplexing** protocol over session, such as [smux](https://github.com/xtaci/smux)(with embedded keepalive mechanism), see [kcptun](https://github.com/xtaci/kcptun) for example.
|
||||||
@ -169,6 +199,14 @@ Q: I'm handling >5K connections on my server, the CPU utilization is so high.
|
|||||||
|
|
||||||
A: A standalone `agent` or `gate` server for running kcp-go is suggested, not only for CPU utilization, but also important to the **precision** of RTT measurements(timing) which indirectly affects retransmission. By increasing update `interval` with `SetNoDelay` like `conn.SetNoDelay(1, 40, 1, 1)` will dramatically reduce system load, but lower the performance.
|
A: A standalone `agent` or `gate` server for running kcp-go is suggested, not only for CPU utilization, but also important to the **precision** of RTT measurements(timing) which indirectly affects retransmission. By increasing update `interval` with `SetNoDelay` like `conn.SetNoDelay(1, 40, 1, 1)` will dramatically reduce system load, but lower the performance.
|
||||||
|
|
||||||
|
Q: When should I enable FEC?
|
||||||
|
|
||||||
|
A: Forward error correction is critical to long-distance transmission, because a packet loss will lead to a huge penalty in time. And for the complicated packet routing network in modern world, round-trip time based loss check will not always be efficient, the big deviation of RTT samples in the long way usually leads to a larger RTO value in typical rtt estimator, which in other words, slows down the transmission.
|
||||||
|
|
||||||
|
Q: Should I enable encryption?
|
||||||
|
|
||||||
|
A: Yes, for the safety of protocol, even if the upper layer has encrypted.
|
||||||
|
|
||||||
## Who is using this?
|
## Who is using this?
|
||||||
|
|
||||||
1. https://github.com/xtaci/kcptun -- A Secure Tunnel Based On KCP over UDP.
|
1. https://github.com/xtaci/kcptun -- A Secure Tunnel Based On KCP over UDP.
|
||||||
|
12
vendor/github.com/fatedier/kcp-go/batchconn.go
generated
vendored
Normal file
12
vendor/github.com/fatedier/kcp-go/batchconn.go
generated
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
package kcp
|
||||||
|
|
||||||
|
import "golang.org/x/net/ipv4"
|
||||||
|
|
||||||
|
const (
|
||||||
|
batchSize = 16
|
||||||
|
)
|
||||||
|
|
||||||
|
type batchConn interface {
|
||||||
|
WriteBatch(ms []ipv4.Message, flags int) (int, error)
|
||||||
|
ReadBatch(ms []ipv4.Message, flags int) (int, error)
|
||||||
|
}
|
115
vendor/github.com/fatedier/kcp-go/fec.go
generated
vendored
115
vendor/github.com/fatedier/kcp-go/fec.go
generated
vendored
@ -11,36 +11,34 @@ const (
|
|||||||
fecHeaderSize = 6
|
fecHeaderSize = 6
|
||||||
fecHeaderSizePlus2 = fecHeaderSize + 2 // plus 2B data size
|
fecHeaderSizePlus2 = fecHeaderSize + 2 // plus 2B data size
|
||||||
typeData = 0xf1
|
typeData = 0xf1
|
||||||
typeFEC = 0xf2
|
typeParity = 0xf2
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
// fecPacket is a decoded FEC packet
|
||||||
// fecPacket is a decoded FEC packet
|
type fecPacket []byte
|
||||||
fecPacket struct {
|
|
||||||
seqid uint32
|
|
||||||
flag uint16
|
|
||||||
data []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
// fecDecoder for decoding incoming packets
|
func (bts fecPacket) seqid() uint32 { return binary.LittleEndian.Uint32(bts) }
|
||||||
fecDecoder struct {
|
func (bts fecPacket) flag() uint16 { return binary.LittleEndian.Uint16(bts[4:]) }
|
||||||
rxlimit int // queue size limit
|
func (bts fecPacket) data() []byte { return bts[6:] }
|
||||||
dataShards int
|
|
||||||
parityShards int
|
|
||||||
shardSize int
|
|
||||||
rx []fecPacket // ordered receive queue
|
|
||||||
|
|
||||||
// caches
|
// fecDecoder for decoding incoming packets
|
||||||
decodeCache [][]byte
|
type fecDecoder struct {
|
||||||
flagCache []bool
|
rxlimit int // queue size limit
|
||||||
|
dataShards int
|
||||||
|
parityShards int
|
||||||
|
shardSize int
|
||||||
|
rx []fecPacket // ordered receive queue
|
||||||
|
|
||||||
// zeros
|
// caches
|
||||||
zeros []byte
|
decodeCache [][]byte
|
||||||
|
flagCache []bool
|
||||||
|
|
||||||
// RS decoder
|
// zeros
|
||||||
codec reedsolomon.Encoder
|
zeros []byte
|
||||||
}
|
|
||||||
)
|
// RS decoder
|
||||||
|
codec reedsolomon.Encoder
|
||||||
|
}
|
||||||
|
|
||||||
func newFECDecoder(rxlimit, dataShards, parityShards int) *fecDecoder {
|
func newFECDecoder(rxlimit, dataShards, parityShards int) *fecDecoder {
|
||||||
if dataShards <= 0 || parityShards <= 0 {
|
if dataShards <= 0 || parityShards <= 0 {
|
||||||
@ -66,33 +64,24 @@ func newFECDecoder(rxlimit, dataShards, parityShards int) *fecDecoder {
|
|||||||
return dec
|
return dec
|
||||||
}
|
}
|
||||||
|
|
||||||
// decodeBytes a fec packet
|
|
||||||
func (dec *fecDecoder) decodeBytes(data []byte) fecPacket {
|
|
||||||
var pkt fecPacket
|
|
||||||
pkt.seqid = binary.LittleEndian.Uint32(data)
|
|
||||||
pkt.flag = binary.LittleEndian.Uint16(data[4:])
|
|
||||||
// allocate memory & copy
|
|
||||||
buf := xmitBuf.Get().([]byte)[:len(data)-6]
|
|
||||||
copy(buf, data[6:])
|
|
||||||
pkt.data = buf
|
|
||||||
return pkt
|
|
||||||
}
|
|
||||||
|
|
||||||
// decode a fec packet
|
// decode a fec packet
|
||||||
func (dec *fecDecoder) decode(pkt fecPacket) (recovered [][]byte) {
|
func (dec *fecDecoder) decode(in fecPacket) (recovered [][]byte) {
|
||||||
// insertion
|
// insertion
|
||||||
n := len(dec.rx) - 1
|
n := len(dec.rx) - 1
|
||||||
insertIdx := 0
|
insertIdx := 0
|
||||||
for i := n; i >= 0; i-- {
|
for i := n; i >= 0; i-- {
|
||||||
if pkt.seqid == dec.rx[i].seqid { // de-duplicate
|
if in.seqid() == dec.rx[i].seqid() { // de-duplicate
|
||||||
xmitBuf.Put(pkt.data)
|
|
||||||
return nil
|
return nil
|
||||||
} else if _itimediff(pkt.seqid, dec.rx[i].seqid) > 0 { // insertion
|
} else if _itimediff(in.seqid(), dec.rx[i].seqid()) > 0 { // insertion
|
||||||
insertIdx = i + 1
|
insertIdx = i + 1
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// make a copy
|
||||||
|
pkt := fecPacket(xmitBuf.Get().([]byte)[:len(in)])
|
||||||
|
copy(pkt, in)
|
||||||
|
|
||||||
// insert into ordered rx queue
|
// insert into ordered rx queue
|
||||||
if insertIdx == n+1 {
|
if insertIdx == n+1 {
|
||||||
dec.rx = append(dec.rx, pkt)
|
dec.rx = append(dec.rx, pkt)
|
||||||
@ -103,11 +92,11 @@ func (dec *fecDecoder) decode(pkt fecPacket) (recovered [][]byte) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// shard range for current packet
|
// shard range for current packet
|
||||||
shardBegin := pkt.seqid - pkt.seqid%uint32(dec.shardSize)
|
shardBegin := pkt.seqid() - pkt.seqid()%uint32(dec.shardSize)
|
||||||
shardEnd := shardBegin + uint32(dec.shardSize) - 1
|
shardEnd := shardBegin + uint32(dec.shardSize) - 1
|
||||||
|
|
||||||
// max search range in ordered queue for current shard
|
// max search range in ordered queue for current shard
|
||||||
searchBegin := insertIdx - int(pkt.seqid%uint32(dec.shardSize))
|
searchBegin := insertIdx - int(pkt.seqid()%uint32(dec.shardSize))
|
||||||
if searchBegin < 0 {
|
if searchBegin < 0 {
|
||||||
searchBegin = 0
|
searchBegin = 0
|
||||||
}
|
}
|
||||||
@ -130,21 +119,21 @@ func (dec *fecDecoder) decode(pkt fecPacket) (recovered [][]byte) {
|
|||||||
|
|
||||||
// shard assembly
|
// shard assembly
|
||||||
for i := searchBegin; i <= searchEnd; i++ {
|
for i := searchBegin; i <= searchEnd; i++ {
|
||||||
seqid := dec.rx[i].seqid
|
seqid := dec.rx[i].seqid()
|
||||||
if _itimediff(seqid, shardEnd) > 0 {
|
if _itimediff(seqid, shardEnd) > 0 {
|
||||||
break
|
break
|
||||||
} else if _itimediff(seqid, shardBegin) >= 0 {
|
} else if _itimediff(seqid, shardBegin) >= 0 {
|
||||||
shards[seqid%uint32(dec.shardSize)] = dec.rx[i].data
|
shards[seqid%uint32(dec.shardSize)] = dec.rx[i].data()
|
||||||
shardsflag[seqid%uint32(dec.shardSize)] = true
|
shardsflag[seqid%uint32(dec.shardSize)] = true
|
||||||
numshard++
|
numshard++
|
||||||
if dec.rx[i].flag == typeData {
|
if dec.rx[i].flag() == typeData {
|
||||||
numDataShard++
|
numDataShard++
|
||||||
}
|
}
|
||||||
if numshard == 1 {
|
if numshard == 1 {
|
||||||
first = i
|
first = i
|
||||||
}
|
}
|
||||||
if len(dec.rx[i].data) > maxlen {
|
if len(dec.rx[i].data()) > maxlen {
|
||||||
maxlen = len(dec.rx[i].data)
|
maxlen = len(dec.rx[i].data())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -159,11 +148,14 @@ func (dec *fecDecoder) decode(pkt fecPacket) (recovered [][]byte) {
|
|||||||
dlen := len(shards[k])
|
dlen := len(shards[k])
|
||||||
shards[k] = shards[k][:maxlen]
|
shards[k] = shards[k][:maxlen]
|
||||||
copy(shards[k][dlen:], dec.zeros)
|
copy(shards[k][dlen:], dec.zeros)
|
||||||
|
} else {
|
||||||
|
shards[k] = xmitBuf.Get().([]byte)[:0]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err := dec.codec.ReconstructData(shards); err == nil {
|
if err := dec.codec.ReconstructData(shards); err == nil {
|
||||||
for k := range shards[:dec.dataShards] {
|
for k := range shards[:dec.dataShards] {
|
||||||
if !shardsflag[k] {
|
if !shardsflag[k] {
|
||||||
|
// recovered data should be recycled
|
||||||
recovered = append(recovered, shards[k])
|
recovered = append(recovered, shards[k])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -174,7 +166,7 @@ func (dec *fecDecoder) decode(pkt fecPacket) (recovered [][]byte) {
|
|||||||
|
|
||||||
// keep rxlimit
|
// keep rxlimit
|
||||||
if len(dec.rx) > dec.rxlimit {
|
if len(dec.rx) > dec.rxlimit {
|
||||||
if dec.rx[0].flag == typeData { // track the unrecoverable data
|
if dec.rx[0].flag() == typeData { // track the unrecoverable data
|
||||||
atomic.AddUint64(&DefaultSnmp.FECShortShards, 1)
|
atomic.AddUint64(&DefaultSnmp.FECShortShards, 1)
|
||||||
}
|
}
|
||||||
dec.rx = dec.freeRange(0, 1, dec.rx)
|
dec.rx = dec.freeRange(0, 1, dec.rx)
|
||||||
@ -182,15 +174,16 @@ func (dec *fecDecoder) decode(pkt fecPacket) (recovered [][]byte) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// free a range of fecPacket, and zero for GC recycling
|
// free a range of fecPacket
|
||||||
func (dec *fecDecoder) freeRange(first, n int, q []fecPacket) []fecPacket {
|
func (dec *fecDecoder) freeRange(first, n int, q []fecPacket) []fecPacket {
|
||||||
for i := first; i < first+n; i++ { // recycle buffer
|
for i := first; i < first+n; i++ { // recycle buffer
|
||||||
xmitBuf.Put(q[i].data)
|
xmitBuf.Put([]byte(q[i]))
|
||||||
|
}
|
||||||
|
|
||||||
|
if first == 0 && n < cap(q)/2 {
|
||||||
|
return q[n:]
|
||||||
}
|
}
|
||||||
copy(q[first:], q[first+n:])
|
copy(q[first:], q[first+n:])
|
||||||
for i := 0; i < n; i++ { // dereference data
|
|
||||||
q[len(q)-1-i].data = nil
|
|
||||||
}
|
|
||||||
return q[:len(q)-n]
|
return q[:len(q)-n]
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -229,7 +222,7 @@ func newFECEncoder(dataShards, parityShards, offset int) *fecEncoder {
|
|||||||
enc.dataShards = dataShards
|
enc.dataShards = dataShards
|
||||||
enc.parityShards = parityShards
|
enc.parityShards = parityShards
|
||||||
enc.shardSize = dataShards + parityShards
|
enc.shardSize = dataShards + parityShards
|
||||||
enc.paws = (0xffffffff/uint32(enc.shardSize) - 1) * uint32(enc.shardSize)
|
enc.paws = 0xffffffff / uint32(enc.shardSize) * uint32(enc.shardSize)
|
||||||
enc.headerOffset = offset
|
enc.headerOffset = offset
|
||||||
enc.payloadOffset = enc.headerOffset + fecHeaderSize
|
enc.payloadOffset = enc.headerOffset + fecHeaderSize
|
||||||
|
|
||||||
@ -252,13 +245,16 @@ func newFECEncoder(dataShards, parityShards, offset int) *fecEncoder {
|
|||||||
// encodes the packet, outputs parity shards if we have collected quorum datashards
|
// encodes the packet, outputs parity shards if we have collected quorum datashards
|
||||||
// notice: the contents of 'ps' will be re-written in successive calling
|
// notice: the contents of 'ps' will be re-written in successive calling
|
||||||
func (enc *fecEncoder) encode(b []byte) (ps [][]byte) {
|
func (enc *fecEncoder) encode(b []byte) (ps [][]byte) {
|
||||||
|
// The header format:
|
||||||
|
// | FEC SEQID(4B) | FEC TYPE(2B) | SIZE (2B) | PAYLOAD(SIZE-2) |
|
||||||
|
// |<-headerOffset |<-payloadOffset
|
||||||
enc.markData(b[enc.headerOffset:])
|
enc.markData(b[enc.headerOffset:])
|
||||||
binary.LittleEndian.PutUint16(b[enc.payloadOffset:], uint16(len(b[enc.payloadOffset:])))
|
binary.LittleEndian.PutUint16(b[enc.payloadOffset:], uint16(len(b[enc.payloadOffset:])))
|
||||||
|
|
||||||
// copy data to fec datashards
|
// copy data from payloadOffset to fec shard cache
|
||||||
sz := len(b)
|
sz := len(b)
|
||||||
enc.shardCache[enc.shardCount] = enc.shardCache[enc.shardCount][:sz]
|
enc.shardCache[enc.shardCount] = enc.shardCache[enc.shardCount][:sz]
|
||||||
copy(enc.shardCache[enc.shardCount], b)
|
copy(enc.shardCache[enc.shardCount][enc.payloadOffset:], b[enc.payloadOffset:])
|
||||||
enc.shardCount++
|
enc.shardCount++
|
||||||
|
|
||||||
// track max datashard length
|
// track max datashard length
|
||||||
@ -285,7 +281,7 @@ func (enc *fecEncoder) encode(b []byte) (ps [][]byte) {
|
|||||||
if err := enc.codec.Encode(cache); err == nil {
|
if err := enc.codec.Encode(cache); err == nil {
|
||||||
ps = enc.shardCache[enc.dataShards:]
|
ps = enc.shardCache[enc.dataShards:]
|
||||||
for k := range ps {
|
for k := range ps {
|
||||||
enc.markFEC(ps[k][enc.headerOffset:])
|
enc.markParity(ps[k][enc.headerOffset:])
|
||||||
ps[k] = ps[k][:enc.maxSize]
|
ps[k] = ps[k][:enc.maxSize]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -304,8 +300,9 @@ func (enc *fecEncoder) markData(data []byte) {
|
|||||||
enc.next++
|
enc.next++
|
||||||
}
|
}
|
||||||
|
|
||||||
func (enc *fecEncoder) markFEC(data []byte) {
|
func (enc *fecEncoder) markParity(data []byte) {
|
||||||
binary.LittleEndian.PutUint32(data, enc.next)
|
binary.LittleEndian.PutUint32(data, enc.next)
|
||||||
binary.LittleEndian.PutUint16(data[4:], typeFEC)
|
binary.LittleEndian.PutUint16(data[4:], typeParity)
|
||||||
|
// sequence wrap will only happen at parity shard
|
||||||
enc.next = (enc.next + 1) % enc.paws
|
enc.next = (enc.next + 1) % enc.paws
|
||||||
}
|
}
|
||||||
|
BIN
vendor/github.com/fatedier/kcp-go/flame.png
generated
vendored
Normal file
BIN
vendor/github.com/fatedier/kcp-go/flame.png
generated
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 56 KiB |
147
vendor/github.com/fatedier/kcp-go/kcp.go
generated
vendored
147
vendor/github.com/fatedier/kcp-go/kcp.go
generated
vendored
@ -1,9 +1,9 @@
|
|||||||
// Package kcp - A Fast and Reliable ARQ Protocol
|
|
||||||
package kcp
|
package kcp
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -30,6 +30,12 @@ const (
|
|||||||
IKCP_PROBE_LIMIT = 120000 // up to 120 secs to probe window
|
IKCP_PROBE_LIMIT = 120000 // up to 120 secs to probe window
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// monotonic reference time point
|
||||||
|
var refTime time.Time = time.Now()
|
||||||
|
|
||||||
|
// currentMs returns current elasped monotonic milliseconds since program startup
|
||||||
|
func currentMs() uint32 { return uint32(time.Now().Sub(refTime) / time.Millisecond) }
|
||||||
|
|
||||||
// output_callback is a prototype which ought capture conn and call conn.Write
|
// output_callback is a prototype which ought capture conn and call conn.Write
|
||||||
type output_callback func(buf []byte, size int)
|
type output_callback func(buf []byte, size int)
|
||||||
|
|
||||||
@ -145,8 +151,9 @@ type KCP struct {
|
|||||||
|
|
||||||
acklist []ackItem
|
acklist []ackItem
|
||||||
|
|
||||||
buffer []byte
|
buffer []byte
|
||||||
output output_callback
|
reserved int
|
||||||
|
output output_callback
|
||||||
}
|
}
|
||||||
|
|
||||||
type ackItem struct {
|
type ackItem struct {
|
||||||
@ -154,8 +161,11 @@ type ackItem struct {
|
|||||||
ts uint32
|
ts uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewKCP create a new kcp control object, 'conv' must equal in two endpoint
|
// NewKCP create a new kcp state machine
|
||||||
// from the same connection.
|
//
|
||||||
|
// 'conv' must be equal in the connection peers, or else data will be silently rejected.
|
||||||
|
//
|
||||||
|
// 'output' function will be called whenever these is data to be sent on wire.
|
||||||
func NewKCP(conv uint32, output output_callback) *KCP {
|
func NewKCP(conv uint32, output output_callback) *KCP {
|
||||||
kcp := new(KCP)
|
kcp := new(KCP)
|
||||||
kcp.conv = conv
|
kcp.conv = conv
|
||||||
@ -164,7 +174,7 @@ func NewKCP(conv uint32, output output_callback) *KCP {
|
|||||||
kcp.rmt_wnd = IKCP_WND_RCV
|
kcp.rmt_wnd = IKCP_WND_RCV
|
||||||
kcp.mtu = IKCP_MTU_DEF
|
kcp.mtu = IKCP_MTU_DEF
|
||||||
kcp.mss = kcp.mtu - IKCP_OVERHEAD
|
kcp.mss = kcp.mtu - IKCP_OVERHEAD
|
||||||
kcp.buffer = make([]byte, (kcp.mtu+IKCP_OVERHEAD)*3)
|
kcp.buffer = make([]byte, kcp.mtu)
|
||||||
kcp.rx_rto = IKCP_RTO_DEF
|
kcp.rx_rto = IKCP_RTO_DEF
|
||||||
kcp.rx_minrto = IKCP_RTO_MIN
|
kcp.rx_minrto = IKCP_RTO_MIN
|
||||||
kcp.interval = IKCP_INTERVAL
|
kcp.interval = IKCP_INTERVAL
|
||||||
@ -189,6 +199,19 @@ func (kcp *KCP) delSegment(seg *segment) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ReserveBytes keeps n bytes untouched from the beginning of the buffer,
|
||||||
|
// the output_callback function should be aware of this.
|
||||||
|
//
|
||||||
|
// Return false if n >= mss
|
||||||
|
func (kcp *KCP) ReserveBytes(n int) bool {
|
||||||
|
if n >= int(kcp.mtu-IKCP_OVERHEAD) || n < 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
kcp.reserved = n
|
||||||
|
kcp.mss = kcp.mtu - IKCP_OVERHEAD - uint32(n)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
// PeekSize checks the size of next message in the recv queue
|
// PeekSize checks the size of next message in the recv queue
|
||||||
func (kcp *KCP) PeekSize() (length int) {
|
func (kcp *KCP) PeekSize() (length int) {
|
||||||
if len(kcp.rcv_queue) == 0 {
|
if len(kcp.rcv_queue) == 0 {
|
||||||
@ -214,19 +237,21 @@ func (kcp *KCP) PeekSize() (length int) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Recv is user/upper level recv: returns size, returns below zero for EAGAIN
|
// Receive data from kcp state machine
|
||||||
|
//
|
||||||
|
// Return number of bytes read.
|
||||||
|
//
|
||||||
|
// Return -1 when there is no readable data.
|
||||||
|
//
|
||||||
|
// Return -2 if len(buffer) is smaller than kcp.PeekSize().
|
||||||
func (kcp *KCP) Recv(buffer []byte) (n int) {
|
func (kcp *KCP) Recv(buffer []byte) (n int) {
|
||||||
if len(kcp.rcv_queue) == 0 {
|
peeksize := kcp.PeekSize()
|
||||||
|
if peeksize < 0 {
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
|
||||||
peeksize := kcp.PeekSize()
|
|
||||||
if peeksize < 0 {
|
|
||||||
return -2
|
|
||||||
}
|
|
||||||
|
|
||||||
if peeksize > len(buffer) {
|
if peeksize > len(buffer) {
|
||||||
return -3
|
return -2
|
||||||
}
|
}
|
||||||
|
|
||||||
var fast_recover bool
|
var fast_recover bool
|
||||||
@ -255,7 +280,7 @@ func (kcp *KCP) Recv(buffer []byte) (n int) {
|
|||||||
count = 0
|
count = 0
|
||||||
for k := range kcp.rcv_buf {
|
for k := range kcp.rcv_buf {
|
||||||
seg := &kcp.rcv_buf[k]
|
seg := &kcp.rcv_buf[k]
|
||||||
if seg.sn == kcp.rcv_nxt && len(kcp.rcv_queue) < int(kcp.rcv_wnd) {
|
if seg.sn == kcp.rcv_nxt && len(kcp.rcv_queue)+count < int(kcp.rcv_wnd) {
|
||||||
kcp.rcv_nxt++
|
kcp.rcv_nxt++
|
||||||
count++
|
count++
|
||||||
} else {
|
} else {
|
||||||
@ -386,6 +411,10 @@ func (kcp *KCP) parse_ack(sn uint32) {
|
|||||||
for k := range kcp.snd_buf {
|
for k := range kcp.snd_buf {
|
||||||
seg := &kcp.snd_buf[k]
|
seg := &kcp.snd_buf[k]
|
||||||
if sn == seg.sn {
|
if sn == seg.sn {
|
||||||
|
// mark and free space, but leave the segment here,
|
||||||
|
// and wait until `una` to delete this, then we don't
|
||||||
|
// have to shift the segments behind forward,
|
||||||
|
// which is an expensive operation for large window
|
||||||
seg.acked = 1
|
seg.acked = 1
|
||||||
kcp.delSegment(seg)
|
kcp.delSegment(seg)
|
||||||
break
|
break
|
||||||
@ -474,7 +503,7 @@ func (kcp *KCP) parse_data(newseg segment) bool {
|
|||||||
count := 0
|
count := 0
|
||||||
for k := range kcp.rcv_buf {
|
for k := range kcp.rcv_buf {
|
||||||
seg := &kcp.rcv_buf[k]
|
seg := &kcp.rcv_buf[k]
|
||||||
if seg.sn == kcp.rcv_nxt && len(kcp.rcv_queue) < int(kcp.rcv_wnd) {
|
if seg.sn == kcp.rcv_nxt && len(kcp.rcv_queue)+count < int(kcp.rcv_wnd) {
|
||||||
kcp.rcv_nxt++
|
kcp.rcv_nxt++
|
||||||
count++
|
count++
|
||||||
} else {
|
} else {
|
||||||
@ -489,8 +518,12 @@ func (kcp *KCP) parse_data(newseg segment) bool {
|
|||||||
return repeat
|
return repeat
|
||||||
}
|
}
|
||||||
|
|
||||||
// Input when you received a low level packet (eg. UDP packet), call it
|
// Input a packet into kcp state machine.
|
||||||
// regular indicates a regular packet has received(not from FEC)
|
//
|
||||||
|
// 'regular' indicates it's a real data packet from remote, and it means it's not generated from ReedSolomon
|
||||||
|
// codecs.
|
||||||
|
//
|
||||||
|
// 'ackNoDelay' will trigger immediate ACK, but surely it will not be efficient in bandwidth
|
||||||
func (kcp *KCP) Input(data []byte, regular, ackNoDelay bool) int {
|
func (kcp *KCP) Input(data []byte, regular, ackNoDelay bool) int {
|
||||||
snd_una := kcp.snd_una
|
snd_una := kcp.snd_una
|
||||||
if len(data) < IKCP_OVERHEAD {
|
if len(data) < IKCP_OVERHEAD {
|
||||||
@ -634,14 +667,28 @@ func (kcp *KCP) flush(ackOnly bool) uint32 {
|
|||||||
seg.una = kcp.rcv_nxt
|
seg.una = kcp.rcv_nxt
|
||||||
|
|
||||||
buffer := kcp.buffer
|
buffer := kcp.buffer
|
||||||
// flush acknowledges
|
ptr := buffer[kcp.reserved:] // keep n bytes untouched
|
||||||
ptr := buffer
|
|
||||||
for i, ack := range kcp.acklist {
|
// makeSpace makes room for writing
|
||||||
|
makeSpace := func(space int) {
|
||||||
size := len(buffer) - len(ptr)
|
size := len(buffer) - len(ptr)
|
||||||
if size+IKCP_OVERHEAD > int(kcp.mtu) {
|
if size+space > int(kcp.mtu) {
|
||||||
kcp.output(buffer, size)
|
kcp.output(buffer, size)
|
||||||
ptr = buffer
|
ptr = buffer[kcp.reserved:]
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// flush bytes in buffer if there is any
|
||||||
|
flushBuffer := func() {
|
||||||
|
size := len(buffer) - len(ptr)
|
||||||
|
if size > kcp.reserved {
|
||||||
|
kcp.output(buffer, size)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// flush acknowledges
|
||||||
|
for i, ack := range kcp.acklist {
|
||||||
|
makeSpace(IKCP_OVERHEAD)
|
||||||
// filter jitters caused by bufferbloat
|
// filter jitters caused by bufferbloat
|
||||||
if ack.sn >= kcp.rcv_nxt || len(kcp.acklist)-1 == i {
|
if ack.sn >= kcp.rcv_nxt || len(kcp.acklist)-1 == i {
|
||||||
seg.sn, seg.ts = ack.sn, ack.ts
|
seg.sn, seg.ts = ack.sn, ack.ts
|
||||||
@ -651,10 +698,7 @@ func (kcp *KCP) flush(ackOnly bool) uint32 {
|
|||||||
kcp.acklist = kcp.acklist[0:0]
|
kcp.acklist = kcp.acklist[0:0]
|
||||||
|
|
||||||
if ackOnly { // flash remain ack segments
|
if ackOnly { // flash remain ack segments
|
||||||
size := len(buffer) - len(ptr)
|
flushBuffer()
|
||||||
if size > 0 {
|
|
||||||
kcp.output(buffer, size)
|
|
||||||
}
|
|
||||||
return kcp.interval
|
return kcp.interval
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -685,22 +729,14 @@ func (kcp *KCP) flush(ackOnly bool) uint32 {
|
|||||||
// flush window probing commands
|
// flush window probing commands
|
||||||
if (kcp.probe & IKCP_ASK_SEND) != 0 {
|
if (kcp.probe & IKCP_ASK_SEND) != 0 {
|
||||||
seg.cmd = IKCP_CMD_WASK
|
seg.cmd = IKCP_CMD_WASK
|
||||||
size := len(buffer) - len(ptr)
|
makeSpace(IKCP_OVERHEAD)
|
||||||
if size+IKCP_OVERHEAD > int(kcp.mtu) {
|
|
||||||
kcp.output(buffer, size)
|
|
||||||
ptr = buffer
|
|
||||||
}
|
|
||||||
ptr = seg.encode(ptr)
|
ptr = seg.encode(ptr)
|
||||||
}
|
}
|
||||||
|
|
||||||
// flush window probing commands
|
// flush window probing commands
|
||||||
if (kcp.probe & IKCP_ASK_TELL) != 0 {
|
if (kcp.probe & IKCP_ASK_TELL) != 0 {
|
||||||
seg.cmd = IKCP_CMD_WINS
|
seg.cmd = IKCP_CMD_WINS
|
||||||
size := len(buffer) - len(ptr)
|
makeSpace(IKCP_OVERHEAD)
|
||||||
if size+IKCP_OVERHEAD > int(kcp.mtu) {
|
|
||||||
kcp.output(buffer, size)
|
|
||||||
ptr = buffer
|
|
||||||
}
|
|
||||||
ptr = seg.encode(ptr)
|
ptr = seg.encode(ptr)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -779,20 +815,14 @@ func (kcp *KCP) flush(ackOnly bool) uint32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if needsend {
|
if needsend {
|
||||||
current = currentMs() // time update for a blocking call
|
current = currentMs()
|
||||||
segment.xmit++
|
segment.xmit++
|
||||||
segment.ts = current
|
segment.ts = current
|
||||||
segment.wnd = seg.wnd
|
segment.wnd = seg.wnd
|
||||||
segment.una = seg.una
|
segment.una = seg.una
|
||||||
|
|
||||||
size := len(buffer) - len(ptr)
|
|
||||||
need := IKCP_OVERHEAD + len(segment.data)
|
need := IKCP_OVERHEAD + len(segment.data)
|
||||||
|
makeSpace(need)
|
||||||
if size+need > int(kcp.mtu) {
|
|
||||||
kcp.output(buffer, size)
|
|
||||||
ptr = buffer
|
|
||||||
}
|
|
||||||
|
|
||||||
ptr = segment.encode(ptr)
|
ptr = segment.encode(ptr)
|
||||||
copy(ptr, segment.data)
|
copy(ptr, segment.data)
|
||||||
ptr = ptr[len(segment.data):]
|
ptr = ptr[len(segment.data):]
|
||||||
@ -809,10 +839,7 @@ func (kcp *KCP) flush(ackOnly bool) uint32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// flash remain segments
|
// flash remain segments
|
||||||
size := len(buffer) - len(ptr)
|
flushBuffer()
|
||||||
if size > 0 {
|
|
||||||
kcp.output(buffer, size)
|
|
||||||
}
|
|
||||||
|
|
||||||
// counter updates
|
// counter updates
|
||||||
sum := lostSegs
|
sum := lostSegs
|
||||||
@ -864,6 +891,8 @@ func (kcp *KCP) flush(ackOnly bool) uint32 {
|
|||||||
return uint32(minrto)
|
return uint32(minrto)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// (deprecated)
|
||||||
|
//
|
||||||
// Update updates state (call it repeatedly, every 10ms-100ms), or you can ask
|
// Update updates state (call it repeatedly, every 10ms-100ms), or you can ask
|
||||||
// ikcp_check when to call it again (without ikcp_input/_send calling).
|
// ikcp_check when to call it again (without ikcp_input/_send calling).
|
||||||
// 'current' - current timestamp in millisec.
|
// 'current' - current timestamp in millisec.
|
||||||
@ -892,6 +921,8 @@ func (kcp *KCP) Update() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// (deprecated)
|
||||||
|
//
|
||||||
// Check determines when should you invoke ikcp_update:
|
// Check determines when should you invoke ikcp_update:
|
||||||
// returns when you should invoke ikcp_update in millisec, if there
|
// returns when you should invoke ikcp_update in millisec, if there
|
||||||
// is no ikcp_input/_send calling. you can call ikcp_update in that
|
// is no ikcp_input/_send calling. you can call ikcp_update in that
|
||||||
@ -947,12 +978,16 @@ func (kcp *KCP) SetMtu(mtu int) int {
|
|||||||
if mtu < 50 || mtu < IKCP_OVERHEAD {
|
if mtu < 50 || mtu < IKCP_OVERHEAD {
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
buffer := make([]byte, (mtu+IKCP_OVERHEAD)*3)
|
if kcp.reserved >= int(kcp.mtu-IKCP_OVERHEAD) || kcp.reserved < 0 {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer := make([]byte, mtu)
|
||||||
if buffer == nil {
|
if buffer == nil {
|
||||||
return -2
|
return -2
|
||||||
}
|
}
|
||||||
kcp.mtu = uint32(mtu)
|
kcp.mtu = uint32(mtu)
|
||||||
kcp.mss = kcp.mtu - IKCP_OVERHEAD
|
kcp.mss = kcp.mtu - IKCP_OVERHEAD - uint32(kcp.reserved)
|
||||||
kcp.buffer = buffer
|
kcp.buffer = buffer
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
@ -1006,7 +1041,13 @@ func (kcp *KCP) WaitSnd() int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// remove front n elements from queue
|
// remove front n elements from queue
|
||||||
|
// if the number of elements to remove is more than half of the size.
|
||||||
|
// just shift the rear elements to front, otherwise just reslice q to q[n:]
|
||||||
|
// then the cost of runtime.growslice can always be less than n/2
|
||||||
func (kcp *KCP) remove_front(q []segment, n int) []segment {
|
func (kcp *KCP) remove_front(q []segment, n int) []segment {
|
||||||
newn := copy(q, q[n:])
|
if n > cap(q)/2 {
|
||||||
return q[:newn]
|
newn := copy(q, q[n:])
|
||||||
|
return q[:newn]
|
||||||
|
}
|
||||||
|
return q[n:]
|
||||||
}
|
}
|
||||||
|
48
vendor/github.com/fatedier/kcp-go/readloop.go
generated
vendored
Normal file
48
vendor/github.com/fatedier/kcp-go/readloop.go
generated
vendored
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
package kcp
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync/atomic"
|
||||||
|
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (s *UDPSession) defaultReadLoop() {
|
||||||
|
buf := make([]byte, mtuLimit)
|
||||||
|
var src string
|
||||||
|
for {
|
||||||
|
if n, addr, err := s.conn.ReadFrom(buf); err == nil {
|
||||||
|
// make sure the packet is from the same source
|
||||||
|
if src == "" { // set source address
|
||||||
|
src = addr.String()
|
||||||
|
} else if addr.String() != src {
|
||||||
|
atomic.AddUint64(&DefaultSnmp.InErrs, 1)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if n >= s.headerSize+IKCP_OVERHEAD {
|
||||||
|
s.packetInput(buf[:n])
|
||||||
|
} else {
|
||||||
|
atomic.AddUint64(&DefaultSnmp.InErrs, 1)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
s.notifyReadError(errors.WithStack(err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *Listener) defaultMonitor() {
|
||||||
|
buf := make([]byte, mtuLimit)
|
||||||
|
for {
|
||||||
|
if n, from, err := l.conn.ReadFrom(buf); err == nil {
|
||||||
|
if n >= l.headerSize+IKCP_OVERHEAD {
|
||||||
|
l.packetInput(buf[:n], from)
|
||||||
|
} else {
|
||||||
|
atomic.AddUint64(&DefaultSnmp.InErrs, 1)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
l.notifyReadError(errors.WithStack(err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
11
vendor/github.com/fatedier/kcp-go/readloop_generic.go
generated
vendored
Normal file
11
vendor/github.com/fatedier/kcp-go/readloop_generic.go
generated
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
// +build !linux
|
||||||
|
|
||||||
|
package kcp
|
||||||
|
|
||||||
|
func (s *UDPSession) readLoop() {
|
||||||
|
s.defaultReadLoop()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *Listener) monitor() {
|
||||||
|
l.defaultMonitor()
|
||||||
|
}
|
120
vendor/github.com/fatedier/kcp-go/readloop_linux.go
generated
vendored
Normal file
120
vendor/github.com/fatedier/kcp-go/readloop_linux.go
generated
vendored
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
// +build linux
|
||||||
|
|
||||||
|
package kcp
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
"os"
|
||||||
|
"sync/atomic"
|
||||||
|
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
"golang.org/x/net/ipv4"
|
||||||
|
"golang.org/x/net/ipv6"
|
||||||
|
)
|
||||||
|
|
||||||
|
// the read loop for a client session
|
||||||
|
func (s *UDPSession) readLoop() {
|
||||||
|
// default version
|
||||||
|
if s.xconn == nil {
|
||||||
|
s.defaultReadLoop()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// x/net version
|
||||||
|
var src string
|
||||||
|
msgs := make([]ipv4.Message, batchSize)
|
||||||
|
for k := range msgs {
|
||||||
|
msgs[k].Buffers = [][]byte{make([]byte, mtuLimit)}
|
||||||
|
}
|
||||||
|
|
||||||
|
for {
|
||||||
|
if count, err := s.xconn.ReadBatch(msgs, 0); err == nil {
|
||||||
|
for i := 0; i < count; i++ {
|
||||||
|
msg := &msgs[i]
|
||||||
|
// make sure the packet is from the same source
|
||||||
|
if src == "" { // set source address if nil
|
||||||
|
src = msg.Addr.String()
|
||||||
|
} else if msg.Addr.String() != src {
|
||||||
|
atomic.AddUint64(&DefaultSnmp.InErrs, 1)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if msg.N < s.headerSize+IKCP_OVERHEAD {
|
||||||
|
atomic.AddUint64(&DefaultSnmp.InErrs, 1)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// source and size has validated
|
||||||
|
s.packetInput(msg.Buffers[0][:msg.N])
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// compatibility issue:
|
||||||
|
// for linux kernel<=2.6.32, support for sendmmsg is not available
|
||||||
|
// an error of type os.SyscallError will be returned
|
||||||
|
if operr, ok := err.(*net.OpError); ok {
|
||||||
|
if se, ok := operr.Err.(*os.SyscallError); ok {
|
||||||
|
if se.Syscall == "recvmmsg" {
|
||||||
|
s.defaultReadLoop()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
s.notifyReadError(errors.WithStack(err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// monitor incoming data for all connections of server
|
||||||
|
func (l *Listener) monitor() {
|
||||||
|
var xconn batchConn
|
||||||
|
if _, ok := l.conn.(*net.UDPConn); ok {
|
||||||
|
addr, err := net.ResolveUDPAddr("udp", l.conn.LocalAddr().String())
|
||||||
|
if err == nil {
|
||||||
|
if addr.IP.To4() != nil {
|
||||||
|
xconn = ipv4.NewPacketConn(l.conn)
|
||||||
|
} else {
|
||||||
|
xconn = ipv6.NewPacketConn(l.conn)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// default version
|
||||||
|
if xconn == nil {
|
||||||
|
l.defaultMonitor()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// x/net version
|
||||||
|
msgs := make([]ipv4.Message, batchSize)
|
||||||
|
for k := range msgs {
|
||||||
|
msgs[k].Buffers = [][]byte{make([]byte, mtuLimit)}
|
||||||
|
}
|
||||||
|
|
||||||
|
for {
|
||||||
|
if count, err := xconn.ReadBatch(msgs, 0); err == nil {
|
||||||
|
for i := 0; i < count; i++ {
|
||||||
|
msg := &msgs[i]
|
||||||
|
if msg.N >= l.headerSize+IKCP_OVERHEAD {
|
||||||
|
l.packetInput(msg.Buffers[0][:msg.N], msg.Addr)
|
||||||
|
} else {
|
||||||
|
atomic.AddUint64(&DefaultSnmp.InErrs, 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// compatibility issue:
|
||||||
|
// for linux kernel<=2.6.32, support for sendmmsg is not available
|
||||||
|
// an error of type os.SyscallError will be returned
|
||||||
|
if operr, ok := err.(*net.OpError); ok {
|
||||||
|
if se, ok := operr.Err.(*os.SyscallError); ok {
|
||||||
|
if se.Syscall == "recvmmsg" {
|
||||||
|
l.defaultMonitor()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
l.notifyReadError(errors.WithStack(err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
602
vendor/github.com/fatedier/kcp-go/sess.go
generated
vendored
602
vendor/github.com/fatedier/kcp-go/sess.go
generated
vendored
@ -1,9 +1,17 @@
|
|||||||
|
// Package kcp-go is a Reliable-UDP library for golang.
|
||||||
|
//
|
||||||
|
// This library intents to provide a smooth, resilient, ordered,
|
||||||
|
// error-checked and anonymous delivery of streams over UDP packets.
|
||||||
|
//
|
||||||
|
// The interfaces of this package aims to be compatible with
|
||||||
|
// net.Conn in standard library, but offers powerful features for advanced users.
|
||||||
package kcp
|
package kcp
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"hash/crc32"
|
"hash/crc32"
|
||||||
|
"io"
|
||||||
"net"
|
"net"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
@ -14,14 +22,6 @@ import (
|
|||||||
"golang.org/x/net/ipv6"
|
"golang.org/x/net/ipv6"
|
||||||
)
|
)
|
||||||
|
|
||||||
type errTimeout struct {
|
|
||||||
error
|
|
||||||
}
|
|
||||||
|
|
||||||
func (errTimeout) Timeout() bool { return true }
|
|
||||||
func (errTimeout) Temporary() bool { return true }
|
|
||||||
func (errTimeout) Error() string { return "i/o timeout" }
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// 16-bytes nonce for each packet
|
// 16-bytes nonce for each packet
|
||||||
nonceSize = 16
|
nonceSize = 16
|
||||||
@ -42,9 +42,9 @@ const (
|
|||||||
acceptBacklog = 128
|
acceptBacklog = 128
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
var (
|
||||||
errBrokenPipe = "broken pipe"
|
errInvalidOperation = errors.New("invalid operation")
|
||||||
errInvalidOperation = "invalid operation"
|
errTimeout = errors.New("timeout")
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -72,8 +72,6 @@ type (
|
|||||||
// recvbuf turns packets into stream
|
// recvbuf turns packets into stream
|
||||||
recvbuf []byte
|
recvbuf []byte
|
||||||
bufptr []byte
|
bufptr []byte
|
||||||
// header extended output buffer, if has header
|
|
||||||
ext []byte
|
|
||||||
|
|
||||||
// FEC codec
|
// FEC codec
|
||||||
fecDecoder *fecDecoder
|
fecDecoder *fecDecoder
|
||||||
@ -90,16 +88,27 @@ type (
|
|||||||
|
|
||||||
// notifications
|
// notifications
|
||||||
die chan struct{} // notify current session has Closed
|
die chan struct{} // notify current session has Closed
|
||||||
|
dieOnce sync.Once
|
||||||
chReadEvent chan struct{} // notify Read() can be called without blocking
|
chReadEvent chan struct{} // notify Read() can be called without blocking
|
||||||
chWriteEvent chan struct{} // notify Write() can be called without blocking
|
chWriteEvent chan struct{} // notify Write() can be called without blocking
|
||||||
chReadError chan error // notify PacketConn.Read() have an error
|
|
||||||
chWriteError chan error // notify PacketConn.Write() have an error
|
// socket error handling
|
||||||
|
socketReadError atomic.Value
|
||||||
|
socketWriteError atomic.Value
|
||||||
|
chSocketReadError chan struct{}
|
||||||
|
chSocketWriteError chan struct{}
|
||||||
|
socketReadErrorOnce sync.Once
|
||||||
|
socketWriteErrorOnce sync.Once
|
||||||
|
|
||||||
// nonce generator
|
// nonce generator
|
||||||
nonce Entropy
|
nonce Entropy
|
||||||
|
|
||||||
isClosed bool // flag the session has Closed
|
// packets waiting to be sent on wire
|
||||||
mu sync.Mutex
|
txqueue []ipv4.Message
|
||||||
|
xconn batchConn // for x/net
|
||||||
|
xconnWriteError error
|
||||||
|
|
||||||
|
mu sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
setReadBuffer interface {
|
setReadBuffer interface {
|
||||||
@ -119,14 +128,26 @@ func newUDPSession(conv uint32, dataShards, parityShards int, l *Listener, conn
|
|||||||
sess.nonce.Init()
|
sess.nonce.Init()
|
||||||
sess.chReadEvent = make(chan struct{}, 1)
|
sess.chReadEvent = make(chan struct{}, 1)
|
||||||
sess.chWriteEvent = make(chan struct{}, 1)
|
sess.chWriteEvent = make(chan struct{}, 1)
|
||||||
sess.chReadError = make(chan error, 1)
|
sess.chSocketReadError = make(chan struct{})
|
||||||
sess.chWriteError = make(chan error, 1)
|
sess.chSocketWriteError = make(chan struct{})
|
||||||
sess.remote = remote
|
sess.remote = remote
|
||||||
sess.conn = conn
|
sess.conn = conn
|
||||||
sess.l = l
|
sess.l = l
|
||||||
sess.block = block
|
sess.block = block
|
||||||
sess.recvbuf = make([]byte, mtuLimit)
|
sess.recvbuf = make([]byte, mtuLimit)
|
||||||
|
|
||||||
|
// cast to writebatch conn
|
||||||
|
if _, ok := conn.(*net.UDPConn); ok {
|
||||||
|
addr, err := net.ResolveUDPAddr("udp", conn.LocalAddr().String())
|
||||||
|
if err == nil {
|
||||||
|
if addr.IP.To4() != nil {
|
||||||
|
sess.xconn = ipv4.NewPacketConn(conn)
|
||||||
|
} else {
|
||||||
|
sess.xconn = ipv6.NewPacketConn(conn)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// FEC codec initialization
|
// FEC codec initialization
|
||||||
sess.fecDecoder = newFECDecoder(rxFECMulti*(dataShards+parityShards), dataShards, parityShards)
|
sess.fecDecoder = newFECDecoder(rxFECMulti*(dataShards+parityShards), dataShards, parityShards)
|
||||||
if sess.block != nil {
|
if sess.block != nil {
|
||||||
@ -143,17 +164,12 @@ func newUDPSession(conv uint32, dataShards, parityShards int, l *Listener, conn
|
|||||||
sess.headerSize += fecHeaderSizePlus2
|
sess.headerSize += fecHeaderSizePlus2
|
||||||
}
|
}
|
||||||
|
|
||||||
// we only need to allocate extended packet buffer if we have the additional header
|
|
||||||
if sess.headerSize > 0 {
|
|
||||||
sess.ext = make([]byte, mtuLimit)
|
|
||||||
}
|
|
||||||
|
|
||||||
sess.kcp = NewKCP(conv, func(buf []byte, size int) {
|
sess.kcp = NewKCP(conv, func(buf []byte, size int) {
|
||||||
if size >= IKCP_OVERHEAD {
|
if size >= IKCP_OVERHEAD+sess.headerSize {
|
||||||
sess.output(buf[:size])
|
sess.output(buf[:size])
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
sess.kcp.SetMtu(IKCP_MTU_DEF - sess.headerSize)
|
sess.kcp.ReserveBytes(sess.headerSize)
|
||||||
|
|
||||||
// register current session to the global updater,
|
// register current session to the global updater,
|
||||||
// which call sess.update() periodically.
|
// which call sess.update() periodically.
|
||||||
@ -165,6 +181,7 @@ func newUDPSession(conv uint32, dataShards, parityShards int, l *Listener, conn
|
|||||||
} else {
|
} else {
|
||||||
atomic.AddUint64(&DefaultSnmp.PassiveOpens, 1)
|
atomic.AddUint64(&DefaultSnmp.PassiveOpens, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
currestab := atomic.AddUint64(&DefaultSnmp.CurrEstab, 1)
|
currestab := atomic.AddUint64(&DefaultSnmp.CurrEstab, 1)
|
||||||
maxconn := atomic.LoadUint64(&DefaultSnmp.MaxConn)
|
maxconn := atomic.LoadUint64(&DefaultSnmp.MaxConn)
|
||||||
if currestab > maxconn {
|
if currestab > maxconn {
|
||||||
@ -186,11 +203,6 @@ func (s *UDPSession) Read(b []byte) (n int, err error) {
|
|||||||
return n, nil
|
return n, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.isClosed {
|
|
||||||
s.mu.Unlock()
|
|
||||||
return 0, errors.New(errBrokenPipe)
|
|
||||||
}
|
|
||||||
|
|
||||||
if size := s.kcp.PeekSize(); size > 0 { // peek data size from kcp
|
if size := s.kcp.PeekSize(); size > 0 { // peek data size from kcp
|
||||||
if len(b) >= size { // receive data into 'b' directly
|
if len(b) >= size { // receive data into 'b' directly
|
||||||
s.kcp.Recv(b)
|
s.kcp.Recv(b)
|
||||||
@ -220,7 +232,7 @@ func (s *UDPSession) Read(b []byte) (n int, err error) {
|
|||||||
if !s.rd.IsZero() {
|
if !s.rd.IsZero() {
|
||||||
if time.Now().After(s.rd) {
|
if time.Now().After(s.rd) {
|
||||||
s.mu.Unlock()
|
s.mu.Unlock()
|
||||||
return 0, errTimeout{}
|
return 0, errors.WithStack(errTimeout)
|
||||||
}
|
}
|
||||||
|
|
||||||
delay := s.rd.Sub(time.Now())
|
delay := s.rd.Sub(time.Now())
|
||||||
@ -229,63 +241,66 @@ func (s *UDPSession) Read(b []byte) (n int, err error) {
|
|||||||
}
|
}
|
||||||
s.mu.Unlock()
|
s.mu.Unlock()
|
||||||
|
|
||||||
// wait for read event or timeout
|
// wait for read event or timeout or error
|
||||||
select {
|
select {
|
||||||
case <-s.chReadEvent:
|
case <-s.chReadEvent:
|
||||||
case <-c:
|
|
||||||
case <-s.die:
|
|
||||||
case err = <-s.chReadError:
|
|
||||||
if timeout != nil {
|
if timeout != nil {
|
||||||
timeout.Stop()
|
timeout.Stop()
|
||||||
}
|
}
|
||||||
return n, err
|
case <-c:
|
||||||
}
|
return 0, errors.WithStack(errTimeout)
|
||||||
|
case <-s.chSocketReadError:
|
||||||
if timeout != nil {
|
return 0, s.socketReadError.Load().(error)
|
||||||
timeout.Stop()
|
case <-s.die:
|
||||||
|
return 0, errors.WithStack(io.ErrClosedPipe)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write implements net.Conn
|
// Write implements net.Conn
|
||||||
func (s *UDPSession) Write(b []byte) (n int, err error) {
|
func (s *UDPSession) Write(b []byte) (n int, err error) { return s.WriteBuffers([][]byte{b}) }
|
||||||
|
|
||||||
|
// WriteBuffers write a vector of byte slices to the underlying connection
|
||||||
|
func (s *UDPSession) WriteBuffers(v [][]byte) (n int, err error) {
|
||||||
for {
|
for {
|
||||||
s.mu.Lock()
|
select {
|
||||||
if s.isClosed {
|
case <-s.chSocketWriteError:
|
||||||
s.mu.Unlock()
|
return 0, s.socketWriteError.Load().(error)
|
||||||
return 0, errors.New(errBrokenPipe)
|
case <-s.die:
|
||||||
|
return 0, errors.WithStack(io.ErrClosedPipe)
|
||||||
|
default:
|
||||||
}
|
}
|
||||||
|
|
||||||
// controls how much data will be sent to kcp core
|
s.mu.Lock()
|
||||||
// to prevent the memory from exhuasting
|
|
||||||
if s.kcp.WaitSnd() < int(s.kcp.snd_wnd) {
|
if s.kcp.WaitSnd() < int(s.kcp.snd_wnd) {
|
||||||
n = len(b)
|
for _, b := range v {
|
||||||
for {
|
n += len(b)
|
||||||
if len(b) <= int(s.kcp.mss) {
|
for {
|
||||||
s.kcp.Send(b)
|
if len(b) <= int(s.kcp.mss) {
|
||||||
break
|
s.kcp.Send(b)
|
||||||
} else {
|
break
|
||||||
s.kcp.Send(b[:s.kcp.mss])
|
} else {
|
||||||
b = b[s.kcp.mss:]
|
s.kcp.Send(b[:s.kcp.mss])
|
||||||
|
b = b[s.kcp.mss:]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// flush immediately if the queue is full
|
|
||||||
if s.kcp.WaitSnd() >= int(s.kcp.snd_wnd) || !s.writeDelay {
|
if s.kcp.WaitSnd() >= int(s.kcp.snd_wnd) || !s.writeDelay {
|
||||||
s.kcp.flush(false)
|
s.kcp.flush(false)
|
||||||
|
s.uncork()
|
||||||
}
|
}
|
||||||
s.mu.Unlock()
|
s.mu.Unlock()
|
||||||
atomic.AddUint64(&DefaultSnmp.BytesSent, uint64(n))
|
atomic.AddUint64(&DefaultSnmp.BytesSent, uint64(n))
|
||||||
return n, nil
|
return n, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// deadline for current writing operation
|
|
||||||
var timeout *time.Timer
|
var timeout *time.Timer
|
||||||
var c <-chan time.Time
|
var c <-chan time.Time
|
||||||
if !s.wd.IsZero() {
|
if !s.wd.IsZero() {
|
||||||
if time.Now().After(s.wd) {
|
if time.Now().After(s.wd) {
|
||||||
s.mu.Unlock()
|
s.mu.Unlock()
|
||||||
return 0, errTimeout{}
|
return 0, errors.WithStack(errTimeout)
|
||||||
}
|
}
|
||||||
delay := s.wd.Sub(time.Now())
|
delay := s.wd.Sub(time.Now())
|
||||||
timeout = time.NewTimer(delay)
|
timeout = time.NewTimer(delay)
|
||||||
@ -293,44 +308,52 @@ func (s *UDPSession) Write(b []byte) (n int, err error) {
|
|||||||
}
|
}
|
||||||
s.mu.Unlock()
|
s.mu.Unlock()
|
||||||
|
|
||||||
// wait for write event or timeout
|
|
||||||
select {
|
select {
|
||||||
case <-s.chWriteEvent:
|
case <-s.chWriteEvent:
|
||||||
case <-c:
|
|
||||||
case <-s.die:
|
|
||||||
case err = <-s.chWriteError:
|
|
||||||
if timeout != nil {
|
if timeout != nil {
|
||||||
timeout.Stop()
|
timeout.Stop()
|
||||||
}
|
}
|
||||||
return n, err
|
case <-c:
|
||||||
}
|
return 0, errors.WithStack(errTimeout)
|
||||||
|
case <-s.chSocketWriteError:
|
||||||
if timeout != nil {
|
return 0, s.socketWriteError.Load().(error)
|
||||||
timeout.Stop()
|
case <-s.die:
|
||||||
|
return 0, errors.WithStack(io.ErrClosedPipe)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// uncork sends data in txqueue if there is any
|
||||||
|
func (s *UDPSession) uncork() {
|
||||||
|
if len(s.txqueue) > 0 {
|
||||||
|
s.tx(s.txqueue)
|
||||||
|
s.txqueue = s.txqueue[:0]
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// Close closes the connection.
|
// Close closes the connection.
|
||||||
func (s *UDPSession) Close() error {
|
func (s *UDPSession) Close() error {
|
||||||
// remove current session from updater & listener(if necessary)
|
var once bool
|
||||||
updater.removeSession(s)
|
s.dieOnce.Do(func() {
|
||||||
if s.l != nil { // notify listener
|
close(s.die)
|
||||||
s.l.closeSession(s.remote)
|
once = true
|
||||||
}
|
})
|
||||||
|
|
||||||
s.mu.Lock()
|
if once {
|
||||||
defer s.mu.Unlock()
|
// remove from updater
|
||||||
if s.isClosed {
|
updater.removeSession(s)
|
||||||
return errors.New(errBrokenPipe)
|
atomic.AddUint64(&DefaultSnmp.CurrEstab, ^uint64(0))
|
||||||
|
|
||||||
|
if s.l != nil { // belongs to listener
|
||||||
|
s.l.closeSession(s.remote)
|
||||||
|
return nil
|
||||||
|
} else { // client socket close
|
||||||
|
return s.conn.Close()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return errors.WithStack(io.ErrClosedPipe)
|
||||||
}
|
}
|
||||||
close(s.die)
|
|
||||||
s.isClosed = true
|
|
||||||
atomic.AddUint64(&DefaultSnmp.CurrEstab, ^uint64(0))
|
|
||||||
if s.l == nil { // client socket close
|
|
||||||
return s.conn.Close()
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// LocalAddr returns the local network address. The Addr returned is shared by all invocations of LocalAddr, so do not modify it.
|
// LocalAddr returns the local network address. The Addr returned is shared by all invocations of LocalAddr, so do not modify it.
|
||||||
@ -390,7 +413,7 @@ func (s *UDPSession) SetMtu(mtu int) bool {
|
|||||||
|
|
||||||
s.mu.Lock()
|
s.mu.Lock()
|
||||||
defer s.mu.Unlock()
|
defer s.mu.Unlock()
|
||||||
s.kcp.SetMtu(mtu - s.headerSize)
|
s.kcp.SetMtu(mtu)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -412,7 +435,9 @@ func (s *UDPSession) SetACKNoDelay(nodelay bool) {
|
|||||||
s.ackNoDelay = nodelay
|
s.ackNoDelay = nodelay
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetDUP duplicates udp packets for kcp output, for testing purpose only
|
// (deprecated)
|
||||||
|
//
|
||||||
|
// SetDUP duplicates udp packets for kcp output.
|
||||||
func (s *UDPSession) SetDUP(dup int) {
|
func (s *UDPSession) SetDUP(dup int) {
|
||||||
s.mu.Lock()
|
s.mu.Lock()
|
||||||
defer s.mu.Unlock()
|
defer s.mu.Unlock()
|
||||||
@ -427,19 +452,29 @@ func (s *UDPSession) SetNoDelay(nodelay, interval, resend, nc int) {
|
|||||||
s.kcp.NoDelay(nodelay, interval, resend, nc)
|
s.kcp.NoDelay(nodelay, interval, resend, nc)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetDSCP sets the 6bit DSCP field of IP header, no effect if it's accepted from Listener
|
// SetDSCP sets the 6bit DSCP field in IPv4 header, or 8bit Traffic Class in IPv6 header.
|
||||||
|
//
|
||||||
|
// It has no effect if it's accepted from Listener.
|
||||||
func (s *UDPSession) SetDSCP(dscp int) error {
|
func (s *UDPSession) SetDSCP(dscp int) error {
|
||||||
s.mu.Lock()
|
s.mu.Lock()
|
||||||
defer s.mu.Unlock()
|
defer s.mu.Unlock()
|
||||||
if s.l == nil {
|
if s.l != nil {
|
||||||
if nc, ok := s.conn.(net.Conn); ok {
|
return errInvalidOperation
|
||||||
if err := ipv4.NewConn(nc).SetTOS(dscp << 2); err != nil {
|
}
|
||||||
return ipv6.NewConn(nc).SetTrafficClass(dscp)
|
if nc, ok := s.conn.(net.Conn); ok {
|
||||||
}
|
var succeed bool
|
||||||
|
if err := ipv4.NewConn(nc).SetTOS(dscp << 2); err == nil {
|
||||||
|
succeed = true
|
||||||
|
}
|
||||||
|
if err := ipv6.NewConn(nc).SetTrafficClass(dscp); err == nil {
|
||||||
|
succeed = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if succeed {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return errors.New(errInvalidOperation)
|
return errInvalidOperation
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetReadBuffer sets the socket read buffer, no effect if it's accepted from Listener
|
// SetReadBuffer sets the socket read buffer, no effect if it's accepted from Listener
|
||||||
@ -451,7 +486,7 @@ func (s *UDPSession) SetReadBuffer(bytes int) error {
|
|||||||
return nc.SetReadBuffer(bytes)
|
return nc.SetReadBuffer(bytes)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return errors.New(errInvalidOperation)
|
return errInvalidOperation
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetWriteBuffer sets the socket write buffer, no effect if it's accepted from Listener
|
// SetWriteBuffer sets the socket write buffer, no effect if it's accepted from Listener
|
||||||
@ -463,37 +498,29 @@ func (s *UDPSession) SetWriteBuffer(bytes int) error {
|
|||||||
return nc.SetWriteBuffer(bytes)
|
return nc.SetWriteBuffer(bytes)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return errors.New(errInvalidOperation)
|
return errInvalidOperation
|
||||||
}
|
}
|
||||||
|
|
||||||
// post-processing for sending a packet from kcp core
|
// post-processing for sending a packet from kcp core
|
||||||
// steps:
|
// steps:
|
||||||
// 0. Header extending
|
|
||||||
// 1. FEC packet generation
|
// 1. FEC packet generation
|
||||||
// 2. CRC32 integrity
|
// 2. CRC32 integrity
|
||||||
// 3. Encryption
|
// 3. Encryption
|
||||||
// 4. WriteTo kernel
|
// 4. TxQueue
|
||||||
func (s *UDPSession) output(buf []byte) {
|
func (s *UDPSession) output(buf []byte) {
|
||||||
var ecc [][]byte
|
var ecc [][]byte
|
||||||
|
|
||||||
// 0. extend buf's header space(if necessary)
|
|
||||||
ext := buf
|
|
||||||
if s.headerSize > 0 {
|
|
||||||
ext = s.ext[:s.headerSize+len(buf)]
|
|
||||||
copy(ext[s.headerSize:], buf)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 1. FEC encoding
|
// 1. FEC encoding
|
||||||
if s.fecEncoder != nil {
|
if s.fecEncoder != nil {
|
||||||
ecc = s.fecEncoder.encode(ext)
|
ecc = s.fecEncoder.encode(buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2&3. crc32 & encryption
|
// 2&3. crc32 & encryption
|
||||||
if s.block != nil {
|
if s.block != nil {
|
||||||
s.nonce.Fill(ext[:nonceSize])
|
s.nonce.Fill(buf[:nonceSize])
|
||||||
checksum := crc32.ChecksumIEEE(ext[cryptHeaderSize:])
|
checksum := crc32.ChecksumIEEE(buf[cryptHeaderSize:])
|
||||||
binary.LittleEndian.PutUint32(ext[nonceSize:], checksum)
|
binary.LittleEndian.PutUint32(buf[nonceSize:], checksum)
|
||||||
s.block.Encrypt(ext, ext)
|
s.block.Encrypt(buf, buf)
|
||||||
|
|
||||||
for k := range ecc {
|
for k := range ecc {
|
||||||
s.nonce.Fill(ecc[k][:nonceSize])
|
s.nonce.Fill(ecc[k][:nonceSize])
|
||||||
@ -503,28 +530,23 @@ func (s *UDPSession) output(buf []byte) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4. WriteTo kernel
|
// 4. TxQueue
|
||||||
nbytes := 0
|
var msg ipv4.Message
|
||||||
npkts := 0
|
|
||||||
for i := 0; i < s.dup+1; i++ {
|
for i := 0; i < s.dup+1; i++ {
|
||||||
if n, err := s.conn.WriteTo(ext, s.remote); err == nil {
|
bts := xmitBuf.Get().([]byte)[:len(buf)]
|
||||||
nbytes += n
|
copy(bts, buf)
|
||||||
npkts++
|
msg.Buffers = [][]byte{bts}
|
||||||
} else {
|
msg.Addr = s.remote
|
||||||
s.notifyWriteError(err)
|
s.txqueue = append(s.txqueue, msg)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for k := range ecc {
|
for k := range ecc {
|
||||||
if n, err := s.conn.WriteTo(ecc[k], s.remote); err == nil {
|
bts := xmitBuf.Get().([]byte)[:len(ecc[k])]
|
||||||
nbytes += n
|
copy(bts, ecc[k])
|
||||||
npkts++
|
msg.Buffers = [][]byte{bts}
|
||||||
} else {
|
msg.Addr = s.remote
|
||||||
s.notifyWriteError(err)
|
s.txqueue = append(s.txqueue, msg)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
atomic.AddUint64(&DefaultSnmp.OutPkts, uint64(npkts))
|
|
||||||
atomic.AddUint64(&DefaultSnmp.OutBytes, uint64(nbytes))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// kcp update, returns interval for next calling
|
// kcp update, returns interval for next calling
|
||||||
@ -535,6 +557,7 @@ func (s *UDPSession) update() (interval time.Duration) {
|
|||||||
if s.kcp.WaitSnd() < waitsnd {
|
if s.kcp.WaitSnd() < waitsnd {
|
||||||
s.notifyWriteEvent()
|
s.notifyWriteEvent()
|
||||||
}
|
}
|
||||||
|
s.uncork()
|
||||||
s.mu.Unlock()
|
s.mu.Unlock()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -556,10 +579,39 @@ func (s *UDPSession) notifyWriteEvent() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *UDPSession) notifyReadError(err error) {
|
||||||
|
s.socketReadErrorOnce.Do(func() {
|
||||||
|
s.socketReadError.Store(err)
|
||||||
|
close(s.chSocketReadError)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func (s *UDPSession) notifyWriteError(err error) {
|
func (s *UDPSession) notifyWriteError(err error) {
|
||||||
select {
|
s.socketWriteErrorOnce.Do(func() {
|
||||||
case s.chWriteError <- err:
|
s.socketWriteError.Store(err)
|
||||||
default:
|
close(s.chSocketWriteError)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// packet input stage
|
||||||
|
func (s *UDPSession) packetInput(data []byte) {
|
||||||
|
dataValid := false
|
||||||
|
if s.block != nil {
|
||||||
|
s.block.Decrypt(data, data)
|
||||||
|
data = data[nonceSize:]
|
||||||
|
checksum := crc32.ChecksumIEEE(data[crcSize:])
|
||||||
|
if checksum == binary.LittleEndian.Uint32(data) {
|
||||||
|
data = data[crcSize:]
|
||||||
|
dataValid = true
|
||||||
|
} else {
|
||||||
|
atomic.AddUint64(&DefaultSnmp.InCsumErrors, 1)
|
||||||
|
}
|
||||||
|
} else if s.block == nil {
|
||||||
|
dataValid = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if dataValid {
|
||||||
|
s.kcpInput(data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -568,16 +620,16 @@ func (s *UDPSession) kcpInput(data []byte) {
|
|||||||
|
|
||||||
if s.fecDecoder != nil {
|
if s.fecDecoder != nil {
|
||||||
if len(data) > fecHeaderSize { // must be larger than fec header size
|
if len(data) > fecHeaderSize { // must be larger than fec header size
|
||||||
f := s.fecDecoder.decodeBytes(data)
|
f := fecPacket(data)
|
||||||
if f.flag == typeData || f.flag == typeFEC { // header check
|
if f.flag() == typeData || f.flag() == typeParity { // header check
|
||||||
if f.flag == typeFEC {
|
if f.flag() == typeParity {
|
||||||
fecParityShards++
|
fecParityShards++
|
||||||
}
|
}
|
||||||
recovers := s.fecDecoder.decode(f)
|
recovers := s.fecDecoder.decode(f)
|
||||||
|
|
||||||
s.mu.Lock()
|
s.mu.Lock()
|
||||||
waitsnd := s.kcp.WaitSnd()
|
waitsnd := s.kcp.WaitSnd()
|
||||||
if f.flag == typeData {
|
if f.flag() == typeData {
|
||||||
if ret := s.kcp.Input(data[fecHeaderSizePlus2:], true, s.ackNoDelay); ret != 0 {
|
if ret := s.kcp.Input(data[fecHeaderSizePlus2:], true, s.ackNoDelay); ret != 0 {
|
||||||
kcpInErrors++
|
kcpInErrors++
|
||||||
}
|
}
|
||||||
@ -598,6 +650,8 @@ func (s *UDPSession) kcpInput(data []byte) {
|
|||||||
} else {
|
} else {
|
||||||
fecErrs++
|
fecErrs++
|
||||||
}
|
}
|
||||||
|
// recycle the recovers
|
||||||
|
xmitBuf.Put(r)
|
||||||
}
|
}
|
||||||
|
|
||||||
// to notify the readers to receive the data
|
// to notify the readers to receive the data
|
||||||
@ -608,6 +662,7 @@ func (s *UDPSession) kcpInput(data []byte) {
|
|||||||
if s.kcp.WaitSnd() < waitsnd {
|
if s.kcp.WaitSnd() < waitsnd {
|
||||||
s.notifyWriteEvent()
|
s.notifyWriteEvent()
|
||||||
}
|
}
|
||||||
|
s.uncork()
|
||||||
s.mu.Unlock()
|
s.mu.Unlock()
|
||||||
} else {
|
} else {
|
||||||
atomic.AddUint64(&DefaultSnmp.InErrs, 1)
|
atomic.AddUint64(&DefaultSnmp.InErrs, 1)
|
||||||
@ -627,6 +682,7 @@ func (s *UDPSession) kcpInput(data []byte) {
|
|||||||
if s.kcp.WaitSnd() < waitsnd {
|
if s.kcp.WaitSnd() < waitsnd {
|
||||||
s.notifyWriteEvent()
|
s.notifyWriteEvent()
|
||||||
}
|
}
|
||||||
|
s.uncork()
|
||||||
s.mu.Unlock()
|
s.mu.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -644,50 +700,7 @@ func (s *UDPSession) kcpInput(data []byte) {
|
|||||||
if fecRecovered > 0 {
|
if fecRecovered > 0 {
|
||||||
atomic.AddUint64(&DefaultSnmp.FECRecovered, fecRecovered)
|
atomic.AddUint64(&DefaultSnmp.FECRecovered, fecRecovered)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// the read loop for a client session
|
|
||||||
func (s *UDPSession) readLoop() {
|
|
||||||
buf := make([]byte, mtuLimit)
|
|
||||||
var src string
|
|
||||||
for {
|
|
||||||
if n, addr, err := s.conn.ReadFrom(buf); err == nil {
|
|
||||||
// make sure the packet is from the same source
|
|
||||||
if src == "" { // set source address
|
|
||||||
src = addr.String()
|
|
||||||
} else if addr.String() != src {
|
|
||||||
atomic.AddUint64(&DefaultSnmp.InErrs, 1)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if n >= s.headerSize+IKCP_OVERHEAD {
|
|
||||||
data := buf[:n]
|
|
||||||
dataValid := false
|
|
||||||
if s.block != nil {
|
|
||||||
s.block.Decrypt(data, data)
|
|
||||||
data = data[nonceSize:]
|
|
||||||
checksum := crc32.ChecksumIEEE(data[crcSize:])
|
|
||||||
if checksum == binary.LittleEndian.Uint32(data) {
|
|
||||||
data = data[crcSize:]
|
|
||||||
dataValid = true
|
|
||||||
} else {
|
|
||||||
atomic.AddUint64(&DefaultSnmp.InCsumErrors, 1)
|
|
||||||
}
|
|
||||||
} else if s.block == nil {
|
|
||||||
dataValid = true
|
|
||||||
}
|
|
||||||
|
|
||||||
if dataValid {
|
|
||||||
s.kcpInput(data)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
atomic.AddUint64(&DefaultSnmp.InErrs, 1)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
s.chReadError <- err
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type (
|
type (
|
||||||
@ -704,98 +717,91 @@ type (
|
|||||||
chAccepts chan *UDPSession // Listen() backlog
|
chAccepts chan *UDPSession // Listen() backlog
|
||||||
chSessionClosed chan net.Addr // session close queue
|
chSessionClosed chan net.Addr // session close queue
|
||||||
headerSize int // the additional header to a KCP frame
|
headerSize int // the additional header to a KCP frame
|
||||||
die chan struct{} // notify the listener has closed
|
|
||||||
rd atomic.Value // read deadline for Accept()
|
die chan struct{} // notify the listener has closed
|
||||||
wd atomic.Value
|
dieOnce sync.Once
|
||||||
|
|
||||||
|
// socket error handling
|
||||||
|
socketReadError atomic.Value
|
||||||
|
chSocketReadError chan struct{}
|
||||||
|
socketReadErrorOnce sync.Once
|
||||||
|
|
||||||
|
rd atomic.Value // read deadline for Accept()
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// monitor incoming data for all connections of server
|
// packet input stage
|
||||||
func (l *Listener) monitor() {
|
func (l *Listener) packetInput(data []byte, addr net.Addr) {
|
||||||
// a cache for session object last used
|
dataValid := false
|
||||||
var lastAddr string
|
if l.block != nil {
|
||||||
var lastSession *UDPSession
|
l.block.Decrypt(data, data)
|
||||||
buf := make([]byte, mtuLimit)
|
data = data[nonceSize:]
|
||||||
for {
|
checksum := crc32.ChecksumIEEE(data[crcSize:])
|
||||||
if n, from, err := l.conn.ReadFrom(buf); err == nil {
|
if checksum == binary.LittleEndian.Uint32(data) {
|
||||||
if n >= l.headerSize+IKCP_OVERHEAD {
|
data = data[crcSize:]
|
||||||
data := buf[:n]
|
dataValid = true
|
||||||
dataValid := false
|
} else {
|
||||||
if l.block != nil {
|
atomic.AddUint64(&DefaultSnmp.InCsumErrors, 1)
|
||||||
l.block.Decrypt(data, data)
|
}
|
||||||
data = data[nonceSize:]
|
} else if l.block == nil {
|
||||||
checksum := crc32.ChecksumIEEE(data[crcSize:])
|
dataValid = true
|
||||||
if checksum == binary.LittleEndian.Uint32(data) {
|
}
|
||||||
data = data[crcSize:]
|
|
||||||
dataValid = true
|
if dataValid {
|
||||||
} else {
|
l.sessionLock.Lock()
|
||||||
atomic.AddUint64(&DefaultSnmp.InCsumErrors, 1)
|
s, ok := l.sessions[addr.String()]
|
||||||
|
l.sessionLock.Unlock()
|
||||||
|
|
||||||
|
if !ok { // new address:port
|
||||||
|
if len(l.chAccepts) < cap(l.chAccepts) { // do not let the new sessions overwhelm accept queue
|
||||||
|
var conv uint32
|
||||||
|
convValid := false
|
||||||
|
if l.fecDecoder != nil {
|
||||||
|
isfec := binary.LittleEndian.Uint16(data[4:])
|
||||||
|
if isfec == typeData {
|
||||||
|
conv = binary.LittleEndian.Uint32(data[fecHeaderSizePlus2:])
|
||||||
|
convValid = true
|
||||||
}
|
}
|
||||||
} else if l.block == nil {
|
} else {
|
||||||
dataValid = true
|
conv = binary.LittleEndian.Uint32(data)
|
||||||
|
convValid = true
|
||||||
}
|
}
|
||||||
|
|
||||||
if dataValid {
|
if convValid { // creates a new session only if the 'conv' field in kcp is accessible
|
||||||
addr := from.String()
|
s := newUDPSession(conv, l.dataShards, l.parityShards, l, l.conn, addr, l.block)
|
||||||
var s *UDPSession
|
s.kcpInput(data)
|
||||||
var ok bool
|
l.sessionLock.Lock()
|
||||||
|
l.sessions[addr.String()] = s
|
||||||
// the packets received from an address always come in batch,
|
l.sessionLock.Unlock()
|
||||||
// cache the session for next packet, without querying map.
|
l.chAccepts <- s
|
||||||
if addr == lastAddr {
|
|
||||||
s, ok = lastSession, true
|
|
||||||
} else {
|
|
||||||
l.sessionLock.Lock()
|
|
||||||
if s, ok = l.sessions[addr]; ok {
|
|
||||||
lastSession = s
|
|
||||||
lastAddr = addr
|
|
||||||
}
|
|
||||||
l.sessionLock.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
if !ok { // new session
|
|
||||||
if len(l.chAccepts) < cap(l.chAccepts) { // do not let the new sessions overwhelm accept queue
|
|
||||||
var conv uint32
|
|
||||||
convValid := false
|
|
||||||
if l.fecDecoder != nil {
|
|
||||||
isfec := binary.LittleEndian.Uint16(data[4:])
|
|
||||||
if isfec == typeData {
|
|
||||||
conv = binary.LittleEndian.Uint32(data[fecHeaderSizePlus2:])
|
|
||||||
convValid = true
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
conv = binary.LittleEndian.Uint32(data)
|
|
||||||
convValid = true
|
|
||||||
}
|
|
||||||
|
|
||||||
if convValid { // creates a new session only if the 'conv' field in kcp is accessible
|
|
||||||
s := newUDPSession(conv, l.dataShards, l.parityShards, l, l.conn, from, l.block)
|
|
||||||
s.kcpInput(data)
|
|
||||||
l.sessionLock.Lock()
|
|
||||||
l.sessions[addr] = s
|
|
||||||
l.sessionLock.Unlock()
|
|
||||||
l.chAccepts <- s
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
s.kcpInput(data)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
atomic.AddUint64(&DefaultSnmp.InErrs, 1)
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return
|
s.kcpInput(data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (l *Listener) notifyReadError(err error) {
|
||||||
|
l.socketReadErrorOnce.Do(func() {
|
||||||
|
l.socketReadError.Store(err)
|
||||||
|
close(l.chSocketReadError)
|
||||||
|
|
||||||
|
// propagate read error to all sessions
|
||||||
|
l.sessionLock.Lock()
|
||||||
|
for _, s := range l.sessions {
|
||||||
|
s.notifyReadError(err)
|
||||||
|
}
|
||||||
|
l.sessionLock.Unlock()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// SetReadBuffer sets the socket read buffer for the Listener
|
// SetReadBuffer sets the socket read buffer for the Listener
|
||||||
func (l *Listener) SetReadBuffer(bytes int) error {
|
func (l *Listener) SetReadBuffer(bytes int) error {
|
||||||
if nc, ok := l.conn.(setReadBuffer); ok {
|
if nc, ok := l.conn.(setReadBuffer); ok {
|
||||||
return nc.SetReadBuffer(bytes)
|
return nc.SetReadBuffer(bytes)
|
||||||
}
|
}
|
||||||
return errors.New(errInvalidOperation)
|
return errInvalidOperation
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetWriteBuffer sets the socket write buffer for the Listener
|
// SetWriteBuffer sets the socket write buffer for the Listener
|
||||||
@ -803,18 +809,25 @@ func (l *Listener) SetWriteBuffer(bytes int) error {
|
|||||||
if nc, ok := l.conn.(setWriteBuffer); ok {
|
if nc, ok := l.conn.(setWriteBuffer); ok {
|
||||||
return nc.SetWriteBuffer(bytes)
|
return nc.SetWriteBuffer(bytes)
|
||||||
}
|
}
|
||||||
return errors.New(errInvalidOperation)
|
return errInvalidOperation
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetDSCP sets the 6bit DSCP field of IP header
|
// SetDSCP sets the 6bit DSCP field in IPv4 header, or 8bit Traffic Class in IPv6 header.
|
||||||
func (l *Listener) SetDSCP(dscp int) error {
|
func (l *Listener) SetDSCP(dscp int) error {
|
||||||
if nc, ok := l.conn.(net.Conn); ok {
|
if nc, ok := l.conn.(net.Conn); ok {
|
||||||
if err := ipv4.NewConn(nc).SetTOS(dscp << 2); err != nil {
|
var succeed bool
|
||||||
return ipv6.NewConn(nc).SetTrafficClass(dscp)
|
if err := ipv4.NewConn(nc).SetTOS(dscp << 2); err == nil {
|
||||||
|
succeed = true
|
||||||
|
}
|
||||||
|
if err := ipv6.NewConn(nc).SetTrafficClass(dscp); err == nil {
|
||||||
|
succeed = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if succeed {
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
return errors.New(errInvalidOperation)
|
return errInvalidOperation
|
||||||
}
|
}
|
||||||
|
|
||||||
// Accept implements the Accept method in the Listener interface; it waits for the next call and returns a generic Conn.
|
// Accept implements the Accept method in the Listener interface; it waits for the next call and returns a generic Conn.
|
||||||
@ -831,11 +844,13 @@ func (l *Listener) AcceptKCP() (*UDPSession, error) {
|
|||||||
|
|
||||||
select {
|
select {
|
||||||
case <-timeout:
|
case <-timeout:
|
||||||
return nil, &errTimeout{}
|
return nil, errors.WithStack(errTimeout)
|
||||||
case c := <-l.chAccepts:
|
case c := <-l.chAccepts:
|
||||||
return c, nil
|
return c, nil
|
||||||
|
case <-l.chSocketReadError:
|
||||||
|
return nil, l.socketReadError.Load().(error)
|
||||||
case <-l.die:
|
case <-l.die:
|
||||||
return nil, errors.New(errBrokenPipe)
|
return nil, errors.WithStack(io.ErrClosedPipe)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -853,15 +868,21 @@ func (l *Listener) SetReadDeadline(t time.Time) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SetWriteDeadline implements the Conn SetWriteDeadline method.
|
// SetWriteDeadline implements the Conn SetWriteDeadline method.
|
||||||
func (l *Listener) SetWriteDeadline(t time.Time) error {
|
func (l *Listener) SetWriteDeadline(t time.Time) error { return errInvalidOperation }
|
||||||
l.wd.Store(t)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close stops listening on the UDP address. Already Accepted connections are not closed.
|
// Close stops listening on the UDP address, and closes the socket
|
||||||
func (l *Listener) Close() error {
|
func (l *Listener) Close() error {
|
||||||
close(l.die)
|
var once bool
|
||||||
return l.conn.Close()
|
l.dieOnce.Do(func() {
|
||||||
|
close(l.die)
|
||||||
|
once = true
|
||||||
|
})
|
||||||
|
|
||||||
|
if once {
|
||||||
|
return l.conn.Close()
|
||||||
|
} else {
|
||||||
|
return errors.WithStack(io.ErrClosedPipe)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// closeSession notify the listener that a session has closed
|
// closeSession notify the listener that a session has closed
|
||||||
@ -881,16 +902,21 @@ func (l *Listener) Addr() net.Addr { return l.conn.LocalAddr() }
|
|||||||
// Listen listens for incoming KCP packets addressed to the local address laddr on the network "udp",
|
// Listen listens for incoming KCP packets addressed to the local address laddr on the network "udp",
|
||||||
func Listen(laddr string) (net.Listener, error) { return ListenWithOptions(laddr, nil, 0, 0) }
|
func Listen(laddr string) (net.Listener, error) { return ListenWithOptions(laddr, nil, 0, 0) }
|
||||||
|
|
||||||
// ListenWithOptions listens for incoming KCP packets addressed to the local address laddr on the network "udp" with packet encryption,
|
// ListenWithOptions listens for incoming KCP packets addressed to the local address laddr on the network "udp" with packet encryption.
|
||||||
// dataShards, parityShards defines Reed-Solomon Erasure Coding parameters
|
//
|
||||||
|
// 'block' is the block encryption algorithm to encrypt packets.
|
||||||
|
//
|
||||||
|
// 'dataShards', 'parityShards' specifiy how many parity packets will be generated following the data packets.
|
||||||
|
//
|
||||||
|
// Check https://github.com/klauspost/reedsolomon for details
|
||||||
func ListenWithOptions(laddr string, block BlockCrypt, dataShards, parityShards int) (*Listener, error) {
|
func ListenWithOptions(laddr string, block BlockCrypt, dataShards, parityShards int) (*Listener, error) {
|
||||||
udpaddr, err := net.ResolveUDPAddr("udp", laddr)
|
udpaddr, err := net.ResolveUDPAddr("udp", laddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "net.ResolveUDPAddr")
|
return nil, errors.WithStack(err)
|
||||||
}
|
}
|
||||||
conn, err := net.ListenUDP("udp", udpaddr)
|
conn, err := net.ListenUDP("udp", udpaddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "net.ListenUDP")
|
return nil, errors.WithStack(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return ServeConn(block, dataShards, parityShards, conn)
|
return ServeConn(block, dataShards, parityShards, conn)
|
||||||
@ -908,6 +934,7 @@ func ServeConn(block BlockCrypt, dataShards, parityShards int, conn net.PacketCo
|
|||||||
l.parityShards = parityShards
|
l.parityShards = parityShards
|
||||||
l.block = block
|
l.block = block
|
||||||
l.fecDecoder = newFECDecoder(rxFECMulti*(dataShards+parityShards), dataShards, parityShards)
|
l.fecDecoder = newFECDecoder(rxFECMulti*(dataShards+parityShards), dataShards, parityShards)
|
||||||
|
l.chSocketReadError = make(chan struct{})
|
||||||
|
|
||||||
// calculate header size
|
// calculate header size
|
||||||
if l.block != nil {
|
if l.block != nil {
|
||||||
@ -921,15 +948,21 @@ func ServeConn(block BlockCrypt, dataShards, parityShards int, conn net.PacketCo
|
|||||||
return l, nil
|
return l, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dial connects to the remote address "raddr" on the network "udp"
|
// Dial connects to the remote address "raddr" on the network "udp" without encryption and FEC
|
||||||
func Dial(raddr string) (net.Conn, error) { return DialWithOptions(raddr, nil, 0, 0) }
|
func Dial(raddr string) (net.Conn, error) { return DialWithOptions(raddr, nil, 0, 0) }
|
||||||
|
|
||||||
// DialWithOptions connects to the remote address "raddr" on the network "udp" with packet encryption
|
// DialWithOptions connects to the remote address "raddr" on the network "udp" with packet encryption
|
||||||
|
//
|
||||||
|
// 'block' is the block encryption algorithm to encrypt packets.
|
||||||
|
//
|
||||||
|
// 'dataShards', 'parityShards' specifiy how many parity packets will be generated following the data packets.
|
||||||
|
//
|
||||||
|
// Check https://github.com/klauspost/reedsolomon for details
|
||||||
func DialWithOptions(raddr string, block BlockCrypt, dataShards, parityShards int) (*UDPSession, error) {
|
func DialWithOptions(raddr string, block BlockCrypt, dataShards, parityShards int) (*UDPSession, error) {
|
||||||
// network type detection
|
// network type detection
|
||||||
udpaddr, err := net.ResolveUDPAddr("udp", raddr)
|
udpaddr, err := net.ResolveUDPAddr("udp", raddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "net.ResolveUDPAddr")
|
return nil, errors.WithStack(err)
|
||||||
}
|
}
|
||||||
network := "udp4"
|
network := "udp4"
|
||||||
if udpaddr.IP.To4() == nil {
|
if udpaddr.IP.To4() == nil {
|
||||||
@ -938,30 +971,33 @@ func DialWithOptions(raddr string, block BlockCrypt, dataShards, parityShards in
|
|||||||
|
|
||||||
conn, err := net.ListenUDP(network, nil)
|
conn, err := net.ListenUDP(network, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "net.DialUDP")
|
return nil, errors.WithStack(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return NewConn(raddr, block, dataShards, parityShards, conn)
|
return NewConn(raddr, block, dataShards, parityShards, conn)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewConn3 establishes a session and talks KCP protocol over a packet connection.
|
||||||
|
func NewConn3(convid uint32, raddr net.Addr, block BlockCrypt, dataShards, parityShards int, conn net.PacketConn) (*UDPSession, error) {
|
||||||
|
return newUDPSession(convid, dataShards, parityShards, nil, conn, raddr, block), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewConn2 establishes a session and talks KCP protocol over a packet connection.
|
||||||
|
func NewConn2(raddr net.Addr, block BlockCrypt, dataShards, parityShards int, conn net.PacketConn) (*UDPSession, error) {
|
||||||
|
var convid uint32
|
||||||
|
binary.Read(rand.Reader, binary.LittleEndian, &convid)
|
||||||
|
return NewConn3(convid, raddr, block, dataShards, parityShards, conn)
|
||||||
|
}
|
||||||
|
|
||||||
// NewConn establishes a session and talks KCP protocol over a packet connection.
|
// NewConn establishes a session and talks KCP protocol over a packet connection.
|
||||||
func NewConn(raddr string, block BlockCrypt, dataShards, parityShards int, conn net.PacketConn) (*UDPSession, error) {
|
func NewConn(raddr string, block BlockCrypt, dataShards, parityShards int, conn net.PacketConn) (*UDPSession, error) {
|
||||||
udpaddr, err := net.ResolveUDPAddr("udp", raddr)
|
udpaddr, err := net.ResolveUDPAddr("udp", raddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "net.ResolveUDPAddr")
|
return nil, errors.WithStack(err)
|
||||||
}
|
}
|
||||||
|
return NewConn2(udpaddr, block, dataShards, parityShards, conn)
|
||||||
var convid uint32
|
|
||||||
binary.Read(rand.Reader, binary.LittleEndian, &convid)
|
|
||||||
return newUDPSession(convid, dataShards, parityShards, nil, conn, udpaddr, block), nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// monotonic reference time point
|
|
||||||
var refTime time.Time = time.Now()
|
|
||||||
|
|
||||||
// currentMs returns current elasped monotonic milliseconds since program startup
|
|
||||||
func currentMs() uint32 { return uint32(time.Now().Sub(refTime) / time.Millisecond) }
|
|
||||||
|
|
||||||
func NewConnEx(convid uint32, connected bool, raddr string, block BlockCrypt, dataShards, parityShards int, conn *net.UDPConn) (*UDPSession, error) {
|
func NewConnEx(convid uint32, connected bool, raddr string, block BlockCrypt, dataShards, parityShards int, conn *net.UDPConn) (*UDPSession, error) {
|
||||||
udpaddr, err := net.ResolveUDPAddr("udp", raddr)
|
udpaddr, err := net.ResolveUDPAddr("udp", raddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
25
vendor/github.com/fatedier/kcp-go/tx.go
generated
vendored
Normal file
25
vendor/github.com/fatedier/kcp-go/tx.go
generated
vendored
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
package kcp
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync/atomic"
|
||||||
|
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
"golang.org/x/net/ipv4"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (s *UDPSession) defaultTx(txqueue []ipv4.Message) {
|
||||||
|
nbytes := 0
|
||||||
|
npkts := 0
|
||||||
|
for k := range txqueue {
|
||||||
|
if n, err := s.conn.WriteTo(txqueue[k].Buffers[0], txqueue[k].Addr); err == nil {
|
||||||
|
nbytes += n
|
||||||
|
npkts++
|
||||||
|
xmitBuf.Put(txqueue[k].Buffers[0])
|
||||||
|
} else {
|
||||||
|
s.notifyWriteError(errors.WithStack(err))
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
atomic.AddUint64(&DefaultSnmp.OutPkts, uint64(npkts))
|
||||||
|
atomic.AddUint64(&DefaultSnmp.OutBytes, uint64(nbytes))
|
||||||
|
}
|
11
vendor/github.com/fatedier/kcp-go/tx_generic.go
generated
vendored
Normal file
11
vendor/github.com/fatedier/kcp-go/tx_generic.go
generated
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
// +build !linux
|
||||||
|
|
||||||
|
package kcp
|
||||||
|
|
||||||
|
import (
|
||||||
|
"golang.org/x/net/ipv4"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (s *UDPSession) tx(txqueue []ipv4.Message) {
|
||||||
|
s.defaultTx(txqueue)
|
||||||
|
}
|
52
vendor/github.com/fatedier/kcp-go/tx_linux.go
generated
vendored
Normal file
52
vendor/github.com/fatedier/kcp-go/tx_linux.go
generated
vendored
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
// +build linux
|
||||||
|
|
||||||
|
package kcp
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
"os"
|
||||||
|
"sync/atomic"
|
||||||
|
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
"golang.org/x/net/ipv4"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (s *UDPSession) tx(txqueue []ipv4.Message) {
|
||||||
|
// default version
|
||||||
|
if s.xconn == nil || s.xconnWriteError != nil {
|
||||||
|
s.defaultTx(txqueue)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// x/net version
|
||||||
|
nbytes := 0
|
||||||
|
npkts := 0
|
||||||
|
for len(txqueue) > 0 {
|
||||||
|
if n, err := s.xconn.WriteBatch(txqueue, 0); err == nil {
|
||||||
|
for k := range txqueue[:n] {
|
||||||
|
nbytes += len(txqueue[k].Buffers[0])
|
||||||
|
xmitBuf.Put(txqueue[k].Buffers[0])
|
||||||
|
}
|
||||||
|
npkts += n
|
||||||
|
txqueue = txqueue[n:]
|
||||||
|
} else {
|
||||||
|
// compatibility issue:
|
||||||
|
// for linux kernel<=2.6.32, support for sendmmsg is not available
|
||||||
|
// an error of type os.SyscallError will be returned
|
||||||
|
if operr, ok := err.(*net.OpError); ok {
|
||||||
|
if se, ok := operr.Err.(*os.SyscallError); ok {
|
||||||
|
if se.Syscall == "sendmmsg" {
|
||||||
|
s.xconnWriteError = se
|
||||||
|
s.defaultTx(txqueue)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
s.notifyWriteError(errors.WithStack(err))
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
atomic.AddUint64(&DefaultSnmp.OutPkts, uint64(npkts))
|
||||||
|
atomic.AddUint64(&DefaultSnmp.OutBytes, uint64(nbytes))
|
||||||
|
}
|
8
vendor/github.com/fatedier/kcp-go/updater.go
generated
vendored
8
vendor/github.com/fatedier/kcp-go/updater.go
generated
vendored
@ -76,10 +76,10 @@ func (h *updateHeap) wakeup() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (h *updateHeap) updateTask() {
|
func (h *updateHeap) updateTask() {
|
||||||
var timer <-chan time.Time
|
timer := time.NewTimer(0)
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-timer:
|
case <-timer.C:
|
||||||
case <-h.chWakeUp:
|
case <-h.chWakeUp:
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -87,7 +87,7 @@ func (h *updateHeap) updateTask() {
|
|||||||
hlen := h.Len()
|
hlen := h.Len()
|
||||||
for i := 0; i < hlen; i++ {
|
for i := 0; i < hlen; i++ {
|
||||||
entry := &h.entries[0]
|
entry := &h.entries[0]
|
||||||
if time.Now().After(entry.ts) {
|
if !time.Now().Before(entry.ts) {
|
||||||
interval := entry.s.update()
|
interval := entry.s.update()
|
||||||
entry.ts = time.Now().Add(interval)
|
entry.ts = time.Now().Add(interval)
|
||||||
heap.Fix(h, 0)
|
heap.Fix(h, 0)
|
||||||
@ -97,7 +97,7 @@ func (h *updateHeap) updateTask() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if hlen > 0 {
|
if hlen > 0 {
|
||||||
timer = time.After(h.entries[0].ts.Sub(time.Now()))
|
timer.Reset(h.entries[0].ts.Sub(time.Now()))
|
||||||
}
|
}
|
||||||
h.mu.Unlock()
|
h.mu.Unlock()
|
||||||
}
|
}
|
||||||
|
476
vendor/github.com/klauspost/cpuid/private-gen.go
generated
vendored
476
vendor/github.com/klauspost/cpuid/private-gen.go
generated
vendored
@ -1,476 +0,0 @@
|
|||||||
// +build ignore
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"fmt"
|
|
||||||
"go/ast"
|
|
||||||
"go/parser"
|
|
||||||
"go/printer"
|
|
||||||
"go/token"
|
|
||||||
"io"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
"reflect"
|
|
||||||
"strings"
|
|
||||||
"unicode"
|
|
||||||
"unicode/utf8"
|
|
||||||
)
|
|
||||||
|
|
||||||
var inFiles = []string{"cpuid.go", "cpuid_test.go"}
|
|
||||||
var copyFiles = []string{"cpuid_amd64.s", "cpuid_386.s", "detect_ref.go", "detect_intel.go"}
|
|
||||||
var fileSet = token.NewFileSet()
|
|
||||||
var reWrites = []rewrite{
|
|
||||||
initRewrite("CPUInfo -> cpuInfo"),
|
|
||||||
initRewrite("Vendor -> vendor"),
|
|
||||||
initRewrite("Flags -> flags"),
|
|
||||||
initRewrite("Detect -> detect"),
|
|
||||||
initRewrite("CPU -> cpu"),
|
|
||||||
}
|
|
||||||
var excludeNames = map[string]bool{"string": true, "join": true, "trim": true,
|
|
||||||
// cpuid_test.go
|
|
||||||
"t": true, "println": true, "logf": true, "log": true, "fatalf": true, "fatal": true,
|
|
||||||
}
|
|
||||||
|
|
||||||
var excludePrefixes = []string{"test", "benchmark"}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
Package := "private"
|
|
||||||
parserMode := parser.ParseComments
|
|
||||||
exported := make(map[string]rewrite)
|
|
||||||
for _, file := range inFiles {
|
|
||||||
in, err := os.Open(file)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("opening input", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
src, err := ioutil.ReadAll(in)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("reading input", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
astfile, err := parser.ParseFile(fileSet, file, src, parserMode)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("parsing input", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, rw := range reWrites {
|
|
||||||
astfile = rw(astfile)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Inspect the AST and print all identifiers and literals.
|
|
||||||
var startDecl token.Pos
|
|
||||||
var endDecl token.Pos
|
|
||||||
ast.Inspect(astfile, func(n ast.Node) bool {
|
|
||||||
var s string
|
|
||||||
switch x := n.(type) {
|
|
||||||
case *ast.Ident:
|
|
||||||
if x.IsExported() {
|
|
||||||
t := strings.ToLower(x.Name)
|
|
||||||
for _, pre := range excludePrefixes {
|
|
||||||
if strings.HasPrefix(t, pre) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if excludeNames[t] != true {
|
|
||||||
//if x.Pos() > startDecl && x.Pos() < endDecl {
|
|
||||||
exported[x.Name] = initRewrite(x.Name + " -> " + t)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
case *ast.GenDecl:
|
|
||||||
if x.Tok == token.CONST && x.Lparen > 0 {
|
|
||||||
startDecl = x.Lparen
|
|
||||||
endDecl = x.Rparen
|
|
||||||
// fmt.Printf("Decl:%s -> %s\n", fileSet.Position(startDecl), fileSet.Position(endDecl))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if s != "" {
|
|
||||||
fmt.Printf("%s:\t%s\n", fileSet.Position(n.Pos()), s)
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
})
|
|
||||||
|
|
||||||
for _, rw := range exported {
|
|
||||||
astfile = rw(astfile)
|
|
||||||
}
|
|
||||||
|
|
||||||
var buf bytes.Buffer
|
|
||||||
|
|
||||||
printer.Fprint(&buf, fileSet, astfile)
|
|
||||||
|
|
||||||
// Remove package documentation and insert information
|
|
||||||
s := buf.String()
|
|
||||||
ind := strings.Index(buf.String(), "\npackage cpuid")
|
|
||||||
s = s[ind:]
|
|
||||||
s = "// Generated, DO NOT EDIT,\n" +
|
|
||||||
"// but copy it to your own project and rename the package.\n" +
|
|
||||||
"// See more at http://github.com/klauspost/cpuid\n" +
|
|
||||||
s
|
|
||||||
|
|
||||||
outputName := Package + string(os.PathSeparator) + file
|
|
||||||
|
|
||||||
err = ioutil.WriteFile(outputName, []byte(s), 0644)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("writing output: %s", err)
|
|
||||||
}
|
|
||||||
log.Println("Generated", outputName)
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, file := range copyFiles {
|
|
||||||
dst := ""
|
|
||||||
if strings.HasPrefix(file, "cpuid") {
|
|
||||||
dst = Package + string(os.PathSeparator) + file
|
|
||||||
} else {
|
|
||||||
dst = Package + string(os.PathSeparator) + "cpuid_" + file
|
|
||||||
}
|
|
||||||
err := copyFile(file, dst)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("copying file: %s", err)
|
|
||||||
}
|
|
||||||
log.Println("Copied", dst)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// CopyFile copies a file from src to dst. If src and dst files exist, and are
|
|
||||||
// the same, then return success. Copy the file contents from src to dst.
|
|
||||||
func copyFile(src, dst string) (err error) {
|
|
||||||
sfi, err := os.Stat(src)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if !sfi.Mode().IsRegular() {
|
|
||||||
// cannot copy non-regular files (e.g., directories,
|
|
||||||
// symlinks, devices, etc.)
|
|
||||||
return fmt.Errorf("CopyFile: non-regular source file %s (%q)", sfi.Name(), sfi.Mode().String())
|
|
||||||
}
|
|
||||||
dfi, err := os.Stat(dst)
|
|
||||||
if err != nil {
|
|
||||||
if !os.IsNotExist(err) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if !(dfi.Mode().IsRegular()) {
|
|
||||||
return fmt.Errorf("CopyFile: non-regular destination file %s (%q)", dfi.Name(), dfi.Mode().String())
|
|
||||||
}
|
|
||||||
if os.SameFile(sfi, dfi) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
err = copyFileContents(src, dst)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// copyFileContents copies the contents of the file named src to the file named
|
|
||||||
// by dst. The file will be created if it does not already exist. If the
|
|
||||||
// destination file exists, all it's contents will be replaced by the contents
|
|
||||||
// of the source file.
|
|
||||||
func copyFileContents(src, dst string) (err error) {
|
|
||||||
in, err := os.Open(src)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer in.Close()
|
|
||||||
out, err := os.Create(dst)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer func() {
|
|
||||||
cerr := out.Close()
|
|
||||||
if err == nil {
|
|
||||||
err = cerr
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
if _, err = io.Copy(out, in); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err = out.Sync()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
type rewrite func(*ast.File) *ast.File
|
|
||||||
|
|
||||||
// Mostly copied from gofmt
|
|
||||||
func initRewrite(rewriteRule string) rewrite {
|
|
||||||
f := strings.Split(rewriteRule, "->")
|
|
||||||
if len(f) != 2 {
|
|
||||||
fmt.Fprintf(os.Stderr, "rewrite rule must be of the form 'pattern -> replacement'\n")
|
|
||||||
os.Exit(2)
|
|
||||||
}
|
|
||||||
pattern := parseExpr(f[0], "pattern")
|
|
||||||
replace := parseExpr(f[1], "replacement")
|
|
||||||
return func(p *ast.File) *ast.File { return rewriteFile(pattern, replace, p) }
|
|
||||||
}
|
|
||||||
|
|
||||||
// parseExpr parses s as an expression.
|
|
||||||
// It might make sense to expand this to allow statement patterns,
|
|
||||||
// but there are problems with preserving formatting and also
|
|
||||||
// with what a wildcard for a statement looks like.
|
|
||||||
func parseExpr(s, what string) ast.Expr {
|
|
||||||
x, err := parser.ParseExpr(s)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Fprintf(os.Stderr, "parsing %s %s at %s\n", what, s, err)
|
|
||||||
os.Exit(2)
|
|
||||||
}
|
|
||||||
return x
|
|
||||||
}
|
|
||||||
|
|
||||||
// Keep this function for debugging.
|
|
||||||
/*
|
|
||||||
func dump(msg string, val reflect.Value) {
|
|
||||||
fmt.Printf("%s:\n", msg)
|
|
||||||
ast.Print(fileSet, val.Interface())
|
|
||||||
fmt.Println()
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
// rewriteFile applies the rewrite rule 'pattern -> replace' to an entire file.
|
|
||||||
func rewriteFile(pattern, replace ast.Expr, p *ast.File) *ast.File {
|
|
||||||
cmap := ast.NewCommentMap(fileSet, p, p.Comments)
|
|
||||||
m := make(map[string]reflect.Value)
|
|
||||||
pat := reflect.ValueOf(pattern)
|
|
||||||
repl := reflect.ValueOf(replace)
|
|
||||||
|
|
||||||
var rewriteVal func(val reflect.Value) reflect.Value
|
|
||||||
rewriteVal = func(val reflect.Value) reflect.Value {
|
|
||||||
// don't bother if val is invalid to start with
|
|
||||||
if !val.IsValid() {
|
|
||||||
return reflect.Value{}
|
|
||||||
}
|
|
||||||
for k := range m {
|
|
||||||
delete(m, k)
|
|
||||||
}
|
|
||||||
val = apply(rewriteVal, val)
|
|
||||||
if match(m, pat, val) {
|
|
||||||
val = subst(m, repl, reflect.ValueOf(val.Interface().(ast.Node).Pos()))
|
|
||||||
}
|
|
||||||
return val
|
|
||||||
}
|
|
||||||
|
|
||||||
r := apply(rewriteVal, reflect.ValueOf(p)).Interface().(*ast.File)
|
|
||||||
r.Comments = cmap.Filter(r).Comments() // recreate comments list
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
// set is a wrapper for x.Set(y); it protects the caller from panics if x cannot be changed to y.
|
|
||||||
func set(x, y reflect.Value) {
|
|
||||||
// don't bother if x cannot be set or y is invalid
|
|
||||||
if !x.CanSet() || !y.IsValid() {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer func() {
|
|
||||||
if x := recover(); x != nil {
|
|
||||||
if s, ok := x.(string); ok &&
|
|
||||||
(strings.Contains(s, "type mismatch") || strings.Contains(s, "not assignable")) {
|
|
||||||
// x cannot be set to y - ignore this rewrite
|
|
||||||
return
|
|
||||||
}
|
|
||||||
panic(x)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
x.Set(y)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Values/types for special cases.
|
|
||||||
var (
|
|
||||||
objectPtrNil = reflect.ValueOf((*ast.Object)(nil))
|
|
||||||
scopePtrNil = reflect.ValueOf((*ast.Scope)(nil))
|
|
||||||
|
|
||||||
identType = reflect.TypeOf((*ast.Ident)(nil))
|
|
||||||
objectPtrType = reflect.TypeOf((*ast.Object)(nil))
|
|
||||||
positionType = reflect.TypeOf(token.NoPos)
|
|
||||||
callExprType = reflect.TypeOf((*ast.CallExpr)(nil))
|
|
||||||
scopePtrType = reflect.TypeOf((*ast.Scope)(nil))
|
|
||||||
)
|
|
||||||
|
|
||||||
// apply replaces each AST field x in val with f(x), returning val.
|
|
||||||
// To avoid extra conversions, f operates on the reflect.Value form.
|
|
||||||
func apply(f func(reflect.Value) reflect.Value, val reflect.Value) reflect.Value {
|
|
||||||
if !val.IsValid() {
|
|
||||||
return reflect.Value{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// *ast.Objects introduce cycles and are likely incorrect after
|
|
||||||
// rewrite; don't follow them but replace with nil instead
|
|
||||||
if val.Type() == objectPtrType {
|
|
||||||
return objectPtrNil
|
|
||||||
}
|
|
||||||
|
|
||||||
// similarly for scopes: they are likely incorrect after a rewrite;
|
|
||||||
// replace them with nil
|
|
||||||
if val.Type() == scopePtrType {
|
|
||||||
return scopePtrNil
|
|
||||||
}
|
|
||||||
|
|
||||||
switch v := reflect.Indirect(val); v.Kind() {
|
|
||||||
case reflect.Slice:
|
|
||||||
for i := 0; i < v.Len(); i++ {
|
|
||||||
e := v.Index(i)
|
|
||||||
set(e, f(e))
|
|
||||||
}
|
|
||||||
case reflect.Struct:
|
|
||||||
for i := 0; i < v.NumField(); i++ {
|
|
||||||
e := v.Field(i)
|
|
||||||
set(e, f(e))
|
|
||||||
}
|
|
||||||
case reflect.Interface:
|
|
||||||
e := v.Elem()
|
|
||||||
set(v, f(e))
|
|
||||||
}
|
|
||||||
return val
|
|
||||||
}
|
|
||||||
|
|
||||||
func isWildcard(s string) bool {
|
|
||||||
rune, size := utf8.DecodeRuneInString(s)
|
|
||||||
return size == len(s) && unicode.IsLower(rune)
|
|
||||||
}
|
|
||||||
|
|
||||||
// match returns true if pattern matches val,
|
|
||||||
// recording wildcard submatches in m.
|
|
||||||
// If m == nil, match checks whether pattern == val.
|
|
||||||
func match(m map[string]reflect.Value, pattern, val reflect.Value) bool {
|
|
||||||
// Wildcard matches any expression. If it appears multiple
|
|
||||||
// times in the pattern, it must match the same expression
|
|
||||||
// each time.
|
|
||||||
if m != nil && pattern.IsValid() && pattern.Type() == identType {
|
|
||||||
name := pattern.Interface().(*ast.Ident).Name
|
|
||||||
if isWildcard(name) && val.IsValid() {
|
|
||||||
// wildcards only match valid (non-nil) expressions.
|
|
||||||
if _, ok := val.Interface().(ast.Expr); ok && !val.IsNil() {
|
|
||||||
if old, ok := m[name]; ok {
|
|
||||||
return match(nil, old, val)
|
|
||||||
}
|
|
||||||
m[name] = val
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Otherwise, pattern and val must match recursively.
|
|
||||||
if !pattern.IsValid() || !val.IsValid() {
|
|
||||||
return !pattern.IsValid() && !val.IsValid()
|
|
||||||
}
|
|
||||||
if pattern.Type() != val.Type() {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Special cases.
|
|
||||||
switch pattern.Type() {
|
|
||||||
case identType:
|
|
||||||
// For identifiers, only the names need to match
|
|
||||||
// (and none of the other *ast.Object information).
|
|
||||||
// This is a common case, handle it all here instead
|
|
||||||
// of recursing down any further via reflection.
|
|
||||||
p := pattern.Interface().(*ast.Ident)
|
|
||||||
v := val.Interface().(*ast.Ident)
|
|
||||||
return p == nil && v == nil || p != nil && v != nil && p.Name == v.Name
|
|
||||||
case objectPtrType, positionType:
|
|
||||||
// object pointers and token positions always match
|
|
||||||
return true
|
|
||||||
case callExprType:
|
|
||||||
// For calls, the Ellipsis fields (token.Position) must
|
|
||||||
// match since that is how f(x) and f(x...) are different.
|
|
||||||
// Check them here but fall through for the remaining fields.
|
|
||||||
p := pattern.Interface().(*ast.CallExpr)
|
|
||||||
v := val.Interface().(*ast.CallExpr)
|
|
||||||
if p.Ellipsis.IsValid() != v.Ellipsis.IsValid() {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
p := reflect.Indirect(pattern)
|
|
||||||
v := reflect.Indirect(val)
|
|
||||||
if !p.IsValid() || !v.IsValid() {
|
|
||||||
return !p.IsValid() && !v.IsValid()
|
|
||||||
}
|
|
||||||
|
|
||||||
switch p.Kind() {
|
|
||||||
case reflect.Slice:
|
|
||||||
if p.Len() != v.Len() {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
for i := 0; i < p.Len(); i++ {
|
|
||||||
if !match(m, p.Index(i), v.Index(i)) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
|
|
||||||
case reflect.Struct:
|
|
||||||
for i := 0; i < p.NumField(); i++ {
|
|
||||||
if !match(m, p.Field(i), v.Field(i)) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
|
|
||||||
case reflect.Interface:
|
|
||||||
return match(m, p.Elem(), v.Elem())
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle token integers, etc.
|
|
||||||
return p.Interface() == v.Interface()
|
|
||||||
}
|
|
||||||
|
|
||||||
// subst returns a copy of pattern with values from m substituted in place
|
|
||||||
// of wildcards and pos used as the position of tokens from the pattern.
|
|
||||||
// if m == nil, subst returns a copy of pattern and doesn't change the line
|
|
||||||
// number information.
|
|
||||||
func subst(m map[string]reflect.Value, pattern reflect.Value, pos reflect.Value) reflect.Value {
|
|
||||||
if !pattern.IsValid() {
|
|
||||||
return reflect.Value{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wildcard gets replaced with map value.
|
|
||||||
if m != nil && pattern.Type() == identType {
|
|
||||||
name := pattern.Interface().(*ast.Ident).Name
|
|
||||||
if isWildcard(name) {
|
|
||||||
if old, ok := m[name]; ok {
|
|
||||||
return subst(nil, old, reflect.Value{})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if pos.IsValid() && pattern.Type() == positionType {
|
|
||||||
// use new position only if old position was valid in the first place
|
|
||||||
if old := pattern.Interface().(token.Pos); !old.IsValid() {
|
|
||||||
return pattern
|
|
||||||
}
|
|
||||||
return pos
|
|
||||||
}
|
|
||||||
|
|
||||||
// Otherwise copy.
|
|
||||||
switch p := pattern; p.Kind() {
|
|
||||||
case reflect.Slice:
|
|
||||||
v := reflect.MakeSlice(p.Type(), p.Len(), p.Len())
|
|
||||||
for i := 0; i < p.Len(); i++ {
|
|
||||||
v.Index(i).Set(subst(m, p.Index(i), pos))
|
|
||||||
}
|
|
||||||
return v
|
|
||||||
|
|
||||||
case reflect.Struct:
|
|
||||||
v := reflect.New(p.Type()).Elem()
|
|
||||||
for i := 0; i < p.NumField(); i++ {
|
|
||||||
v.Field(i).Set(subst(m, p.Field(i), pos))
|
|
||||||
}
|
|
||||||
return v
|
|
||||||
|
|
||||||
case reflect.Ptr:
|
|
||||||
v := reflect.New(p.Type()).Elem()
|
|
||||||
if elem := p.Elem(); elem.IsValid() {
|
|
||||||
v.Set(subst(m, elem, pos).Addr())
|
|
||||||
}
|
|
||||||
return v
|
|
||||||
|
|
||||||
case reflect.Interface:
|
|
||||||
v := reflect.New(p.Type()).Elem()
|
|
||||||
if elem := p.Elem(); elem.IsValid() {
|
|
||||||
v.Set(subst(m, elem, pos))
|
|
||||||
}
|
|
||||||
return v
|
|
||||||
}
|
|
||||||
|
|
||||||
return pattern
|
|
||||||
}
|
|
132
vendor/github.com/klauspost/reedsolomon/gentables.go
generated
vendored
132
vendor/github.com/klauspost/reedsolomon/gentables.go
generated
vendored
@ -1,132 +0,0 @@
|
|||||||
//+build ignore
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
var logTable = [fieldSize]int16{
|
|
||||||
-1, 0, 1, 25, 2, 50, 26, 198,
|
|
||||||
3, 223, 51, 238, 27, 104, 199, 75,
|
|
||||||
4, 100, 224, 14, 52, 141, 239, 129,
|
|
||||||
28, 193, 105, 248, 200, 8, 76, 113,
|
|
||||||
5, 138, 101, 47, 225, 36, 15, 33,
|
|
||||||
53, 147, 142, 218, 240, 18, 130, 69,
|
|
||||||
29, 181, 194, 125, 106, 39, 249, 185,
|
|
||||||
201, 154, 9, 120, 77, 228, 114, 166,
|
|
||||||
6, 191, 139, 98, 102, 221, 48, 253,
|
|
||||||
226, 152, 37, 179, 16, 145, 34, 136,
|
|
||||||
54, 208, 148, 206, 143, 150, 219, 189,
|
|
||||||
241, 210, 19, 92, 131, 56, 70, 64,
|
|
||||||
30, 66, 182, 163, 195, 72, 126, 110,
|
|
||||||
107, 58, 40, 84, 250, 133, 186, 61,
|
|
||||||
202, 94, 155, 159, 10, 21, 121, 43,
|
|
||||||
78, 212, 229, 172, 115, 243, 167, 87,
|
|
||||||
7, 112, 192, 247, 140, 128, 99, 13,
|
|
||||||
103, 74, 222, 237, 49, 197, 254, 24,
|
|
||||||
227, 165, 153, 119, 38, 184, 180, 124,
|
|
||||||
17, 68, 146, 217, 35, 32, 137, 46,
|
|
||||||
55, 63, 209, 91, 149, 188, 207, 205,
|
|
||||||
144, 135, 151, 178, 220, 252, 190, 97,
|
|
||||||
242, 86, 211, 171, 20, 42, 93, 158,
|
|
||||||
132, 60, 57, 83, 71, 109, 65, 162,
|
|
||||||
31, 45, 67, 216, 183, 123, 164, 118,
|
|
||||||
196, 23, 73, 236, 127, 12, 111, 246,
|
|
||||||
108, 161, 59, 82, 41, 157, 85, 170,
|
|
||||||
251, 96, 134, 177, 187, 204, 62, 90,
|
|
||||||
203, 89, 95, 176, 156, 169, 160, 81,
|
|
||||||
11, 245, 22, 235, 122, 117, 44, 215,
|
|
||||||
79, 174, 213, 233, 230, 231, 173, 232,
|
|
||||||
116, 214, 244, 234, 168, 80, 88, 175,
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
|
||||||
// The number of elements in the field.
|
|
||||||
fieldSize = 256
|
|
||||||
|
|
||||||
// The polynomial used to generate the logarithm table.
|
|
||||||
//
|
|
||||||
// There are a number of polynomials that work to generate
|
|
||||||
// a Galois field of 256 elements. The choice is arbitrary,
|
|
||||||
// and we just use the first one.
|
|
||||||
//
|
|
||||||
// The possibilities are: 29, 43, 45, 77, 95, 99, 101, 105,
|
|
||||||
//* 113, 135, 141, 169, 195, 207, 231, and 245.
|
|
||||||
generatingPolynomial = 29
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
t := generateExpTable()
|
|
||||||
fmt.Printf("var expTable = %#v\n", t)
|
|
||||||
//t2 := generateMulTableSplit(t)
|
|
||||||
//fmt.Printf("var mulTable = %#v\n", t2)
|
|
||||||
low, high := generateMulTableHalf(t)
|
|
||||||
fmt.Printf("var mulTableLow = %#v\n", low)
|
|
||||||
fmt.Printf("var mulTableHigh = %#v\n", high)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates the inverse log table.
|
|
||||||
*/
|
|
||||||
func generateExpTable() []byte {
|
|
||||||
result := make([]byte, fieldSize*2-2)
|
|
||||||
for i := 1; i < fieldSize; i++ {
|
|
||||||
log := logTable[i]
|
|
||||||
result[log] = byte(i)
|
|
||||||
result[log+fieldSize-1] = byte(i)
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
func generateMulTable(expTable []byte) []byte {
|
|
||||||
result := make([]byte, 256*256)
|
|
||||||
for v := range result {
|
|
||||||
a := byte(v & 0xff)
|
|
||||||
b := byte(v >> 8)
|
|
||||||
if a == 0 || b == 0 {
|
|
||||||
result[v] = 0
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
logA := int(logTable[a])
|
|
||||||
logB := int(logTable[b])
|
|
||||||
result[v] = expTable[logA+logB]
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
func generateMulTableSplit(expTable []byte) [256][256]byte {
|
|
||||||
var result [256][256]byte
|
|
||||||
for a := range result {
|
|
||||||
for b := range result[a] {
|
|
||||||
if a == 0 || b == 0 {
|
|
||||||
result[a][b] = 0
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
logA := int(logTable[a])
|
|
||||||
logB := int(logTable[b])
|
|
||||||
result[a][b] = expTable[logA+logB]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
func generateMulTableHalf(expTable []byte) (low [256][16]byte, high [256][16]byte) {
|
|
||||||
for a := range low {
|
|
||||||
for b := range low {
|
|
||||||
result := 0
|
|
||||||
if !(a == 0 || b == 0) {
|
|
||||||
logA := int(logTable[a])
|
|
||||||
logB := int(logTable[b])
|
|
||||||
result = int(expTable[logA+logB])
|
|
||||||
}
|
|
||||||
if (b & 0xf) == b {
|
|
||||||
low[a][b] = byte(result)
|
|
||||||
}
|
|
||||||
if (b & 0xf0) == b {
|
|
||||||
high[a][b>>4] = byte(result)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
35
vendor/github.com/stretchr/testify/LICENSE
generated
vendored
35
vendor/github.com/stretchr/testify/LICENSE
generated
vendored
@ -1,22 +1,21 @@
|
|||||||
Copyright (c) 2012 - 2013 Mat Ryer and Tyler Bunnell
|
MIT License
|
||||||
|
|
||||||
Please consider promoting this project if you find it useful.
|
Copyright (c) 2012-2018 Mat Ryer and Tyler Bunnell
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
obtaining a copy of this software and associated documentation
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
files (the "Software"), to deal in the Software without restriction,
|
in the Software without restriction, including without limitation the rights
|
||||||
including without limitation the rights to use, copy, modify, merge,
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
publish, distribute, sublicense, and/or sell copies of the Software,
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
and to permit persons to whom the Software is furnished to do so,
|
furnished to do so, subject to the following conditions:
|
||||||
subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included
|
The above copyright notice and this permission notice shall be included in all
|
||||||
in all copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
SOFTWARE.
|
||||||
|
139
vendor/github.com/stretchr/testify/assert/assertion_format.go
generated
vendored
139
vendor/github.com/stretchr/testify/assert/assertion_format.go
generated
vendored
@ -13,6 +13,9 @@ import (
|
|||||||
|
|
||||||
// Conditionf uses a Comparison to assert a complex condition.
|
// Conditionf uses a Comparison to assert a complex condition.
|
||||||
func Conditionf(t TestingT, comp Comparison, msg string, args ...interface{}) bool {
|
func Conditionf(t TestingT, comp Comparison, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Condition(t, comp, append([]interface{}{msg}, args...)...)
|
return Condition(t, comp, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -23,11 +26,17 @@ func Conditionf(t TestingT, comp Comparison, msg string, args ...interface{}) bo
|
|||||||
// assert.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted")
|
// assert.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted")
|
||||||
// assert.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted")
|
// assert.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted")
|
||||||
func Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool {
|
func Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Contains(t, s, contains, append([]interface{}{msg}, args...)...)
|
return Contains(t, s, contains, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DirExistsf checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists.
|
// DirExistsf checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists.
|
||||||
func DirExistsf(t TestingT, path string, msg string, args ...interface{}) bool {
|
func DirExistsf(t TestingT, path string, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return DirExists(t, path, append([]interface{}{msg}, args...)...)
|
return DirExists(t, path, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -37,6 +46,9 @@ func DirExistsf(t TestingT, path string, msg string, args ...interface{}) bool {
|
|||||||
//
|
//
|
||||||
// assert.ElementsMatchf(t, [1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted")
|
// assert.ElementsMatchf(t, [1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted")
|
||||||
func ElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string, args ...interface{}) bool {
|
func ElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return ElementsMatch(t, listA, listB, append([]interface{}{msg}, args...)...)
|
return ElementsMatch(t, listA, listB, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -45,6 +57,9 @@ func ElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string
|
|||||||
//
|
//
|
||||||
// assert.Emptyf(t, obj, "error message %s", "formatted")
|
// assert.Emptyf(t, obj, "error message %s", "formatted")
|
||||||
func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool {
|
func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Empty(t, object, append([]interface{}{msg}, args...)...)
|
return Empty(t, object, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,6 +71,9 @@ func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) boo
|
|||||||
// referenced values (as opposed to the memory addresses). Function equality
|
// referenced values (as opposed to the memory addresses). Function equality
|
||||||
// cannot be determined and will always fail.
|
// cannot be determined and will always fail.
|
||||||
func Equalf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
func Equalf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Equal(t, expected, actual, append([]interface{}{msg}, args...)...)
|
return Equal(t, expected, actual, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -65,6 +83,9 @@ func Equalf(t TestingT, expected interface{}, actual interface{}, msg string, ar
|
|||||||
// actualObj, err := SomeFunction()
|
// actualObj, err := SomeFunction()
|
||||||
// assert.EqualErrorf(t, err, expectedErrorString, "error message %s", "formatted")
|
// assert.EqualErrorf(t, err, expectedErrorString, "error message %s", "formatted")
|
||||||
func EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) bool {
|
func EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return EqualError(t, theError, errString, append([]interface{}{msg}, args...)...)
|
return EqualError(t, theError, errString, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,6 +94,9 @@ func EqualErrorf(t TestingT, theError error, errString string, msg string, args
|
|||||||
//
|
//
|
||||||
// assert.EqualValuesf(t, uint32(123, "error message %s", "formatted"), int32(123))
|
// assert.EqualValuesf(t, uint32(123, "error message %s", "formatted"), int32(123))
|
||||||
func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return EqualValues(t, expected, actual, append([]interface{}{msg}, args...)...)
|
return EqualValues(t, expected, actual, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -83,6 +107,9 @@ func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg stri
|
|||||||
// assert.Equal(t, expectedErrorf, err)
|
// assert.Equal(t, expectedErrorf, err)
|
||||||
// }
|
// }
|
||||||
func Errorf(t TestingT, err error, msg string, args ...interface{}) bool {
|
func Errorf(t TestingT, err error, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Error(t, err, append([]interface{}{msg}, args...)...)
|
return Error(t, err, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -90,16 +117,25 @@ func Errorf(t TestingT, err error, msg string, args ...interface{}) bool {
|
|||||||
//
|
//
|
||||||
// assert.Exactlyf(t, int32(123, "error message %s", "formatted"), int64(123))
|
// assert.Exactlyf(t, int32(123, "error message %s", "formatted"), int64(123))
|
||||||
func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Exactly(t, expected, actual, append([]interface{}{msg}, args...)...)
|
return Exactly(t, expected, actual, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Failf reports a failure through
|
// Failf reports a failure through
|
||||||
func Failf(t TestingT, failureMessage string, msg string, args ...interface{}) bool {
|
func Failf(t TestingT, failureMessage string, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Fail(t, failureMessage, append([]interface{}{msg}, args...)...)
|
return Fail(t, failureMessage, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FailNowf fails test
|
// FailNowf fails test
|
||||||
func FailNowf(t TestingT, failureMessage string, msg string, args ...interface{}) bool {
|
func FailNowf(t TestingT, failureMessage string, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return FailNow(t, failureMessage, append([]interface{}{msg}, args...)...)
|
return FailNow(t, failureMessage, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -107,31 +143,43 @@ func FailNowf(t TestingT, failureMessage string, msg string, args ...interface{}
|
|||||||
//
|
//
|
||||||
// assert.Falsef(t, myBool, "error message %s", "formatted")
|
// assert.Falsef(t, myBool, "error message %s", "formatted")
|
||||||
func Falsef(t TestingT, value bool, msg string, args ...interface{}) bool {
|
func Falsef(t TestingT, value bool, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return False(t, value, append([]interface{}{msg}, args...)...)
|
return False(t, value, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FileExistsf checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file.
|
// FileExistsf checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file.
|
||||||
func FileExistsf(t TestingT, path string, msg string, args ...interface{}) bool {
|
func FileExistsf(t TestingT, path string, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return FileExists(t, path, append([]interface{}{msg}, args...)...)
|
return FileExists(t, path, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// HTTPBodyContainsf asserts that a specified handler returns a
|
// HTTPBodyContainsf asserts that a specified handler returns a
|
||||||
// body that contains a string.
|
// body that contains a string.
|
||||||
//
|
//
|
||||||
// assert.HTTPBodyContainsf(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted")
|
// assert.HTTPBodyContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted")
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool {
|
func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return HTTPBodyContains(t, handler, method, url, values, str, append([]interface{}{msg}, args...)...)
|
return HTTPBodyContains(t, handler, method, url, values, str, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// HTTPBodyNotContainsf asserts that a specified handler returns a
|
// HTTPBodyNotContainsf asserts that a specified handler returns a
|
||||||
// body that does not contain a string.
|
// body that does not contain a string.
|
||||||
//
|
//
|
||||||
// assert.HTTPBodyNotContainsf(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted")
|
// assert.HTTPBodyNotContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted")
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool {
|
func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return HTTPBodyNotContains(t, handler, method, url, values, str, append([]interface{}{msg}, args...)...)
|
return HTTPBodyNotContains(t, handler, method, url, values, str, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -141,6 +189,9 @@ func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, u
|
|||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false).
|
// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false).
|
||||||
func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool {
|
func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return HTTPError(t, handler, method, url, values, append([]interface{}{msg}, args...)...)
|
return HTTPError(t, handler, method, url, values, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -150,6 +201,9 @@ func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string,
|
|||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false).
|
// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false).
|
||||||
func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool {
|
func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return HTTPRedirect(t, handler, method, url, values, append([]interface{}{msg}, args...)...)
|
return HTTPRedirect(t, handler, method, url, values, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -159,6 +213,9 @@ func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url stri
|
|||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool {
|
func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return HTTPSuccess(t, handler, method, url, values, append([]interface{}{msg}, args...)...)
|
return HTTPSuccess(t, handler, method, url, values, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -166,6 +223,9 @@ func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url strin
|
|||||||
//
|
//
|
||||||
// assert.Implementsf(t, (*MyInterface, "error message %s", "formatted")(nil), new(MyObject))
|
// assert.Implementsf(t, (*MyInterface, "error message %s", "formatted")(nil), new(MyObject))
|
||||||
func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool {
|
func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Implements(t, interfaceObject, object, append([]interface{}{msg}, args...)...)
|
return Implements(t, interfaceObject, object, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -173,31 +233,49 @@ func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, ms
|
|||||||
//
|
//
|
||||||
// assert.InDeltaf(t, math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01)
|
// assert.InDeltaf(t, math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01)
|
||||||
func InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool {
|
func InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return InDelta(t, expected, actual, delta, append([]interface{}{msg}, args...)...)
|
return InDelta(t, expected, actual, delta, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// InDeltaMapValuesf is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys.
|
// InDeltaMapValuesf is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys.
|
||||||
func InDeltaMapValuesf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool {
|
func InDeltaMapValuesf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return InDeltaMapValues(t, expected, actual, delta, append([]interface{}{msg}, args...)...)
|
return InDeltaMapValues(t, expected, actual, delta, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// InDeltaSlicef is the same as InDelta, except it compares two slices.
|
// InDeltaSlicef is the same as InDelta, except it compares two slices.
|
||||||
func InDeltaSlicef(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool {
|
func InDeltaSlicef(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return InDeltaSlice(t, expected, actual, delta, append([]interface{}{msg}, args...)...)
|
return InDeltaSlice(t, expected, actual, delta, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// InEpsilonf asserts that expected and actual have a relative error less than epsilon
|
// InEpsilonf asserts that expected and actual have a relative error less than epsilon
|
||||||
func InEpsilonf(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool {
|
func InEpsilonf(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return InEpsilon(t, expected, actual, epsilon, append([]interface{}{msg}, args...)...)
|
return InEpsilon(t, expected, actual, epsilon, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices.
|
// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices.
|
||||||
func InEpsilonSlicef(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool {
|
func InEpsilonSlicef(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return InEpsilonSlice(t, expected, actual, epsilon, append([]interface{}{msg}, args...)...)
|
return InEpsilonSlice(t, expected, actual, epsilon, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsTypef asserts that the specified objects are of the same type.
|
// IsTypef asserts that the specified objects are of the same type.
|
||||||
func IsTypef(t TestingT, expectedType interface{}, object interface{}, msg string, args ...interface{}) bool {
|
func IsTypef(t TestingT, expectedType interface{}, object interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return IsType(t, expectedType, object, append([]interface{}{msg}, args...)...)
|
return IsType(t, expectedType, object, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,6 +283,9 @@ func IsTypef(t TestingT, expectedType interface{}, object interface{}, msg strin
|
|||||||
//
|
//
|
||||||
// assert.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted")
|
// assert.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted")
|
||||||
func JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) bool {
|
func JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return JSONEq(t, expected, actual, append([]interface{}{msg}, args...)...)
|
return JSONEq(t, expected, actual, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -213,6 +294,9 @@ func JSONEqf(t TestingT, expected string, actual string, msg string, args ...int
|
|||||||
//
|
//
|
||||||
// assert.Lenf(t, mySlice, 3, "error message %s", "formatted")
|
// assert.Lenf(t, mySlice, 3, "error message %s", "formatted")
|
||||||
func Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) bool {
|
func Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Len(t, object, length, append([]interface{}{msg}, args...)...)
|
return Len(t, object, length, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -220,6 +304,9 @@ func Lenf(t TestingT, object interface{}, length int, msg string, args ...interf
|
|||||||
//
|
//
|
||||||
// assert.Nilf(t, err, "error message %s", "formatted")
|
// assert.Nilf(t, err, "error message %s", "formatted")
|
||||||
func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) bool {
|
func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Nil(t, object, append([]interface{}{msg}, args...)...)
|
return Nil(t, object, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -230,6 +317,9 @@ func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) bool
|
|||||||
// assert.Equal(t, expectedObj, actualObj)
|
// assert.Equal(t, expectedObj, actualObj)
|
||||||
// }
|
// }
|
||||||
func NoErrorf(t TestingT, err error, msg string, args ...interface{}) bool {
|
func NoErrorf(t TestingT, err error, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NoError(t, err, append([]interface{}{msg}, args...)...)
|
return NoError(t, err, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -240,6 +330,9 @@ func NoErrorf(t TestingT, err error, msg string, args ...interface{}) bool {
|
|||||||
// assert.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted")
|
// assert.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted")
|
||||||
// assert.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted")
|
// assert.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted")
|
||||||
func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool {
|
func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NotContains(t, s, contains, append([]interface{}{msg}, args...)...)
|
return NotContains(t, s, contains, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -250,6 +343,9 @@ func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, a
|
|||||||
// assert.Equal(t, "two", obj[1])
|
// assert.Equal(t, "two", obj[1])
|
||||||
// }
|
// }
|
||||||
func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool {
|
func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NotEmpty(t, object, append([]interface{}{msg}, args...)...)
|
return NotEmpty(t, object, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -260,6 +356,9 @@ func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{})
|
|||||||
// Pointer variable equality is determined based on the equality of the
|
// Pointer variable equality is determined based on the equality of the
|
||||||
// referenced values (as opposed to the memory addresses).
|
// referenced values (as opposed to the memory addresses).
|
||||||
func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NotEqual(t, expected, actual, append([]interface{}{msg}, args...)...)
|
return NotEqual(t, expected, actual, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -267,6 +366,9 @@ func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string,
|
|||||||
//
|
//
|
||||||
// assert.NotNilf(t, err, "error message %s", "formatted")
|
// assert.NotNilf(t, err, "error message %s", "formatted")
|
||||||
func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) bool {
|
func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NotNil(t, object, append([]interface{}{msg}, args...)...)
|
return NotNil(t, object, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -274,6 +376,9 @@ func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) bo
|
|||||||
//
|
//
|
||||||
// assert.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted")
|
// assert.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted")
|
||||||
func NotPanicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool {
|
func NotPanicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NotPanics(t, f, append([]interface{}{msg}, args...)...)
|
return NotPanics(t, f, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -282,6 +387,9 @@ func NotPanicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bo
|
|||||||
// assert.NotRegexpf(t, regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting")
|
// assert.NotRegexpf(t, regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting")
|
||||||
// assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted")
|
// assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted")
|
||||||
func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool {
|
func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NotRegexp(t, rx, str, append([]interface{}{msg}, args...)...)
|
return NotRegexp(t, rx, str, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -290,11 +398,17 @@ func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ..
|
|||||||
//
|
//
|
||||||
// assert.NotSubsetf(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted")
|
// assert.NotSubsetf(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted")
|
||||||
func NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool {
|
func NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NotSubset(t, list, subset, append([]interface{}{msg}, args...)...)
|
return NotSubset(t, list, subset, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NotZerof asserts that i is not the zero value for its type.
|
// NotZerof asserts that i is not the zero value for its type.
|
||||||
func NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) bool {
|
func NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NotZero(t, i, append([]interface{}{msg}, args...)...)
|
return NotZero(t, i, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -302,6 +416,9 @@ func NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) bool {
|
|||||||
//
|
//
|
||||||
// assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted")
|
// assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted")
|
||||||
func Panicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool {
|
func Panicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Panics(t, f, append([]interface{}{msg}, args...)...)
|
return Panics(t, f, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -310,6 +427,9 @@ func Panicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool
|
|||||||
//
|
//
|
||||||
// assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted")
|
// assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted")
|
||||||
func PanicsWithValuef(t TestingT, expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool {
|
func PanicsWithValuef(t TestingT, expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return PanicsWithValue(t, expected, f, append([]interface{}{msg}, args...)...)
|
return PanicsWithValue(t, expected, f, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -318,6 +438,9 @@ func PanicsWithValuef(t TestingT, expected interface{}, f PanicTestFunc, msg str
|
|||||||
// assert.Regexpf(t, regexp.MustCompile("start", "error message %s", "formatted"), "it's starting")
|
// assert.Regexpf(t, regexp.MustCompile("start", "error message %s", "formatted"), "it's starting")
|
||||||
// assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted")
|
// assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted")
|
||||||
func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool {
|
func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Regexp(t, rx, str, append([]interface{}{msg}, args...)...)
|
return Regexp(t, rx, str, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -326,6 +449,9 @@ func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...in
|
|||||||
//
|
//
|
||||||
// assert.Subsetf(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted")
|
// assert.Subsetf(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted")
|
||||||
func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool {
|
func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Subset(t, list, subset, append([]interface{}{msg}, args...)...)
|
return Subset(t, list, subset, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -333,6 +459,9 @@ func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args
|
|||||||
//
|
//
|
||||||
// assert.Truef(t, myBool, "error message %s", "formatted")
|
// assert.Truef(t, myBool, "error message %s", "formatted")
|
||||||
func Truef(t TestingT, value bool, msg string, args ...interface{}) bool {
|
func Truef(t TestingT, value bool, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return True(t, value, append([]interface{}{msg}, args...)...)
|
return True(t, value, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -340,10 +469,16 @@ func Truef(t TestingT, value bool, msg string, args ...interface{}) bool {
|
|||||||
//
|
//
|
||||||
// assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted")
|
// assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted")
|
||||||
func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool {
|
func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return WithinDuration(t, expected, actual, delta, append([]interface{}{msg}, args...)...)
|
return WithinDuration(t, expected, actual, delta, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Zerof asserts that i is the zero value for its type.
|
// Zerof asserts that i is the zero value for its type.
|
||||||
func Zerof(t TestingT, i interface{}, msg string, args ...interface{}) bool {
|
func Zerof(t TestingT, i interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Zero(t, i, append([]interface{}{msg}, args...)...)
|
return Zero(t, i, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
1
vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl
generated
vendored
1
vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl
generated
vendored
@ -1,4 +1,5 @@
|
|||||||
{{.CommentFormat}}
|
{{.CommentFormat}}
|
||||||
func {{.DocInfo.Name}}f(t TestingT, {{.ParamsFormat}}) bool {
|
func {{.DocInfo.Name}}f(t TestingT, {{.ParamsFormat}}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok { h.Helper() }
|
||||||
return {{.DocInfo.Name}}(t, {{.ForwardedParamsFormat}})
|
return {{.DocInfo.Name}}(t, {{.ForwardedParamsFormat}})
|
||||||
}
|
}
|
||||||
|
278
vendor/github.com/stretchr/testify/assert/assertion_forward.go
generated
vendored
278
vendor/github.com/stretchr/testify/assert/assertion_forward.go
generated
vendored
@ -13,11 +13,17 @@ import (
|
|||||||
|
|
||||||
// Condition uses a Comparison to assert a complex condition.
|
// Condition uses a Comparison to assert a complex condition.
|
||||||
func (a *Assertions) Condition(comp Comparison, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) Condition(comp Comparison, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Condition(a.t, comp, msgAndArgs...)
|
return Condition(a.t, comp, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Conditionf uses a Comparison to assert a complex condition.
|
// Conditionf uses a Comparison to assert a complex condition.
|
||||||
func (a *Assertions) Conditionf(comp Comparison, msg string, args ...interface{}) bool {
|
func (a *Assertions) Conditionf(comp Comparison, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Conditionf(a.t, comp, msg, args...)
|
return Conditionf(a.t, comp, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -28,6 +34,9 @@ func (a *Assertions) Conditionf(comp Comparison, msg string, args ...interface{}
|
|||||||
// a.Contains(["Hello", "World"], "World")
|
// a.Contains(["Hello", "World"], "World")
|
||||||
// a.Contains({"Hello": "World"}, "Hello")
|
// a.Contains({"Hello": "World"}, "Hello")
|
||||||
func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Contains(a.t, s, contains, msgAndArgs...)
|
return Contains(a.t, s, contains, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -38,16 +47,25 @@ func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ..
|
|||||||
// a.Containsf(["Hello", "World"], "World", "error message %s", "formatted")
|
// a.Containsf(["Hello", "World"], "World", "error message %s", "formatted")
|
||||||
// a.Containsf({"Hello": "World"}, "Hello", "error message %s", "formatted")
|
// a.Containsf({"Hello": "World"}, "Hello", "error message %s", "formatted")
|
||||||
func (a *Assertions) Containsf(s interface{}, contains interface{}, msg string, args ...interface{}) bool {
|
func (a *Assertions) Containsf(s interface{}, contains interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Containsf(a.t, s, contains, msg, args...)
|
return Containsf(a.t, s, contains, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DirExists checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists.
|
// DirExists checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists.
|
||||||
func (a *Assertions) DirExists(path string, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) DirExists(path string, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return DirExists(a.t, path, msgAndArgs...)
|
return DirExists(a.t, path, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DirExistsf checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists.
|
// DirExistsf checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists.
|
||||||
func (a *Assertions) DirExistsf(path string, msg string, args ...interface{}) bool {
|
func (a *Assertions) DirExistsf(path string, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return DirExistsf(a.t, path, msg, args...)
|
return DirExistsf(a.t, path, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,6 +75,9 @@ func (a *Assertions) DirExistsf(path string, msg string, args ...interface{}) bo
|
|||||||
//
|
//
|
||||||
// a.ElementsMatch([1, 3, 2, 3], [1, 3, 3, 2])
|
// a.ElementsMatch([1, 3, 2, 3], [1, 3, 3, 2])
|
||||||
func (a *Assertions) ElementsMatch(listA interface{}, listB interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) ElementsMatch(listA interface{}, listB interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return ElementsMatch(a.t, listA, listB, msgAndArgs...)
|
return ElementsMatch(a.t, listA, listB, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -66,6 +87,9 @@ func (a *Assertions) ElementsMatch(listA interface{}, listB interface{}, msgAndA
|
|||||||
//
|
//
|
||||||
// a.ElementsMatchf([1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted")
|
// a.ElementsMatchf([1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted")
|
||||||
func (a *Assertions) ElementsMatchf(listA interface{}, listB interface{}, msg string, args ...interface{}) bool {
|
func (a *Assertions) ElementsMatchf(listA interface{}, listB interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return ElementsMatchf(a.t, listA, listB, msg, args...)
|
return ElementsMatchf(a.t, listA, listB, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,6 +98,9 @@ func (a *Assertions) ElementsMatchf(listA interface{}, listB interface{}, msg st
|
|||||||
//
|
//
|
||||||
// a.Empty(obj)
|
// a.Empty(obj)
|
||||||
func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Empty(a.t, object, msgAndArgs...)
|
return Empty(a.t, object, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,6 +109,9 @@ func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) bool {
|
|||||||
//
|
//
|
||||||
// a.Emptyf(obj, "error message %s", "formatted")
|
// a.Emptyf(obj, "error message %s", "formatted")
|
||||||
func (a *Assertions) Emptyf(object interface{}, msg string, args ...interface{}) bool {
|
func (a *Assertions) Emptyf(object interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Emptyf(a.t, object, msg, args...)
|
return Emptyf(a.t, object, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,6 +123,9 @@ func (a *Assertions) Emptyf(object interface{}, msg string, args ...interface{})
|
|||||||
// referenced values (as opposed to the memory addresses). Function equality
|
// referenced values (as opposed to the memory addresses). Function equality
|
||||||
// cannot be determined and will always fail.
|
// cannot be determined and will always fail.
|
||||||
func (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Equal(a.t, expected, actual, msgAndArgs...)
|
return Equal(a.t, expected, actual, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,6 +135,9 @@ func (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs
|
|||||||
// actualObj, err := SomeFunction()
|
// actualObj, err := SomeFunction()
|
||||||
// a.EqualError(err, expectedErrorString)
|
// a.EqualError(err, expectedErrorString)
|
||||||
func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return EqualError(a.t, theError, errString, msgAndArgs...)
|
return EqualError(a.t, theError, errString, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,6 +147,9 @@ func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...
|
|||||||
// actualObj, err := SomeFunction()
|
// actualObj, err := SomeFunction()
|
||||||
// a.EqualErrorf(err, expectedErrorString, "error message %s", "formatted")
|
// a.EqualErrorf(err, expectedErrorString, "error message %s", "formatted")
|
||||||
func (a *Assertions) EqualErrorf(theError error, errString string, msg string, args ...interface{}) bool {
|
func (a *Assertions) EqualErrorf(theError error, errString string, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return EqualErrorf(a.t, theError, errString, msg, args...)
|
return EqualErrorf(a.t, theError, errString, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,6 +158,9 @@ func (a *Assertions) EqualErrorf(theError error, errString string, msg string, a
|
|||||||
//
|
//
|
||||||
// a.EqualValues(uint32(123), int32(123))
|
// a.EqualValues(uint32(123), int32(123))
|
||||||
func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return EqualValues(a.t, expected, actual, msgAndArgs...)
|
return EqualValues(a.t, expected, actual, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -127,6 +169,9 @@ func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAn
|
|||||||
//
|
//
|
||||||
// a.EqualValuesf(uint32(123, "error message %s", "formatted"), int32(123))
|
// a.EqualValuesf(uint32(123, "error message %s", "formatted"), int32(123))
|
||||||
func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return EqualValuesf(a.t, expected, actual, msg, args...)
|
return EqualValuesf(a.t, expected, actual, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,6 +183,9 @@ func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg
|
|||||||
// referenced values (as opposed to the memory addresses). Function equality
|
// referenced values (as opposed to the memory addresses). Function equality
|
||||||
// cannot be determined and will always fail.
|
// cannot be determined and will always fail.
|
||||||
func (a *Assertions) Equalf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
func (a *Assertions) Equalf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Equalf(a.t, expected, actual, msg, args...)
|
return Equalf(a.t, expected, actual, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -148,6 +196,9 @@ func (a *Assertions) Equalf(expected interface{}, actual interface{}, msg string
|
|||||||
// assert.Equal(t, expectedError, err)
|
// assert.Equal(t, expectedError, err)
|
||||||
// }
|
// }
|
||||||
func (a *Assertions) Error(err error, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) Error(err error, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Error(a.t, err, msgAndArgs...)
|
return Error(a.t, err, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -158,6 +209,9 @@ func (a *Assertions) Error(err error, msgAndArgs ...interface{}) bool {
|
|||||||
// assert.Equal(t, expectedErrorf, err)
|
// assert.Equal(t, expectedErrorf, err)
|
||||||
// }
|
// }
|
||||||
func (a *Assertions) Errorf(err error, msg string, args ...interface{}) bool {
|
func (a *Assertions) Errorf(err error, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Errorf(a.t, err, msg, args...)
|
return Errorf(a.t, err, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -165,6 +219,9 @@ func (a *Assertions) Errorf(err error, msg string, args ...interface{}) bool {
|
|||||||
//
|
//
|
||||||
// a.Exactly(int32(123), int64(123))
|
// a.Exactly(int32(123), int64(123))
|
||||||
func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Exactly(a.t, expected, actual, msgAndArgs...)
|
return Exactly(a.t, expected, actual, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,26 +229,41 @@ func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArg
|
|||||||
//
|
//
|
||||||
// a.Exactlyf(int32(123, "error message %s", "formatted"), int64(123))
|
// a.Exactlyf(int32(123, "error message %s", "formatted"), int64(123))
|
||||||
func (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
func (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Exactlyf(a.t, expected, actual, msg, args...)
|
return Exactlyf(a.t, expected, actual, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fail reports a failure through
|
// Fail reports a failure through
|
||||||
func (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Fail(a.t, failureMessage, msgAndArgs...)
|
return Fail(a.t, failureMessage, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FailNow fails test
|
// FailNow fails test
|
||||||
func (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return FailNow(a.t, failureMessage, msgAndArgs...)
|
return FailNow(a.t, failureMessage, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FailNowf fails test
|
// FailNowf fails test
|
||||||
func (a *Assertions) FailNowf(failureMessage string, msg string, args ...interface{}) bool {
|
func (a *Assertions) FailNowf(failureMessage string, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return FailNowf(a.t, failureMessage, msg, args...)
|
return FailNowf(a.t, failureMessage, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Failf reports a failure through
|
// Failf reports a failure through
|
||||||
func (a *Assertions) Failf(failureMessage string, msg string, args ...interface{}) bool {
|
func (a *Assertions) Failf(failureMessage string, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Failf(a.t, failureMessage, msg, args...)
|
return Failf(a.t, failureMessage, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -199,6 +271,9 @@ func (a *Assertions) Failf(failureMessage string, msg string, args ...interface{
|
|||||||
//
|
//
|
||||||
// a.False(myBool)
|
// a.False(myBool)
|
||||||
func (a *Assertions) False(value bool, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) False(value bool, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return False(a.t, value, msgAndArgs...)
|
return False(a.t, value, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -206,56 +281,77 @@ func (a *Assertions) False(value bool, msgAndArgs ...interface{}) bool {
|
|||||||
//
|
//
|
||||||
// a.Falsef(myBool, "error message %s", "formatted")
|
// a.Falsef(myBool, "error message %s", "formatted")
|
||||||
func (a *Assertions) Falsef(value bool, msg string, args ...interface{}) bool {
|
func (a *Assertions) Falsef(value bool, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Falsef(a.t, value, msg, args...)
|
return Falsef(a.t, value, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FileExists checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file.
|
// FileExists checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file.
|
||||||
func (a *Assertions) FileExists(path string, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) FileExists(path string, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return FileExists(a.t, path, msgAndArgs...)
|
return FileExists(a.t, path, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FileExistsf checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file.
|
// FileExistsf checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file.
|
||||||
func (a *Assertions) FileExistsf(path string, msg string, args ...interface{}) bool {
|
func (a *Assertions) FileExistsf(path string, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return FileExistsf(a.t, path, msg, args...)
|
return FileExistsf(a.t, path, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// HTTPBodyContains asserts that a specified handler returns a
|
// HTTPBodyContains asserts that a specified handler returns a
|
||||||
// body that contains a string.
|
// body that contains a string.
|
||||||
//
|
//
|
||||||
// a.HTTPBodyContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky")
|
// a.HTTPBodyContains(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky")
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return HTTPBodyContains(a.t, handler, method, url, values, str, msgAndArgs...)
|
return HTTPBodyContains(a.t, handler, method, url, values, str, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// HTTPBodyContainsf asserts that a specified handler returns a
|
// HTTPBodyContainsf asserts that a specified handler returns a
|
||||||
// body that contains a string.
|
// body that contains a string.
|
||||||
//
|
//
|
||||||
// a.HTTPBodyContainsf(myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted")
|
// a.HTTPBodyContainsf(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted")
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool {
|
func (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return HTTPBodyContainsf(a.t, handler, method, url, values, str, msg, args...)
|
return HTTPBodyContainsf(a.t, handler, method, url, values, str, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// HTTPBodyNotContains asserts that a specified handler returns a
|
// HTTPBodyNotContains asserts that a specified handler returns a
|
||||||
// body that does not contain a string.
|
// body that does not contain a string.
|
||||||
//
|
//
|
||||||
// a.HTTPBodyNotContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky")
|
// a.HTTPBodyNotContains(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky")
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return HTTPBodyNotContains(a.t, handler, method, url, values, str, msgAndArgs...)
|
return HTTPBodyNotContains(a.t, handler, method, url, values, str, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// HTTPBodyNotContainsf asserts that a specified handler returns a
|
// HTTPBodyNotContainsf asserts that a specified handler returns a
|
||||||
// body that does not contain a string.
|
// body that does not contain a string.
|
||||||
//
|
//
|
||||||
// a.HTTPBodyNotContainsf(myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted")
|
// a.HTTPBodyNotContainsf(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted")
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool {
|
func (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return HTTPBodyNotContainsf(a.t, handler, method, url, values, str, msg, args...)
|
return HTTPBodyNotContainsf(a.t, handler, method, url, values, str, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -265,6 +361,9 @@ func (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method strin
|
|||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return HTTPError(a.t, handler, method, url, values, msgAndArgs...)
|
return HTTPError(a.t, handler, method, url, values, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -274,6 +373,9 @@ func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url stri
|
|||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false).
|
// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false).
|
||||||
func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool {
|
func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return HTTPErrorf(a.t, handler, method, url, values, msg, args...)
|
return HTTPErrorf(a.t, handler, method, url, values, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -283,6 +385,9 @@ func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url str
|
|||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return HTTPRedirect(a.t, handler, method, url, values, msgAndArgs...)
|
return HTTPRedirect(a.t, handler, method, url, values, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -292,6 +397,9 @@ func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url s
|
|||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false).
|
// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false).
|
||||||
func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool {
|
func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return HTTPRedirectf(a.t, handler, method, url, values, msg, args...)
|
return HTTPRedirectf(a.t, handler, method, url, values, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -301,6 +409,9 @@ func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url
|
|||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return HTTPSuccess(a.t, handler, method, url, values, msgAndArgs...)
|
return HTTPSuccess(a.t, handler, method, url, values, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -310,6 +421,9 @@ func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url st
|
|||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool {
|
func (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return HTTPSuccessf(a.t, handler, method, url, values, msg, args...)
|
return HTTPSuccessf(a.t, handler, method, url, values, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -317,6 +431,9 @@ func (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url s
|
|||||||
//
|
//
|
||||||
// a.Implements((*MyInterface)(nil), new(MyObject))
|
// a.Implements((*MyInterface)(nil), new(MyObject))
|
||||||
func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Implements(a.t, interfaceObject, object, msgAndArgs...)
|
return Implements(a.t, interfaceObject, object, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -324,6 +441,9 @@ func (a *Assertions) Implements(interfaceObject interface{}, object interface{},
|
|||||||
//
|
//
|
||||||
// a.Implementsf((*MyInterface, "error message %s", "formatted")(nil), new(MyObject))
|
// a.Implementsf((*MyInterface, "error message %s", "formatted")(nil), new(MyObject))
|
||||||
func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool {
|
func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Implementsf(a.t, interfaceObject, object, msg, args...)
|
return Implementsf(a.t, interfaceObject, object, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -331,26 +451,41 @@ func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}
|
|||||||
//
|
//
|
||||||
// a.InDelta(math.Pi, (22 / 7.0), 0.01)
|
// a.InDelta(math.Pi, (22 / 7.0), 0.01)
|
||||||
func (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return InDelta(a.t, expected, actual, delta, msgAndArgs...)
|
return InDelta(a.t, expected, actual, delta, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// InDeltaMapValues is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys.
|
// InDeltaMapValues is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys.
|
||||||
func (a *Assertions) InDeltaMapValues(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) InDeltaMapValues(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return InDeltaMapValues(a.t, expected, actual, delta, msgAndArgs...)
|
return InDeltaMapValues(a.t, expected, actual, delta, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// InDeltaMapValuesf is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys.
|
// InDeltaMapValuesf is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys.
|
||||||
func (a *Assertions) InDeltaMapValuesf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool {
|
func (a *Assertions) InDeltaMapValuesf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return InDeltaMapValuesf(a.t, expected, actual, delta, msg, args...)
|
return InDeltaMapValuesf(a.t, expected, actual, delta, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// InDeltaSlice is the same as InDelta, except it compares two slices.
|
// InDeltaSlice is the same as InDelta, except it compares two slices.
|
||||||
func (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return InDeltaSlice(a.t, expected, actual, delta, msgAndArgs...)
|
return InDeltaSlice(a.t, expected, actual, delta, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// InDeltaSlicef is the same as InDelta, except it compares two slices.
|
// InDeltaSlicef is the same as InDelta, except it compares two slices.
|
||||||
func (a *Assertions) InDeltaSlicef(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool {
|
func (a *Assertions) InDeltaSlicef(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return InDeltaSlicef(a.t, expected, actual, delta, msg, args...)
|
return InDeltaSlicef(a.t, expected, actual, delta, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -358,36 +493,57 @@ func (a *Assertions) InDeltaSlicef(expected interface{}, actual interface{}, del
|
|||||||
//
|
//
|
||||||
// a.InDeltaf(math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01)
|
// a.InDeltaf(math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01)
|
||||||
func (a *Assertions) InDeltaf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool {
|
func (a *Assertions) InDeltaf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return InDeltaf(a.t, expected, actual, delta, msg, args...)
|
return InDeltaf(a.t, expected, actual, delta, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// InEpsilon asserts that expected and actual have a relative error less than epsilon
|
// InEpsilon asserts that expected and actual have a relative error less than epsilon
|
||||||
func (a *Assertions) InEpsilon(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) InEpsilon(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...)
|
return InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices.
|
// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices.
|
||||||
func (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return InEpsilonSlice(a.t, expected, actual, epsilon, msgAndArgs...)
|
return InEpsilonSlice(a.t, expected, actual, epsilon, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices.
|
// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices.
|
||||||
func (a *Assertions) InEpsilonSlicef(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool {
|
func (a *Assertions) InEpsilonSlicef(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return InEpsilonSlicef(a.t, expected, actual, epsilon, msg, args...)
|
return InEpsilonSlicef(a.t, expected, actual, epsilon, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// InEpsilonf asserts that expected and actual have a relative error less than epsilon
|
// InEpsilonf asserts that expected and actual have a relative error less than epsilon
|
||||||
func (a *Assertions) InEpsilonf(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool {
|
func (a *Assertions) InEpsilonf(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return InEpsilonf(a.t, expected, actual, epsilon, msg, args...)
|
return InEpsilonf(a.t, expected, actual, epsilon, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsType asserts that the specified objects are of the same type.
|
// IsType asserts that the specified objects are of the same type.
|
||||||
func (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return IsType(a.t, expectedType, object, msgAndArgs...)
|
return IsType(a.t, expectedType, object, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsTypef asserts that the specified objects are of the same type.
|
// IsTypef asserts that the specified objects are of the same type.
|
||||||
func (a *Assertions) IsTypef(expectedType interface{}, object interface{}, msg string, args ...interface{}) bool {
|
func (a *Assertions) IsTypef(expectedType interface{}, object interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return IsTypef(a.t, expectedType, object, msg, args...)
|
return IsTypef(a.t, expectedType, object, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -395,6 +551,9 @@ func (a *Assertions) IsTypef(expectedType interface{}, object interface{}, msg s
|
|||||||
//
|
//
|
||||||
// a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`)
|
// a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`)
|
||||||
func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return JSONEq(a.t, expected, actual, msgAndArgs...)
|
return JSONEq(a.t, expected, actual, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -402,6 +561,9 @@ func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interf
|
|||||||
//
|
//
|
||||||
// a.JSONEqf(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted")
|
// a.JSONEqf(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted")
|
||||||
func (a *Assertions) JSONEqf(expected string, actual string, msg string, args ...interface{}) bool {
|
func (a *Assertions) JSONEqf(expected string, actual string, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return JSONEqf(a.t, expected, actual, msg, args...)
|
return JSONEqf(a.t, expected, actual, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -410,6 +572,9 @@ func (a *Assertions) JSONEqf(expected string, actual string, msg string, args ..
|
|||||||
//
|
//
|
||||||
// a.Len(mySlice, 3)
|
// a.Len(mySlice, 3)
|
||||||
func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Len(a.t, object, length, msgAndArgs...)
|
return Len(a.t, object, length, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -418,6 +583,9 @@ func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface
|
|||||||
//
|
//
|
||||||
// a.Lenf(mySlice, 3, "error message %s", "formatted")
|
// a.Lenf(mySlice, 3, "error message %s", "formatted")
|
||||||
func (a *Assertions) Lenf(object interface{}, length int, msg string, args ...interface{}) bool {
|
func (a *Assertions) Lenf(object interface{}, length int, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Lenf(a.t, object, length, msg, args...)
|
return Lenf(a.t, object, length, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -425,6 +593,9 @@ func (a *Assertions) Lenf(object interface{}, length int, msg string, args ...in
|
|||||||
//
|
//
|
||||||
// a.Nil(err)
|
// a.Nil(err)
|
||||||
func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Nil(a.t, object, msgAndArgs...)
|
return Nil(a.t, object, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -432,6 +603,9 @@ func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) bool {
|
|||||||
//
|
//
|
||||||
// a.Nilf(err, "error message %s", "formatted")
|
// a.Nilf(err, "error message %s", "formatted")
|
||||||
func (a *Assertions) Nilf(object interface{}, msg string, args ...interface{}) bool {
|
func (a *Assertions) Nilf(object interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Nilf(a.t, object, msg, args...)
|
return Nilf(a.t, object, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -442,6 +616,9 @@ func (a *Assertions) Nilf(object interface{}, msg string, args ...interface{}) b
|
|||||||
// assert.Equal(t, expectedObj, actualObj)
|
// assert.Equal(t, expectedObj, actualObj)
|
||||||
// }
|
// }
|
||||||
func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NoError(a.t, err, msgAndArgs...)
|
return NoError(a.t, err, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -452,6 +629,9 @@ func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) bool {
|
|||||||
// assert.Equal(t, expectedObj, actualObj)
|
// assert.Equal(t, expectedObj, actualObj)
|
||||||
// }
|
// }
|
||||||
func (a *Assertions) NoErrorf(err error, msg string, args ...interface{}) bool {
|
func (a *Assertions) NoErrorf(err error, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NoErrorf(a.t, err, msg, args...)
|
return NoErrorf(a.t, err, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -462,6 +642,9 @@ func (a *Assertions) NoErrorf(err error, msg string, args ...interface{}) bool {
|
|||||||
// a.NotContains(["Hello", "World"], "Earth")
|
// a.NotContains(["Hello", "World"], "Earth")
|
||||||
// a.NotContains({"Hello": "World"}, "Earth")
|
// a.NotContains({"Hello": "World"}, "Earth")
|
||||||
func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NotContains(a.t, s, contains, msgAndArgs...)
|
return NotContains(a.t, s, contains, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -472,6 +655,9 @@ func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs
|
|||||||
// a.NotContainsf(["Hello", "World"], "Earth", "error message %s", "formatted")
|
// a.NotContainsf(["Hello", "World"], "Earth", "error message %s", "formatted")
|
||||||
// a.NotContainsf({"Hello": "World"}, "Earth", "error message %s", "formatted")
|
// a.NotContainsf({"Hello": "World"}, "Earth", "error message %s", "formatted")
|
||||||
func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg string, args ...interface{}) bool {
|
func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NotContainsf(a.t, s, contains, msg, args...)
|
return NotContainsf(a.t, s, contains, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -482,6 +668,9 @@ func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg strin
|
|||||||
// assert.Equal(t, "two", obj[1])
|
// assert.Equal(t, "two", obj[1])
|
||||||
// }
|
// }
|
||||||
func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NotEmpty(a.t, object, msgAndArgs...)
|
return NotEmpty(a.t, object, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -492,6 +681,9 @@ func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) boo
|
|||||||
// assert.Equal(t, "two", obj[1])
|
// assert.Equal(t, "two", obj[1])
|
||||||
// }
|
// }
|
||||||
func (a *Assertions) NotEmptyf(object interface{}, msg string, args ...interface{}) bool {
|
func (a *Assertions) NotEmptyf(object interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NotEmptyf(a.t, object, msg, args...)
|
return NotEmptyf(a.t, object, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -502,6 +694,9 @@ func (a *Assertions) NotEmptyf(object interface{}, msg string, args ...interface
|
|||||||
// Pointer variable equality is determined based on the equality of the
|
// Pointer variable equality is determined based on the equality of the
|
||||||
// referenced values (as opposed to the memory addresses).
|
// referenced values (as opposed to the memory addresses).
|
||||||
func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NotEqual(a.t, expected, actual, msgAndArgs...)
|
return NotEqual(a.t, expected, actual, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -512,6 +707,9 @@ func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndAr
|
|||||||
// Pointer variable equality is determined based on the equality of the
|
// Pointer variable equality is determined based on the equality of the
|
||||||
// referenced values (as opposed to the memory addresses).
|
// referenced values (as opposed to the memory addresses).
|
||||||
func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NotEqualf(a.t, expected, actual, msg, args...)
|
return NotEqualf(a.t, expected, actual, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -519,6 +717,9 @@ func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg str
|
|||||||
//
|
//
|
||||||
// a.NotNil(err)
|
// a.NotNil(err)
|
||||||
func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NotNil(a.t, object, msgAndArgs...)
|
return NotNil(a.t, object, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -526,6 +727,9 @@ func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) bool
|
|||||||
//
|
//
|
||||||
// a.NotNilf(err, "error message %s", "formatted")
|
// a.NotNilf(err, "error message %s", "formatted")
|
||||||
func (a *Assertions) NotNilf(object interface{}, msg string, args ...interface{}) bool {
|
func (a *Assertions) NotNilf(object interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NotNilf(a.t, object, msg, args...)
|
return NotNilf(a.t, object, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -533,6 +737,9 @@ func (a *Assertions) NotNilf(object interface{}, msg string, args ...interface{}
|
|||||||
//
|
//
|
||||||
// a.NotPanics(func(){ RemainCalm() })
|
// a.NotPanics(func(){ RemainCalm() })
|
||||||
func (a *Assertions) NotPanics(f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) NotPanics(f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NotPanics(a.t, f, msgAndArgs...)
|
return NotPanics(a.t, f, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -540,6 +747,9 @@ func (a *Assertions) NotPanics(f PanicTestFunc, msgAndArgs ...interface{}) bool
|
|||||||
//
|
//
|
||||||
// a.NotPanicsf(func(){ RemainCalm() }, "error message %s", "formatted")
|
// a.NotPanicsf(func(){ RemainCalm() }, "error message %s", "formatted")
|
||||||
func (a *Assertions) NotPanicsf(f PanicTestFunc, msg string, args ...interface{}) bool {
|
func (a *Assertions) NotPanicsf(f PanicTestFunc, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NotPanicsf(a.t, f, msg, args...)
|
return NotPanicsf(a.t, f, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -548,6 +758,9 @@ func (a *Assertions) NotPanicsf(f PanicTestFunc, msg string, args ...interface{}
|
|||||||
// a.NotRegexp(regexp.MustCompile("starts"), "it's starting")
|
// a.NotRegexp(regexp.MustCompile("starts"), "it's starting")
|
||||||
// a.NotRegexp("^start", "it's not starting")
|
// a.NotRegexp("^start", "it's not starting")
|
||||||
func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NotRegexp(a.t, rx, str, msgAndArgs...)
|
return NotRegexp(a.t, rx, str, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -556,6 +769,9 @@ func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...in
|
|||||||
// a.NotRegexpf(regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting")
|
// a.NotRegexpf(regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting")
|
||||||
// a.NotRegexpf("^start", "it's not starting", "error message %s", "formatted")
|
// a.NotRegexpf("^start", "it's not starting", "error message %s", "formatted")
|
||||||
func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool {
|
func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NotRegexpf(a.t, rx, str, msg, args...)
|
return NotRegexpf(a.t, rx, str, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -564,6 +780,9 @@ func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, arg
|
|||||||
//
|
//
|
||||||
// a.NotSubset([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]")
|
// a.NotSubset([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]")
|
||||||
func (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NotSubset(a.t, list, subset, msgAndArgs...)
|
return NotSubset(a.t, list, subset, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -572,16 +791,25 @@ func (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs
|
|||||||
//
|
//
|
||||||
// a.NotSubsetf([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted")
|
// a.NotSubsetf([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted")
|
||||||
func (a *Assertions) NotSubsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool {
|
func (a *Assertions) NotSubsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NotSubsetf(a.t, list, subset, msg, args...)
|
return NotSubsetf(a.t, list, subset, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NotZero asserts that i is not the zero value for its type.
|
// NotZero asserts that i is not the zero value for its type.
|
||||||
func (a *Assertions) NotZero(i interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) NotZero(i interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NotZero(a.t, i, msgAndArgs...)
|
return NotZero(a.t, i, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NotZerof asserts that i is not the zero value for its type.
|
// NotZerof asserts that i is not the zero value for its type.
|
||||||
func (a *Assertions) NotZerof(i interface{}, msg string, args ...interface{}) bool {
|
func (a *Assertions) NotZerof(i interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return NotZerof(a.t, i, msg, args...)
|
return NotZerof(a.t, i, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -589,6 +817,9 @@ func (a *Assertions) NotZerof(i interface{}, msg string, args ...interface{}) bo
|
|||||||
//
|
//
|
||||||
// a.Panics(func(){ GoCrazy() })
|
// a.Panics(func(){ GoCrazy() })
|
||||||
func (a *Assertions) Panics(f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) Panics(f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Panics(a.t, f, msgAndArgs...)
|
return Panics(a.t, f, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -597,6 +828,9 @@ func (a *Assertions) Panics(f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
|||||||
//
|
//
|
||||||
// a.PanicsWithValue("crazy error", func(){ GoCrazy() })
|
// a.PanicsWithValue("crazy error", func(){ GoCrazy() })
|
||||||
func (a *Assertions) PanicsWithValue(expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) PanicsWithValue(expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return PanicsWithValue(a.t, expected, f, msgAndArgs...)
|
return PanicsWithValue(a.t, expected, f, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -605,6 +839,9 @@ func (a *Assertions) PanicsWithValue(expected interface{}, f PanicTestFunc, msgA
|
|||||||
//
|
//
|
||||||
// a.PanicsWithValuef("crazy error", func(){ GoCrazy() }, "error message %s", "formatted")
|
// a.PanicsWithValuef("crazy error", func(){ GoCrazy() }, "error message %s", "formatted")
|
||||||
func (a *Assertions) PanicsWithValuef(expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool {
|
func (a *Assertions) PanicsWithValuef(expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return PanicsWithValuef(a.t, expected, f, msg, args...)
|
return PanicsWithValuef(a.t, expected, f, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -612,6 +849,9 @@ func (a *Assertions) PanicsWithValuef(expected interface{}, f PanicTestFunc, msg
|
|||||||
//
|
//
|
||||||
// a.Panicsf(func(){ GoCrazy() }, "error message %s", "formatted")
|
// a.Panicsf(func(){ GoCrazy() }, "error message %s", "formatted")
|
||||||
func (a *Assertions) Panicsf(f PanicTestFunc, msg string, args ...interface{}) bool {
|
func (a *Assertions) Panicsf(f PanicTestFunc, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Panicsf(a.t, f, msg, args...)
|
return Panicsf(a.t, f, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -620,6 +860,9 @@ func (a *Assertions) Panicsf(f PanicTestFunc, msg string, args ...interface{}) b
|
|||||||
// a.Regexp(regexp.MustCompile("start"), "it's starting")
|
// a.Regexp(regexp.MustCompile("start"), "it's starting")
|
||||||
// a.Regexp("start...$", "it's not starting")
|
// a.Regexp("start...$", "it's not starting")
|
||||||
func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Regexp(a.t, rx, str, msgAndArgs...)
|
return Regexp(a.t, rx, str, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -628,6 +871,9 @@ func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...inter
|
|||||||
// a.Regexpf(regexp.MustCompile("start", "error message %s", "formatted"), "it's starting")
|
// a.Regexpf(regexp.MustCompile("start", "error message %s", "formatted"), "it's starting")
|
||||||
// a.Regexpf("start...$", "it's not starting", "error message %s", "formatted")
|
// a.Regexpf("start...$", "it's not starting", "error message %s", "formatted")
|
||||||
func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool {
|
func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Regexpf(a.t, rx, str, msg, args...)
|
return Regexpf(a.t, rx, str, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -636,6 +882,9 @@ func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args .
|
|||||||
//
|
//
|
||||||
// a.Subset([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]")
|
// a.Subset([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]")
|
||||||
func (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Subset(a.t, list, subset, msgAndArgs...)
|
return Subset(a.t, list, subset, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -644,6 +893,9 @@ func (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ...
|
|||||||
//
|
//
|
||||||
// a.Subsetf([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted")
|
// a.Subsetf([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted")
|
||||||
func (a *Assertions) Subsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool {
|
func (a *Assertions) Subsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Subsetf(a.t, list, subset, msg, args...)
|
return Subsetf(a.t, list, subset, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -651,6 +903,9 @@ func (a *Assertions) Subsetf(list interface{}, subset interface{}, msg string, a
|
|||||||
//
|
//
|
||||||
// a.True(myBool)
|
// a.True(myBool)
|
||||||
func (a *Assertions) True(value bool, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) True(value bool, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return True(a.t, value, msgAndArgs...)
|
return True(a.t, value, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -658,6 +913,9 @@ func (a *Assertions) True(value bool, msgAndArgs ...interface{}) bool {
|
|||||||
//
|
//
|
||||||
// a.Truef(myBool, "error message %s", "formatted")
|
// a.Truef(myBool, "error message %s", "formatted")
|
||||||
func (a *Assertions) Truef(value bool, msg string, args ...interface{}) bool {
|
func (a *Assertions) Truef(value bool, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Truef(a.t, value, msg, args...)
|
return Truef(a.t, value, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -665,6 +923,9 @@ func (a *Assertions) Truef(value bool, msg string, args ...interface{}) bool {
|
|||||||
//
|
//
|
||||||
// a.WithinDuration(time.Now(), time.Now(), 10*time.Second)
|
// a.WithinDuration(time.Now(), time.Now(), 10*time.Second)
|
||||||
func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return WithinDuration(a.t, expected, actual, delta, msgAndArgs...)
|
return WithinDuration(a.t, expected, actual, delta, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -672,15 +933,24 @@ func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta
|
|||||||
//
|
//
|
||||||
// a.WithinDurationf(time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted")
|
// a.WithinDurationf(time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted")
|
||||||
func (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool {
|
func (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return WithinDurationf(a.t, expected, actual, delta, msg, args...)
|
return WithinDurationf(a.t, expected, actual, delta, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Zero asserts that i is the zero value for its type.
|
// Zero asserts that i is the zero value for its type.
|
||||||
func (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Zero(a.t, i, msgAndArgs...)
|
return Zero(a.t, i, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Zerof asserts that i is the zero value for its type.
|
// Zerof asserts that i is the zero value for its type.
|
||||||
func (a *Assertions) Zerof(i interface{}, msg string, args ...interface{}) bool {
|
func (a *Assertions) Zerof(i interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
return Zerof(a.t, i, msg, args...)
|
return Zerof(a.t, i, msg, args...)
|
||||||
}
|
}
|
||||||
|
1
vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl
generated
vendored
1
vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl
generated
vendored
@ -1,4 +1,5 @@
|
|||||||
{{.CommentWithoutT "a"}}
|
{{.CommentWithoutT "a"}}
|
||||||
func (a *Assertions) {{.DocInfo.Name}}({{.Params}}) bool {
|
func (a *Assertions) {{.DocInfo.Name}}({{.Params}}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok { h.Helper() }
|
||||||
return {{.DocInfo.Name}}(a.t, {{.ForwardedParams}})
|
return {{.DocInfo.Name}}(a.t, {{.ForwardedParams}})
|
||||||
}
|
}
|
||||||
|
244
vendor/github.com/stretchr/testify/assert/assertions.go
generated
vendored
244
vendor/github.com/stretchr/testify/assert/assertions.go
generated
vendored
@ -27,6 +27,22 @@ type TestingT interface {
|
|||||||
Errorf(format string, args ...interface{})
|
Errorf(format string, args ...interface{})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ComparisonAssertionFunc is a common function prototype when comparing two values. Can be useful
|
||||||
|
// for table driven tests.
|
||||||
|
type ComparisonAssertionFunc func(TestingT, interface{}, interface{}, ...interface{}) bool
|
||||||
|
|
||||||
|
// ValueAssertionFunc is a common function prototype when validating a single value. Can be useful
|
||||||
|
// for table driven tests.
|
||||||
|
type ValueAssertionFunc func(TestingT, interface{}, ...interface{}) bool
|
||||||
|
|
||||||
|
// BoolAssertionFunc is a common function prototype when validating a bool value. Can be useful
|
||||||
|
// for table driven tests.
|
||||||
|
type BoolAssertionFunc func(TestingT, bool, ...interface{}) bool
|
||||||
|
|
||||||
|
// ErrorAssertionFunc is a common function prototype when validating an error value. Can be useful
|
||||||
|
// for table driven tests.
|
||||||
|
type ErrorAssertionFunc func(TestingT, error, ...interface{}) bool
|
||||||
|
|
||||||
// Comparison a custom function that returns true on success and false on failure
|
// Comparison a custom function that returns true on success and false on failure
|
||||||
type Comparison func() (success bool)
|
type Comparison func() (success bool)
|
||||||
|
|
||||||
@ -38,21 +54,23 @@ type Comparison func() (success bool)
|
|||||||
//
|
//
|
||||||
// This function does no assertion of any kind.
|
// This function does no assertion of any kind.
|
||||||
func ObjectsAreEqual(expected, actual interface{}) bool {
|
func ObjectsAreEqual(expected, actual interface{}) bool {
|
||||||
|
|
||||||
if expected == nil || actual == nil {
|
if expected == nil || actual == nil {
|
||||||
return expected == actual
|
return expected == actual
|
||||||
}
|
}
|
||||||
if exp, ok := expected.([]byte); ok {
|
|
||||||
act, ok := actual.([]byte)
|
|
||||||
if !ok {
|
|
||||||
return false
|
|
||||||
} else if exp == nil || act == nil {
|
|
||||||
return exp == nil && act == nil
|
|
||||||
}
|
|
||||||
return bytes.Equal(exp, act)
|
|
||||||
}
|
|
||||||
return reflect.DeepEqual(expected, actual)
|
|
||||||
|
|
||||||
|
exp, ok := expected.([]byte)
|
||||||
|
if !ok {
|
||||||
|
return reflect.DeepEqual(expected, actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
act, ok := actual.([]byte)
|
||||||
|
if !ok {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if exp == nil || act == nil {
|
||||||
|
return exp == nil && act == nil
|
||||||
|
}
|
||||||
|
return bytes.Equal(exp, act)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ObjectsAreEqualValues gets whether two objects are equal, or if their
|
// ObjectsAreEqualValues gets whether two objects are equal, or if their
|
||||||
@ -156,27 +174,16 @@ func isTest(name, prefix string) bool {
|
|||||||
return !unicode.IsLower(rune)
|
return !unicode.IsLower(rune)
|
||||||
}
|
}
|
||||||
|
|
||||||
// getWhitespaceString returns a string that is long enough to overwrite the default
|
|
||||||
// output from the go testing framework.
|
|
||||||
func getWhitespaceString() string {
|
|
||||||
|
|
||||||
_, file, line, ok := runtime.Caller(1)
|
|
||||||
if !ok {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
parts := strings.Split(file, "/")
|
|
||||||
file = parts[len(parts)-1]
|
|
||||||
|
|
||||||
return strings.Repeat(" ", len(fmt.Sprintf("%s:%d: ", file, line)))
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func messageFromMsgAndArgs(msgAndArgs ...interface{}) string {
|
func messageFromMsgAndArgs(msgAndArgs ...interface{}) string {
|
||||||
if len(msgAndArgs) == 0 || msgAndArgs == nil {
|
if len(msgAndArgs) == 0 || msgAndArgs == nil {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
if len(msgAndArgs) == 1 {
|
if len(msgAndArgs) == 1 {
|
||||||
return msgAndArgs[0].(string)
|
msg := msgAndArgs[0]
|
||||||
|
if msgAsStr, ok := msg.(string); ok {
|
||||||
|
return msgAsStr
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%+v", msg)
|
||||||
}
|
}
|
||||||
if len(msgAndArgs) > 1 {
|
if len(msgAndArgs) > 1 {
|
||||||
return fmt.Sprintf(msgAndArgs[0].(string), msgAndArgs[1:]...)
|
return fmt.Sprintf(msgAndArgs[0].(string), msgAndArgs[1:]...)
|
||||||
@ -195,7 +202,7 @@ func indentMessageLines(message string, longestLabelLen int) string {
|
|||||||
// no need to align first line because it starts at the correct location (after the label)
|
// no need to align first line because it starts at the correct location (after the label)
|
||||||
if i != 0 {
|
if i != 0 {
|
||||||
// append alignLen+1 spaces to align with "{{longestLabel}}:" before adding tab
|
// append alignLen+1 spaces to align with "{{longestLabel}}:" before adding tab
|
||||||
outBuf.WriteString("\n\r\t" + strings.Repeat(" ", longestLabelLen+1) + "\t")
|
outBuf.WriteString("\n\t" + strings.Repeat(" ", longestLabelLen+1) + "\t")
|
||||||
}
|
}
|
||||||
outBuf.WriteString(scanner.Text())
|
outBuf.WriteString(scanner.Text())
|
||||||
}
|
}
|
||||||
@ -209,6 +216,9 @@ type failNower interface {
|
|||||||
|
|
||||||
// FailNow fails test
|
// FailNow fails test
|
||||||
func FailNow(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool {
|
func FailNow(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
Fail(t, failureMessage, msgAndArgs...)
|
Fail(t, failureMessage, msgAndArgs...)
|
||||||
|
|
||||||
// We cannot extend TestingT with FailNow() and
|
// We cannot extend TestingT with FailNow() and
|
||||||
@ -227,8 +237,11 @@ func FailNow(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool
|
|||||||
|
|
||||||
// Fail reports a failure through
|
// Fail reports a failure through
|
||||||
func Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool {
|
func Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
content := []labeledContent{
|
content := []labeledContent{
|
||||||
{"Error Trace", strings.Join(CallerInfo(), "\n\r\t\t\t")},
|
{"Error Trace", strings.Join(CallerInfo(), "\n\t\t\t")},
|
||||||
{"Error", failureMessage},
|
{"Error", failureMessage},
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -244,7 +257,7 @@ func Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool {
|
|||||||
content = append(content, labeledContent{"Messages", message})
|
content = append(content, labeledContent{"Messages", message})
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Errorf("%s", "\r"+getWhitespaceString()+labeledOutput(content...))
|
t.Errorf("\n%s", ""+labeledOutput(content...))
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@ -256,7 +269,7 @@ type labeledContent struct {
|
|||||||
|
|
||||||
// labeledOutput returns a string consisting of the provided labeledContent. Each labeled output is appended in the following manner:
|
// labeledOutput returns a string consisting of the provided labeledContent. Each labeled output is appended in the following manner:
|
||||||
//
|
//
|
||||||
// \r\t{{label}}:{{align_spaces}}\t{{content}}\n
|
// \t{{label}}:{{align_spaces}}\t{{content}}\n
|
||||||
//
|
//
|
||||||
// The initial carriage return is required to undo/erase any padding added by testing.T.Errorf. The "\t{{label}}:" is for the label.
|
// The initial carriage return is required to undo/erase any padding added by testing.T.Errorf. The "\t{{label}}:" is for the label.
|
||||||
// If a label is shorter than the longest label provided, padding spaces are added to make all the labels match in length. Once this
|
// If a label is shorter than the longest label provided, padding spaces are added to make all the labels match in length. Once this
|
||||||
@ -272,7 +285,7 @@ func labeledOutput(content ...labeledContent) string {
|
|||||||
}
|
}
|
||||||
var output string
|
var output string
|
||||||
for _, v := range content {
|
for _, v := range content {
|
||||||
output += "\r\t" + v.label + ":" + strings.Repeat(" ", longestLabel-len(v.label)) + "\t" + indentMessageLines(v.content, longestLabel) + "\n"
|
output += "\t" + v.label + ":" + strings.Repeat(" ", longestLabel-len(v.label)) + "\t" + indentMessageLines(v.content, longestLabel) + "\n"
|
||||||
}
|
}
|
||||||
return output
|
return output
|
||||||
}
|
}
|
||||||
@ -281,6 +294,9 @@ func labeledOutput(content ...labeledContent) string {
|
|||||||
//
|
//
|
||||||
// assert.Implements(t, (*MyInterface)(nil), new(MyObject))
|
// assert.Implements(t, (*MyInterface)(nil), new(MyObject))
|
||||||
func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool {
|
func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
interfaceType := reflect.TypeOf(interfaceObject).Elem()
|
interfaceType := reflect.TypeOf(interfaceObject).Elem()
|
||||||
|
|
||||||
if object == nil {
|
if object == nil {
|
||||||
@ -295,6 +311,9 @@ func Implements(t TestingT, interfaceObject interface{}, object interface{}, msg
|
|||||||
|
|
||||||
// IsType asserts that the specified objects are of the same type.
|
// IsType asserts that the specified objects are of the same type.
|
||||||
func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool {
|
func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
|
||||||
if !ObjectsAreEqual(reflect.TypeOf(object), reflect.TypeOf(expectedType)) {
|
if !ObjectsAreEqual(reflect.TypeOf(object), reflect.TypeOf(expectedType)) {
|
||||||
return Fail(t, fmt.Sprintf("Object expected to be of type %v, but was %v", reflect.TypeOf(expectedType), reflect.TypeOf(object)), msgAndArgs...)
|
return Fail(t, fmt.Sprintf("Object expected to be of type %v, but was %v", reflect.TypeOf(expectedType), reflect.TypeOf(object)), msgAndArgs...)
|
||||||
@ -311,6 +330,9 @@ func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs
|
|||||||
// referenced values (as opposed to the memory addresses). Function equality
|
// referenced values (as opposed to the memory addresses). Function equality
|
||||||
// cannot be determined and will always fail.
|
// cannot be determined and will always fail.
|
||||||
func Equal(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
|
func Equal(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
if err := validateEqualArgs(expected, actual); err != nil {
|
if err := validateEqualArgs(expected, actual); err != nil {
|
||||||
return Fail(t, fmt.Sprintf("Invalid operation: %#v == %#v (%s)",
|
return Fail(t, fmt.Sprintf("Invalid operation: %#v == %#v (%s)",
|
||||||
expected, actual, err), msgAndArgs...)
|
expected, actual, err), msgAndArgs...)
|
||||||
@ -349,6 +371,9 @@ func formatUnequalValues(expected, actual interface{}) (e string, a string) {
|
|||||||
//
|
//
|
||||||
// assert.EqualValues(t, uint32(123), int32(123))
|
// assert.EqualValues(t, uint32(123), int32(123))
|
||||||
func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
|
func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
|
||||||
if !ObjectsAreEqualValues(expected, actual) {
|
if !ObjectsAreEqualValues(expected, actual) {
|
||||||
diff := diff(expected, actual)
|
diff := diff(expected, actual)
|
||||||
@ -366,12 +391,15 @@ func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interfa
|
|||||||
//
|
//
|
||||||
// assert.Exactly(t, int32(123), int64(123))
|
// assert.Exactly(t, int32(123), int64(123))
|
||||||
func Exactly(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
|
func Exactly(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
|
||||||
aType := reflect.TypeOf(expected)
|
aType := reflect.TypeOf(expected)
|
||||||
bType := reflect.TypeOf(actual)
|
bType := reflect.TypeOf(actual)
|
||||||
|
|
||||||
if aType != bType {
|
if aType != bType {
|
||||||
return Fail(t, fmt.Sprintf("Types expected to match exactly\n\r\t%v != %v", aType, bType), msgAndArgs...)
|
return Fail(t, fmt.Sprintf("Types expected to match exactly\n\t%v != %v", aType, bType), msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
return Equal(t, expected, actual, msgAndArgs...)
|
return Equal(t, expected, actual, msgAndArgs...)
|
||||||
@ -382,12 +410,26 @@ func Exactly(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}
|
|||||||
//
|
//
|
||||||
// assert.NotNil(t, err)
|
// assert.NotNil(t, err)
|
||||||
func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
if !isNil(object) {
|
if !isNil(object) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return Fail(t, "Expected value not to be nil.", msgAndArgs...)
|
return Fail(t, "Expected value not to be nil.", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// containsKind checks if a specified kind in the slice of kinds.
|
||||||
|
func containsKind(kinds []reflect.Kind, kind reflect.Kind) bool {
|
||||||
|
for i := 0; i < len(kinds); i++ {
|
||||||
|
if kind == kinds[i] {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// isNil checks if a specified object is nil or not, without Failing.
|
// isNil checks if a specified object is nil or not, without Failing.
|
||||||
func isNil(object interface{}) bool {
|
func isNil(object interface{}) bool {
|
||||||
if object == nil {
|
if object == nil {
|
||||||
@ -396,7 +438,14 @@ func isNil(object interface{}) bool {
|
|||||||
|
|
||||||
value := reflect.ValueOf(object)
|
value := reflect.ValueOf(object)
|
||||||
kind := value.Kind()
|
kind := value.Kind()
|
||||||
if kind >= reflect.Chan && kind <= reflect.Slice && value.IsNil() {
|
isNilableKind := containsKind(
|
||||||
|
[]reflect.Kind{
|
||||||
|
reflect.Chan, reflect.Func,
|
||||||
|
reflect.Interface, reflect.Map,
|
||||||
|
reflect.Ptr, reflect.Slice},
|
||||||
|
kind)
|
||||||
|
|
||||||
|
if isNilableKind && value.IsNil() {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -407,6 +456,9 @@ func isNil(object interface{}) bool {
|
|||||||
//
|
//
|
||||||
// assert.Nil(t, err)
|
// assert.Nil(t, err)
|
||||||
func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
if isNil(object) {
|
if isNil(object) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -446,6 +498,9 @@ func isEmpty(object interface{}) bool {
|
|||||||
//
|
//
|
||||||
// assert.Empty(t, obj)
|
// assert.Empty(t, obj)
|
||||||
func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
|
||||||
pass := isEmpty(object)
|
pass := isEmpty(object)
|
||||||
if !pass {
|
if !pass {
|
||||||
@ -463,6 +518,9 @@ func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
|||||||
// assert.Equal(t, "two", obj[1])
|
// assert.Equal(t, "two", obj[1])
|
||||||
// }
|
// }
|
||||||
func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
|
||||||
pass := !isEmpty(object)
|
pass := !isEmpty(object)
|
||||||
if !pass {
|
if !pass {
|
||||||
@ -490,6 +548,9 @@ func getLen(x interface{}) (ok bool, length int) {
|
|||||||
//
|
//
|
||||||
// assert.Len(t, mySlice, 3)
|
// assert.Len(t, mySlice, 3)
|
||||||
func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) bool {
|
func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
ok, l := getLen(object)
|
ok, l := getLen(object)
|
||||||
if !ok {
|
if !ok {
|
||||||
return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", object), msgAndArgs...)
|
return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", object), msgAndArgs...)
|
||||||
@ -505,6 +566,14 @@ func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{})
|
|||||||
//
|
//
|
||||||
// assert.True(t, myBool)
|
// assert.True(t, myBool)
|
||||||
func True(t TestingT, value bool, msgAndArgs ...interface{}) bool {
|
func True(t TestingT, value bool, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
if h, ok := t.(interface {
|
||||||
|
Helper()
|
||||||
|
}); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
|
||||||
if value != true {
|
if value != true {
|
||||||
return Fail(t, "Should be true", msgAndArgs...)
|
return Fail(t, "Should be true", msgAndArgs...)
|
||||||
@ -518,6 +587,9 @@ func True(t TestingT, value bool, msgAndArgs ...interface{}) bool {
|
|||||||
//
|
//
|
||||||
// assert.False(t, myBool)
|
// assert.False(t, myBool)
|
||||||
func False(t TestingT, value bool, msgAndArgs ...interface{}) bool {
|
func False(t TestingT, value bool, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
|
||||||
if value != false {
|
if value != false {
|
||||||
return Fail(t, "Should be false", msgAndArgs...)
|
return Fail(t, "Should be false", msgAndArgs...)
|
||||||
@ -534,6 +606,9 @@ func False(t TestingT, value bool, msgAndArgs ...interface{}) bool {
|
|||||||
// Pointer variable equality is determined based on the equality of the
|
// Pointer variable equality is determined based on the equality of the
|
||||||
// referenced values (as opposed to the memory addresses).
|
// referenced values (as opposed to the memory addresses).
|
||||||
func NotEqual(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
|
func NotEqual(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
if err := validateEqualArgs(expected, actual); err != nil {
|
if err := validateEqualArgs(expected, actual); err != nil {
|
||||||
return Fail(t, fmt.Sprintf("Invalid operation: %#v != %#v (%s)",
|
return Fail(t, fmt.Sprintf("Invalid operation: %#v != %#v (%s)",
|
||||||
expected, actual, err), msgAndArgs...)
|
expected, actual, err), msgAndArgs...)
|
||||||
@ -592,6 +667,9 @@ func includeElement(list interface{}, element interface{}) (ok, found bool) {
|
|||||||
// assert.Contains(t, ["Hello", "World"], "World")
|
// assert.Contains(t, ["Hello", "World"], "World")
|
||||||
// assert.Contains(t, {"Hello": "World"}, "Hello")
|
// assert.Contains(t, {"Hello": "World"}, "Hello")
|
||||||
func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool {
|
func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
|
||||||
ok, found := includeElement(s, contains)
|
ok, found := includeElement(s, contains)
|
||||||
if !ok {
|
if !ok {
|
||||||
@ -612,6 +690,9 @@ func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bo
|
|||||||
// assert.NotContains(t, ["Hello", "World"], "Earth")
|
// assert.NotContains(t, ["Hello", "World"], "Earth")
|
||||||
// assert.NotContains(t, {"Hello": "World"}, "Earth")
|
// assert.NotContains(t, {"Hello": "World"}, "Earth")
|
||||||
func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool {
|
func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
|
||||||
ok, found := includeElement(s, contains)
|
ok, found := includeElement(s, contains)
|
||||||
if !ok {
|
if !ok {
|
||||||
@ -630,6 +711,9 @@ func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{})
|
|||||||
//
|
//
|
||||||
// assert.Subset(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]")
|
// assert.Subset(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]")
|
||||||
func Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) {
|
func Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
if subset == nil {
|
if subset == nil {
|
||||||
return true // we consider nil to be equal to the nil set
|
return true // we consider nil to be equal to the nil set
|
||||||
}
|
}
|
||||||
@ -671,6 +755,9 @@ func Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok
|
|||||||
//
|
//
|
||||||
// assert.NotSubset(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]")
|
// assert.NotSubset(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]")
|
||||||
func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) {
|
func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
if subset == nil {
|
if subset == nil {
|
||||||
return Fail(t, fmt.Sprintf("nil is the empty set which is a subset of every set"), msgAndArgs...)
|
return Fail(t, fmt.Sprintf("nil is the empty set which is a subset of every set"), msgAndArgs...)
|
||||||
}
|
}
|
||||||
@ -713,6 +800,9 @@ func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{})
|
|||||||
//
|
//
|
||||||
// assert.ElementsMatch(t, [1, 3, 2, 3], [1, 3, 3, 2])
|
// assert.ElementsMatch(t, [1, 3, 2, 3], [1, 3, 3, 2])
|
||||||
func ElementsMatch(t TestingT, listA, listB interface{}, msgAndArgs ...interface{}) (ok bool) {
|
func ElementsMatch(t TestingT, listA, listB interface{}, msgAndArgs ...interface{}) (ok bool) {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
if isEmpty(listA) && isEmpty(listB) {
|
if isEmpty(listA) && isEmpty(listB) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -763,6 +853,9 @@ func ElementsMatch(t TestingT, listA, listB interface{}, msgAndArgs ...interface
|
|||||||
|
|
||||||
// Condition uses a Comparison to assert a complex condition.
|
// Condition uses a Comparison to assert a complex condition.
|
||||||
func Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool {
|
func Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
result := comp()
|
result := comp()
|
||||||
if !result {
|
if !result {
|
||||||
Fail(t, "Condition failed!", msgAndArgs...)
|
Fail(t, "Condition failed!", msgAndArgs...)
|
||||||
@ -800,9 +893,12 @@ func didPanic(f PanicTestFunc) (bool, interface{}) {
|
|||||||
//
|
//
|
||||||
// assert.Panics(t, func(){ GoCrazy() })
|
// assert.Panics(t, func(){ GoCrazy() })
|
||||||
func Panics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
func Panics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
|
||||||
if funcDidPanic, panicValue := didPanic(f); !funcDidPanic {
|
if funcDidPanic, panicValue := didPanic(f); !funcDidPanic {
|
||||||
return Fail(t, fmt.Sprintf("func %#v should panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...)
|
return Fail(t, fmt.Sprintf("func %#v should panic\n\tPanic value:\t%#v", f, panicValue), msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
@ -813,13 +909,16 @@ func Panics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
|||||||
//
|
//
|
||||||
// assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() })
|
// assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() })
|
||||||
func PanicsWithValue(t TestingT, expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
func PanicsWithValue(t TestingT, expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
|
||||||
funcDidPanic, panicValue := didPanic(f)
|
funcDidPanic, panicValue := didPanic(f)
|
||||||
if !funcDidPanic {
|
if !funcDidPanic {
|
||||||
return Fail(t, fmt.Sprintf("func %#v should panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...)
|
return Fail(t, fmt.Sprintf("func %#v should panic\n\tPanic value:\t%#v", f, panicValue), msgAndArgs...)
|
||||||
}
|
}
|
||||||
if panicValue != expected {
|
if panicValue != expected {
|
||||||
return Fail(t, fmt.Sprintf("func %#v should panic with value:\t%v\n\r\tPanic value:\t%v", f, expected, panicValue), msgAndArgs...)
|
return Fail(t, fmt.Sprintf("func %#v should panic with value:\t%#v\n\tPanic value:\t%#v", f, expected, panicValue), msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
@ -829,9 +928,12 @@ func PanicsWithValue(t TestingT, expected interface{}, f PanicTestFunc, msgAndAr
|
|||||||
//
|
//
|
||||||
// assert.NotPanics(t, func(){ RemainCalm() })
|
// assert.NotPanics(t, func(){ RemainCalm() })
|
||||||
func NotPanics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
func NotPanics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
|
||||||
if funcDidPanic, panicValue := didPanic(f); funcDidPanic {
|
if funcDidPanic, panicValue := didPanic(f); funcDidPanic {
|
||||||
return Fail(t, fmt.Sprintf("func %#v should not panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...)
|
return Fail(t, fmt.Sprintf("func %#v should not panic\n\tPanic value:\t%v", f, panicValue), msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
@ -841,6 +943,9 @@ func NotPanics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
|||||||
//
|
//
|
||||||
// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second)
|
// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second)
|
||||||
func WithinDuration(t TestingT, expected, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool {
|
func WithinDuration(t TestingT, expected, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
|
||||||
dt := expected.Sub(actual)
|
dt := expected.Sub(actual)
|
||||||
if dt < -delta || dt > delta {
|
if dt < -delta || dt > delta {
|
||||||
@ -890,6 +995,9 @@ func toFloat(x interface{}) (float64, bool) {
|
|||||||
//
|
//
|
||||||
// assert.InDelta(t, math.Pi, (22 / 7.0), 0.01)
|
// assert.InDelta(t, math.Pi, (22 / 7.0), 0.01)
|
||||||
func InDelta(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {
|
func InDelta(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
|
||||||
af, aok := toFloat(expected)
|
af, aok := toFloat(expected)
|
||||||
bf, bok := toFloat(actual)
|
bf, bok := toFloat(actual)
|
||||||
@ -916,6 +1024,9 @@ func InDelta(t TestingT, expected, actual interface{}, delta float64, msgAndArgs
|
|||||||
|
|
||||||
// InDeltaSlice is the same as InDelta, except it compares two slices.
|
// InDeltaSlice is the same as InDelta, except it compares two slices.
|
||||||
func InDeltaSlice(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {
|
func InDeltaSlice(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
if expected == nil || actual == nil ||
|
if expected == nil || actual == nil ||
|
||||||
reflect.TypeOf(actual).Kind() != reflect.Slice ||
|
reflect.TypeOf(actual).Kind() != reflect.Slice ||
|
||||||
reflect.TypeOf(expected).Kind() != reflect.Slice {
|
reflect.TypeOf(expected).Kind() != reflect.Slice {
|
||||||
@ -937,6 +1048,9 @@ func InDeltaSlice(t TestingT, expected, actual interface{}, delta float64, msgAn
|
|||||||
|
|
||||||
// InDeltaMapValues is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys.
|
// InDeltaMapValues is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys.
|
||||||
func InDeltaMapValues(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {
|
func InDeltaMapValues(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
if expected == nil || actual == nil ||
|
if expected == nil || actual == nil ||
|
||||||
reflect.TypeOf(actual).Kind() != reflect.Map ||
|
reflect.TypeOf(actual).Kind() != reflect.Map ||
|
||||||
reflect.TypeOf(expected).Kind() != reflect.Map {
|
reflect.TypeOf(expected).Kind() != reflect.Map {
|
||||||
@ -994,6 +1108,9 @@ func calcRelativeError(expected, actual interface{}) (float64, error) {
|
|||||||
|
|
||||||
// InEpsilon asserts that expected and actual have a relative error less than epsilon
|
// InEpsilon asserts that expected and actual have a relative error less than epsilon
|
||||||
func InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool {
|
func InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
actualEpsilon, err := calcRelativeError(expected, actual)
|
actualEpsilon, err := calcRelativeError(expected, actual)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Fail(t, err.Error(), msgAndArgs...)
|
return Fail(t, err.Error(), msgAndArgs...)
|
||||||
@ -1008,6 +1125,9 @@ func InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAnd
|
|||||||
|
|
||||||
// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices.
|
// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices.
|
||||||
func InEpsilonSlice(t TestingT, expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool {
|
func InEpsilonSlice(t TestingT, expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
if expected == nil || actual == nil ||
|
if expected == nil || actual == nil ||
|
||||||
reflect.TypeOf(actual).Kind() != reflect.Slice ||
|
reflect.TypeOf(actual).Kind() != reflect.Slice ||
|
||||||
reflect.TypeOf(expected).Kind() != reflect.Slice {
|
reflect.TypeOf(expected).Kind() != reflect.Slice {
|
||||||
@ -1038,6 +1158,9 @@ func InEpsilonSlice(t TestingT, expected, actual interface{}, epsilon float64, m
|
|||||||
// assert.Equal(t, expectedObj, actualObj)
|
// assert.Equal(t, expectedObj, actualObj)
|
||||||
// }
|
// }
|
||||||
func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool {
|
func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Fail(t, fmt.Sprintf("Received unexpected error:\n%+v", err), msgAndArgs...)
|
return Fail(t, fmt.Sprintf("Received unexpected error:\n%+v", err), msgAndArgs...)
|
||||||
}
|
}
|
||||||
@ -1052,6 +1175,9 @@ func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool {
|
|||||||
// assert.Equal(t, expectedError, err)
|
// assert.Equal(t, expectedError, err)
|
||||||
// }
|
// }
|
||||||
func Error(t TestingT, err error, msgAndArgs ...interface{}) bool {
|
func Error(t TestingT, err error, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return Fail(t, "An error is expected but got nil.", msgAndArgs...)
|
return Fail(t, "An error is expected but got nil.", msgAndArgs...)
|
||||||
@ -1066,6 +1192,9 @@ func Error(t TestingT, err error, msgAndArgs ...interface{}) bool {
|
|||||||
// actualObj, err := SomeFunction()
|
// actualObj, err := SomeFunction()
|
||||||
// assert.EqualError(t, err, expectedErrorString)
|
// assert.EqualError(t, err, expectedErrorString)
|
||||||
func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) bool {
|
func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
if !Error(t, theError, msgAndArgs...) {
|
if !Error(t, theError, msgAndArgs...) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@ -1099,6 +1228,9 @@ func matchRegexp(rx interface{}, str interface{}) bool {
|
|||||||
// assert.Regexp(t, regexp.MustCompile("start"), "it's starting")
|
// assert.Regexp(t, regexp.MustCompile("start"), "it's starting")
|
||||||
// assert.Regexp(t, "start...$", "it's not starting")
|
// assert.Regexp(t, "start...$", "it's not starting")
|
||||||
func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {
|
func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
|
||||||
match := matchRegexp(rx, str)
|
match := matchRegexp(rx, str)
|
||||||
|
|
||||||
@ -1114,6 +1246,9 @@ func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface
|
|||||||
// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting")
|
// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting")
|
||||||
// assert.NotRegexp(t, "^start", "it's not starting")
|
// assert.NotRegexp(t, "^start", "it's not starting")
|
||||||
func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {
|
func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
match := matchRegexp(rx, str)
|
match := matchRegexp(rx, str)
|
||||||
|
|
||||||
if match {
|
if match {
|
||||||
@ -1126,6 +1261,9 @@ func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interf
|
|||||||
|
|
||||||
// Zero asserts that i is the zero value for its type.
|
// Zero asserts that i is the zero value for its type.
|
||||||
func Zero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool {
|
func Zero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
if i != nil && !reflect.DeepEqual(i, reflect.Zero(reflect.TypeOf(i)).Interface()) {
|
if i != nil && !reflect.DeepEqual(i, reflect.Zero(reflect.TypeOf(i)).Interface()) {
|
||||||
return Fail(t, fmt.Sprintf("Should be zero, but was %v", i), msgAndArgs...)
|
return Fail(t, fmt.Sprintf("Should be zero, but was %v", i), msgAndArgs...)
|
||||||
}
|
}
|
||||||
@ -1134,6 +1272,9 @@ func Zero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool {
|
|||||||
|
|
||||||
// NotZero asserts that i is not the zero value for its type.
|
// NotZero asserts that i is not the zero value for its type.
|
||||||
func NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool {
|
func NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
if i == nil || reflect.DeepEqual(i, reflect.Zero(reflect.TypeOf(i)).Interface()) {
|
if i == nil || reflect.DeepEqual(i, reflect.Zero(reflect.TypeOf(i)).Interface()) {
|
||||||
return Fail(t, fmt.Sprintf("Should not be zero, but was %v", i), msgAndArgs...)
|
return Fail(t, fmt.Sprintf("Should not be zero, but was %v", i), msgAndArgs...)
|
||||||
}
|
}
|
||||||
@ -1142,6 +1283,9 @@ func NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool {
|
|||||||
|
|
||||||
// FileExists checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file.
|
// FileExists checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file.
|
||||||
func FileExists(t TestingT, path string, msgAndArgs ...interface{}) bool {
|
func FileExists(t TestingT, path string, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
info, err := os.Lstat(path)
|
info, err := os.Lstat(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
@ -1157,6 +1301,9 @@ func FileExists(t TestingT, path string, msgAndArgs ...interface{}) bool {
|
|||||||
|
|
||||||
// DirExists checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists.
|
// DirExists checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists.
|
||||||
func DirExists(t TestingT, path string, msgAndArgs ...interface{}) bool {
|
func DirExists(t TestingT, path string, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
info, err := os.Lstat(path)
|
info, err := os.Lstat(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
@ -1174,6 +1321,9 @@ func DirExists(t TestingT, path string, msgAndArgs ...interface{}) bool {
|
|||||||
//
|
//
|
||||||
// assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`)
|
// assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`)
|
||||||
func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) bool {
|
func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
var expectedJSONAsInterface, actualJSONAsInterface interface{}
|
var expectedJSONAsInterface, actualJSONAsInterface interface{}
|
||||||
|
|
||||||
if err := json.Unmarshal([]byte(expected), &expectedJSONAsInterface); err != nil {
|
if err := json.Unmarshal([]byte(expected), &expectedJSONAsInterface); err != nil {
|
||||||
@ -1199,7 +1349,7 @@ func typeAndKind(v interface{}) (reflect.Type, reflect.Kind) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// diff returns a diff of both values as long as both are of the same type and
|
// diff returns a diff of both values as long as both are of the same type and
|
||||||
// are a struct, map, slice or array. Otherwise it returns an empty string.
|
// are a struct, map, slice, array or string. Otherwise it returns an empty string.
|
||||||
func diff(expected interface{}, actual interface{}) string {
|
func diff(expected interface{}, actual interface{}) string {
|
||||||
if expected == nil || actual == nil {
|
if expected == nil || actual == nil {
|
||||||
return ""
|
return ""
|
||||||
@ -1212,12 +1362,18 @@ func diff(expected interface{}, actual interface{}) string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
if ek != reflect.Struct && ek != reflect.Map && ek != reflect.Slice && ek != reflect.Array {
|
if ek != reflect.Struct && ek != reflect.Map && ek != reflect.Slice && ek != reflect.Array && ek != reflect.String {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
e := spewConfig.Sdump(expected)
|
var e, a string
|
||||||
a := spewConfig.Sdump(actual)
|
if et != reflect.TypeOf("") {
|
||||||
|
e = spewConfig.Sdump(expected)
|
||||||
|
a = spewConfig.Sdump(actual)
|
||||||
|
} else {
|
||||||
|
e = expected.(string)
|
||||||
|
a = actual.(string)
|
||||||
|
}
|
||||||
|
|
||||||
diff, _ := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{
|
diff, _ := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{
|
||||||
A: difflib.SplitLines(e),
|
A: difflib.SplitLines(e),
|
||||||
@ -1254,3 +1410,7 @@ var spewConfig = spew.ConfigState{
|
|||||||
DisableCapacities: true,
|
DisableCapacities: true,
|
||||||
SortKeys: true,
|
SortKeys: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type tHelper interface {
|
||||||
|
Helper()
|
||||||
|
}
|
||||||
|
22
vendor/github.com/stretchr/testify/assert/http_assertions.go
generated
vendored
22
vendor/github.com/stretchr/testify/assert/http_assertions.go
generated
vendored
@ -12,10 +12,11 @@ import (
|
|||||||
// an error if building a new request fails.
|
// an error if building a new request fails.
|
||||||
func httpCode(handler http.HandlerFunc, method, url string, values url.Values) (int, error) {
|
func httpCode(handler http.HandlerFunc, method, url string, values url.Values) (int, error) {
|
||||||
w := httptest.NewRecorder()
|
w := httptest.NewRecorder()
|
||||||
req, err := http.NewRequest(method, url+"?"+values.Encode(), nil)
|
req, err := http.NewRequest(method, url, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return -1, err
|
return -1, err
|
||||||
}
|
}
|
||||||
|
req.URL.RawQuery = values.Encode()
|
||||||
handler(w, req)
|
handler(w, req)
|
||||||
return w.Code, nil
|
return w.Code, nil
|
||||||
}
|
}
|
||||||
@ -26,6 +27,9 @@ func httpCode(handler http.HandlerFunc, method, url string, values url.Values) (
|
|||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool {
|
func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
code, err := httpCode(handler, method, url, values)
|
code, err := httpCode(handler, method, url, values)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err))
|
Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err))
|
||||||
@ -46,6 +50,9 @@ func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, value
|
|||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool {
|
func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
code, err := httpCode(handler, method, url, values)
|
code, err := httpCode(handler, method, url, values)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err))
|
Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err))
|
||||||
@ -66,6 +73,9 @@ func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, valu
|
|||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool {
|
func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
code, err := httpCode(handler, method, url, values)
|
code, err := httpCode(handler, method, url, values)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err))
|
Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err))
|
||||||
@ -95,10 +105,13 @@ func HTTPBody(handler http.HandlerFunc, method, url string, values url.Values) s
|
|||||||
// HTTPBodyContains asserts that a specified handler returns a
|
// HTTPBodyContains asserts that a specified handler returns a
|
||||||
// body that contains a string.
|
// body that contains a string.
|
||||||
//
|
//
|
||||||
// assert.HTTPBodyContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky")
|
// assert.HTTPBodyContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky")
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool {
|
func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
body := HTTPBody(handler, method, url, values)
|
body := HTTPBody(handler, method, url, values)
|
||||||
|
|
||||||
contains := strings.Contains(body, fmt.Sprint(str))
|
contains := strings.Contains(body, fmt.Sprint(str))
|
||||||
@ -112,10 +125,13 @@ func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string,
|
|||||||
// HTTPBodyNotContains asserts that a specified handler returns a
|
// HTTPBodyNotContains asserts that a specified handler returns a
|
||||||
// body that does not contain a string.
|
// body that does not contain a string.
|
||||||
//
|
//
|
||||||
// assert.HTTPBodyNotContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky")
|
// assert.HTTPBodyNotContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky")
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool {
|
func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
body := HTTPBody(handler, method, url, values)
|
body := HTTPBody(handler, method, url, values)
|
||||||
|
|
||||||
contains := strings.Contains(body, fmt.Sprint(str))
|
contains := strings.Contains(body, fmt.Sprint(str))
|
||||||
|
387
vendor/golang.org/x/net/internal/iana/gen.go
generated
vendored
387
vendor/golang.org/x/net/internal/iana/gen.go
generated
vendored
@ -1,387 +0,0 @@
|
|||||||
// Copyright 2013 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
//go:generate go run gen.go
|
|
||||||
|
|
||||||
// This program generates internet protocol constants and tables by
|
|
||||||
// reading IANA protocol registries.
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/xml"
|
|
||||||
"fmt"
|
|
||||||
"go/format"
|
|
||||||
"io"
|
|
||||||
"io/ioutil"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
var registries = []struct {
|
|
||||||
url string
|
|
||||||
parse func(io.Writer, io.Reader) error
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
"https://www.iana.org/assignments/dscp-registry/dscp-registry.xml",
|
|
||||||
parseDSCPRegistry,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"https://www.iana.org/assignments/ipv4-tos-byte/ipv4-tos-byte.xml",
|
|
||||||
parseTOSTCByte,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml",
|
|
||||||
parseProtocolNumbers,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"http://www.iana.org/assignments/address-family-numbers/address-family-numbers.xml",
|
|
||||||
parseAddrFamilyNumbers,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
var bb bytes.Buffer
|
|
||||||
fmt.Fprintf(&bb, "// go generate gen.go\n")
|
|
||||||
fmt.Fprintf(&bb, "// Code generated by the command above; DO NOT EDIT.\n\n")
|
|
||||||
fmt.Fprintf(&bb, "// Package iana provides protocol number resources managed by the Internet Assigned Numbers Authority (IANA).\n")
|
|
||||||
fmt.Fprintf(&bb, `package iana // import "golang.org/x/net/internal/iana"`+"\n\n")
|
|
||||||
for _, r := range registries {
|
|
||||||
resp, err := http.Get(r.url)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Fprintln(os.Stderr, err)
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
defer resp.Body.Close()
|
|
||||||
if resp.StatusCode != http.StatusOK {
|
|
||||||
fmt.Fprintf(os.Stderr, "got HTTP status code %v for %v\n", resp.StatusCode, r.url)
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
if err := r.parse(&bb, resp.Body); err != nil {
|
|
||||||
fmt.Fprintln(os.Stderr, err)
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
fmt.Fprintf(&bb, "\n")
|
|
||||||
}
|
|
||||||
b, err := format.Source(bb.Bytes())
|
|
||||||
if err != nil {
|
|
||||||
fmt.Fprintln(os.Stderr, err)
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
if err := ioutil.WriteFile("const.go", b, 0644); err != nil {
|
|
||||||
fmt.Fprintln(os.Stderr, err)
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseDSCPRegistry(w io.Writer, r io.Reader) error {
|
|
||||||
dec := xml.NewDecoder(r)
|
|
||||||
var dr dscpRegistry
|
|
||||||
if err := dec.Decode(&dr); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
drs := dr.escape()
|
|
||||||
fmt.Fprintf(w, "// %s, Updated: %s\n", dr.Title, dr.Updated)
|
|
||||||
fmt.Fprintf(w, "const (\n")
|
|
||||||
for _, dr := range drs {
|
|
||||||
fmt.Fprintf(w, "DiffServ%s = %#x", dr.Name, dr.Value)
|
|
||||||
fmt.Fprintf(w, "// %s\n", dr.OrigName)
|
|
||||||
}
|
|
||||||
fmt.Fprintf(w, ")\n")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type dscpRegistry struct {
|
|
||||||
XMLName xml.Name `xml:"registry"`
|
|
||||||
Title string `xml:"title"`
|
|
||||||
Updated string `xml:"updated"`
|
|
||||||
Note string `xml:"note"`
|
|
||||||
RegTitle string `xml:"registry>title"`
|
|
||||||
PoolRecords []struct {
|
|
||||||
Name string `xml:"name"`
|
|
||||||
Space string `xml:"space"`
|
|
||||||
} `xml:"registry>record"`
|
|
||||||
Records []struct {
|
|
||||||
Name string `xml:"name"`
|
|
||||||
Space string `xml:"space"`
|
|
||||||
} `xml:"registry>registry>record"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type canonDSCPRecord struct {
|
|
||||||
OrigName string
|
|
||||||
Name string
|
|
||||||
Value int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (drr *dscpRegistry) escape() []canonDSCPRecord {
|
|
||||||
drs := make([]canonDSCPRecord, len(drr.Records))
|
|
||||||
sr := strings.NewReplacer(
|
|
||||||
"+", "",
|
|
||||||
"-", "",
|
|
||||||
"/", "",
|
|
||||||
".", "",
|
|
||||||
" ", "",
|
|
||||||
)
|
|
||||||
for i, dr := range drr.Records {
|
|
||||||
s := strings.TrimSpace(dr.Name)
|
|
||||||
drs[i].OrigName = s
|
|
||||||
drs[i].Name = sr.Replace(s)
|
|
||||||
n, err := strconv.ParseUint(dr.Space, 2, 8)
|
|
||||||
if err != nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
drs[i].Value = int(n) << 2
|
|
||||||
}
|
|
||||||
return drs
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseTOSTCByte(w io.Writer, r io.Reader) error {
|
|
||||||
dec := xml.NewDecoder(r)
|
|
||||||
var ttb tosTCByte
|
|
||||||
if err := dec.Decode(&ttb); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
trs := ttb.escape()
|
|
||||||
fmt.Fprintf(w, "// %s, Updated: %s\n", ttb.Title, ttb.Updated)
|
|
||||||
fmt.Fprintf(w, "const (\n")
|
|
||||||
for _, tr := range trs {
|
|
||||||
fmt.Fprintf(w, "%s = %#x", tr.Keyword, tr.Value)
|
|
||||||
fmt.Fprintf(w, "// %s\n", tr.OrigKeyword)
|
|
||||||
}
|
|
||||||
fmt.Fprintf(w, ")\n")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type tosTCByte struct {
|
|
||||||
XMLName xml.Name `xml:"registry"`
|
|
||||||
Title string `xml:"title"`
|
|
||||||
Updated string `xml:"updated"`
|
|
||||||
Note string `xml:"note"`
|
|
||||||
RegTitle string `xml:"registry>title"`
|
|
||||||
Records []struct {
|
|
||||||
Binary string `xml:"binary"`
|
|
||||||
Keyword string `xml:"keyword"`
|
|
||||||
} `xml:"registry>record"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type canonTOSTCByteRecord struct {
|
|
||||||
OrigKeyword string
|
|
||||||
Keyword string
|
|
||||||
Value int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ttb *tosTCByte) escape() []canonTOSTCByteRecord {
|
|
||||||
trs := make([]canonTOSTCByteRecord, len(ttb.Records))
|
|
||||||
sr := strings.NewReplacer(
|
|
||||||
"Capable", "",
|
|
||||||
"(", "",
|
|
||||||
")", "",
|
|
||||||
"+", "",
|
|
||||||
"-", "",
|
|
||||||
"/", "",
|
|
||||||
".", "",
|
|
||||||
" ", "",
|
|
||||||
)
|
|
||||||
for i, tr := range ttb.Records {
|
|
||||||
s := strings.TrimSpace(tr.Keyword)
|
|
||||||
trs[i].OrigKeyword = s
|
|
||||||
ss := strings.Split(s, " ")
|
|
||||||
if len(ss) > 1 {
|
|
||||||
trs[i].Keyword = strings.Join(ss[1:], " ")
|
|
||||||
} else {
|
|
||||||
trs[i].Keyword = ss[0]
|
|
||||||
}
|
|
||||||
trs[i].Keyword = sr.Replace(trs[i].Keyword)
|
|
||||||
n, err := strconv.ParseUint(tr.Binary, 2, 8)
|
|
||||||
if err != nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
trs[i].Value = int(n)
|
|
||||||
}
|
|
||||||
return trs
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseProtocolNumbers(w io.Writer, r io.Reader) error {
|
|
||||||
dec := xml.NewDecoder(r)
|
|
||||||
var pn protocolNumbers
|
|
||||||
if err := dec.Decode(&pn); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
prs := pn.escape()
|
|
||||||
prs = append([]canonProtocolRecord{{
|
|
||||||
Name: "IP",
|
|
||||||
Descr: "IPv4 encapsulation, pseudo protocol number",
|
|
||||||
Value: 0,
|
|
||||||
}}, prs...)
|
|
||||||
fmt.Fprintf(w, "// %s, Updated: %s\n", pn.Title, pn.Updated)
|
|
||||||
fmt.Fprintf(w, "const (\n")
|
|
||||||
for _, pr := range prs {
|
|
||||||
if pr.Name == "" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
fmt.Fprintf(w, "Protocol%s = %d", pr.Name, pr.Value)
|
|
||||||
s := pr.Descr
|
|
||||||
if s == "" {
|
|
||||||
s = pr.OrigName
|
|
||||||
}
|
|
||||||
fmt.Fprintf(w, "// %s\n", s)
|
|
||||||
}
|
|
||||||
fmt.Fprintf(w, ")\n")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type protocolNumbers struct {
|
|
||||||
XMLName xml.Name `xml:"registry"`
|
|
||||||
Title string `xml:"title"`
|
|
||||||
Updated string `xml:"updated"`
|
|
||||||
RegTitle string `xml:"registry>title"`
|
|
||||||
Note string `xml:"registry>note"`
|
|
||||||
Records []struct {
|
|
||||||
Value string `xml:"value"`
|
|
||||||
Name string `xml:"name"`
|
|
||||||
Descr string `xml:"description"`
|
|
||||||
} `xml:"registry>record"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type canonProtocolRecord struct {
|
|
||||||
OrigName string
|
|
||||||
Name string
|
|
||||||
Descr string
|
|
||||||
Value int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (pn *protocolNumbers) escape() []canonProtocolRecord {
|
|
||||||
prs := make([]canonProtocolRecord, len(pn.Records))
|
|
||||||
sr := strings.NewReplacer(
|
|
||||||
"-in-", "in",
|
|
||||||
"-within-", "within",
|
|
||||||
"-over-", "over",
|
|
||||||
"+", "P",
|
|
||||||
"-", "",
|
|
||||||
"/", "",
|
|
||||||
".", "",
|
|
||||||
" ", "",
|
|
||||||
)
|
|
||||||
for i, pr := range pn.Records {
|
|
||||||
if strings.Contains(pr.Name, "Deprecated") ||
|
|
||||||
strings.Contains(pr.Name, "deprecated") {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
prs[i].OrigName = pr.Name
|
|
||||||
s := strings.TrimSpace(pr.Name)
|
|
||||||
switch pr.Name {
|
|
||||||
case "ISIS over IPv4":
|
|
||||||
prs[i].Name = "ISIS"
|
|
||||||
case "manet":
|
|
||||||
prs[i].Name = "MANET"
|
|
||||||
default:
|
|
||||||
prs[i].Name = sr.Replace(s)
|
|
||||||
}
|
|
||||||
ss := strings.Split(pr.Descr, "\n")
|
|
||||||
for i := range ss {
|
|
||||||
ss[i] = strings.TrimSpace(ss[i])
|
|
||||||
}
|
|
||||||
if len(ss) > 1 {
|
|
||||||
prs[i].Descr = strings.Join(ss, " ")
|
|
||||||
} else {
|
|
||||||
prs[i].Descr = ss[0]
|
|
||||||
}
|
|
||||||
prs[i].Value, _ = strconv.Atoi(pr.Value)
|
|
||||||
}
|
|
||||||
return prs
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseAddrFamilyNumbers(w io.Writer, r io.Reader) error {
|
|
||||||
dec := xml.NewDecoder(r)
|
|
||||||
var afn addrFamilylNumbers
|
|
||||||
if err := dec.Decode(&afn); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
afrs := afn.escape()
|
|
||||||
fmt.Fprintf(w, "// %s, Updated: %s\n", afn.Title, afn.Updated)
|
|
||||||
fmt.Fprintf(w, "const (\n")
|
|
||||||
for _, afr := range afrs {
|
|
||||||
if afr.Name == "" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
fmt.Fprintf(w, "AddrFamily%s = %d", afr.Name, afr.Value)
|
|
||||||
fmt.Fprintf(w, "// %s\n", afr.Descr)
|
|
||||||
}
|
|
||||||
fmt.Fprintf(w, ")\n")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type addrFamilylNumbers struct {
|
|
||||||
XMLName xml.Name `xml:"registry"`
|
|
||||||
Title string `xml:"title"`
|
|
||||||
Updated string `xml:"updated"`
|
|
||||||
RegTitle string `xml:"registry>title"`
|
|
||||||
Note string `xml:"registry>note"`
|
|
||||||
Records []struct {
|
|
||||||
Value string `xml:"value"`
|
|
||||||
Descr string `xml:"description"`
|
|
||||||
} `xml:"registry>record"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type canonAddrFamilyRecord struct {
|
|
||||||
Name string
|
|
||||||
Descr string
|
|
||||||
Value int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (afn *addrFamilylNumbers) escape() []canonAddrFamilyRecord {
|
|
||||||
afrs := make([]canonAddrFamilyRecord, len(afn.Records))
|
|
||||||
sr := strings.NewReplacer(
|
|
||||||
"IP version 4", "IPv4",
|
|
||||||
"IP version 6", "IPv6",
|
|
||||||
"Identifier", "ID",
|
|
||||||
"-", "",
|
|
||||||
"-", "",
|
|
||||||
"/", "",
|
|
||||||
".", "",
|
|
||||||
" ", "",
|
|
||||||
)
|
|
||||||
for i, afr := range afn.Records {
|
|
||||||
if strings.Contains(afr.Descr, "Unassigned") ||
|
|
||||||
strings.Contains(afr.Descr, "Reserved") {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
afrs[i].Descr = afr.Descr
|
|
||||||
s := strings.TrimSpace(afr.Descr)
|
|
||||||
switch s {
|
|
||||||
case "IP (IP version 4)":
|
|
||||||
afrs[i].Name = "IPv4"
|
|
||||||
case "IP6 (IP version 6)":
|
|
||||||
afrs[i].Name = "IPv6"
|
|
||||||
case "AFI for L2VPN information":
|
|
||||||
afrs[i].Name = "L2VPN"
|
|
||||||
case "E.164 with NSAP format subaddress":
|
|
||||||
afrs[i].Name = "E164withSubaddress"
|
|
||||||
case "MT IP: Multi-Topology IP version 4":
|
|
||||||
afrs[i].Name = "MTIPv4"
|
|
||||||
case "MAC/24":
|
|
||||||
afrs[i].Name = "MACFinal24bits"
|
|
||||||
case "MAC/40":
|
|
||||||
afrs[i].Name = "MACFinal40bits"
|
|
||||||
case "IPv6/64":
|
|
||||||
afrs[i].Name = "IPv6Initial64bits"
|
|
||||||
default:
|
|
||||||
n := strings.Index(s, "(")
|
|
||||||
if n > 0 {
|
|
||||||
s = s[:n]
|
|
||||||
}
|
|
||||||
n = strings.Index(s, ":")
|
|
||||||
if n > 0 {
|
|
||||||
s = s[:n]
|
|
||||||
}
|
|
||||||
afrs[i].Name = sr.Replace(s)
|
|
||||||
}
|
|
||||||
afrs[i].Value, _ = strconv.Atoi(afr.Value)
|
|
||||||
}
|
|
||||||
return afrs
|
|
||||||
}
|
|
44
vendor/golang.org/x/net/internal/socket/defs_darwin.go
generated
vendored
44
vendor/golang.org/x/net/internal/socket/defs_darwin.go
generated
vendored
@ -1,44 +0,0 @@
|
|||||||
// Copyright 2017 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// +godefs map struct_in_addr [4]byte /* in_addr */
|
|
||||||
// +godefs map struct_in6_addr [16]byte /* in6_addr */
|
|
||||||
|
|
||||||
package socket
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <sys/socket.h>
|
|
||||||
|
|
||||||
#include <netinet/in.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = C.AF_UNSPEC
|
|
||||||
sysAF_INET = C.AF_INET
|
|
||||||
sysAF_INET6 = C.AF_INET6
|
|
||||||
|
|
||||||
sysSOCK_RAW = C.SOCK_RAW
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec C.struct_iovec
|
|
||||||
|
|
||||||
type msghdr C.struct_msghdr
|
|
||||||
|
|
||||||
type cmsghdr C.struct_cmsghdr
|
|
||||||
|
|
||||||
type sockaddrInet C.struct_sockaddr_in
|
|
||||||
|
|
||||||
type sockaddrInet6 C.struct_sockaddr_in6
|
|
||||||
|
|
||||||
const (
|
|
||||||
sizeofIovec = C.sizeof_struct_iovec
|
|
||||||
sizeofMsghdr = C.sizeof_struct_msghdr
|
|
||||||
sizeofCmsghdr = C.sizeof_struct_cmsghdr
|
|
||||||
|
|
||||||
sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
|
|
||||||
sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
|
|
||||||
)
|
|
44
vendor/golang.org/x/net/internal/socket/defs_dragonfly.go
generated
vendored
44
vendor/golang.org/x/net/internal/socket/defs_dragonfly.go
generated
vendored
@ -1,44 +0,0 @@
|
|||||||
// Copyright 2017 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// +godefs map struct_in_addr [4]byte /* in_addr */
|
|
||||||
// +godefs map struct_in6_addr [16]byte /* in6_addr */
|
|
||||||
|
|
||||||
package socket
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <sys/socket.h>
|
|
||||||
|
|
||||||
#include <netinet/in.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = C.AF_UNSPEC
|
|
||||||
sysAF_INET = C.AF_INET
|
|
||||||
sysAF_INET6 = C.AF_INET6
|
|
||||||
|
|
||||||
sysSOCK_RAW = C.SOCK_RAW
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec C.struct_iovec
|
|
||||||
|
|
||||||
type msghdr C.struct_msghdr
|
|
||||||
|
|
||||||
type cmsghdr C.struct_cmsghdr
|
|
||||||
|
|
||||||
type sockaddrInet C.struct_sockaddr_in
|
|
||||||
|
|
||||||
type sockaddrInet6 C.struct_sockaddr_in6
|
|
||||||
|
|
||||||
const (
|
|
||||||
sizeofIovec = C.sizeof_struct_iovec
|
|
||||||
sizeofMsghdr = C.sizeof_struct_msghdr
|
|
||||||
sizeofCmsghdr = C.sizeof_struct_cmsghdr
|
|
||||||
|
|
||||||
sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
|
|
||||||
sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
|
|
||||||
)
|
|
44
vendor/golang.org/x/net/internal/socket/defs_freebsd.go
generated
vendored
44
vendor/golang.org/x/net/internal/socket/defs_freebsd.go
generated
vendored
@ -1,44 +0,0 @@
|
|||||||
// Copyright 2017 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// +godefs map struct_in_addr [4]byte /* in_addr */
|
|
||||||
// +godefs map struct_in6_addr [16]byte /* in6_addr */
|
|
||||||
|
|
||||||
package socket
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <sys/socket.h>
|
|
||||||
|
|
||||||
#include <netinet/in.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = C.AF_UNSPEC
|
|
||||||
sysAF_INET = C.AF_INET
|
|
||||||
sysAF_INET6 = C.AF_INET6
|
|
||||||
|
|
||||||
sysSOCK_RAW = C.SOCK_RAW
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec C.struct_iovec
|
|
||||||
|
|
||||||
type msghdr C.struct_msghdr
|
|
||||||
|
|
||||||
type cmsghdr C.struct_cmsghdr
|
|
||||||
|
|
||||||
type sockaddrInet C.struct_sockaddr_in
|
|
||||||
|
|
||||||
type sockaddrInet6 C.struct_sockaddr_in6
|
|
||||||
|
|
||||||
const (
|
|
||||||
sizeofIovec = C.sizeof_struct_iovec
|
|
||||||
sizeofMsghdr = C.sizeof_struct_msghdr
|
|
||||||
sizeofCmsghdr = C.sizeof_struct_cmsghdr
|
|
||||||
|
|
||||||
sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
|
|
||||||
sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
|
|
||||||
)
|
|
49
vendor/golang.org/x/net/internal/socket/defs_linux.go
generated
vendored
49
vendor/golang.org/x/net/internal/socket/defs_linux.go
generated
vendored
@ -1,49 +0,0 @@
|
|||||||
// Copyright 2017 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// +godefs map struct_in_addr [4]byte /* in_addr */
|
|
||||||
// +godefs map struct_in6_addr [16]byte /* in6_addr */
|
|
||||||
|
|
||||||
package socket
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <linux/in.h>
|
|
||||||
#include <linux/in6.h>
|
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <sys/socket.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = C.AF_UNSPEC
|
|
||||||
sysAF_INET = C.AF_INET
|
|
||||||
sysAF_INET6 = C.AF_INET6
|
|
||||||
|
|
||||||
sysSOCK_RAW = C.SOCK_RAW
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec C.struct_iovec
|
|
||||||
|
|
||||||
type msghdr C.struct_msghdr
|
|
||||||
|
|
||||||
type mmsghdr C.struct_mmsghdr
|
|
||||||
|
|
||||||
type cmsghdr C.struct_cmsghdr
|
|
||||||
|
|
||||||
type sockaddrInet C.struct_sockaddr_in
|
|
||||||
|
|
||||||
type sockaddrInet6 C.struct_sockaddr_in6
|
|
||||||
|
|
||||||
const (
|
|
||||||
sizeofIovec = C.sizeof_struct_iovec
|
|
||||||
sizeofMsghdr = C.sizeof_struct_msghdr
|
|
||||||
sizeofMmsghdr = C.sizeof_struct_mmsghdr
|
|
||||||
sizeofCmsghdr = C.sizeof_struct_cmsghdr
|
|
||||||
|
|
||||||
sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
|
|
||||||
sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
|
|
||||||
)
|
|
47
vendor/golang.org/x/net/internal/socket/defs_netbsd.go
generated
vendored
47
vendor/golang.org/x/net/internal/socket/defs_netbsd.go
generated
vendored
@ -1,47 +0,0 @@
|
|||||||
// Copyright 2017 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// +godefs map struct_in_addr [4]byte /* in_addr */
|
|
||||||
// +godefs map struct_in6_addr [16]byte /* in6_addr */
|
|
||||||
|
|
||||||
package socket
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <sys/socket.h>
|
|
||||||
|
|
||||||
#include <netinet/in.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = C.AF_UNSPEC
|
|
||||||
sysAF_INET = C.AF_INET
|
|
||||||
sysAF_INET6 = C.AF_INET6
|
|
||||||
|
|
||||||
sysSOCK_RAW = C.SOCK_RAW
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec C.struct_iovec
|
|
||||||
|
|
||||||
type msghdr C.struct_msghdr
|
|
||||||
|
|
||||||
type mmsghdr C.struct_mmsghdr
|
|
||||||
|
|
||||||
type cmsghdr C.struct_cmsghdr
|
|
||||||
|
|
||||||
type sockaddrInet C.struct_sockaddr_in
|
|
||||||
|
|
||||||
type sockaddrInet6 C.struct_sockaddr_in6
|
|
||||||
|
|
||||||
const (
|
|
||||||
sizeofIovec = C.sizeof_struct_iovec
|
|
||||||
sizeofMsghdr = C.sizeof_struct_msghdr
|
|
||||||
sizeofMmsghdr = C.sizeof_struct_mmsghdr
|
|
||||||
sizeofCmsghdr = C.sizeof_struct_cmsghdr
|
|
||||||
|
|
||||||
sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
|
|
||||||
sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
|
|
||||||
)
|
|
44
vendor/golang.org/x/net/internal/socket/defs_openbsd.go
generated
vendored
44
vendor/golang.org/x/net/internal/socket/defs_openbsd.go
generated
vendored
@ -1,44 +0,0 @@
|
|||||||
// Copyright 2017 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// +godefs map struct_in_addr [4]byte /* in_addr */
|
|
||||||
// +godefs map struct_in6_addr [16]byte /* in6_addr */
|
|
||||||
|
|
||||||
package socket
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <sys/socket.h>
|
|
||||||
|
|
||||||
#include <netinet/in.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = C.AF_UNSPEC
|
|
||||||
sysAF_INET = C.AF_INET
|
|
||||||
sysAF_INET6 = C.AF_INET6
|
|
||||||
|
|
||||||
sysSOCK_RAW = C.SOCK_RAW
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec C.struct_iovec
|
|
||||||
|
|
||||||
type msghdr C.struct_msghdr
|
|
||||||
|
|
||||||
type cmsghdr C.struct_cmsghdr
|
|
||||||
|
|
||||||
type sockaddrInet C.struct_sockaddr_in
|
|
||||||
|
|
||||||
type sockaddrInet6 C.struct_sockaddr_in6
|
|
||||||
|
|
||||||
const (
|
|
||||||
sizeofIovec = C.sizeof_struct_iovec
|
|
||||||
sizeofMsghdr = C.sizeof_struct_msghdr
|
|
||||||
sizeofCmsghdr = C.sizeof_struct_cmsghdr
|
|
||||||
|
|
||||||
sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
|
|
||||||
sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
|
|
||||||
)
|
|
44
vendor/golang.org/x/net/internal/socket/defs_solaris.go
generated
vendored
44
vendor/golang.org/x/net/internal/socket/defs_solaris.go
generated
vendored
@ -1,44 +0,0 @@
|
|||||||
// Copyright 2017 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// +godefs map struct_in_addr [4]byte /* in_addr */
|
|
||||||
// +godefs map struct_in6_addr [16]byte /* in6_addr */
|
|
||||||
|
|
||||||
package socket
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <sys/socket.h>
|
|
||||||
|
|
||||||
#include <netinet/in.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = C.AF_UNSPEC
|
|
||||||
sysAF_INET = C.AF_INET
|
|
||||||
sysAF_INET6 = C.AF_INET6
|
|
||||||
|
|
||||||
sysSOCK_RAW = C.SOCK_RAW
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec C.struct_iovec
|
|
||||||
|
|
||||||
type msghdr C.struct_msghdr
|
|
||||||
|
|
||||||
type cmsghdr C.struct_cmsghdr
|
|
||||||
|
|
||||||
type sockaddrInet C.struct_sockaddr_in
|
|
||||||
|
|
||||||
type sockaddrInet6 C.struct_sockaddr_in6
|
|
||||||
|
|
||||||
const (
|
|
||||||
sizeofIovec = C.sizeof_struct_iovec
|
|
||||||
sizeofMsghdr = C.sizeof_struct_msghdr
|
|
||||||
sizeofCmsghdr = C.sizeof_struct_cmsghdr
|
|
||||||
|
|
||||||
sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
|
|
||||||
sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
|
|
||||||
)
|
|
77
vendor/golang.org/x/net/ipv4/defs_darwin.go
generated
vendored
77
vendor/golang.org/x/net/ipv4/defs_darwin.go
generated
vendored
@ -1,77 +0,0 @@
|
|||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// +godefs map struct_in_addr [4]byte /* in_addr */
|
|
||||||
|
|
||||||
package ipv4
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <sys/socket.h>
|
|
||||||
|
|
||||||
#include <netinet/in.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
const (
|
|
||||||
sysIP_OPTIONS = C.IP_OPTIONS
|
|
||||||
sysIP_HDRINCL = C.IP_HDRINCL
|
|
||||||
sysIP_TOS = C.IP_TOS
|
|
||||||
sysIP_TTL = C.IP_TTL
|
|
||||||
sysIP_RECVOPTS = C.IP_RECVOPTS
|
|
||||||
sysIP_RECVRETOPTS = C.IP_RECVRETOPTS
|
|
||||||
sysIP_RECVDSTADDR = C.IP_RECVDSTADDR
|
|
||||||
sysIP_RETOPTS = C.IP_RETOPTS
|
|
||||||
sysIP_RECVIF = C.IP_RECVIF
|
|
||||||
sysIP_STRIPHDR = C.IP_STRIPHDR
|
|
||||||
sysIP_RECVTTL = C.IP_RECVTTL
|
|
||||||
sysIP_BOUND_IF = C.IP_BOUND_IF
|
|
||||||
sysIP_PKTINFO = C.IP_PKTINFO
|
|
||||||
sysIP_RECVPKTINFO = C.IP_RECVPKTINFO
|
|
||||||
|
|
||||||
sysIP_MULTICAST_IF = C.IP_MULTICAST_IF
|
|
||||||
sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL
|
|
||||||
sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP
|
|
||||||
sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP
|
|
||||||
sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP
|
|
||||||
sysIP_MULTICAST_VIF = C.IP_MULTICAST_VIF
|
|
||||||
sysIP_MULTICAST_IFINDEX = C.IP_MULTICAST_IFINDEX
|
|
||||||
sysIP_ADD_SOURCE_MEMBERSHIP = C.IP_ADD_SOURCE_MEMBERSHIP
|
|
||||||
sysIP_DROP_SOURCE_MEMBERSHIP = C.IP_DROP_SOURCE_MEMBERSHIP
|
|
||||||
sysIP_BLOCK_SOURCE = C.IP_BLOCK_SOURCE
|
|
||||||
sysIP_UNBLOCK_SOURCE = C.IP_UNBLOCK_SOURCE
|
|
||||||
sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP
|
|
||||||
sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP
|
|
||||||
sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP
|
|
||||||
sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP
|
|
||||||
sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE
|
|
||||||
sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE
|
|
||||||
|
|
||||||
sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage
|
|
||||||
sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
|
|
||||||
sizeofInetPktinfo = C.sizeof_struct_in_pktinfo
|
|
||||||
|
|
||||||
sizeofIPMreq = C.sizeof_struct_ip_mreq
|
|
||||||
sizeofIPMreqn = C.sizeof_struct_ip_mreqn
|
|
||||||
sizeofIPMreqSource = C.sizeof_struct_ip_mreq_source
|
|
||||||
sizeofGroupReq = C.sizeof_struct_group_req
|
|
||||||
sizeofGroupSourceReq = C.sizeof_struct_group_source_req
|
|
||||||
)
|
|
||||||
|
|
||||||
type sockaddrStorage C.struct_sockaddr_storage
|
|
||||||
|
|
||||||
type sockaddrInet C.struct_sockaddr_in
|
|
||||||
|
|
||||||
type inetPktinfo C.struct_in_pktinfo
|
|
||||||
|
|
||||||
type ipMreq C.struct_ip_mreq
|
|
||||||
|
|
||||||
type ipMreqn C.struct_ip_mreqn
|
|
||||||
|
|
||||||
type ipMreqSource C.struct_ip_mreq_source
|
|
||||||
|
|
||||||
type groupReq C.struct_group_req
|
|
||||||
|
|
||||||
type groupSourceReq C.struct_group_source_req
|
|
38
vendor/golang.org/x/net/ipv4/defs_dragonfly.go
generated
vendored
38
vendor/golang.org/x/net/ipv4/defs_dragonfly.go
generated
vendored
@ -1,38 +0,0 @@
|
|||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// +godefs map struct_in_addr [4]byte /* in_addr */
|
|
||||||
|
|
||||||
package ipv4
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <netinet/in.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
const (
|
|
||||||
sysIP_OPTIONS = C.IP_OPTIONS
|
|
||||||
sysIP_HDRINCL = C.IP_HDRINCL
|
|
||||||
sysIP_TOS = C.IP_TOS
|
|
||||||
sysIP_TTL = C.IP_TTL
|
|
||||||
sysIP_RECVOPTS = C.IP_RECVOPTS
|
|
||||||
sysIP_RECVRETOPTS = C.IP_RECVRETOPTS
|
|
||||||
sysIP_RECVDSTADDR = C.IP_RECVDSTADDR
|
|
||||||
sysIP_RETOPTS = C.IP_RETOPTS
|
|
||||||
sysIP_RECVIF = C.IP_RECVIF
|
|
||||||
sysIP_RECVTTL = C.IP_RECVTTL
|
|
||||||
|
|
||||||
sysIP_MULTICAST_IF = C.IP_MULTICAST_IF
|
|
||||||
sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL
|
|
||||||
sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP
|
|
||||||
sysIP_MULTICAST_VIF = C.IP_MULTICAST_VIF
|
|
||||||
sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP
|
|
||||||
sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP
|
|
||||||
|
|
||||||
sizeofIPMreq = C.sizeof_struct_ip_mreq
|
|
||||||
)
|
|
||||||
|
|
||||||
type ipMreq C.struct_ip_mreq
|
|
75
vendor/golang.org/x/net/ipv4/defs_freebsd.go
generated
vendored
75
vendor/golang.org/x/net/ipv4/defs_freebsd.go
generated
vendored
@ -1,75 +0,0 @@
|
|||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// +godefs map struct_in_addr [4]byte /* in_addr */
|
|
||||||
|
|
||||||
package ipv4
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <sys/socket.h>
|
|
||||||
|
|
||||||
#include <netinet/in.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
const (
|
|
||||||
sysIP_OPTIONS = C.IP_OPTIONS
|
|
||||||
sysIP_HDRINCL = C.IP_HDRINCL
|
|
||||||
sysIP_TOS = C.IP_TOS
|
|
||||||
sysIP_TTL = C.IP_TTL
|
|
||||||
sysIP_RECVOPTS = C.IP_RECVOPTS
|
|
||||||
sysIP_RECVRETOPTS = C.IP_RECVRETOPTS
|
|
||||||
sysIP_RECVDSTADDR = C.IP_RECVDSTADDR
|
|
||||||
sysIP_SENDSRCADDR = C.IP_SENDSRCADDR
|
|
||||||
sysIP_RETOPTS = C.IP_RETOPTS
|
|
||||||
sysIP_RECVIF = C.IP_RECVIF
|
|
||||||
sysIP_ONESBCAST = C.IP_ONESBCAST
|
|
||||||
sysIP_BINDANY = C.IP_BINDANY
|
|
||||||
sysIP_RECVTTL = C.IP_RECVTTL
|
|
||||||
sysIP_MINTTL = C.IP_MINTTL
|
|
||||||
sysIP_DONTFRAG = C.IP_DONTFRAG
|
|
||||||
sysIP_RECVTOS = C.IP_RECVTOS
|
|
||||||
|
|
||||||
sysIP_MULTICAST_IF = C.IP_MULTICAST_IF
|
|
||||||
sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL
|
|
||||||
sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP
|
|
||||||
sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP
|
|
||||||
sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP
|
|
||||||
sysIP_MULTICAST_VIF = C.IP_MULTICAST_VIF
|
|
||||||
sysIP_ADD_SOURCE_MEMBERSHIP = C.IP_ADD_SOURCE_MEMBERSHIP
|
|
||||||
sysIP_DROP_SOURCE_MEMBERSHIP = C.IP_DROP_SOURCE_MEMBERSHIP
|
|
||||||
sysIP_BLOCK_SOURCE = C.IP_BLOCK_SOURCE
|
|
||||||
sysIP_UNBLOCK_SOURCE = C.IP_UNBLOCK_SOURCE
|
|
||||||
sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP
|
|
||||||
sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP
|
|
||||||
sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP
|
|
||||||
sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP
|
|
||||||
sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE
|
|
||||||
sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE
|
|
||||||
|
|
||||||
sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage
|
|
||||||
sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
|
|
||||||
|
|
||||||
sizeofIPMreq = C.sizeof_struct_ip_mreq
|
|
||||||
sizeofIPMreqn = C.sizeof_struct_ip_mreqn
|
|
||||||
sizeofIPMreqSource = C.sizeof_struct_ip_mreq_source
|
|
||||||
sizeofGroupReq = C.sizeof_struct_group_req
|
|
||||||
sizeofGroupSourceReq = C.sizeof_struct_group_source_req
|
|
||||||
)
|
|
||||||
|
|
||||||
type sockaddrStorage C.struct_sockaddr_storage
|
|
||||||
|
|
||||||
type sockaddrInet C.struct_sockaddr_in
|
|
||||||
|
|
||||||
type ipMreq C.struct_ip_mreq
|
|
||||||
|
|
||||||
type ipMreqn C.struct_ip_mreqn
|
|
||||||
|
|
||||||
type ipMreqSource C.struct_ip_mreq_source
|
|
||||||
|
|
||||||
type groupReq C.struct_group_req
|
|
||||||
|
|
||||||
type groupSourceReq C.struct_group_source_req
|
|
122
vendor/golang.org/x/net/ipv4/defs_linux.go
generated
vendored
122
vendor/golang.org/x/net/ipv4/defs_linux.go
generated
vendored
@ -1,122 +0,0 @@
|
|||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// +godefs map struct_in_addr [4]byte /* in_addr */
|
|
||||||
|
|
||||||
package ipv4
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
#include <linux/errqueue.h>
|
|
||||||
#include <linux/icmp.h>
|
|
||||||
#include <linux/in.h>
|
|
||||||
#include <linux/filter.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
const (
|
|
||||||
sysIP_TOS = C.IP_TOS
|
|
||||||
sysIP_TTL = C.IP_TTL
|
|
||||||
sysIP_HDRINCL = C.IP_HDRINCL
|
|
||||||
sysIP_OPTIONS = C.IP_OPTIONS
|
|
||||||
sysIP_ROUTER_ALERT = C.IP_ROUTER_ALERT
|
|
||||||
sysIP_RECVOPTS = C.IP_RECVOPTS
|
|
||||||
sysIP_RETOPTS = C.IP_RETOPTS
|
|
||||||
sysIP_PKTINFO = C.IP_PKTINFO
|
|
||||||
sysIP_PKTOPTIONS = C.IP_PKTOPTIONS
|
|
||||||
sysIP_MTU_DISCOVER = C.IP_MTU_DISCOVER
|
|
||||||
sysIP_RECVERR = C.IP_RECVERR
|
|
||||||
sysIP_RECVTTL = C.IP_RECVTTL
|
|
||||||
sysIP_RECVTOS = C.IP_RECVTOS
|
|
||||||
sysIP_MTU = C.IP_MTU
|
|
||||||
sysIP_FREEBIND = C.IP_FREEBIND
|
|
||||||
sysIP_TRANSPARENT = C.IP_TRANSPARENT
|
|
||||||
sysIP_RECVRETOPTS = C.IP_RECVRETOPTS
|
|
||||||
sysIP_ORIGDSTADDR = C.IP_ORIGDSTADDR
|
|
||||||
sysIP_RECVORIGDSTADDR = C.IP_RECVORIGDSTADDR
|
|
||||||
sysIP_MINTTL = C.IP_MINTTL
|
|
||||||
sysIP_NODEFRAG = C.IP_NODEFRAG
|
|
||||||
sysIP_UNICAST_IF = C.IP_UNICAST_IF
|
|
||||||
|
|
||||||
sysIP_MULTICAST_IF = C.IP_MULTICAST_IF
|
|
||||||
sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL
|
|
||||||
sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP
|
|
||||||
sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP
|
|
||||||
sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP
|
|
||||||
sysIP_UNBLOCK_SOURCE = C.IP_UNBLOCK_SOURCE
|
|
||||||
sysIP_BLOCK_SOURCE = C.IP_BLOCK_SOURCE
|
|
||||||
sysIP_ADD_SOURCE_MEMBERSHIP = C.IP_ADD_SOURCE_MEMBERSHIP
|
|
||||||
sysIP_DROP_SOURCE_MEMBERSHIP = C.IP_DROP_SOURCE_MEMBERSHIP
|
|
||||||
sysIP_MSFILTER = C.IP_MSFILTER
|
|
||||||
sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP
|
|
||||||
sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP
|
|
||||||
sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP
|
|
||||||
sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP
|
|
||||||
sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE
|
|
||||||
sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE
|
|
||||||
sysMCAST_MSFILTER = C.MCAST_MSFILTER
|
|
||||||
sysIP_MULTICAST_ALL = C.IP_MULTICAST_ALL
|
|
||||||
|
|
||||||
//sysIP_PMTUDISC_DONT = C.IP_PMTUDISC_DONT
|
|
||||||
//sysIP_PMTUDISC_WANT = C.IP_PMTUDISC_WANT
|
|
||||||
//sysIP_PMTUDISC_DO = C.IP_PMTUDISC_DO
|
|
||||||
//sysIP_PMTUDISC_PROBE = C.IP_PMTUDISC_PROBE
|
|
||||||
//sysIP_PMTUDISC_INTERFACE = C.IP_PMTUDISC_INTERFACE
|
|
||||||
//sysIP_PMTUDISC_OMIT = C.IP_PMTUDISC_OMIT
|
|
||||||
|
|
||||||
sysICMP_FILTER = C.ICMP_FILTER
|
|
||||||
|
|
||||||
sysSO_EE_ORIGIN_NONE = C.SO_EE_ORIGIN_NONE
|
|
||||||
sysSO_EE_ORIGIN_LOCAL = C.SO_EE_ORIGIN_LOCAL
|
|
||||||
sysSO_EE_ORIGIN_ICMP = C.SO_EE_ORIGIN_ICMP
|
|
||||||
sysSO_EE_ORIGIN_ICMP6 = C.SO_EE_ORIGIN_ICMP6
|
|
||||||
sysSO_EE_ORIGIN_TXSTATUS = C.SO_EE_ORIGIN_TXSTATUS
|
|
||||||
sysSO_EE_ORIGIN_TIMESTAMPING = C.SO_EE_ORIGIN_TIMESTAMPING
|
|
||||||
|
|
||||||
sysSOL_SOCKET = C.SOL_SOCKET
|
|
||||||
sysSO_ATTACH_FILTER = C.SO_ATTACH_FILTER
|
|
||||||
|
|
||||||
sizeofKernelSockaddrStorage = C.sizeof_struct___kernel_sockaddr_storage
|
|
||||||
sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
|
|
||||||
sizeofInetPktinfo = C.sizeof_struct_in_pktinfo
|
|
||||||
sizeofSockExtendedErr = C.sizeof_struct_sock_extended_err
|
|
||||||
|
|
||||||
sizeofIPMreq = C.sizeof_struct_ip_mreq
|
|
||||||
sizeofIPMreqn = C.sizeof_struct_ip_mreqn
|
|
||||||
sizeofIPMreqSource = C.sizeof_struct_ip_mreq_source
|
|
||||||
sizeofGroupReq = C.sizeof_struct_group_req
|
|
||||||
sizeofGroupSourceReq = C.sizeof_struct_group_source_req
|
|
||||||
|
|
||||||
sizeofICMPFilter = C.sizeof_struct_icmp_filter
|
|
||||||
|
|
||||||
sizeofSockFprog = C.sizeof_struct_sock_fprog
|
|
||||||
)
|
|
||||||
|
|
||||||
type kernelSockaddrStorage C.struct___kernel_sockaddr_storage
|
|
||||||
|
|
||||||
type sockaddrInet C.struct_sockaddr_in
|
|
||||||
|
|
||||||
type inetPktinfo C.struct_in_pktinfo
|
|
||||||
|
|
||||||
type sockExtendedErr C.struct_sock_extended_err
|
|
||||||
|
|
||||||
type ipMreq C.struct_ip_mreq
|
|
||||||
|
|
||||||
type ipMreqn C.struct_ip_mreqn
|
|
||||||
|
|
||||||
type ipMreqSource C.struct_ip_mreq_source
|
|
||||||
|
|
||||||
type groupReq C.struct_group_req
|
|
||||||
|
|
||||||
type groupSourceReq C.struct_group_source_req
|
|
||||||
|
|
||||||
type icmpFilter C.struct_icmp_filter
|
|
||||||
|
|
||||||
type sockFProg C.struct_sock_fprog
|
|
||||||
|
|
||||||
type sockFilter C.struct_sock_filter
|
|
37
vendor/golang.org/x/net/ipv4/defs_netbsd.go
generated
vendored
37
vendor/golang.org/x/net/ipv4/defs_netbsd.go
generated
vendored
@ -1,37 +0,0 @@
|
|||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// +godefs map struct_in_addr [4]byte /* in_addr */
|
|
||||||
|
|
||||||
package ipv4
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <netinet/in.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
const (
|
|
||||||
sysIP_OPTIONS = C.IP_OPTIONS
|
|
||||||
sysIP_HDRINCL = C.IP_HDRINCL
|
|
||||||
sysIP_TOS = C.IP_TOS
|
|
||||||
sysIP_TTL = C.IP_TTL
|
|
||||||
sysIP_RECVOPTS = C.IP_RECVOPTS
|
|
||||||
sysIP_RECVRETOPTS = C.IP_RECVRETOPTS
|
|
||||||
sysIP_RECVDSTADDR = C.IP_RECVDSTADDR
|
|
||||||
sysIP_RETOPTS = C.IP_RETOPTS
|
|
||||||
sysIP_RECVIF = C.IP_RECVIF
|
|
||||||
sysIP_RECVTTL = C.IP_RECVTTL
|
|
||||||
|
|
||||||
sysIP_MULTICAST_IF = C.IP_MULTICAST_IF
|
|
||||||
sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL
|
|
||||||
sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP
|
|
||||||
sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP
|
|
||||||
sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP
|
|
||||||
|
|
||||||
sizeofIPMreq = C.sizeof_struct_ip_mreq
|
|
||||||
)
|
|
||||||
|
|
||||||
type ipMreq C.struct_ip_mreq
|
|
37
vendor/golang.org/x/net/ipv4/defs_openbsd.go
generated
vendored
37
vendor/golang.org/x/net/ipv4/defs_openbsd.go
generated
vendored
@ -1,37 +0,0 @@
|
|||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// +godefs map struct_in_addr [4]byte /* in_addr */
|
|
||||||
|
|
||||||
package ipv4
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <netinet/in.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
const (
|
|
||||||
sysIP_OPTIONS = C.IP_OPTIONS
|
|
||||||
sysIP_HDRINCL = C.IP_HDRINCL
|
|
||||||
sysIP_TOS = C.IP_TOS
|
|
||||||
sysIP_TTL = C.IP_TTL
|
|
||||||
sysIP_RECVOPTS = C.IP_RECVOPTS
|
|
||||||
sysIP_RECVRETOPTS = C.IP_RECVRETOPTS
|
|
||||||
sysIP_RECVDSTADDR = C.IP_RECVDSTADDR
|
|
||||||
sysIP_RETOPTS = C.IP_RETOPTS
|
|
||||||
sysIP_RECVIF = C.IP_RECVIF
|
|
||||||
sysIP_RECVTTL = C.IP_RECVTTL
|
|
||||||
|
|
||||||
sysIP_MULTICAST_IF = C.IP_MULTICAST_IF
|
|
||||||
sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL
|
|
||||||
sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP
|
|
||||||
sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP
|
|
||||||
sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP
|
|
||||||
|
|
||||||
sizeofIPMreq = C.sizeof_struct_ip_mreq
|
|
||||||
)
|
|
||||||
|
|
||||||
type ipMreq C.struct_ip_mreq
|
|
84
vendor/golang.org/x/net/ipv4/defs_solaris.go
generated
vendored
84
vendor/golang.org/x/net/ipv4/defs_solaris.go
generated
vendored
@ -1,84 +0,0 @@
|
|||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// +godefs map struct_in_addr [4]byte /* in_addr */
|
|
||||||
|
|
||||||
package ipv4
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <sys/socket.h>
|
|
||||||
|
|
||||||
#include <netinet/in.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
const (
|
|
||||||
sysIP_OPTIONS = C.IP_OPTIONS
|
|
||||||
sysIP_HDRINCL = C.IP_HDRINCL
|
|
||||||
sysIP_TOS = C.IP_TOS
|
|
||||||
sysIP_TTL = C.IP_TTL
|
|
||||||
sysIP_RECVOPTS = C.IP_RECVOPTS
|
|
||||||
sysIP_RECVRETOPTS = C.IP_RECVRETOPTS
|
|
||||||
sysIP_RECVDSTADDR = C.IP_RECVDSTADDR
|
|
||||||
sysIP_RETOPTS = C.IP_RETOPTS
|
|
||||||
sysIP_RECVIF = C.IP_RECVIF
|
|
||||||
sysIP_RECVSLLA = C.IP_RECVSLLA
|
|
||||||
sysIP_RECVTTL = C.IP_RECVTTL
|
|
||||||
|
|
||||||
sysIP_MULTICAST_IF = C.IP_MULTICAST_IF
|
|
||||||
sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL
|
|
||||||
sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP
|
|
||||||
sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP
|
|
||||||
sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP
|
|
||||||
sysIP_BLOCK_SOURCE = C.IP_BLOCK_SOURCE
|
|
||||||
sysIP_UNBLOCK_SOURCE = C.IP_UNBLOCK_SOURCE
|
|
||||||
sysIP_ADD_SOURCE_MEMBERSHIP = C.IP_ADD_SOURCE_MEMBERSHIP
|
|
||||||
sysIP_DROP_SOURCE_MEMBERSHIP = C.IP_DROP_SOURCE_MEMBERSHIP
|
|
||||||
sysIP_NEXTHOP = C.IP_NEXTHOP
|
|
||||||
|
|
||||||
sysIP_PKTINFO = C.IP_PKTINFO
|
|
||||||
sysIP_RECVPKTINFO = C.IP_RECVPKTINFO
|
|
||||||
sysIP_DONTFRAG = C.IP_DONTFRAG
|
|
||||||
|
|
||||||
sysIP_BOUND_IF = C.IP_BOUND_IF
|
|
||||||
sysIP_UNSPEC_SRC = C.IP_UNSPEC_SRC
|
|
||||||
sysIP_BROADCAST_TTL = C.IP_BROADCAST_TTL
|
|
||||||
sysIP_DHCPINIT_IF = C.IP_DHCPINIT_IF
|
|
||||||
|
|
||||||
sysIP_REUSEADDR = C.IP_REUSEADDR
|
|
||||||
sysIP_DONTROUTE = C.IP_DONTROUTE
|
|
||||||
sysIP_BROADCAST = C.IP_BROADCAST
|
|
||||||
|
|
||||||
sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP
|
|
||||||
sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP
|
|
||||||
sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE
|
|
||||||
sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE
|
|
||||||
sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP
|
|
||||||
sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP
|
|
||||||
|
|
||||||
sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage
|
|
||||||
sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
|
|
||||||
sizeofInetPktinfo = C.sizeof_struct_in_pktinfo
|
|
||||||
|
|
||||||
sizeofIPMreq = C.sizeof_struct_ip_mreq
|
|
||||||
sizeofIPMreqSource = C.sizeof_struct_ip_mreq_source
|
|
||||||
sizeofGroupReq = C.sizeof_struct_group_req
|
|
||||||
sizeofGroupSourceReq = C.sizeof_struct_group_source_req
|
|
||||||
)
|
|
||||||
|
|
||||||
type sockaddrStorage C.struct_sockaddr_storage
|
|
||||||
|
|
||||||
type sockaddrInet C.struct_sockaddr_in
|
|
||||||
|
|
||||||
type inetPktinfo C.struct_in_pktinfo
|
|
||||||
|
|
||||||
type ipMreq C.struct_ip_mreq
|
|
||||||
|
|
||||||
type ipMreqSource C.struct_ip_mreq_source
|
|
||||||
|
|
||||||
type groupReq C.struct_group_req
|
|
||||||
|
|
||||||
type groupSourceReq C.struct_group_source_req
|
|
199
vendor/golang.org/x/net/ipv4/gen.go
generated
vendored
199
vendor/golang.org/x/net/ipv4/gen.go
generated
vendored
@ -1,199 +0,0 @@
|
|||||||
// Copyright 2013 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
//go:generate go run gen.go
|
|
||||||
|
|
||||||
// This program generates system adaptation constants and types,
|
|
||||||
// internet protocol constants and tables by reading template files
|
|
||||||
// and IANA protocol registries.
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/xml"
|
|
||||||
"fmt"
|
|
||||||
"go/format"
|
|
||||||
"io"
|
|
||||||
"io/ioutil"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
"os/exec"
|
|
||||||
"runtime"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
if err := genzsys(); err != nil {
|
|
||||||
fmt.Fprintln(os.Stderr, err)
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
if err := geniana(); err != nil {
|
|
||||||
fmt.Fprintln(os.Stderr, err)
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func genzsys() error {
|
|
||||||
defs := "defs_" + runtime.GOOS + ".go"
|
|
||||||
f, err := os.Open(defs)
|
|
||||||
if err != nil {
|
|
||||||
if os.IsNotExist(err) {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
f.Close()
|
|
||||||
cmd := exec.Command("go", "tool", "cgo", "-godefs", defs)
|
|
||||||
b, err := cmd.Output()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
b, err = format.Source(b)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
zsys := "zsys_" + runtime.GOOS + ".go"
|
|
||||||
switch runtime.GOOS {
|
|
||||||
case "freebsd", "linux":
|
|
||||||
zsys = "zsys_" + runtime.GOOS + "_" + runtime.GOARCH + ".go"
|
|
||||||
}
|
|
||||||
if err := ioutil.WriteFile(zsys, b, 0644); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var registries = []struct {
|
|
||||||
url string
|
|
||||||
parse func(io.Writer, io.Reader) error
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
"https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xml",
|
|
||||||
parseICMPv4Parameters,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func geniana() error {
|
|
||||||
var bb bytes.Buffer
|
|
||||||
fmt.Fprintf(&bb, "// go generate gen.go\n")
|
|
||||||
fmt.Fprintf(&bb, "// Code generated by the command above; DO NOT EDIT.\n\n")
|
|
||||||
fmt.Fprintf(&bb, "package ipv4\n\n")
|
|
||||||
for _, r := range registries {
|
|
||||||
resp, err := http.Get(r.url)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer resp.Body.Close()
|
|
||||||
if resp.StatusCode != http.StatusOK {
|
|
||||||
return fmt.Errorf("got HTTP status code %v for %v\n", resp.StatusCode, r.url)
|
|
||||||
}
|
|
||||||
if err := r.parse(&bb, resp.Body); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
fmt.Fprintf(&bb, "\n")
|
|
||||||
}
|
|
||||||
b, err := format.Source(bb.Bytes())
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := ioutil.WriteFile("iana.go", b, 0644); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseICMPv4Parameters(w io.Writer, r io.Reader) error {
|
|
||||||
dec := xml.NewDecoder(r)
|
|
||||||
var icp icmpv4Parameters
|
|
||||||
if err := dec.Decode(&icp); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
prs := icp.escape()
|
|
||||||
fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated)
|
|
||||||
fmt.Fprintf(w, "const (\n")
|
|
||||||
for _, pr := range prs {
|
|
||||||
if pr.Descr == "" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
fmt.Fprintf(w, "ICMPType%s ICMPType = %d", pr.Descr, pr.Value)
|
|
||||||
fmt.Fprintf(w, "// %s\n", pr.OrigDescr)
|
|
||||||
}
|
|
||||||
fmt.Fprintf(w, ")\n\n")
|
|
||||||
fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated)
|
|
||||||
fmt.Fprintf(w, "var icmpTypes = map[ICMPType]string{\n")
|
|
||||||
for _, pr := range prs {
|
|
||||||
if pr.Descr == "" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
fmt.Fprintf(w, "%d: %q,\n", pr.Value, strings.ToLower(pr.OrigDescr))
|
|
||||||
}
|
|
||||||
fmt.Fprintf(w, "}\n")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type icmpv4Parameters struct {
|
|
||||||
XMLName xml.Name `xml:"registry"`
|
|
||||||
Title string `xml:"title"`
|
|
||||||
Updated string `xml:"updated"`
|
|
||||||
Registries []struct {
|
|
||||||
Title string `xml:"title"`
|
|
||||||
Records []struct {
|
|
||||||
Value string `xml:"value"`
|
|
||||||
Descr string `xml:"description"`
|
|
||||||
} `xml:"record"`
|
|
||||||
} `xml:"registry"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type canonICMPv4ParamRecord struct {
|
|
||||||
OrigDescr string
|
|
||||||
Descr string
|
|
||||||
Value int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (icp *icmpv4Parameters) escape() []canonICMPv4ParamRecord {
|
|
||||||
id := -1
|
|
||||||
for i, r := range icp.Registries {
|
|
||||||
if strings.Contains(r.Title, "Type") || strings.Contains(r.Title, "type") {
|
|
||||||
id = i
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if id < 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
prs := make([]canonICMPv4ParamRecord, len(icp.Registries[id].Records))
|
|
||||||
sr := strings.NewReplacer(
|
|
||||||
"Messages", "",
|
|
||||||
"Message", "",
|
|
||||||
"ICMP", "",
|
|
||||||
"+", "P",
|
|
||||||
"-", "",
|
|
||||||
"/", "",
|
|
||||||
".", "",
|
|
||||||
" ", "",
|
|
||||||
)
|
|
||||||
for i, pr := range icp.Registries[id].Records {
|
|
||||||
if strings.Contains(pr.Descr, "Reserved") ||
|
|
||||||
strings.Contains(pr.Descr, "Unassigned") ||
|
|
||||||
strings.Contains(pr.Descr, "Deprecated") ||
|
|
||||||
strings.Contains(pr.Descr, "Experiment") ||
|
|
||||||
strings.Contains(pr.Descr, "experiment") {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
ss := strings.Split(pr.Descr, "\n")
|
|
||||||
if len(ss) > 1 {
|
|
||||||
prs[i].Descr = strings.Join(ss, " ")
|
|
||||||
} else {
|
|
||||||
prs[i].Descr = ss[0]
|
|
||||||
}
|
|
||||||
s := strings.TrimSpace(prs[i].Descr)
|
|
||||||
prs[i].OrigDescr = s
|
|
||||||
prs[i].Descr = sr.Replace(s)
|
|
||||||
prs[i].Value, _ = strconv.Atoi(pr.Value)
|
|
||||||
}
|
|
||||||
return prs
|
|
||||||
}
|
|
112
vendor/golang.org/x/net/ipv6/defs_darwin.go
generated
vendored
112
vendor/golang.org/x/net/ipv6/defs_darwin.go
generated
vendored
@ -1,112 +0,0 @@
|
|||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// +godefs map struct_in6_addr [16]byte /* in6_addr */
|
|
||||||
|
|
||||||
package ipv6
|
|
||||||
|
|
||||||
/*
|
|
||||||
#define __APPLE_USE_RFC_3542
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <netinet/icmp6.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
const (
|
|
||||||
sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS
|
|
||||||
sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF
|
|
||||||
sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS
|
|
||||||
sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP
|
|
||||||
sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP
|
|
||||||
sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP
|
|
||||||
|
|
||||||
sysIPV6_PORTRANGE = C.IPV6_PORTRANGE
|
|
||||||
sysICMP6_FILTER = C.ICMP6_FILTER
|
|
||||||
sysIPV6_2292PKTINFO = C.IPV6_2292PKTINFO
|
|
||||||
sysIPV6_2292HOPLIMIT = C.IPV6_2292HOPLIMIT
|
|
||||||
sysIPV6_2292NEXTHOP = C.IPV6_2292NEXTHOP
|
|
||||||
sysIPV6_2292HOPOPTS = C.IPV6_2292HOPOPTS
|
|
||||||
sysIPV6_2292DSTOPTS = C.IPV6_2292DSTOPTS
|
|
||||||
sysIPV6_2292RTHDR = C.IPV6_2292RTHDR
|
|
||||||
|
|
||||||
sysIPV6_2292PKTOPTIONS = C.IPV6_2292PKTOPTIONS
|
|
||||||
|
|
||||||
sysIPV6_CHECKSUM = C.IPV6_CHECKSUM
|
|
||||||
sysIPV6_V6ONLY = C.IPV6_V6ONLY
|
|
||||||
|
|
||||||
sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY
|
|
||||||
|
|
||||||
sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS
|
|
||||||
sysIPV6_TCLASS = C.IPV6_TCLASS
|
|
||||||
|
|
||||||
sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS
|
|
||||||
|
|
||||||
sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO
|
|
||||||
|
|
||||||
sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT
|
|
||||||
sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR
|
|
||||||
sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS
|
|
||||||
sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS
|
|
||||||
|
|
||||||
sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU
|
|
||||||
sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU
|
|
||||||
|
|
||||||
sysIPV6_PATHMTU = C.IPV6_PATHMTU
|
|
||||||
|
|
||||||
sysIPV6_PKTINFO = C.IPV6_PKTINFO
|
|
||||||
sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT
|
|
||||||
sysIPV6_NEXTHOP = C.IPV6_NEXTHOP
|
|
||||||
sysIPV6_HOPOPTS = C.IPV6_HOPOPTS
|
|
||||||
sysIPV6_DSTOPTS = C.IPV6_DSTOPTS
|
|
||||||
sysIPV6_RTHDR = C.IPV6_RTHDR
|
|
||||||
|
|
||||||
sysIPV6_AUTOFLOWLABEL = C.IPV6_AUTOFLOWLABEL
|
|
||||||
|
|
||||||
sysIPV6_DONTFRAG = C.IPV6_DONTFRAG
|
|
||||||
|
|
||||||
sysIPV6_PREFER_TEMPADDR = C.IPV6_PREFER_TEMPADDR
|
|
||||||
|
|
||||||
sysIPV6_MSFILTER = C.IPV6_MSFILTER
|
|
||||||
sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP
|
|
||||||
sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP
|
|
||||||
sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP
|
|
||||||
sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP
|
|
||||||
sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE
|
|
||||||
sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE
|
|
||||||
|
|
||||||
sysIPV6_BOUND_IF = C.IPV6_BOUND_IF
|
|
||||||
|
|
||||||
sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT
|
|
||||||
sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH
|
|
||||||
sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW
|
|
||||||
|
|
||||||
sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage
|
|
||||||
sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
|
|
||||||
sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo
|
|
||||||
sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo
|
|
||||||
|
|
||||||
sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq
|
|
||||||
sizeofGroupReq = C.sizeof_struct_group_req
|
|
||||||
sizeofGroupSourceReq = C.sizeof_struct_group_source_req
|
|
||||||
|
|
||||||
sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter
|
|
||||||
)
|
|
||||||
|
|
||||||
type sockaddrStorage C.struct_sockaddr_storage
|
|
||||||
|
|
||||||
type sockaddrInet6 C.struct_sockaddr_in6
|
|
||||||
|
|
||||||
type inet6Pktinfo C.struct_in6_pktinfo
|
|
||||||
|
|
||||||
type ipv6Mtuinfo C.struct_ip6_mtuinfo
|
|
||||||
|
|
||||||
type ipv6Mreq C.struct_ipv6_mreq
|
|
||||||
|
|
||||||
type icmpv6Filter C.struct_icmp6_filter
|
|
||||||
|
|
||||||
type groupReq C.struct_group_req
|
|
||||||
|
|
||||||
type groupSourceReq C.struct_group_source_req
|
|
84
vendor/golang.org/x/net/ipv6/defs_dragonfly.go
generated
vendored
84
vendor/golang.org/x/net/ipv6/defs_dragonfly.go
generated
vendored
@ -1,84 +0,0 @@
|
|||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// +godefs map struct_in6_addr [16]byte /* in6_addr */
|
|
||||||
|
|
||||||
package ipv6
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <netinet/icmp6.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
const (
|
|
||||||
sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS
|
|
||||||
sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF
|
|
||||||
sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS
|
|
||||||
sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP
|
|
||||||
sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP
|
|
||||||
sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP
|
|
||||||
sysIPV6_PORTRANGE = C.IPV6_PORTRANGE
|
|
||||||
sysICMP6_FILTER = C.ICMP6_FILTER
|
|
||||||
|
|
||||||
sysIPV6_CHECKSUM = C.IPV6_CHECKSUM
|
|
||||||
sysIPV6_V6ONLY = C.IPV6_V6ONLY
|
|
||||||
|
|
||||||
sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY
|
|
||||||
|
|
||||||
sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS
|
|
||||||
sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO
|
|
||||||
sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT
|
|
||||||
sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR
|
|
||||||
sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS
|
|
||||||
sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS
|
|
||||||
|
|
||||||
sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU
|
|
||||||
sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU
|
|
||||||
|
|
||||||
sysIPV6_PATHMTU = C.IPV6_PATHMTU
|
|
||||||
|
|
||||||
sysIPV6_PKTINFO = C.IPV6_PKTINFO
|
|
||||||
sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT
|
|
||||||
sysIPV6_NEXTHOP = C.IPV6_NEXTHOP
|
|
||||||
sysIPV6_HOPOPTS = C.IPV6_HOPOPTS
|
|
||||||
sysIPV6_DSTOPTS = C.IPV6_DSTOPTS
|
|
||||||
sysIPV6_RTHDR = C.IPV6_RTHDR
|
|
||||||
|
|
||||||
sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS
|
|
||||||
|
|
||||||
sysIPV6_AUTOFLOWLABEL = C.IPV6_AUTOFLOWLABEL
|
|
||||||
|
|
||||||
sysIPV6_TCLASS = C.IPV6_TCLASS
|
|
||||||
sysIPV6_DONTFRAG = C.IPV6_DONTFRAG
|
|
||||||
|
|
||||||
sysIPV6_PREFER_TEMPADDR = C.IPV6_PREFER_TEMPADDR
|
|
||||||
|
|
||||||
sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT
|
|
||||||
sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH
|
|
||||||
sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW
|
|
||||||
|
|
||||||
sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
|
|
||||||
sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo
|
|
||||||
sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo
|
|
||||||
|
|
||||||
sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq
|
|
||||||
|
|
||||||
sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter
|
|
||||||
)
|
|
||||||
|
|
||||||
type sockaddrInet6 C.struct_sockaddr_in6
|
|
||||||
|
|
||||||
type inet6Pktinfo C.struct_in6_pktinfo
|
|
||||||
|
|
||||||
type ipv6Mtuinfo C.struct_ip6_mtuinfo
|
|
||||||
|
|
||||||
type ipv6Mreq C.struct_ipv6_mreq
|
|
||||||
|
|
||||||
type icmpv6Filter C.struct_icmp6_filter
|
|
105
vendor/golang.org/x/net/ipv6/defs_freebsd.go
generated
vendored
105
vendor/golang.org/x/net/ipv6/defs_freebsd.go
generated
vendored
@ -1,105 +0,0 @@
|
|||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// +godefs map struct_in6_addr [16]byte /* in6_addr */
|
|
||||||
|
|
||||||
package ipv6
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <netinet/icmp6.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
const (
|
|
||||||
sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS
|
|
||||||
sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF
|
|
||||||
sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS
|
|
||||||
sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP
|
|
||||||
sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP
|
|
||||||
sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP
|
|
||||||
sysIPV6_PORTRANGE = C.IPV6_PORTRANGE
|
|
||||||
sysICMP6_FILTER = C.ICMP6_FILTER
|
|
||||||
|
|
||||||
sysIPV6_CHECKSUM = C.IPV6_CHECKSUM
|
|
||||||
sysIPV6_V6ONLY = C.IPV6_V6ONLY
|
|
||||||
|
|
||||||
sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY
|
|
||||||
|
|
||||||
sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS
|
|
||||||
|
|
||||||
sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO
|
|
||||||
sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT
|
|
||||||
sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR
|
|
||||||
sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS
|
|
||||||
sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS
|
|
||||||
|
|
||||||
sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU
|
|
||||||
sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU
|
|
||||||
|
|
||||||
sysIPV6_PATHMTU = C.IPV6_PATHMTU
|
|
||||||
|
|
||||||
sysIPV6_PKTINFO = C.IPV6_PKTINFO
|
|
||||||
sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT
|
|
||||||
sysIPV6_NEXTHOP = C.IPV6_NEXTHOP
|
|
||||||
sysIPV6_HOPOPTS = C.IPV6_HOPOPTS
|
|
||||||
sysIPV6_DSTOPTS = C.IPV6_DSTOPTS
|
|
||||||
sysIPV6_RTHDR = C.IPV6_RTHDR
|
|
||||||
|
|
||||||
sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS
|
|
||||||
|
|
||||||
sysIPV6_AUTOFLOWLABEL = C.IPV6_AUTOFLOWLABEL
|
|
||||||
|
|
||||||
sysIPV6_TCLASS = C.IPV6_TCLASS
|
|
||||||
sysIPV6_DONTFRAG = C.IPV6_DONTFRAG
|
|
||||||
|
|
||||||
sysIPV6_PREFER_TEMPADDR = C.IPV6_PREFER_TEMPADDR
|
|
||||||
|
|
||||||
sysIPV6_BINDANY = C.IPV6_BINDANY
|
|
||||||
|
|
||||||
sysIPV6_MSFILTER = C.IPV6_MSFILTER
|
|
||||||
|
|
||||||
sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP
|
|
||||||
sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP
|
|
||||||
sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP
|
|
||||||
sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP
|
|
||||||
sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE
|
|
||||||
sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE
|
|
||||||
|
|
||||||
sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT
|
|
||||||
sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH
|
|
||||||
sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW
|
|
||||||
|
|
||||||
sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage
|
|
||||||
sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
|
|
||||||
sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo
|
|
||||||
sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo
|
|
||||||
|
|
||||||
sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq
|
|
||||||
sizeofGroupReq = C.sizeof_struct_group_req
|
|
||||||
sizeofGroupSourceReq = C.sizeof_struct_group_source_req
|
|
||||||
|
|
||||||
sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter
|
|
||||||
)
|
|
||||||
|
|
||||||
type sockaddrStorage C.struct_sockaddr_storage
|
|
||||||
|
|
||||||
type sockaddrInet6 C.struct_sockaddr_in6
|
|
||||||
|
|
||||||
type inet6Pktinfo C.struct_in6_pktinfo
|
|
||||||
|
|
||||||
type ipv6Mtuinfo C.struct_ip6_mtuinfo
|
|
||||||
|
|
||||||
type ipv6Mreq C.struct_ipv6_mreq
|
|
||||||
|
|
||||||
type groupReq C.struct_group_req
|
|
||||||
|
|
||||||
type groupSourceReq C.struct_group_source_req
|
|
||||||
|
|
||||||
type icmpv6Filter C.struct_icmp6_filter
|
|
147
vendor/golang.org/x/net/ipv6/defs_linux.go
generated
vendored
147
vendor/golang.org/x/net/ipv6/defs_linux.go
generated
vendored
@ -1,147 +0,0 @@
|
|||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// +godefs map struct_in6_addr [16]byte /* in6_addr */
|
|
||||||
|
|
||||||
package ipv6
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <linux/in.h>
|
|
||||||
#include <linux/in6.h>
|
|
||||||
#include <linux/ipv6.h>
|
|
||||||
#include <linux/icmpv6.h>
|
|
||||||
#include <linux/filter.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
const (
|
|
||||||
sysIPV6_ADDRFORM = C.IPV6_ADDRFORM
|
|
||||||
sysIPV6_2292PKTINFO = C.IPV6_2292PKTINFO
|
|
||||||
sysIPV6_2292HOPOPTS = C.IPV6_2292HOPOPTS
|
|
||||||
sysIPV6_2292DSTOPTS = C.IPV6_2292DSTOPTS
|
|
||||||
sysIPV6_2292RTHDR = C.IPV6_2292RTHDR
|
|
||||||
sysIPV6_2292PKTOPTIONS = C.IPV6_2292PKTOPTIONS
|
|
||||||
sysIPV6_CHECKSUM = C.IPV6_CHECKSUM
|
|
||||||
sysIPV6_2292HOPLIMIT = C.IPV6_2292HOPLIMIT
|
|
||||||
sysIPV6_NEXTHOP = C.IPV6_NEXTHOP
|
|
||||||
sysIPV6_FLOWINFO = C.IPV6_FLOWINFO
|
|
||||||
|
|
||||||
sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS
|
|
||||||
sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF
|
|
||||||
sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS
|
|
||||||
sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP
|
|
||||||
sysIPV6_ADD_MEMBERSHIP = C.IPV6_ADD_MEMBERSHIP
|
|
||||||
sysIPV6_DROP_MEMBERSHIP = C.IPV6_DROP_MEMBERSHIP
|
|
||||||
sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP
|
|
||||||
sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP
|
|
||||||
sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP
|
|
||||||
sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP
|
|
||||||
sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE
|
|
||||||
sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE
|
|
||||||
sysMCAST_MSFILTER = C.MCAST_MSFILTER
|
|
||||||
sysIPV6_ROUTER_ALERT = C.IPV6_ROUTER_ALERT
|
|
||||||
sysIPV6_MTU_DISCOVER = C.IPV6_MTU_DISCOVER
|
|
||||||
sysIPV6_MTU = C.IPV6_MTU
|
|
||||||
sysIPV6_RECVERR = C.IPV6_RECVERR
|
|
||||||
sysIPV6_V6ONLY = C.IPV6_V6ONLY
|
|
||||||
sysIPV6_JOIN_ANYCAST = C.IPV6_JOIN_ANYCAST
|
|
||||||
sysIPV6_LEAVE_ANYCAST = C.IPV6_LEAVE_ANYCAST
|
|
||||||
|
|
||||||
//sysIPV6_PMTUDISC_DONT = C.IPV6_PMTUDISC_DONT
|
|
||||||
//sysIPV6_PMTUDISC_WANT = C.IPV6_PMTUDISC_WANT
|
|
||||||
//sysIPV6_PMTUDISC_DO = C.IPV6_PMTUDISC_DO
|
|
||||||
//sysIPV6_PMTUDISC_PROBE = C.IPV6_PMTUDISC_PROBE
|
|
||||||
//sysIPV6_PMTUDISC_INTERFACE = C.IPV6_PMTUDISC_INTERFACE
|
|
||||||
//sysIPV6_PMTUDISC_OMIT = C.IPV6_PMTUDISC_OMIT
|
|
||||||
|
|
||||||
sysIPV6_FLOWLABEL_MGR = C.IPV6_FLOWLABEL_MGR
|
|
||||||
sysIPV6_FLOWINFO_SEND = C.IPV6_FLOWINFO_SEND
|
|
||||||
|
|
||||||
sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY
|
|
||||||
sysIPV6_XFRM_POLICY = C.IPV6_XFRM_POLICY
|
|
||||||
|
|
||||||
sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO
|
|
||||||
sysIPV6_PKTINFO = C.IPV6_PKTINFO
|
|
||||||
sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT
|
|
||||||
sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT
|
|
||||||
sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS
|
|
||||||
sysIPV6_HOPOPTS = C.IPV6_HOPOPTS
|
|
||||||
sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS
|
|
||||||
sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR
|
|
||||||
sysIPV6_RTHDR = C.IPV6_RTHDR
|
|
||||||
sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS
|
|
||||||
sysIPV6_DSTOPTS = C.IPV6_DSTOPTS
|
|
||||||
sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU
|
|
||||||
sysIPV6_PATHMTU = C.IPV6_PATHMTU
|
|
||||||
sysIPV6_DONTFRAG = C.IPV6_DONTFRAG
|
|
||||||
|
|
||||||
sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS
|
|
||||||
sysIPV6_TCLASS = C.IPV6_TCLASS
|
|
||||||
|
|
||||||
sysIPV6_ADDR_PREFERENCES = C.IPV6_ADDR_PREFERENCES
|
|
||||||
|
|
||||||
sysIPV6_PREFER_SRC_TMP = C.IPV6_PREFER_SRC_TMP
|
|
||||||
sysIPV6_PREFER_SRC_PUBLIC = C.IPV6_PREFER_SRC_PUBLIC
|
|
||||||
sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = C.IPV6_PREFER_SRC_PUBTMP_DEFAULT
|
|
||||||
sysIPV6_PREFER_SRC_COA = C.IPV6_PREFER_SRC_COA
|
|
||||||
sysIPV6_PREFER_SRC_HOME = C.IPV6_PREFER_SRC_HOME
|
|
||||||
sysIPV6_PREFER_SRC_CGA = C.IPV6_PREFER_SRC_CGA
|
|
||||||
sysIPV6_PREFER_SRC_NONCGA = C.IPV6_PREFER_SRC_NONCGA
|
|
||||||
|
|
||||||
sysIPV6_MINHOPCOUNT = C.IPV6_MINHOPCOUNT
|
|
||||||
|
|
||||||
sysIPV6_ORIGDSTADDR = C.IPV6_ORIGDSTADDR
|
|
||||||
sysIPV6_RECVORIGDSTADDR = C.IPV6_RECVORIGDSTADDR
|
|
||||||
sysIPV6_TRANSPARENT = C.IPV6_TRANSPARENT
|
|
||||||
sysIPV6_UNICAST_IF = C.IPV6_UNICAST_IF
|
|
||||||
|
|
||||||
sysICMPV6_FILTER = C.ICMPV6_FILTER
|
|
||||||
|
|
||||||
sysICMPV6_FILTER_BLOCK = C.ICMPV6_FILTER_BLOCK
|
|
||||||
sysICMPV6_FILTER_PASS = C.ICMPV6_FILTER_PASS
|
|
||||||
sysICMPV6_FILTER_BLOCKOTHERS = C.ICMPV6_FILTER_BLOCKOTHERS
|
|
||||||
sysICMPV6_FILTER_PASSONLY = C.ICMPV6_FILTER_PASSONLY
|
|
||||||
|
|
||||||
sysSOL_SOCKET = C.SOL_SOCKET
|
|
||||||
sysSO_ATTACH_FILTER = C.SO_ATTACH_FILTER
|
|
||||||
|
|
||||||
sizeofKernelSockaddrStorage = C.sizeof_struct___kernel_sockaddr_storage
|
|
||||||
sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
|
|
||||||
sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo
|
|
||||||
sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo
|
|
||||||
sizeofIPv6FlowlabelReq = C.sizeof_struct_in6_flowlabel_req
|
|
||||||
|
|
||||||
sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq
|
|
||||||
sizeofGroupReq = C.sizeof_struct_group_req
|
|
||||||
sizeofGroupSourceReq = C.sizeof_struct_group_source_req
|
|
||||||
|
|
||||||
sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter
|
|
||||||
|
|
||||||
sizeofSockFprog = C.sizeof_struct_sock_fprog
|
|
||||||
)
|
|
||||||
|
|
||||||
type kernelSockaddrStorage C.struct___kernel_sockaddr_storage
|
|
||||||
|
|
||||||
type sockaddrInet6 C.struct_sockaddr_in6
|
|
||||||
|
|
||||||
type inet6Pktinfo C.struct_in6_pktinfo
|
|
||||||
|
|
||||||
type ipv6Mtuinfo C.struct_ip6_mtuinfo
|
|
||||||
|
|
||||||
type ipv6FlowlabelReq C.struct_in6_flowlabel_req
|
|
||||||
|
|
||||||
type ipv6Mreq C.struct_ipv6_mreq
|
|
||||||
|
|
||||||
type groupReq C.struct_group_req
|
|
||||||
|
|
||||||
type groupSourceReq C.struct_group_source_req
|
|
||||||
|
|
||||||
type icmpv6Filter C.struct_icmp6_filter
|
|
||||||
|
|
||||||
type sockFProg C.struct_sock_fprog
|
|
||||||
|
|
||||||
type sockFilter C.struct_sock_filter
|
|
80
vendor/golang.org/x/net/ipv6/defs_netbsd.go
generated
vendored
80
vendor/golang.org/x/net/ipv6/defs_netbsd.go
generated
vendored
@ -1,80 +0,0 @@
|
|||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// +godefs map struct_in6_addr [16]byte /* in6_addr */
|
|
||||||
|
|
||||||
package ipv6
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <netinet/icmp6.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
const (
|
|
||||||
sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS
|
|
||||||
sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF
|
|
||||||
sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS
|
|
||||||
sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP
|
|
||||||
sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP
|
|
||||||
sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP
|
|
||||||
sysIPV6_PORTRANGE = C.IPV6_PORTRANGE
|
|
||||||
sysICMP6_FILTER = C.ICMP6_FILTER
|
|
||||||
|
|
||||||
sysIPV6_CHECKSUM = C.IPV6_CHECKSUM
|
|
||||||
sysIPV6_V6ONLY = C.IPV6_V6ONLY
|
|
||||||
|
|
||||||
sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY
|
|
||||||
|
|
||||||
sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS
|
|
||||||
|
|
||||||
sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO
|
|
||||||
sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT
|
|
||||||
sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR
|
|
||||||
sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS
|
|
||||||
sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS
|
|
||||||
|
|
||||||
sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU
|
|
||||||
sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU
|
|
||||||
sysIPV6_PATHMTU = C.IPV6_PATHMTU
|
|
||||||
|
|
||||||
sysIPV6_PKTINFO = C.IPV6_PKTINFO
|
|
||||||
sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT
|
|
||||||
sysIPV6_NEXTHOP = C.IPV6_NEXTHOP
|
|
||||||
sysIPV6_HOPOPTS = C.IPV6_HOPOPTS
|
|
||||||
sysIPV6_DSTOPTS = C.IPV6_DSTOPTS
|
|
||||||
sysIPV6_RTHDR = C.IPV6_RTHDR
|
|
||||||
|
|
||||||
sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS
|
|
||||||
|
|
||||||
sysIPV6_TCLASS = C.IPV6_TCLASS
|
|
||||||
sysIPV6_DONTFRAG = C.IPV6_DONTFRAG
|
|
||||||
|
|
||||||
sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT
|
|
||||||
sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH
|
|
||||||
sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW
|
|
||||||
|
|
||||||
sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
|
|
||||||
sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo
|
|
||||||
sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo
|
|
||||||
|
|
||||||
sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq
|
|
||||||
|
|
||||||
sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter
|
|
||||||
)
|
|
||||||
|
|
||||||
type sockaddrInet6 C.struct_sockaddr_in6
|
|
||||||
|
|
||||||
type inet6Pktinfo C.struct_in6_pktinfo
|
|
||||||
|
|
||||||
type ipv6Mtuinfo C.struct_ip6_mtuinfo
|
|
||||||
|
|
||||||
type ipv6Mreq C.struct_ipv6_mreq
|
|
||||||
|
|
||||||
type icmpv6Filter C.struct_icmp6_filter
|
|
89
vendor/golang.org/x/net/ipv6/defs_openbsd.go
generated
vendored
89
vendor/golang.org/x/net/ipv6/defs_openbsd.go
generated
vendored
@ -1,89 +0,0 @@
|
|||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// +godefs map struct_in6_addr [16]byte /* in6_addr */
|
|
||||||
|
|
||||||
package ipv6
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <netinet/icmp6.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
const (
|
|
||||||
sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS
|
|
||||||
sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF
|
|
||||||
sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS
|
|
||||||
sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP
|
|
||||||
sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP
|
|
||||||
sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP
|
|
||||||
sysIPV6_PORTRANGE = C.IPV6_PORTRANGE
|
|
||||||
sysICMP6_FILTER = C.ICMP6_FILTER
|
|
||||||
|
|
||||||
sysIPV6_CHECKSUM = C.IPV6_CHECKSUM
|
|
||||||
sysIPV6_V6ONLY = C.IPV6_V6ONLY
|
|
||||||
|
|
||||||
sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS
|
|
||||||
|
|
||||||
sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO
|
|
||||||
sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT
|
|
||||||
sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR
|
|
||||||
sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS
|
|
||||||
sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS
|
|
||||||
|
|
||||||
sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU
|
|
||||||
sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU
|
|
||||||
|
|
||||||
sysIPV6_PATHMTU = C.IPV6_PATHMTU
|
|
||||||
|
|
||||||
sysIPV6_PKTINFO = C.IPV6_PKTINFO
|
|
||||||
sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT
|
|
||||||
sysIPV6_NEXTHOP = C.IPV6_NEXTHOP
|
|
||||||
sysIPV6_HOPOPTS = C.IPV6_HOPOPTS
|
|
||||||
sysIPV6_DSTOPTS = C.IPV6_DSTOPTS
|
|
||||||
sysIPV6_RTHDR = C.IPV6_RTHDR
|
|
||||||
|
|
||||||
sysIPV6_AUTH_LEVEL = C.IPV6_AUTH_LEVEL
|
|
||||||
sysIPV6_ESP_TRANS_LEVEL = C.IPV6_ESP_TRANS_LEVEL
|
|
||||||
sysIPV6_ESP_NETWORK_LEVEL = C.IPV6_ESP_NETWORK_LEVEL
|
|
||||||
sysIPSEC6_OUTSA = C.IPSEC6_OUTSA
|
|
||||||
sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS
|
|
||||||
|
|
||||||
sysIPV6_AUTOFLOWLABEL = C.IPV6_AUTOFLOWLABEL
|
|
||||||
sysIPV6_IPCOMP_LEVEL = C.IPV6_IPCOMP_LEVEL
|
|
||||||
|
|
||||||
sysIPV6_TCLASS = C.IPV6_TCLASS
|
|
||||||
sysIPV6_DONTFRAG = C.IPV6_DONTFRAG
|
|
||||||
sysIPV6_PIPEX = C.IPV6_PIPEX
|
|
||||||
|
|
||||||
sysIPV6_RTABLE = C.IPV6_RTABLE
|
|
||||||
|
|
||||||
sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT
|
|
||||||
sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH
|
|
||||||
sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW
|
|
||||||
|
|
||||||
sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
|
|
||||||
sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo
|
|
||||||
sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo
|
|
||||||
|
|
||||||
sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq
|
|
||||||
|
|
||||||
sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter
|
|
||||||
)
|
|
||||||
|
|
||||||
type sockaddrInet6 C.struct_sockaddr_in6
|
|
||||||
|
|
||||||
type inet6Pktinfo C.struct_in6_pktinfo
|
|
||||||
|
|
||||||
type ipv6Mtuinfo C.struct_ip6_mtuinfo
|
|
||||||
|
|
||||||
type ipv6Mreq C.struct_ipv6_mreq
|
|
||||||
|
|
||||||
type icmpv6Filter C.struct_icmp6_filter
|
|
114
vendor/golang.org/x/net/ipv6/defs_solaris.go
generated
vendored
114
vendor/golang.org/x/net/ipv6/defs_solaris.go
generated
vendored
@ -1,114 +0,0 @@
|
|||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// +godefs map struct_in6_addr [16]byte /* in6_addr */
|
|
||||||
|
|
||||||
package ipv6
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <sys/socket.h>
|
|
||||||
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <netinet/icmp6.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
const (
|
|
||||||
sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS
|
|
||||||
sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF
|
|
||||||
sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS
|
|
||||||
sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP
|
|
||||||
sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP
|
|
||||||
sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP
|
|
||||||
|
|
||||||
sysIPV6_PKTINFO = C.IPV6_PKTINFO
|
|
||||||
|
|
||||||
sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT
|
|
||||||
sysIPV6_NEXTHOP = C.IPV6_NEXTHOP
|
|
||||||
sysIPV6_HOPOPTS = C.IPV6_HOPOPTS
|
|
||||||
sysIPV6_DSTOPTS = C.IPV6_DSTOPTS
|
|
||||||
|
|
||||||
sysIPV6_RTHDR = C.IPV6_RTHDR
|
|
||||||
sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS
|
|
||||||
|
|
||||||
sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO
|
|
||||||
sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT
|
|
||||||
sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS
|
|
||||||
|
|
||||||
sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR
|
|
||||||
|
|
||||||
sysIPV6_RECVRTHDRDSTOPTS = C.IPV6_RECVRTHDRDSTOPTS
|
|
||||||
|
|
||||||
sysIPV6_CHECKSUM = C.IPV6_CHECKSUM
|
|
||||||
sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS
|
|
||||||
sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU
|
|
||||||
sysIPV6_DONTFRAG = C.IPV6_DONTFRAG
|
|
||||||
sysIPV6_SEC_OPT = C.IPV6_SEC_OPT
|
|
||||||
sysIPV6_SRC_PREFERENCES = C.IPV6_SRC_PREFERENCES
|
|
||||||
sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU
|
|
||||||
sysIPV6_PATHMTU = C.IPV6_PATHMTU
|
|
||||||
sysIPV6_TCLASS = C.IPV6_TCLASS
|
|
||||||
sysIPV6_V6ONLY = C.IPV6_V6ONLY
|
|
||||||
|
|
||||||
sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS
|
|
||||||
|
|
||||||
sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP
|
|
||||||
sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP
|
|
||||||
sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE
|
|
||||||
sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE
|
|
||||||
sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP
|
|
||||||
sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP
|
|
||||||
|
|
||||||
sysIPV6_PREFER_SRC_HOME = C.IPV6_PREFER_SRC_HOME
|
|
||||||
sysIPV6_PREFER_SRC_COA = C.IPV6_PREFER_SRC_COA
|
|
||||||
sysIPV6_PREFER_SRC_PUBLIC = C.IPV6_PREFER_SRC_PUBLIC
|
|
||||||
sysIPV6_PREFER_SRC_TMP = C.IPV6_PREFER_SRC_TMP
|
|
||||||
sysIPV6_PREFER_SRC_NONCGA = C.IPV6_PREFER_SRC_NONCGA
|
|
||||||
sysIPV6_PREFER_SRC_CGA = C.IPV6_PREFER_SRC_CGA
|
|
||||||
|
|
||||||
sysIPV6_PREFER_SRC_MIPMASK = C.IPV6_PREFER_SRC_MIPMASK
|
|
||||||
sysIPV6_PREFER_SRC_MIPDEFAULT = C.IPV6_PREFER_SRC_MIPDEFAULT
|
|
||||||
sysIPV6_PREFER_SRC_TMPMASK = C.IPV6_PREFER_SRC_TMPMASK
|
|
||||||
sysIPV6_PREFER_SRC_TMPDEFAULT = C.IPV6_PREFER_SRC_TMPDEFAULT
|
|
||||||
sysIPV6_PREFER_SRC_CGAMASK = C.IPV6_PREFER_SRC_CGAMASK
|
|
||||||
sysIPV6_PREFER_SRC_CGADEFAULT = C.IPV6_PREFER_SRC_CGADEFAULT
|
|
||||||
|
|
||||||
sysIPV6_PREFER_SRC_MASK = C.IPV6_PREFER_SRC_MASK
|
|
||||||
|
|
||||||
sysIPV6_PREFER_SRC_DEFAULT = C.IPV6_PREFER_SRC_DEFAULT
|
|
||||||
|
|
||||||
sysIPV6_BOUND_IF = C.IPV6_BOUND_IF
|
|
||||||
sysIPV6_UNSPEC_SRC = C.IPV6_UNSPEC_SRC
|
|
||||||
|
|
||||||
sysICMP6_FILTER = C.ICMP6_FILTER
|
|
||||||
|
|
||||||
sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage
|
|
||||||
sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
|
|
||||||
sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo
|
|
||||||
sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo
|
|
||||||
|
|
||||||
sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq
|
|
||||||
sizeofGroupReq = C.sizeof_struct_group_req
|
|
||||||
sizeofGroupSourceReq = C.sizeof_struct_group_source_req
|
|
||||||
|
|
||||||
sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter
|
|
||||||
)
|
|
||||||
|
|
||||||
type sockaddrStorage C.struct_sockaddr_storage
|
|
||||||
|
|
||||||
type sockaddrInet6 C.struct_sockaddr_in6
|
|
||||||
|
|
||||||
type inet6Pktinfo C.struct_in6_pktinfo
|
|
||||||
|
|
||||||
type ipv6Mtuinfo C.struct_ip6_mtuinfo
|
|
||||||
|
|
||||||
type ipv6Mreq C.struct_ipv6_mreq
|
|
||||||
|
|
||||||
type groupReq C.struct_group_req
|
|
||||||
|
|
||||||
type groupSourceReq C.struct_group_source_req
|
|
||||||
|
|
||||||
type icmpv6Filter C.struct_icmp6_filter
|
|
199
vendor/golang.org/x/net/ipv6/gen.go
generated
vendored
199
vendor/golang.org/x/net/ipv6/gen.go
generated
vendored
@ -1,199 +0,0 @@
|
|||||||
// Copyright 2013 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
//go:generate go run gen.go
|
|
||||||
|
|
||||||
// This program generates system adaptation constants and types,
|
|
||||||
// internet protocol constants and tables by reading template files
|
|
||||||
// and IANA protocol registries.
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/xml"
|
|
||||||
"fmt"
|
|
||||||
"go/format"
|
|
||||||
"io"
|
|
||||||
"io/ioutil"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
"os/exec"
|
|
||||||
"runtime"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
if err := genzsys(); err != nil {
|
|
||||||
fmt.Fprintln(os.Stderr, err)
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
if err := geniana(); err != nil {
|
|
||||||
fmt.Fprintln(os.Stderr, err)
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func genzsys() error {
|
|
||||||
defs := "defs_" + runtime.GOOS + ".go"
|
|
||||||
f, err := os.Open(defs)
|
|
||||||
if err != nil {
|
|
||||||
if os.IsNotExist(err) {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
f.Close()
|
|
||||||
cmd := exec.Command("go", "tool", "cgo", "-godefs", defs)
|
|
||||||
b, err := cmd.Output()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
b, err = format.Source(b)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
zsys := "zsys_" + runtime.GOOS + ".go"
|
|
||||||
switch runtime.GOOS {
|
|
||||||
case "freebsd", "linux":
|
|
||||||
zsys = "zsys_" + runtime.GOOS + "_" + runtime.GOARCH + ".go"
|
|
||||||
}
|
|
||||||
if err := ioutil.WriteFile(zsys, b, 0644); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var registries = []struct {
|
|
||||||
url string
|
|
||||||
parse func(io.Writer, io.Reader) error
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
"https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xml",
|
|
||||||
parseICMPv6Parameters,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func geniana() error {
|
|
||||||
var bb bytes.Buffer
|
|
||||||
fmt.Fprintf(&bb, "// go generate gen.go\n")
|
|
||||||
fmt.Fprintf(&bb, "// Code generated by the command above; DO NOT EDIT.\n\n")
|
|
||||||
fmt.Fprintf(&bb, "package ipv6\n\n")
|
|
||||||
for _, r := range registries {
|
|
||||||
resp, err := http.Get(r.url)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer resp.Body.Close()
|
|
||||||
if resp.StatusCode != http.StatusOK {
|
|
||||||
return fmt.Errorf("got HTTP status code %v for %v\n", resp.StatusCode, r.url)
|
|
||||||
}
|
|
||||||
if err := r.parse(&bb, resp.Body); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
fmt.Fprintf(&bb, "\n")
|
|
||||||
}
|
|
||||||
b, err := format.Source(bb.Bytes())
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := ioutil.WriteFile("iana.go", b, 0644); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseICMPv6Parameters(w io.Writer, r io.Reader) error {
|
|
||||||
dec := xml.NewDecoder(r)
|
|
||||||
var icp icmpv6Parameters
|
|
||||||
if err := dec.Decode(&icp); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
prs := icp.escape()
|
|
||||||
fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated)
|
|
||||||
fmt.Fprintf(w, "const (\n")
|
|
||||||
for _, pr := range prs {
|
|
||||||
if pr.Name == "" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
fmt.Fprintf(w, "ICMPType%s ICMPType = %d", pr.Name, pr.Value)
|
|
||||||
fmt.Fprintf(w, "// %s\n", pr.OrigName)
|
|
||||||
}
|
|
||||||
fmt.Fprintf(w, ")\n\n")
|
|
||||||
fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated)
|
|
||||||
fmt.Fprintf(w, "var icmpTypes = map[ICMPType]string{\n")
|
|
||||||
for _, pr := range prs {
|
|
||||||
if pr.Name == "" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
fmt.Fprintf(w, "%d: %q,\n", pr.Value, strings.ToLower(pr.OrigName))
|
|
||||||
}
|
|
||||||
fmt.Fprintf(w, "}\n")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type icmpv6Parameters struct {
|
|
||||||
XMLName xml.Name `xml:"registry"`
|
|
||||||
Title string `xml:"title"`
|
|
||||||
Updated string `xml:"updated"`
|
|
||||||
Registries []struct {
|
|
||||||
Title string `xml:"title"`
|
|
||||||
Records []struct {
|
|
||||||
Value string `xml:"value"`
|
|
||||||
Name string `xml:"name"`
|
|
||||||
} `xml:"record"`
|
|
||||||
} `xml:"registry"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type canonICMPv6ParamRecord struct {
|
|
||||||
OrigName string
|
|
||||||
Name string
|
|
||||||
Value int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (icp *icmpv6Parameters) escape() []canonICMPv6ParamRecord {
|
|
||||||
id := -1
|
|
||||||
for i, r := range icp.Registries {
|
|
||||||
if strings.Contains(r.Title, "Type") || strings.Contains(r.Title, "type") {
|
|
||||||
id = i
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if id < 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
prs := make([]canonICMPv6ParamRecord, len(icp.Registries[id].Records))
|
|
||||||
sr := strings.NewReplacer(
|
|
||||||
"Messages", "",
|
|
||||||
"Message", "",
|
|
||||||
"ICMP", "",
|
|
||||||
"+", "P",
|
|
||||||
"-", "",
|
|
||||||
"/", "",
|
|
||||||
".", "",
|
|
||||||
" ", "",
|
|
||||||
)
|
|
||||||
for i, pr := range icp.Registries[id].Records {
|
|
||||||
if strings.Contains(pr.Name, "Reserved") ||
|
|
||||||
strings.Contains(pr.Name, "Unassigned") ||
|
|
||||||
strings.Contains(pr.Name, "Deprecated") ||
|
|
||||||
strings.Contains(pr.Name, "Experiment") ||
|
|
||||||
strings.Contains(pr.Name, "experiment") {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
ss := strings.Split(pr.Name, "\n")
|
|
||||||
if len(ss) > 1 {
|
|
||||||
prs[i].Name = strings.Join(ss, " ")
|
|
||||||
} else {
|
|
||||||
prs[i].Name = ss[0]
|
|
||||||
}
|
|
||||||
s := strings.TrimSpace(prs[i].Name)
|
|
||||||
prs[i].OrigName = s
|
|
||||||
prs[i].Name = sr.Replace(s)
|
|
||||||
prs[i].Value, _ = strconv.Atoi(pr.Value)
|
|
||||||
}
|
|
||||||
return prs
|
|
||||||
}
|
|
24
vendor/modules.txt
vendored
24
vendor/modules.txt
vendored
@ -7,13 +7,13 @@ github.com/fatedier/beego/logs
|
|||||||
# github.com/fatedier/golib v0.0.0-20181107124048-ff8cd814b049
|
# github.com/fatedier/golib v0.0.0-20181107124048-ff8cd814b049
|
||||||
github.com/fatedier/golib/control/shutdown
|
github.com/fatedier/golib/control/shutdown
|
||||||
github.com/fatedier/golib/crypto
|
github.com/fatedier/golib/crypto
|
||||||
github.com/fatedier/golib/io
|
|
||||||
github.com/fatedier/golib/pool
|
|
||||||
github.com/fatedier/golib/errors
|
github.com/fatedier/golib/errors
|
||||||
|
github.com/fatedier/golib/io
|
||||||
github.com/fatedier/golib/msg/json
|
github.com/fatedier/golib/msg/json
|
||||||
github.com/fatedier/golib/net
|
github.com/fatedier/golib/net
|
||||||
github.com/fatedier/golib/net/mux
|
github.com/fatedier/golib/net/mux
|
||||||
# github.com/fatedier/kcp-go v2.0.4-0.20190317085623-2063a803e6fe+incompatible
|
github.com/fatedier/golib/pool
|
||||||
|
# github.com/fatedier/kcp-go v2.0.4-0.20190803094908-fe8645b0a904+incompatible
|
||||||
github.com/fatedier/kcp-go
|
github.com/fatedier/kcp-go
|
||||||
# github.com/golang/snappy v0.0.0-20170215233205-553a64147049
|
# github.com/golang/snappy v0.0.0-20170215233205-553a64147049
|
||||||
github.com/golang/snappy
|
github.com/golang/snappy
|
||||||
@ -45,7 +45,7 @@ github.com/rodaine/table
|
|||||||
github.com/spf13/cobra
|
github.com/spf13/cobra
|
||||||
# github.com/spf13/pflag v1.0.1
|
# github.com/spf13/pflag v1.0.1
|
||||||
github.com/spf13/pflag
|
github.com/spf13/pflag
|
||||||
# github.com/stretchr/testify v1.2.1
|
# github.com/stretchr/testify v1.3.0
|
||||||
github.com/stretchr/testify/assert
|
github.com/stretchr/testify/assert
|
||||||
# github.com/templexxx/cpufeat v0.0.0-20170927014610-3794dfbfb047
|
# github.com/templexxx/cpufeat v0.0.0-20170927014610-3794dfbfb047
|
||||||
github.com/templexxx/cpufeat
|
github.com/templexxx/cpufeat
|
||||||
@ -56,21 +56,21 @@ github.com/tjfoc/gmsm/sm4
|
|||||||
# github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec
|
# github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec
|
||||||
github.com/vaughan0/go-ini
|
github.com/vaughan0/go-ini
|
||||||
# golang.org/x/crypto v0.0.0-20180505025534-4ec37c66abab
|
# golang.org/x/crypto v0.0.0-20180505025534-4ec37c66abab
|
||||||
golang.org/x/crypto/pbkdf2
|
|
||||||
golang.org/x/crypto/blowfish
|
golang.org/x/crypto/blowfish
|
||||||
golang.org/x/crypto/cast5
|
golang.org/x/crypto/cast5
|
||||||
|
golang.org/x/crypto/pbkdf2
|
||||||
golang.org/x/crypto/salsa20
|
golang.org/x/crypto/salsa20
|
||||||
|
golang.org/x/crypto/salsa20/salsa
|
||||||
golang.org/x/crypto/tea
|
golang.org/x/crypto/tea
|
||||||
golang.org/x/crypto/twofish
|
golang.org/x/crypto/twofish
|
||||||
golang.org/x/crypto/xtea
|
golang.org/x/crypto/xtea
|
||||||
golang.org/x/crypto/salsa20/salsa
|
|
||||||
# golang.org/x/net v0.0.0-20180524181706-dfa909b99c79
|
# golang.org/x/net v0.0.0-20180524181706-dfa909b99c79
|
||||||
golang.org/x/net/websocket
|
|
||||||
golang.org/x/net/context
|
|
||||||
golang.org/x/net/proxy
|
|
||||||
golang.org/x/net/ipv4
|
|
||||||
golang.org/x/net/ipv6
|
|
||||||
golang.org/x/net/internal/socks
|
|
||||||
golang.org/x/net/bpf
|
golang.org/x/net/bpf
|
||||||
|
golang.org/x/net/context
|
||||||
golang.org/x/net/internal/iana
|
golang.org/x/net/internal/iana
|
||||||
golang.org/x/net/internal/socket
|
golang.org/x/net/internal/socket
|
||||||
|
golang.org/x/net/internal/socks
|
||||||
|
golang.org/x/net/ipv4
|
||||||
|
golang.org/x/net/ipv6
|
||||||
|
golang.org/x/net/proxy
|
||||||
|
golang.org/x/net/websocket
|
||||||
|
Loading…
Reference in New Issue
Block a user