How to use TestTLSConfig method of ws Package

Best K6 code snippet using ws.TestTLSConfig

server.go

Source:server.go Github

copy

Full Screen

1package kvdb2import (3 "context"4 "errors"5 "github.com/sdh21/dstore/paxos"6 "github.com/sdh21/dstore/storage"7 "github.com/sdh21/dstore/utils"8 "google.golang.org/grpc"9 "google.golang.org/grpc/codes"10 "google.golang.org/grpc/credentials"11 "google.golang.org/grpc/status"12 "log"13 "net"14 "sync"15 "sync/atomic"16 "time"17)18type DiskStorage struct {19 storage *storage.Storage20 storageStats *storage.BlockStatistics21 mapLock sync.Mutex22 key2block map[string][]*storage.FileBlockInfo23 folder string24}25func (dsk *DiskStorage) Write(key string, size int64, value []byte) error {26 blocks, err := dsk.storage.CreateLogFile(size, value, dsk.storageStats)27 if err != nil {28 return err29 }30 dsk.mapLock.Lock()31 _, found := dsk.key2block[key]32 if found {33 dsk.mapLock.Unlock()34 return errors.New("kvdb Write, key already exists")35 }36 dsk.key2block[key] = blocks37 dsk.mapLock.Unlock()38 return nil39}40func (dsk *DiskStorage) Delete(key string) error {41 dsk.mapLock.Lock()42 blocks := dsk.key2block[key]43 delete(dsk.key2block, key)44 dsk.mapLock.Unlock()45 if blocks == nil {46 return errors.New("trying to release a non-existing file")47 }48 err := dsk.storage.DeleteLogFile(blocks, dsk.storageStats)49 return err50}51type KeyValueDB struct {52 // db socket serving incoming requests53 l net.Listener54 server *grpc.Server55 address string56 addresses []string57 closed int3258 unreliable bool // for testing59 px *paxos.Paxos60 decideChannel chan paxos.DecideEvent61 mu sync.Mutex62 state *DBState63 // proposal id that includes nil proposals64 lastProposalId int6465 requestsBlockList map[int64]*waitProposal66 requestsBlockListLock sync.Mutex67 waitingCount int6468 checkpoint *checkpointInst69 UnimplementedKeyValueDBServer70}71type DBConfig struct {72 StorageFolder string73 PaxosFolder string74 StorageBlockSize uint3275 AllocationUnit uint3276 PaxosConfig *paxos.ServerConfig77 // db address is different from paxos address78 // in order to allow different tls settings79 DBAddress string80 // All DB servers, not used81 Addresses []string82 Listener net.Listener83 TLS *utils.MutualTLSConfig84 Checkpoint CheckpointConfig85}86func DefaultConfig() *DBConfig {87 config := &DBConfig{}88 config.StorageBlockSize = 64 * 1024 * 102489 config.AllocationUnit = 4 * 102490 config.TLS = utils.TestTlsConfig()91 config.PaxosConfig = &paxos.ServerConfig{92 Peers: nil,93 Me: 0,94 Storage: nil,95 Timeout: 3000 * time.Millisecond,96 RandomBackoffMax: 3000,97 HeartbeatInterval: 1000,98 LeaderTimeoutRTTs: 10,99 LeaderTimeout: 10000,100 DecideChannel: make(chan paxos.DecideEvent, 100),101 Listener: nil,102 AdditionalTimeoutPer100Holes: 100 * time.Millisecond,103 TLS: utils.TestTlsConfig(),104 }105 return config106}107const MaxGRPCMsgSize = 512 * 1024 * 1024108func NewServer(config *DBConfig) (*KeyValueDB, error) {109 db := &KeyValueDB{}110 px, err := initializePaxos(config)111 if err != nil {112 return nil, err113 }114 db.px = px115 err = db.initializeCheckPoint(config)116 if err != nil {117 return nil, err118 }119 serverTLSConfig, _, err := utils.LoadMutualTLSConfig(config.TLS)120 if err != nil {121 return nil, err122 }123 db.state = NewDBState()124 db.decideChannel = config.PaxosConfig.DecideChannel125 db.server = grpc.NewServer(grpc.Creds(credentials.NewTLS(serverTLSConfig)),126 grpc.MaxRecvMsgSize(MaxGRPCMsgSize), grpc.MaxSendMsgSize(MaxGRPCMsgSize),127 grpc.MaxConcurrentStreams(20000))128 db.address = config.DBAddress129 db.addresses = config.Addresses130 db.requestsBlockList = map[int64]*waitProposal{}131 db.l = config.Listener132 return db, nil133}134func (db *KeyValueDB) BatchSubmit(ctx context.Context, args *BatchSubmitArgs) (*BatchSubmitReply, error) {135 reply := &BatchSubmitReply{}136 opWrapper := args.Wrapper137 if int64(len(opWrapper.Transactions)) != opWrapper.Count {138 reply.OK = false139 return nil, status.Error(codes.InvalidArgument, "invalid requests, count not consistent")140 }141 utils.Info("KeyValueDB %v is proposing %v", db.address, opWrapper)142 // Indicate that someone is waiting and we should not143 // discard apply results.144 atomic.AddInt64(&db.waitingCount, 1)145 defer func() {146 atomic.AddInt64(&db.waitingCount, -1)147 }()148 proposeValueResult := db.px.ProposeValue(opWrapper, func(i interface{}, i2 interface{}) bool {149 if i == nil || i2 == nil {150 return false151 }152 return i.(*OpWrapper).WrapperId == i2.(*OpWrapper).WrapperId &&153 i.(*OpWrapper).ForwarderId == i2.(*OpWrapper).ForwarderId154 })155 opWrapper = nil156 if !proposeValueResult.Succeeded {157 // redirect requests to leader158 reply.OK = false159 if proposeValueResult.LeaderHint != -1 {160 reply.TalkTo = "" // db.addresses[proposeValueResult.LeaderHint]161 }162 if proposeValueResult.Reason != paxos.FailReasonProposerNotLeader {163 // client should not talk to us for a period of time164 // we might be an old leader in a network partition165 reply.InternalError = true166 }167 //logger.Info("KeyValueDB %v propose failed reason: %v, value: %v", db.address, proposeValueResult.Reason, opWrapper)168 return reply, nil169 } else {170 w := &waitProposal{171 proposalId: proposeValueResult.InstanceId,172 waitChan: make(chan bool),173 }174 proposalId := proposeValueResult.InstanceId175 //logger.Info("KeyValueDB %v propose success instanceId: %v, value: %v", db.address, w.proposalId, opWrapper)176 db.requestsBlockListLock.Lock()177 // wait for the proposal to be applied178 applyResult, found := db.requestsBlockList[proposalId]179 if found {180 // already there181 reply.Result = applyResult.result182 if reply.Result == nil {183 log.Fatalf("nil result!!")184 }185 delete(db.requestsBlockList, proposalId)186 db.requestsBlockListLock.Unlock()187 } else {188 // waiting for result189 db.requestsBlockList[proposalId] = w190 db.requestsBlockListLock.Unlock()191 _ = <-w.waitChan192 db.requestsBlockListLock.Lock()193 delete(db.requestsBlockList, proposalId)194 db.requestsBlockListLock.Unlock()195 if w.result == nil {196 log.Fatalf("nil result!!!!!!!!!")197 }198 reply.Result = w.result199 }200 close(w.waitChan)201 if reply.Result == nil {202 log.Fatalf("nil result!!")203 }204 reply.OK = true205 return reply, nil206 }207}208type waitProposal struct {209 proposalId int64210 result *WrapperResult211 waitChan chan bool212}213func (db *KeyValueDB) waitDecide() {214 go func() {215 for {216 event, ok := <-db.decideChannel217 if !ok {218 break219 }220 db.checkpoint.eventChannel <- event221 atomic.StoreInt64(&db.lastProposalId, event.InstanceId)222 if event.DecidedValue == nil {223 continue224 }225 // apply OpWrapper one by one, but different transactions in226 // an OpWrapper can apply concurrently.227 db.requestsBlockListLock.Lock()228 applyResult := db.applyOpWrapper(db.state, event.DecidedValue.(*OpWrapper), event.InstanceId)229 if atomic.LoadInt64(&db.waitingCount) <= 0 {230 // just discard the applyResult.231 // also, we can reset requestsBlockList232 // since no one is actually waiting.233 if len(db.requestsBlockList) > 0 {234 db.requestsBlockList = map[int64]*waitProposal{}235 }236 db.requestsBlockListLock.Unlock()237 continue238 }239 ws, found := db.requestsBlockList[event.InstanceId]240 if found {241 // someone is waiting242 ws.result = applyResult243 ws.waitChan <- true244 } else {245 // no one is waiting, just put there246 db.requestsBlockList[event.InstanceId] = &waitProposal{247 proposalId: event.InstanceId,248 result: applyResult,249 waitChan: nil,250 }251 }252 db.requestsBlockListLock.Unlock()253 }254 }()255}256// Close gracefully shutdowns server257func (db *KeyValueDB) Close() {258 atomic.StoreInt32(&db.closed, 1)259 db.px.Close()260 db.server.Stop()261 close(db.decideChannel)262}263func (db *KeyValueDB) StartServer() {264 db.px.StartServer()265 RegisterKeyValueDBServer(db.server, db)266 if db.l == nil {267 l, err := net.Listen("tcp", db.address)268 if err != nil {269 log.Fatal("listen error: ", err)270 }271 db.l = l272 }273 go func() {274 err := db.server.Serve(db.l)275 if err != nil {276 utils.Error("serve err: %v", err)277 }278 }()279 db.waitDecide()280 db.startCheckpointRoutine()281}...

Full Screen

Full Screen

wsforwarder.go

Source:wsforwarder.go Github

copy

Full Screen

1// Copyright 2016 bs authors. All rights reserved.2// Use of this source code is governed by a BSD-style3// license that can be found in the LICENSE file.4package log5import (6 "crypto/tls"7 "encoding/json"8 "errors"9 "fmt"10 "io"11 "io/ioutil"12 "net"13 "net/url"14 "sync"15 "sync/atomic"16 "time"17 "github.com/tsuru/bs/bslog"18 "github.com/tsuru/bs/config"19 "github.com/tsuru/bs/container"20 "github.com/tsuru/tsuru/app"21 "golang.org/x/net/websocket"22)23var (24 // Overridden by tests with tls enabled.25 testTlsConfig *tls.Config26 errConnMaxAgeExceeded = errors.New("max connection age exceeded")27)28type tsuruBackend struct {29 msgCh chan<- LogMessage30 quitCh chan<- bool31 nextNotify *time.Timer32}33type wsForwarder struct {34 url string35 token string36 connMutex sync.Mutex37 pingInterval time.Duration38 pongInterval time.Duration39 jsonEncoder *json.Encoder40 quitCh <-chan bool41 bufferConn *bufferedConn42 connCreatedAt time.Time43 connMaxAge time.Duration44 expireConnCh chan bool45}46func (b *tsuruBackend) initialize() error {47 config.LoadConfig()48 if config.Config.TsuruEndpoint == "" {49 return fmt.Errorf("environment variable for TSURU_ENDPOINT must be set")50 }51 bufferSize := config.IntEnvOrDefault(config.DefaultBufferSize, "LOG_TSURU_BUFFER_SIZE", "LOG_BUFFER_SIZE")52 wsPingInterval := config.SecondsEnvOrDefault(config.DefaultWsPingInterval, "LOG_TSURU_PING_INTERVAL", "LOG_WS_PING_INTERVAL")53 wsPongInterval := config.SecondsEnvOrDefault(0, "LOG_TSURU_PONG_INTERVAL", "LOG_WS_PONG_INTERVAL")54 if wsPongInterval < wsPingInterval {55 newPongInterval := wsPingInterval * 456 bslog.Warnf("invalid WS pong interval %v (it must be higher than ping interval). Using the default value of %v", wsPongInterval, newPongInterval)57 wsPongInterval = newPongInterval58 }59 wsConnMaxAge := config.SecondsEnvOrDefault(-1, "LOG_TSURU_CONN_MAX_AGE")60 b.nextNotify = time.NewTimer(0)61 tsuruUrl, err := url.Parse(config.Config.TsuruEndpoint)62 if err != nil {63 return err64 }65 tsuruUrl.Path = "/logs"66 if tsuruUrl.Scheme == "https" {67 tsuruUrl.Scheme = "wss"68 } else {69 tsuruUrl.Scheme = "ws"70 }71 forwardChan, quitChan, err := processMessages(&wsForwarder{72 url: tsuruUrl.String(),73 token: config.Config.TsuruToken,74 pingInterval: wsPingInterval,75 pongInterval: wsPongInterval,76 connMaxAge: wsConnMaxAge,77 }, bufferSize)78 if err != nil {79 return err80 }81 b.msgCh = forwardChan82 b.quitCh = quitChan83 return nil84}85func (b *tsuruBackend) sendMessage(parts *rawLogParts, c *container.Container) {86 msg := &app.Applog{87 Date: parts.ts,88 AppName: c.AppName,89 Message: string(parts.content),90 Source: c.ProcessName,91 Unit: c.ShortHostname,92 }93 select {94 case b.msgCh <- msg:95 default:96 select {97 case <-b.nextNotify.C:98 bslog.Errorf("Dropping log messages to tsuru due to full channel buffer.")99 b.nextNotify.Reset(time.Minute)100 default:101 }102 }103}104func (b *tsuruBackend) stop() {105 close(b.quitCh)106}107func (f *wsForwarder) initialize(quitCh <-chan bool) {108 f.quitCh = quitCh109}110func (f *wsForwarder) connect() (net.Conn, error) {111 config, err := websocket.NewConfig(f.url, "ws://localhost/")112 if err != nil {113 return nil, err114 }115 if testTlsConfig != nil {116 config.TlsConfig = testTlsConfig117 }118 config.Header.Add("Authorization", "bearer "+f.token)119 var client net.Conn120 host, port, _ := net.SplitHostPort(config.Location.Host)121 if host == "" {122 host = config.Location.Host123 }124 dialer := &net.Dialer{125 Timeout: forwardConnDialTimeout,126 KeepAlive: 30 * time.Second,127 }128 switch config.Location.Scheme {129 case "ws":130 if port == "" {131 port = "80"132 }133 client, err = dialer.Dial("tcp", fmt.Sprintf("%s:%s", host, port))134 case "wss":135 if port == "" {136 port = "443"137 }138 client, err = tls.DialWithDialer(dialer, "tcp", fmt.Sprintf("%s:%s", host, port), config.TlsConfig)139 default:140 err = websocket.ErrBadScheme141 }142 if err != nil {143 return nil, err144 }145 f.connCreatedAt = time.Now()146 f.expireConnCh = make(chan bool)147 ws, err := websocket.NewClient(config, client)148 if err != nil {149 client.Close()150 return nil, err151 }152 pingWriter, err := ws.NewFrameWriter(websocket.PingFrame)153 if err != nil {154 client.Close()155 bslog.Errorf("[log forwarder] unable to create ping frame writer, closing websocket: %s", err)156 return nil, err157 }158 f.bufferConn = newBufferedConn(ws, time.Second)159 lastPongTime := time.Now().UnixNano()160 stopWg.Add(2)161 go func() {162 defer stopWg.Done()163 defer client.Close()164 for {165 frame, err := ws.NewFrameReader()166 if err != nil {167 select {168 case <-f.expireConnCh:169 return170 default:171 }172 bslog.Errorf("[log forwarder] unable to create pong frame reader, closing websocket: %s", err)173 return174 }175 if frame.PayloadType() == websocket.PongFrame {176 atomic.StoreInt64(&lastPongTime, time.Now().UnixNano())177 }178 _, _ = io.Copy(ioutil.Discard, frame)179 }180 }()181 go func() {182 defer stopWg.Done()183 defer client.Close()184 for {185 select {186 case <-time.After(f.pingInterval):187 case <-f.quitCh:188 return189 case <-f.expireConnCh:190 return191 }192 err := f.writeWithDeadline(ws, pingWriter, []byte{'z'})193 if err != nil {194 bslog.Errorf("[log forwarder] ping: %s", err)195 return196 }197 mylastPongTime := atomic.LoadInt64(&lastPongTime)198 lastPong := time.Unix(0, mylastPongTime)199 now := time.Now()200 if now.After(lastPong.Add(f.pongInterval)) {201 bslog.Errorf("[log forwarder] no pong response in %v, closing websocket", now.Sub(lastPong))202 return203 }204 }205 }()206 f.jsonEncoder = json.NewEncoder(f.bufferConn)207 return f.bufferConn, nil208}209func (f *wsForwarder) writeWithDeadline(conn net.Conn, writer io.WriteCloser, data []byte) error {210 f.connMutex.Lock()211 defer f.connMutex.Unlock()212 f.bufferConn.mu.Lock()213 defer f.bufferConn.mu.Unlock()214 err := conn.SetWriteDeadline(time.Now().Add(forwardConnWriteTimeout))215 if err != nil {216 return fmt.Errorf("error setting deadline: %s", err)217 }218 n, err := writer.Write(data)219 if err != nil {220 return fmt.Errorf("error sending message: %s", err)221 }222 if n < len(data) {223 return fmt.Errorf("short write trying to write log to %q", conn.RemoteAddr())224 }225 return nil226}227func (f *wsForwarder) process(conn net.Conn, msg LogMessage) error {228 f.connMutex.Lock()229 defer f.connMutex.Unlock()230 err := conn.SetWriteDeadline(time.Now().Add(forwardConnWriteTimeout))231 if err != nil {232 return fmt.Errorf("error setting deadline: %s", err)233 }234 entry := msg.(*app.Applog)235 err = f.jsonEncoder.Encode(entry)236 if err != nil {237 return fmt.Errorf("error sending message: %s", err)238 }239 if time.Since(f.connCreatedAt) >= f.connMaxAge && f.connMaxAge >= 0 {240 close(f.expireConnCh)241 return errConnMaxAgeExceeded242 }243 return nil244}245func (f *wsForwarder) close(conn net.Conn) {246 f.connMutex.Lock()247 defer f.connMutex.Unlock()248 if err := conn.SetWriteDeadline(time.Now().Add(forwardConnWriteTimeout)); err != nil {249 bslog.Errorf("unable to set deadline: %v", err)250 }251 conn.Close()252}...

Full Screen

Full Screen

websocket_server_test.go

Source:websocket_server_test.go Github

copy

Full Screen

1package transport2import (3 "io/ioutil"4 "net/http"5 "testing"6 "github.com/stretchr/testify/assert"7 "github.com/stretchr/testify/require"8)9func TestWSServer(t *testing.T) {10 abstractServerTest(t, "ws")11}12func TestWSSServer(t *testing.T) {13 abstractServerTest(t, "wss")14}15func TestWSServerLaunchError(t *testing.T) {16 abstractServerLaunchErrorTest(t, "ws")17}18func TestWSSServerLaunchError(t *testing.T) {19 abstractServerLaunchErrorTest(t, "wss")20}21func TestWebSocketServerAcceptAfterClose(t *testing.T) {22 abstractServerAcceptAfterCloseTest(t, "ws")23}24func TestWebSocketServerCloseAfterClose(t *testing.T) {25 abstractServerCloseAfterCloseTest(t, "ws")26}27func TestWebSocketServerAddr(t *testing.T) {28 abstractServerAddrTest(t, "ws")29}30func TestWebSocketServerInvalidUpgrade(t *testing.T) {31 server, err := testLauncher.Launch("ws://localhost:0")32 require.NoError(t, err)33 res, err := http.Get(getURL(server, "http"))34 assert.NoError(t, err)35 assert.Equal(t, http.StatusBadRequest, res.StatusCode)36 err = server.Close()37 assert.NoError(t, err)38}39func TestWebSocketServerAcceptAfterError(t *testing.T) {40 server, err := testLauncher.Launch("ws://localhost:0")41 require.NoError(t, err)42 webSocketServer := server.(*WebSocketServer)43 err = webSocketServer.listener.Close()44 assert.NoError(t, err)45 conn, err := server.Accept()46 require.Nil(t, conn)47 assert.Error(t, err)48}49func TestWebSocketServerConnectionCancelOnClose(t *testing.T) {50 server, err := testLauncher.Launch("ws://localhost:0")51 require.NoError(t, err)52 conn, err := testDialer.Dial(getURL(server, "ws"))53 require.NoError(t, err)54 err = server.Close()55 assert.NoError(t, err)56 pkt, err := conn.Receive()57 assert.Nil(t, pkt)58 assert.Error(t, err)59}60func TestWebSocketFallback(t *testing.T) {61 mux := http.NewServeMux()62 mux.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {63 _, _ = w.Write([]byte("Hello world: " + r.Proto))64 })65 server, err := CreateWebSocketServer("localhost:0", mux)66 require.NoError(t, err)67 resp, err := http.Get(getURL(server, "http") + "/test")68 assert.NoError(t, err)69 assert.Equal(t, http.StatusOK, resp.StatusCode)70 bytes, err := ioutil.ReadAll(resp.Body)71 assert.NoError(t, err)72 assert.Equal(t, []byte("Hello world: HTTP/1.1"), bytes)73 err = server.Close()74 assert.NoError(t, err)75}76func TestWebSocketFallbackHTTP2(t *testing.T) {77 mux := http.NewServeMux()78 mux.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {79 _, _ = w.Write([]byte("Hello world: " + r.Proto))80 })81 server, err := CreateSecureWebSocketServer("localhost:0", testTLSConfig, mux)82 require.NoError(t, err)83 resp, err := http.Get(getURL(server, "https") + "/test")84 assert.NoError(t, err)85 assert.Equal(t, http.StatusOK, resp.StatusCode)86 bytes, err := ioutil.ReadAll(resp.Body)87 assert.NoError(t, err)88 assert.Equal(t, []byte("Hello world: HTTP/2.0"), bytes)89 err = server.Close()90 assert.NoError(t, err)91}...

Full Screen

Full Screen

TestTLSConfig

Using AI Code Generation

copy

Full Screen

1import (2var (3func main() {4 u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/ws"}5 log.Printf("connecting to %s", u.String())6 c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)7 if err != nil {8 log.Fatal("dial:", err)9 }10 defer c.Close()11 _, message, err := c.ReadMessage()12 if err != nil {13 log.Println("read:", err)14 }15 log.Printf("recv: %s", message)16}17import (18var (19func main() {20 http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {21 log.Println("Got a request for: ", r.URL.String())22 })23 http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {24 conn, err := websocket.Upgrade(w, r, w.Header(), 1024, 1024)25 if err != nil {26 log.Println(err)27 }28 if err := conn.WriteMessage(1, []byte("Hello World")); err != nil {

Full Screen

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful