diff --git a/net/blockwise/blockwise.go b/net/blockwise/blockwise.go index 574175ec..8e0146e9 100644 --- a/net/blockwise/blockwise.go +++ b/net/blockwise/blockwise.go @@ -800,10 +800,6 @@ func (b *BlockWise[C]) getCachedReceivedMessage(mg *messageGuard, r *pool.Messag //nolint:gocyclo,gocognit func (b *BlockWise[C]) processReceivedMessage(w *responsewriter.ResponseWriter[C], r *pool.Message, maxSzx SZX, next func(w *responsewriter.ResponseWriter[C], r *pool.Message), exchangeKey uint64, blockType message.OptionID, sizeType message.OptionID) error { token := r.Token() - if len(token) == 0 { - next(w, r) - return nil - } if r.Code() == codes.GET || r.Code() == codes.DELETE { next(w, r) return nil diff --git a/udp/server_libcoap_test.go b/udp/server_libcoap_test.go new file mode 100644 index 00000000..43c5ee06 --- /dev/null +++ b/udp/server_libcoap_test.go @@ -0,0 +1,447 @@ +package udp + +import ( + "bytes" + "fmt" + "github.com/plgd-dev/go-coap/v3/message" + "github.com/plgd-dev/go-coap/v3/message/codes" + "github.com/plgd-dev/go-coap/v3/mux" + coapNet "github.com/plgd-dev/go-coap/v3/net" + "github.com/plgd-dev/go-coap/v3/options" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "math/rand" + "os/exec" + "sync" + "testing" +) + +func TestConnGetBlockwise(t *testing.T) { + + type args struct { + path string + opts message.Options + typ message.Type + } + tests := []struct { + name string + args args + wantCode codes.Code + wantContentFormat *message.MediaType + wantPayload interface{} + wantErr bool + useToken bool + }{ + { + name: "block-with-token", + args: args{ + path: "/big", + }, + wantCode: codes.Content, + wantContentFormat: &message.TextPlain, + wantPayload: bigPayload10KiB, + wantErr: false, + useToken: true, + }, + { + name: "block-without-token", + args: args{ + path: "/big", + }, + wantCode: codes.Content, + wantContentFormat: &message.TextPlain, + wantPayload: bigPayload10KiB, + wantErr: false, + useToken: false, + }, + } + + // verify that the binary coap-client is installed + _, err := exec.LookPath("coap-client") + if err != nil { + t.Error("coap-client not found in PATH") + return + } + + l, err := coapNet.NewListenUDP("udp", "") + require.NoError(t, err) + defer func() { + errC := l.Close() + require.NoError(t, errC) + }() + var wg sync.WaitGroup + defer wg.Wait() + + m := mux.NewRouter() + + err = m.Handle("/big", mux.HandlerFunc(func(w mux.ResponseWriter, r *mux.Message) { + assert.Equal(t, codes.GET, r.Code()) + errS := w.SetResponse(codes.Content, message.AppOctets, bytes.NewReader([]byte(bigPayload10KiB))) + require.NoError(t, errS) + require.NotEmpty(t, w.Conn()) + require.Equal(t, message.Confirmable, r.Type()) + })) + require.NoError(t, err) + + s := NewServer(options.WithMux(m)) + defer s.Stop() + + wg.Add(1) + go func() { + defer wg.Done() + errS := s.Serve(l) + assert.NoError(t, errS) + }() + + cc, err := Dial(l.LocalAddr().String()) + require.NoError(t, err) + defer func() { + errC := cc.Close() + require.NoError(t, errC) + <-cc.Done() + }() + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + + laddr := l.LocalAddr().String() + + receivedBody, err := sendCoAPRequestLibCoAP(laddr, "get", tt.args.path, false, tt.useToken) + + if tt.wantErr { + require.Error(t, err) + return + } else { + require.NoError(t, err) + } + + if tt.wantPayload != nil { + if wantPayloadBytes, ok := tt.wantPayload.([]byte); ok { + // add 1 for the extra newline added by coap-client + require.Len(t, receivedBody, len(wantPayloadBytes)+1) + require.Equal(t, wantPayloadBytes, receivedBody[0:len(wantPayloadBytes)]) + } + } + + }) + } +} + +func TestConnPutBlockwise(t *testing.T) { + + type args struct { + path string + opts message.Options + typ message.Type + } + tests := []struct { + name string + args args + wantCode codes.Code + wantErr bool + useToken bool + wantPayload []byte + }{ + { + name: "block-put-with-token", + args: args{ + path: "/big", + }, + wantCode: codes.Changed, + wantErr: false, + useToken: true, + }, + { + name: "block-put-without-token", + args: args{ + path: "/big", + }, + wantCode: codes.Changed, + wantErr: false, + useToken: false, + }, + } + + _, err := exec.LookPath("coap-client") + if err != nil { + t.Error("coap-client not found in PATH") + return + } + + l, err := coapNet.NewListenUDP("udp", "") + require.NoError(t, err) + defer func() { + errC := l.Close() + require.NoError(t, errC) + }() + var wg sync.WaitGroup + defer wg.Wait() + + m := mux.NewRouter() + + err = m.Handle("/big", mux.HandlerFunc(func(w mux.ResponseWriter, r *mux.Message) { + assert.Equal(t, codes.PUT, r.Code()) + errS := w.SetResponse(codes.Changed, message.TextPlain, nil) + received, err := r.ReadBody() + assert.NoError(t, err) + assert.Equal(t, bigPayload10KiB, received) + assert.NoError(t, errS) + assert.NotEmpty(t, w.Conn()) + assert.Equal(t, message.Confirmable, r.Type()) + })) + require.NoError(t, err) + + s := NewServer(options.WithMux(m)) + defer s.Stop() + + wg.Add(1) + go func() { + defer wg.Done() + errS := s.Serve(l) + assert.NoError(t, errS) + }() + + cc, err := Dial(l.LocalAddr().String()) + require.NoError(t, err) + defer func() { + errC := cc.Close() + require.NoError(t, errC) + <-cc.Done() + }() + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + laddr := l.LocalAddr().String() + _, err := sendCoAPRequestLibCoAP(laddr, "put", tt.args.path, true, tt.useToken) + if tt.wantErr { + require.Error(t, err) + return + } else { + require.NoError(t, err) + } + + }) + } +} + +func TestConnPostBlockwise(t *testing.T) { + + type args struct { + path string + opts message.Options + typ message.Type + } + tests := []struct { + name string + args args + wantCode codes.Code + wantErr bool + useToken bool + wantPayload []byte + }{ + { + name: "block-post-with-token", + args: args{ + path: "/big", + }, + wantCode: codes.Content, + wantErr: false, + useToken: true, + wantPayload: []byte(bigPayload10KiB), + }, + { + name: "block-post-without-token", + args: args{ + path: "/big", + }, + wantCode: codes.Content, + wantErr: false, + useToken: false, + wantPayload: []byte(bigPayload10KiB), + }, + } + + _, err := exec.LookPath("coap-client") + if err != nil { + t.Error("coap-client not found in PATH") + return + } + + l, err := coapNet.NewListenUDP("udp", "") + require.NoError(t, err) + defer func() { + errC := l.Close() + require.NoError(t, errC) + }() + var wg sync.WaitGroup + defer wg.Wait() + + m := mux.NewRouter() + + err = m.Handle("/big", mux.HandlerFunc(func(w mux.ResponseWriter, r *mux.Message) { + assert.Equal(t, codes.POST, r.Code()) + received, err := r.ReadBody() + errS := w.SetResponse(codes.Content, message.TextPlain, bytes.NewReader([]byte(bigPayload10KiB))) + assert.NoError(t, err) + assert.Equal(t, bigPayload10KiB, received) + assert.NoError(t, errS) + assert.NotEmpty(t, w.Conn()) + assert.Equal(t, message.Confirmable, r.Type()) + })) + require.NoError(t, err) + + s := NewServer(options.WithMux(m)) + defer s.Stop() + + wg.Add(1) + go func() { + defer wg.Done() + errS := s.Serve(l) + assert.NoError(t, errS) + }() + + cc, err := Dial(l.LocalAddr().String()) + require.NoError(t, err) + defer func() { + errC := cc.Close() + require.NoError(t, errC) + <-cc.Done() + }() + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + laddr := l.LocalAddr().String() + receivedBody, err := sendCoAPRequestLibCoAP(laddr, "post", tt.args.path, true, tt.useToken) + if tt.wantErr { + require.Error(t, err) + return + } else { + require.NoError(t, err) + } + if tt.wantPayload != nil { + // add 1 for the extra newline added by coap-client + require.Len(t, receivedBody, len(tt.wantPayload)+1) + require.Equal(t, tt.wantPayload, receivedBody[0:len(tt.wantPayload)]) + } + }) + } +} + +func sendCoAPRequestLibCoAP(address string, method string, path string, payload bool, token bool) ([]byte, error) { + + coapClientPath, err := exec.LookPath("coap-client") + if err != nil { + return nil, fmt.Errorf("coap-client not found in PATH") + } + + // Build coap-client command arguments + var args []string + args = append(args, "-m", method) + if token { + rand.Uint64() + args = append(args, "-T", fmt.Sprintf("%d", rand.Uint64())) + } + if payload { + args = append(args, "-b", "1024") + args = append(args, "-e", string(bigPayload10KiB)) + } + // Construct URI + uri := fmt.Sprintf("coap://%s%s", address, path) + args = append(args, uri) + + // Prepare command + cmd := exec.Command(coapClientPath, args...) + var out bytes.Buffer + cmd.Stdout = &out + cmd.Stderr = &out + + // Execute command + err = cmd.Run() + if err != nil { + return nil, fmt.Errorf("coap-client error: %v, output: %s", err, out.String()) + } + return out.Bytes(), nil +} + +const bigPayload10KiB = `89075337635954647102216077828334038179638965680796041208684221958292459041499210220101176726750119361506928946801115768179724 +42244632672758898527798766326186965189573496725417576843236332384515325066967967084729236662659424427203830789178855960389888 +59671607161000645588293584669984665020199777828148967747970527020608102921980556435899241646582421992569038754973449362160805 +31239955776017464552148435666505635723861800404618684226812752076597749931057757306056294943547000781262839809899923354086591 +58421004045160720410218892782153917915938163263152750197199304506126821048289291640271668334925747202569241057032162874410383 +13229406649061136455569503589840650992763870062625721531357020224282471379189564485235429826481871222615972206141109473569331 +50068277012583532229033541176707338889365478924968936854152065761173915111644345900669149625078722916074227614326832708754591 +53533652284306970616530322571286936751979637851359030657540649747647283544275697965879550870371044054664298592239900461215946 +76009059557554499660184378901914608236499545073223411783200832723363996938480422813626779756075702722002878735198607429314193 +44002094736767271088986498050654477655967376633678898223733576930739058637767383825961935849401218839710209402921257312961820 +93704825260513424135582178831244406040516588096108309029134822401818513505740695550261354254202973752753820320279087360947196 +55918429621241310363836489491902956692037789941466247111756063173743711825493750990483199095354632251948735581443540571147851 +33576705451417485999639036485103175235333968552793775415105863301060242033137339301553612465043007580178633002347254939486774 +76253351740254469522962295669204305447952824810032268893825488928747429925263799090622391747617047596391321066536712638557732 +37575680867445273951554153048030665598693393863627045322930863847468446766294432847821571079532490545167872329045539409949015 +93424779192253246902943606375448951225118448301956086168374658315461330349815680774676027301983519593091618714763496693321327 +52767560011321332624699332725304370589521682784449705303919999267803733573563697085551153378979854593006577548089909981713543 +28076046071839726793529076260525971094945446115633757355321401737626029007902666342541163866562552047333051804212926622330282 +41096775669616585889040375006715884019811536956240585233400637946794045905653897316207855958856671262695550818746832431295606 +70652628916349630328692621288716842439079295659578841841121454120413491068989115858630542130200218283594695012061423897090440 +61834218560689831750814231844102644604379090428070285797202462407658011097354022625203348117358972984576871018057035444003622 +87704020021974124384513179485429737379288056395947178851257079604107224206190139277216709889542925856531989476001916224619027 +68863759387563972830508162729801251953866678821015546893324592328605329412503154570657275236887715775692340674320468072326355 +09652862095090758001517843237063025061907709965234713527113847987907684535971539884349496439713393308607538169073516509320573 +19881717677921921624342488023285457464136994664772067954504249230069924114917578758575435078932814946225816723664286840764088 +42903975093490490368271551172366611153663502119251412128499322432500850940709954830267709530655015452710045689921953344525963 +25181979506203109704260551650210011996075343877738000511568860075434229446979442101114340921202046274692076576166863291451499 +53087544164706838697712066307637631542308577890521950715395956733727831900957419936036043512013354318852228554517014871430445 +52183006933853209704979716208434160389680560396817362087348868632182558538333715494847726439829807889964882762910089850375881 +42374547618731039196179936072809036245422983954444342795738247254385457457840805971763359054583201742435961107686979396610623 +24810103683410495617851410713572620315448726583584981449947038985485575281475744247630223527779072265880742100969654904378021 +63159154891797884371607885984519924645150719852298986970682242180937549859931769323892726795180205653285906650158213591969127 +87584804780808650485104610259334382933033303555501614573072992784704112611794953126897375807677686756469206675739847741801759 +09824382502353567699991849042178048955406918794863723166080325077644830766879531093270447724236915505895091270857030568108888 +09801992343429647677725213078625344323137570136533993666574069066185597762165272865617351906631969497431308212311746452332753 +50486215446522914826756760315765086483752253455388698527009715323278898802761011517540687432125915776353741286574042410803907 +21693777203033787663322463779624583040636801288144509467244071168015742536261876591972752425051924337119337687394361921739271 +90782443576883768473658476996997690398558218656699441901303581912737632512156234121965757392716338541365378912629415243052335 +39966843950750216344635598090354376724959221639932240820241921222236937716204176100927784185548554306742005876297206915395062 +33984656790327209572799164845594061516502187119288192507898280455275349934963903033116073335340214429518139514404296428299813 +45709035063666734295338164676114269238076991968263060903866042463997529462945589367524801365231239381745249836014682584665967 +63702169565055877527937350731227650228819291370454964156393023418199235266272252491983118158864530128121190181280922773935061 +10633847162296395529279853416539160660383168075328476096164323882800878408541926508583157678473846700986162454710214467032609 +70695523430486870405926491480465478328389802802281318130052139074763712102777228504565265741052198476896513873035147853509815 +73078021574206557938177610955651392978681244556911665485455547538211821498634073945889446610769521367694337737390779669869295 +10465182443527405380842657958322578071720630930701861540608596335839977863802345945722887362911731221008394685261963106407347 +77769897119118227701392711561080248625076536303981719830420967909426069927176983706599409138558924049251608743464919960916913 +88144570581227246506857913197393511175039532892612497264469129095171957627003663858975634494223856152051777243951032446935546 +62987289043239106757365713838749756512351395065276549477382090524107741332847943142919302030966647973228434124101914071624286 +38571288718091450283219945881615099541961495788620178007409933850077658816577006698223328485235433864284768946459888978216577 +47121699195402960072871933253315268991054161819251632890101324426239901606842780785254856630928049697991199918241968401687524 +65917937976902296337925064170768584673518495564384581873028808994535266235268635617401741978167174736077047319525843245759343 +70089161298342265005635681355733041124267109366906725676486016427743761626473104987846106872157445707062414835687945128374662 +89578825333982166848552419287023972913145525150970413085783382589068517065687648235897591171908548273384218256386786982783082 +54298922025845725997349029801423554359348857886791912956117795498184706033931934972442078416047288579273242704361631862185496 +00559535375962052162160562274037339636206853812154636551165938337083356552065298018917831445739403967087655507716769518427209 +93197152162769887682284700761571792662042793655938685565590800435746787101566909314895914936114939501750913365898132656211516 +65919663342722607482529888843347435488546095771604379817945620118200814679008863059926636168213036287099298294287937507356028 +47557350704402491600870402313666691818619528095780380450597711824896871448094764991406857183765003310046481104033999501529907 +63819829881388547210659728155280434115308871143756474969891988249036889905587973832229218365220659637721234812454336200969892 +32565250463372632426784739554249126871707586582634575773633845120978981984781614243321805022984037644550213376382706755538912 +63608087503356415074008640542255965044047385324771966963263687374409541633212667392460170204187585131796962853507077426711467 +82416830408263179547656799909628874003594254830066742351215196660229808482517727653658361184008407639636658314771196514435962 +57055069805255258228997338263416055356962496010247998302332315983943137071589919332935915443079086663292689332796915458858533 +78802099882867673292044986061116853831320553485603326418562099086610304726697864321643940148243293713566569997844148131098723 +32972049017800181590635560746903342186718786568739340270066843173403600088184879446370243389513987511245430183035749259677219 +39475221986745701867045264567295495715162655776937004945587798562307888275226753515294447709418579527627929320806930595092445 +07062444659367053864980480876549582414301239604607713417984571474999763436066374643155514932821874818105012051756426832019448 +38912103535134759846806959529551046008717147043532640492940270997592379633272871916443154917716735955061067476857984563591060 +66600141050577560146599713740762987006647076728636752019214782143927038039299604432858077630018642677582399873252904382929701 +03990998933463052939580256625676152921018937035604237385974487395760437176602948388018261638805259647043228421413136698703550 +43906766027304356681735753014548157098522605811449867456674754796897475153268766128934441535835653548554674438300332619143310 +69482641242905730593109334920730380850018799800268024459342932768494782438798233478030223177726400957860816341294807806542076 +12404964114462146952823124601890934461763628627826392674615311380751608882622614308376225040930500390369920058611297275044397 +27698625743431139018191831104741463234424768206206261648154142508534124892891747531635846606916749510281665170434053883695497 +28014022062629206324986083614666093768159373547463515583848785363477829205304363587371900155823057654041248791031214759095492 +32645352421401631755122614453624940807860429677835265660762815808343546961259904405838666922615861735247043270283672601831237 +23845743452187724003922760010768251830780151145483923718790185717515691135593968954580679887728900565822409559108323375977132 +91655282321189488943674583928812971734718557687261267540861951330156857260194972959320584575281425950364513866555614168110966 +87585502488315874658362449099439868192063303681917995993161431685969345689815394695246096186072665320424126902383281639806078 +13897268972795607841085430069511881664533488909312510299548807790607510574162189448464719710343594178873230685172521870698370 +6337814198009624212201025856162445`