gosnmp
/
generic_e2e_test.go
862 строки · 25.4 Кб
1// Copyright 2012 The GoSNMP Authors. All rights reserved. Use of this
2// source code is governed by a BSD-style license that can be found in the
3// LICENSE file.
4
5// This set of end-to-end integration tests execute gosnmp against a real
6// SNMP MIB-2 host. Potential test systems could include a router, NAS box, printer,
7// or a linux box running snmpd, snmpsimd.py, etc.
8//
9// Ensure "gosnmp-test-host" is defined in your hosts file, and points to your
10// generic test system.
11
12//go:build all || end2end
13// +build all end2end
14
15package gosnmp
16
17import (
18"fmt"
19"os"
20"strconv"
21"strings"
22"testing"
23"time"
24)
25
26func getTarget(t *testing.T) (string, uint16) {
27var envTarget string
28var envPort string
29
30// set this flag to true in v3_testing_credentials.go if you want to use the
31// public SNMP demo service for tests
32if isUsingSnmpLabs() {
33envTarget = "demo.snmplabs.com"
34envPort = "161"
35} else {
36envTarget = os.Getenv("GOSNMP_TARGET")
37envPort = os.Getenv("GOSNMP_PORT")
38}
39
40if len(envTarget) <= 0 {
41t.Skip("environment variable not set: GOSNMP_TARGET")
42}
43
44if len(envPort) <= 0 {
45t.Skip("environment variable not set: GOSNMP_PORT")
46}
47port, _ := strconv.ParseUint(envPort, 10, 16)
48
49if port > 65535 {
50t.Skipf("invalid port number %d", port)
51}
52
53return envTarget, uint16(port)
54}
55
56func setupConnection(t *testing.T) {
57target, port := getTarget(t)
58
59Default.Target = target
60Default.Port = port
61
62err := Default.Connect()
63if err != nil {
64if len(target) > 0 {
65t.Fatalf("Connection failed. Is snmpd reachable on %s:%d?\n(err: %v)",
66target, port, err)
67}
68}
69}
70
71func setupConnectionInstance(gs *GoSNMP, t *testing.T) {
72target, port := getTarget(t)
73
74gs.Target = target
75gs.Port = port
76
77err := gs.Connect()
78if err != nil {
79if len(target) > 0 {
80t.Fatalf("Connection failed. Is snmpd reachable on %s:%d?\n(err: %v)",
81target, port, err)
82}
83}
84}
85
86func setupConnectionIPv4(t *testing.T) {
87target, port := getTarget(t)
88
89Default.Target = target
90Default.Port = port
91
92err := Default.ConnectIPv4()
93if err != nil {
94if len(target) > 0 {
95t.Fatalf("Connection failed. Is snmpd reachable on %s:%d?\n(err: %v)",
96target, port, err)
97}
98}
99}
100
101/*
102TODO work out ipv6 networking, etc
103
104func setupConnectionIPv6(t *testing.T) {
105envTarget := os.Getenv("GOSNMP_TARGET_IPV6")
106envPort := os.Getenv("GOSNMP_PORT_IPV6")
107
108if len(envTarget) <= 0 {
109t.Error("environment variable not set: GOSNMP_TARGET_IPV6")
110}
111Default.Target = envTarget
112
113if len(envPort) <= 0 {
114t.Error("environment variable not set: GOSNMP_PORT_IPV6")
115}
116port, _ := strconv.ParseUint(envPort, 10, 16)
117Default.Port = uint16(port)
118
119err := Default.ConnectIPv6()
120if err != nil {
121if len(envTarget) > 0 {
122t.Fatalf("Connection failed. Is snmpd reachable on %s:%s?\n(err: %v)",
123envTarget, envPort, err)
124}
125}
126}
127*/
128
129func TestGenericBasicGet(t *testing.T) {
130setupConnection(t)
131defer Default.Conn.Close()
132
133result, err := Default.Get([]string{".1.3.6.1.2.1.1.1.0"}) // SNMP MIB-2 sysDescr
134if err != nil {
135t.Fatalf("Get() failed with error => %v", err)
136}
137if len(result.Variables) != 1 {
138t.Fatalf("Expected result of size 1")
139}
140if result.Variables[0].Type != OctetString {
141t.Fatalf("Expected sysDescr to be OctetString")
142}
143sysDescr := result.Variables[0].Value.([]byte)
144if len(sysDescr) == 0 {
145t.Fatalf("Got a zero length sysDescr")
146}
147}
148
149func TestGenericBasicGetIPv4Only(t *testing.T) {
150setupConnectionIPv4(t)
151defer Default.Conn.Close()
152
153result, err := Default.Get([]string{".1.3.6.1.2.1.1.1.0"}) // SNMP MIB-2 sysDescr
154if err != nil {
155t.Fatalf("Get() failed with error => %v", err)
156}
157if len(result.Variables) != 1 {
158t.Fatalf("Expected result of size 1")
159}
160if result.Variables[0].Type != OctetString {
161t.Fatalf("Expected sysDescr to be OctetString")
162}
163sysDescr := result.Variables[0].Value.([]byte)
164if len(sysDescr) == 0 {
165t.Fatalf("Got a zero length sysDescr")
166}
167}
168
169/*
170func TestGenericBasicGetIPv6Only(t *testing.T) {
171setupConnectionIPv6(t)
172defer Default.Conn.Close()
173
174result, err := Default.Get([]string{".1.3.6.1.2.1.1.1.0"}) // SNMP MIB-2 sysDescr
175if err != nil {
176t.Fatalf("Get() failed with error => %v", err)
177}
178if len(result.Variables) != 1 {
179t.Fatalf("Expected result of size 1")
180}
181if result.Variables[0].Type != OctetString {
182t.Fatalf("Expected sysDescr to be OctetString")
183}
184sysDescr := result.Variables[0].Value.([]byte)
185if len(sysDescr) == 0 {
186t.Fatalf("Got a zero length sysDescr")
187}
188}
189*/
190
191func TestGenericMultiGet(t *testing.T) {
192setupConnection(t)
193defer Default.Conn.Close()
194
195oids := []string{
196".1.3.6.1.2.1.1.1.0", // SNMP MIB-2 sysDescr
197".1.3.6.1.2.1.1.5.0", // SNMP MIB-2 sysName
198}
199result, err := Default.Get(oids)
200if err != nil {
201t.Fatalf("Get() failed with error => %v", err)
202}
203if len(result.Variables) != 2 {
204t.Fatalf("Expected result of size 2")
205}
206for _, v := range result.Variables {
207if v.Type != OctetString {
208t.Fatalf("Expected OctetString")
209}
210}
211}
212
213func TestGenericGetNext(t *testing.T) {
214setupConnection(t)
215defer Default.Conn.Close()
216
217sysDescrOid := ".1.3.6.1.2.1.1.1.0" // SNMP MIB-2 sysDescr
218result, err := Default.GetNext([]string{sysDescrOid})
219if err != nil {
220t.Fatalf("GetNext() failed with error => %v", err)
221}
222if len(result.Variables) != 1 {
223t.Fatalf("Expected result of size 1")
224}
225if result.Variables[0].Name == sysDescrOid {
226t.Fatalf("Expected next OID")
227}
228}
229
230func TestGenericWalk(t *testing.T) {
231setupConnection(t)
232defer Default.Conn.Close()
233
234result, err := Default.WalkAll("")
235if err != nil {
236t.Fatalf("WalkAll() Failed with error => %v", err)
237}
238if len(result) <= 1 {
239t.Fatalf("Expected multiple values, got %d", len(result))
240}
241}
242
243func TestGenericBulkWalk(t *testing.T) {
244setupConnection(t)
245defer Default.Conn.Close()
246
247result, err := Default.BulkWalkAll("")
248if err != nil {
249t.Fatalf("BulkWalkAll() Failed with error => %v", err)
250}
251if len(result) <= 1 {
252t.Fatalf("Expected multiple values, got %d", len(result))
253}
254}
255
256func TestV1BulkWalkError(t *testing.T) {
257g := &GoSNMP{
258Version: Version1,
259}
260setupConnectionInstance(g, t)
261
262g.Conn.Close()
263
264_, err := g.BulkWalkAll("")
265if err == nil {
266t.Fatalf("BulkWalkAll() should fail in SNMPv1 but returned nil")
267}
268}
269
270// Standard exception/error tests
271
272func TestMaxOids(t *testing.T) {
273setupConnection(t)
274defer Default.Conn.Close()
275
276Default.MaxOids = 1
277
278var err error
279oids := []string{".1.3.6.1.2.1.1.7.0",
280".1.3.6.1.2.1.2.2.1.10.1"} // 2 arbitrary Oids
281errString := "oid count (2) is greater than MaxOids (1)"
282
283_, err = Default.Get(oids)
284if err == nil {
285t.Fatalf("Expected too many oids failure. Got nil")
286} else if err.Error() != errString {
287t.Fatalf("Expected too many oids failure. Got => %v", err)
288}
289
290_, err = Default.GetNext(oids)
291if err == nil {
292t.Fatalf("Expected too many oids failure. Got nil")
293} else if err.Error() != errString {
294t.Fatalf("Expected too many oids failure. Got => %v", err)
295}
296
297_, err = Default.GetBulk(oids, 0, 0)
298if err == nil {
299t.Fatalf("Expected too many oids failure. Got nil")
300} else if err.Error() != errString {
301t.Fatalf("Expected too many oids failure. Got => %v", err)
302}
303}
304
305func TestGenericFailureUnknownHost(t *testing.T) {
306unknownHost := fmt.Sprintf("gosnmp-test-unknown-host-%d", time.Now().UTC().UnixNano())
307Default.Target = unknownHost
308err := Default.Connect()
309if err == nil {
310t.Fatalf("Expected connection failure due to unknown host")
311}
312if !strings.Contains(strings.ToLower(err.Error()), "no such host") {
313t.Fatalf("Expected connection error of type 'no such host'! Got => %v", err)
314}
315_, err = Default.Get([]string{".1.3.6.1.2.1.1.1.0"}) // SNMP MIB-2 sysDescr
316if err == nil {
317t.Fatalf("Expected get to fail due to missing connection")
318}
319}
320
321func TestGenericFailureConnectionTimeout(t *testing.T) {
322t.Skip("local testing - skipping this slow one") // TODO test tag, or something
323envTarget := os.Getenv("GOSNMP_TARGET")
324if len(envTarget) <= 0 {
325t.Skip("local testing - skipping this slow one")
326}
327
328Default.Target = "198.51.100.1" // Black hole
329err := Default.Connect()
330if err != nil {
331t.Fatalf("Did not expect connection error with IP address")
332}
333_, err = Default.Get([]string{".1.3.6.1.2.1.1.1.0"}) // SNMP MIB-2 sysDescr
334if err == nil {
335t.Fatalf("Expected Get() to fail due to invalid IP")
336}
337if !strings.Contains(err.Error(), "timeout") {
338t.Fatalf("Expected timeout error. Got => %v", err)
339}
340}
341
342func TestGenericFailureConnectionRefused(t *testing.T) {
343Default.Target = "127.0.0.1"
344Default.Port = 1 // Don't expect SNMP to be running here!
345err := Default.Connect()
346if err != nil {
347t.Fatalf("Did not expect connection error with IP address")
348}
349_, err = Default.Get([]string{".1.3.6.1.2.1.1.1.0"}) // SNMP MIB-2 sysDescr
350if err == nil {
351t.Fatalf("Expected Get() to fail due to invalid port")
352}
353if !(strings.Contains(err.Error(), "connection refused") || strings.Contains(err.Error(), "forcibly closed")) {
354t.Fatalf("Expected connection refused error. Got => %v", err)
355}
356}
357
358func TestSnmpV3NoAuthNoPrivBasicGet(t *testing.T) {
359Default.Version = Version3
360Default.MsgFlags = NoAuthNoPriv
361Default.SecurityModel = UserSecurityModel
362Default.SecurityParameters = &UsmSecurityParameters{UserName: getUserName(t, NoAuth, NoPriv)}
363setupConnection(t)
364defer Default.Conn.Close()
365
366result, err := Default.Get([]string{".1.3.6.1.2.1.1.1.0"}) // SNMP MIB-2 sysDescr
367if err != nil {
368t.Fatalf("Get() failed with error => %v", err)
369}
370if len(result.Variables) != 1 {
371t.Fatalf("Expected result of size 1")
372}
373sysDescr := result.Variables[0].Value.([]byte)
374if len(sysDescr) == 0 {
375t.Fatalf("Got a zero length sysDescr")
376}
377}
378
379func TestSnmpV3AuthMD5NoPrivGet(t *testing.T) {
380if !isUsingSnmpLabs() {
381t.Skip("This test is currently only working when using demo.snmplabs.com as test device.")
382}
383Default.Version = Version3
384Default.MsgFlags = AuthNoPriv
385Default.SecurityModel = UserSecurityModel
386Default.SecurityParameters = &UsmSecurityParameters{UserName: getUserName(t, MD5, NoPriv), AuthenticationProtocol: MD5, AuthenticationPassphrase: getAuthKey(t, MD5, NoPriv)}
387setupConnection(t)
388defer Default.Conn.Close()
389
390result, err := Default.Get([]string{".1.3.6.1.2.1.1.1.0"}) // SNMP MIB-2 sysDescr
391if err != nil {
392t.Fatalf("Get() failed with error => %v", err)
393}
394if len(result.Variables) != 1 {
395t.Fatalf("Expected result of size 1")
396}
397if result.Variables[0].Type != OctetString {
398t.Fatalf("Expected sysDescr to be OctetString")
399}
400sysDescr := result.Variables[0].Value.([]byte)
401if len(sysDescr) == 0 {
402t.Fatalf("Got a zero length sysDescr")
403}
404}
405
406func TestSnmpV3AuthMD5PrivAES256CGet(t *testing.T) {
407if !isUsingSnmpLabs() {
408t.Skip("This test is currently only working when using demo.snmplabs.com as test device.")
409}
410Default.Version = Version3
411Default.MsgFlags = AuthPriv
412Default.SecurityModel = UserSecurityModel
413Default.SecurityParameters = &UsmSecurityParameters{
414UserName: getUserName(t, MD5, AES256C),
415AuthenticationProtocol: MD5, AuthenticationPassphrase: getAuthKey(t, MD5, AES256C),
416PrivacyProtocol: AES256C, PrivacyPassphrase: getPrivKey(t, MD5, AES256C),
417}
418setupConnection(t)
419defer Default.Conn.Close()
420
421result, err := Default.Get([]string{".1.3.6.1.2.1.1.1.0"}) // SNMP MIB-2 sysDescr
422if err != nil {
423t.Fatalf("Get() failed with error => %v", err)
424}
425if len(result.Variables) != 1 {
426t.Fatalf("Expected result of size 1")
427}
428if result.Variables[0].Type != OctetString {
429t.Fatalf("Expected sysDescr to be OctetString")
430}
431sysDescr := result.Variables[0].Value.([]byte)
432if len(sysDescr) == 0 {
433t.Fatalf("Got a zero length sysDescr")
434}
435}
436
437func TestSnmpV3AuthSHANoPrivGet(t *testing.T) {
438if !isUsingSnmpLabs() {
439t.Skip("This test is currently only working when using demo.snmplabs.com as test device.")
440}
441Default.Version = Version3
442Default.MsgFlags = AuthNoPriv
443Default.SecurityModel = UserSecurityModel
444Default.SecurityParameters = &UsmSecurityParameters{UserName: getUserName(t, SHA, NoPriv), AuthenticationProtocol: SHA, AuthenticationPassphrase: getAuthKey(t, SHA, NoPriv)}
445setupConnection(t)
446defer Default.Conn.Close()
447
448result, err := Default.Get([]string{".1.3.6.1.2.1.1.1.0"}) // SNMP MIB-2 sysDescr
449if err != nil {
450t.Fatalf("Get() failed with error => %v", err)
451}
452if len(result.Variables) != 1 {
453t.Fatalf("Expected result of size 1")
454}
455if result.Variables[0].Type != OctetString {
456t.Fatalf("Expected sysDescr to be OctetString")
457}
458sysDescr := result.Variables[0].Value.([]byte)
459if len(sysDescr) == 0 {
460t.Fatalf("Got a zero length sysDescr")
461}
462}
463
464func TestSnmpV3AuthSHAPrivAESGet(t *testing.T) {
465if !isUsingSnmpLabs() {
466t.Skip("This test is currently only working when using demo.snmplabs.com as test device.")
467}
468Default.Version = Version3
469Default.MsgFlags = AuthPriv
470Default.SecurityModel = UserSecurityModel
471Default.SecurityParameters = &UsmSecurityParameters{
472UserName: getUserName(t, SHA, AES),
473AuthenticationProtocol: SHA, AuthenticationPassphrase: getAuthKey(t, SHA, AES),
474PrivacyProtocol: AES, PrivacyPassphrase: getPrivKey(t, SHA, AES),
475}
476setupConnection(t)
477defer Default.Conn.Close()
478
479result, err := Default.Get([]string{".1.3.6.1.2.1.1.1.0"}) // SNMP MIB-2 sysDescr
480if err != nil {
481t.Fatalf("Get() failed with error => %v", err)
482}
483if len(result.Variables) != 1 {
484t.Fatalf("Expected result of size 1")
485}
486if result.Variables[0].Type != OctetString {
487t.Fatalf("Expected sysDescr to be OctetString")
488}
489sysDescr := result.Variables[0].Value.([]byte)
490if len(sysDescr) == 0 {
491t.Fatalf("Got a zero length sysDescr")
492}
493}
494
495func TestSnmpV3AuthSHAPrivAES256CGet(t *testing.T) {
496if !isUsingSnmpLabs() {
497t.Skip("This test is currently only working when using demo.snmplabs.com as test device.")
498}
499Default.Version = Version3
500Default.MsgFlags = AuthPriv
501Default.SecurityModel = UserSecurityModel
502Default.SecurityParameters = &UsmSecurityParameters{
503UserName: getUserName(t, SHA, AES256C),
504AuthenticationProtocol: SHA, AuthenticationPassphrase: getAuthKey(t, SHA, AES256C),
505PrivacyProtocol: AES256C, PrivacyPassphrase: getPrivKey(t, SHA, AES256C),
506}
507setupConnection(t)
508defer Default.Conn.Close()
509
510result, err := Default.Get([]string{".1.3.6.1.2.1.1.1.0"}) // SNMP MIB-2 sysDescr
511if err != nil {
512t.Fatalf("Get() failed with error => %v", err)
513}
514if len(result.Variables) != 1 {
515t.Fatalf("Expected result of size 1")
516}
517if result.Variables[0].Type != OctetString {
518t.Fatalf("Expected sysDescr to be OctetString")
519}
520sysDescr := result.Variables[0].Value.([]byte)
521if len(sysDescr) == 0 {
522t.Fatalf("Got a zero length sysDescr")
523}
524}
525
526func TestSnmpV3AuthSHA224NoPrivGet(t *testing.T) {
527if !isUsingSnmpLabs() {
528t.Skip("This test is currently only working when using demo.snmplabs.com as test device.")
529}
530Default.Version = Version3
531Default.MsgFlags = AuthNoPriv
532Default.SecurityModel = UserSecurityModel
533Default.SecurityParameters = &UsmSecurityParameters{UserName: getUserName(t, SHA224, NoPriv), AuthenticationProtocol: SHA224, AuthenticationPassphrase: getAuthKey(t, SHA224, NoPriv)}
534setupConnection(t)
535defer Default.Conn.Close()
536
537result, err := Default.Get([]string{".1.3.6.1.2.1.1.1.0"}) // SNMP MIB-2 sysDescr
538if err != nil {
539t.Fatalf("Get() failed with error => %v", err)
540}
541if len(result.Variables) != 1 {
542t.Fatalf("Expected result of size 1")
543}
544if result.Variables[0].Type != OctetString {
545t.Fatalf("Expected sysDescr to be OctetString")
546}
547sysDescr := result.Variables[0].Value.([]byte)
548if len(sysDescr) == 0 {
549t.Fatalf("Got a zero length sysDescr")
550}
551}
552
553func TestSnmpV3AuthSHA256NoPrivGet(t *testing.T) {
554if !isUsingSnmpLabs() {
555t.Skip("This test is currently only working when using demo.snmplabs.com as test device.")
556}
557Default.Version = Version3
558Default.MsgFlags = AuthNoPriv
559Default.SecurityModel = UserSecurityModel
560Default.SecurityParameters = &UsmSecurityParameters{UserName: getUserName(t, SHA256, NoPriv), AuthenticationProtocol: SHA256, AuthenticationPassphrase: getAuthKey(t, SHA256, NoPriv)}
561setupConnection(t)
562defer Default.Conn.Close()
563
564result, err := Default.Get([]string{".1.3.6.1.2.1.1.1.0"}) // SNMP MIB-2 sysDescr
565if err != nil {
566t.Fatalf("Get() failed with error => %v", err)
567}
568if len(result.Variables) != 1 {
569t.Fatalf("Expected result of size 1")
570}
571if result.Variables[0].Type != OctetString {
572t.Fatalf("Expected sysDescr to be OctetString")
573}
574sysDescr := result.Variables[0].Value.([]byte)
575if len(sysDescr) == 0 {
576t.Fatalf("Got a zero length sysDescr")
577}
578}
579
580func TestSnmpV3AuthSHA384NoPrivGet(t *testing.T) {
581if !isUsingSnmpLabs() {
582t.Skip("This test is currently only working when using demo.snmplabs.com as test device.")
583}
584Default.Version = Version3
585Default.MsgFlags = AuthNoPriv
586Default.SecurityModel = UserSecurityModel
587Default.SecurityParameters = &UsmSecurityParameters{UserName: getUserName(t, SHA384, NoPriv), AuthenticationProtocol: SHA384, AuthenticationPassphrase: getAuthKey(t, SHA384, NoPriv)}
588setupConnection(t)
589defer Default.Conn.Close()
590
591result, err := Default.Get([]string{".1.3.6.1.2.1.1.1.0"}) // SNMP MIB-2 sysDescr
592if err != nil {
593t.Fatalf("Get() failed with error => %v", err)
594}
595if len(result.Variables) != 1 {
596t.Fatalf("Expected result of size 1")
597}
598if result.Variables[0].Type != OctetString {
599t.Fatalf("Expected sysDescr to be OctetString")
600}
601sysDescr := result.Variables[0].Value.([]byte)
602if len(sysDescr) == 0 {
603t.Fatalf("Got a zero length sysDescr")
604}
605}
606
607func TestSnmpV3AuthSHA512NoPrivGet(t *testing.T) {
608if !isUsingSnmpLabs() {
609t.Skip("This test is currently only working when using demo.snmplabs.com as test device.")
610}
611Default.Version = Version3
612Default.MsgFlags = AuthNoPriv
613Default.SecurityModel = UserSecurityModel
614Default.SecurityParameters = &UsmSecurityParameters{UserName: getUserName(t, SHA512, NoPriv), AuthenticationProtocol: SHA512, AuthenticationPassphrase: getAuthKey(t, SHA512, NoPriv)}
615setupConnection(t)
616defer Default.Conn.Close()
617
618result, err := Default.Get([]string{".1.3.6.1.2.1.1.1.0"}) // SNMP MIB-2 sysDescr
619if err != nil {
620t.Fatalf("Get() failed with error => %v", err)
621}
622if len(result.Variables) != 1 {
623t.Fatalf("Expected result of size 1")
624}
625if result.Variables[0].Type != OctetString {
626t.Fatalf("Expected sysDescr to be OctetString")
627}
628sysDescr := result.Variables[0].Value.([]byte)
629if len(sysDescr) == 0 {
630t.Fatalf("Got a zero length sysDescr")
631}
632}
633
634func TestSnmpV3AuthSHA512PrivAES192Get(t *testing.T) {
635t.Skip("AES-192 Blumenthal is currently known to have issues.")
636Default.Version = Version3
637Default.MsgFlags = AuthPriv
638Default.SecurityModel = UserSecurityModel
639Default.SecurityParameters = &UsmSecurityParameters{
640UserName: getUserName(t, SHA512, AES192),
641AuthenticationProtocol: SHA512, AuthenticationPassphrase: getAuthKey(t, SHA512, AES192),
642PrivacyProtocol: AES192, PrivacyPassphrase: getPrivKey(t, SHA512, AES192),
643}
644
645setupConnection(t)
646defer Default.Conn.Close()
647
648result, err := Default.Get([]string{".1.3.6.1.2.1.1.1.0"}) // SNMP MIB-2 sysDescr
649if err != nil {
650t.Fatalf("Get() failed with error => %v", err)
651}
652if len(result.Variables) != 1 {
653t.Fatalf("Expected result of size 1")
654}
655if result.Variables[0].Type != OctetString {
656t.Fatalf("Expected sysDescr to be OctetString")
657}
658sysDescr := result.Variables[0].Value.([]byte)
659if len(sysDescr) == 0 {
660t.Fatalf("Got a zero length sysDescr")
661}
662}
663
664func TestSnmpV3AuthSHA512PrivAES192CGet(t *testing.T) {
665if !isUsingSnmpLabs() {
666t.Skip("This test is currently only working when using demo.snmplabs.com as test device.")
667}
668Default.Version = Version3
669Default.MsgFlags = AuthPriv
670Default.SecurityModel = UserSecurityModel
671Default.SecurityParameters = &UsmSecurityParameters{
672UserName: getUserName(t, SHA512, AES192C),
673AuthenticationProtocol: SHA512, AuthenticationPassphrase: getAuthKey(t, SHA512, AES192C),
674PrivacyProtocol: AES192C, PrivacyPassphrase: getPrivKey(t, SHA512, AES192C),
675}
676
677setupConnection(t)
678defer Default.Conn.Close()
679
680result, err := Default.Get([]string{".1.3.6.1.2.1.1.1.0"}) // SNMP MIB-2 sysDescr
681if err != nil {
682t.Fatalf("Get() failed with error => %v", err)
683}
684if len(result.Variables) != 1 {
685t.Fatalf("Expected result of size 1")
686}
687if result.Variables[0].Type != OctetString {
688t.Fatalf("Expected sysDescr to be OctetString")
689}
690sysDescr := result.Variables[0].Value.([]byte)
691if len(sysDescr) == 0 {
692t.Fatalf("Got a zero length sysDescr")
693}
694}
695
696// SHA 512 + AES256C (Reeder)
697func TestSnmpV3AuthSHA512PrivAES256CGet(t *testing.T) {
698if !isUsingSnmpLabs() {
699t.Skip("This test is currently only working when using demo.snmplabs.com as test device.")
700}
701Default.Version = Version3
702Default.MsgFlags = AuthPriv
703Default.SecurityModel = UserSecurityModel
704Default.SecurityParameters = &UsmSecurityParameters{
705UserName: getUserName(t, SHA512, AES256C),
706AuthenticationProtocol: SHA512, AuthenticationPassphrase: getAuthKey(t, SHA512, AES256C),
707PrivacyProtocol: AES256C, PrivacyPassphrase: getPrivKey(t, SHA512, AES256C),
708}
709setupConnection(t)
710defer Default.Conn.Close()
711
712result, err := Default.Get([]string{".1.3.6.1.2.1.1.1.0"}) // SNMP MIB-2 sysDescr
713if err != nil {
714t.Fatalf("Get() failed with error => %v", err)
715}
716if len(result.Variables) != 1 {
717t.Fatalf("Expected result of size 1")
718}
719if result.Variables[0].Type != OctetString {
720t.Fatalf("Expected sysDescr to be OctetString")
721}
722sysDescr := result.Variables[0].Value.([]byte)
723if len(sysDescr) == 0 {
724t.Fatalf("Got a zero length sysDescr")
725}
726}
727
728func TestSnmpV3AuthMD5PrivDESGet(t *testing.T) {
729if !isUsingSnmpLabs() {
730t.Skip("This test is currently only working when using demo.snmplabs.com as test device.")
731}
732Default.Version = Version3
733Default.MsgFlags = AuthPriv
734Default.SecurityModel = UserSecurityModel
735
736Default.SecurityParameters = &UsmSecurityParameters{UserName: getUserName(t, MD5, DES),
737AuthenticationProtocol: MD5,
738AuthenticationPassphrase: getAuthKey(t, MD5, DES),
739PrivacyProtocol: DES,
740PrivacyPassphrase: getPrivKey(t, MD5, DES)}
741
742setupConnection(t)
743defer Default.Conn.Close()
744
745result, err := Default.Get([]string{".1.3.6.1.2.1.1.1.0"}) // SNMP MIB-2 sysDescr
746if err != nil {
747t.Fatalf("Get() failed with error => %v", err)
748}
749if len(result.Variables) != 1 {
750t.Fatalf("Expected result of size 1")
751}
752if result.Variables[0].Type != OctetString {
753t.Fatalf("Expected sysDescr to be OctetString")
754}
755sysDescr := result.Variables[0].Value.([]byte)
756if len(sysDescr) == 0 {
757t.Fatalf("Got a zero length sysDescr")
758}
759}
760
761func TestSnmpV3AuthSHAPrivDESGet(t *testing.T) {
762if !isUsingSnmpLabs() {
763t.Skip("This test is currently only working when using demo.snmplabs.com as test device.")
764}
765Default.Version = Version3
766Default.MsgFlags = AuthPriv
767Default.SecurityModel = UserSecurityModel
768Default.SecurityParameters = &UsmSecurityParameters{UserName: getUserName(t, SHA, DES),
769AuthenticationProtocol: SHA,
770AuthenticationPassphrase: getAuthKey(t, SHA, DES),
771PrivacyProtocol: DES,
772PrivacyPassphrase: getPrivKey(t, SHA, DES)}
773
774setupConnection(t)
775defer Default.Conn.Close()
776
777result, err := Default.Get([]string{".1.3.6.1.2.1.1.1.0"}) // SNMP MIB-2 sysDescr
778if err != nil {
779t.Fatalf("Get() failed with error => %v", err)
780}
781if len(result.Variables) != 1 {
782t.Fatalf("Expected result of size 1")
783}
784if result.Variables[0].Type != OctetString {
785t.Fatalf("Expected sysDescr to be OctetString")
786}
787sysDescr := result.Variables[0].Value.([]byte)
788if len(sysDescr) == 0 {
789t.Fatalf("Got a zero length sysDescr")
790}
791}
792
793func TestSnmpV3AuthMD5PrivAESGet(t *testing.T) {
794if !isUsingSnmpLabs() {
795t.Skip("This test is currently only working when using demo.snmplabs.com as test device.")
796}
797Default.Version = Version3
798Default.MsgFlags = AuthPriv
799Default.SecurityModel = UserSecurityModel
800
801Default.SecurityParameters = &UsmSecurityParameters{UserName: getUserName(t, MD5, AES),
802AuthenticationProtocol: MD5,
803AuthenticationPassphrase: getAuthKey(t, MD5, AES),
804PrivacyProtocol: AES,
805PrivacyPassphrase: getPrivKey(t, MD5, AES)}
806
807setupConnection(t)
808defer Default.Conn.Close()
809
810result, err := Default.Get([]string{".1.3.6.1.2.1.1.1.0"}) // SNMP MIB-2 sysDescr
811if err != nil {
812t.Fatalf("Get() failed with error => %v", err)
813}
814if len(result.Variables) != 1 {
815t.Fatalf("Expected result of size 1")
816}
817if result.Variables[0].Type != OctetString {
818t.Fatalf("Expected sysDescr to be OctetString")
819}
820sysDescr := result.Variables[0].Value.([]byte)
821if len(sysDescr) == 0 {
822t.Fatalf("Got a zero length sysDescr")
823}
824}
825
826func TestSnmpV3PrivEmptyPrivatePassword(t *testing.T) {
827if !isUsingSnmpLabs() {
828t.Skip("This test is currently only working when using demo.snmplabs.com as test device.")
829}
830Default.Version = Version3
831Default.MsgFlags = AuthPriv
832Default.SecurityModel = UserSecurityModel
833Default.SecurityParameters = &UsmSecurityParameters{UserName: getUserName(t, SHA, AES),
834AuthenticationProtocol: SHA,
835AuthenticationPassphrase: getAuthKey(t, SHA, AES),
836PrivacyProtocol: AES,
837PrivacyPassphrase: ""}
838
839err := Default.Connect()
840if err == nil {
841t.Fatalf("Expected validation error for empty PrivacyPassphrase")
842}
843}
844
845func TestSnmpV3AuthNoPrivEmptyPrivatePassword(t *testing.T) {
846if !isUsingSnmpLabs() {
847t.Skip("This test is currently only working when using demo.snmplabs.com as test device.")
848}
849Default.Version = Version3
850Default.MsgFlags = AuthNoPriv
851Default.SecurityModel = UserSecurityModel
852Default.SecurityParameters = &UsmSecurityParameters{UserName: getUserName(t, SHA, NoPriv),
853AuthenticationProtocol: SHA,
854AuthenticationPassphrase: getAuthKey(t, SHA, NoPriv),
855PrivacyProtocol: AES,
856PrivacyPassphrase: getPrivKey(t, SHA, NoPriv)}
857
858err := Default.Connect()
859if err == nil {
860t.Fatalf("Expected validation error for empty PrivacyPassphrase")
861}
862}
863