This repository has been archived by the owner on Dec 13, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 43
/
ethernet_test.go
102 lines (93 loc) · 2.67 KB
/
ethernet_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// Copyright (C) 2015 Nippon Telegraph and Telephone Corporation.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
// implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package ethernet
import (
"flag"
"fmt"
"github.com/osrg/earthquake/earthquake/endpoint/local"
"github.com/osrg/earthquake/earthquake/signal"
logutil "github.com/osrg/earthquake/earthquake/util/log"
"github.com/osrg/earthquake/earthquake/util/mockorchestrator"
"github.com/stretchr/testify/assert"
zmq "github.com/vaughan0/go-zmq"
"io/ioutil"
"os"
"testing"
)
func TestMain(m *testing.M) {
flag.Parse()
logutil.InitLog("", true)
signal.RegisterKnownSignals()
orcActionCh := make(chan signal.Action)
orcEventCh := local.SingletonLocalEndpoint.Start(orcActionCh)
defer local.SingletonLocalEndpoint.Shutdown()
mockOrc := mockorchestrator.NewMockOrchestrator(orcEventCh, orcActionCh)
mockOrc.Start()
defer mockOrc.Shutdown()
os.Exit(m.Run())
}
func tempZMQAddr(t *testing.T) string {
tmpfile, err := ioutil.TempFile("", "test-hookswitch-inspector")
assert.NoError(t, err)
path := tmpfile.Name()
// we don't need the file itself
os.Remove(path)
addr := fmt.Sprintf("ipc://%s", path)
return addr
}
func hookSwitchRequest(t *testing.T, id int) [][]byte {
meta := fmt.Sprintf("{\"id\":%d}", id)
eth := "\xff\xff\xff\xff\xff\xff" +
"\x00\x00\x00\x00\x00\x00" +
"\x08\x00"
frame := eth + "dummypayload"
return [][]byte{[]byte(meta), []byte(frame)}
}
func TestHookSwitchInspector_10(t *testing.T) {
testHookSwitchInspector(t, 10)
}
func testHookSwitchInspector(t *testing.T, n int) {
context, err := zmq.NewContext()
assert.NoError(t, err)
defer context.Close()
socket, err := context.Socket(zmq.Pair)
assert.NoError(t, err)
defer socket.Close()
zmqAddr := tempZMQAddr(t)
insp, err := NewHookSwitchInspector(
"local://",
"_dummy_entity_id",
zmqAddr,
true)
assert.NoError(t, err)
socket.Connect(zmqAddr)
go func() {
insp.Serve()
}()
defer insp.Shutdown()
chans := socket.Channels()
defer chans.Close()
for i := 0; i < n; i++ {
req := hookSwitchRequest(t, i)
chans.Out() <- req
t.Logf("Sent %d, %v", i, req)
select {
case rsp := <-chans.In():
t.Logf("Received %d, %v", i, rsp)
case err := <-chans.Errors():
t.Fatal(err)
}
}
}