@@ -24,6 +24,7 @@ import (
2424
2525 "github.com/pion/dtls/v3"
2626 "github.com/pion/ice/v4"
27+ "github.com/pion/logging"
2728 "github.com/pion/rtcp"
2829 "github.com/pion/rtp"
2930 "github.com/pion/transport/v3/test"
@@ -1916,3 +1917,91 @@ func Test_IPv6(t *testing.T) { //nolint: cyclop
19161917
19171918 closePairNow (t , offerPC , answerPC )
19181919}
1920+
1921+ type testICELogger struct {
1922+ lastErrorMessage string
1923+ }
1924+
1925+ func (t * testICELogger ) Trace (string ) {}
1926+ func (t * testICELogger ) Tracef (string , ... interface {}) {}
1927+ func (t * testICELogger ) Debug (string ) {}
1928+ func (t * testICELogger ) Debugf (string , ... interface {}) {}
1929+ func (t * testICELogger ) Info (string ) {}
1930+ func (t * testICELogger ) Infof (string , ... interface {}) {}
1931+ func (t * testICELogger ) Warn (string ) {}
1932+ func (t * testICELogger ) Warnf (string , ... interface {}) {}
1933+ func (t * testICELogger ) Error (msg string ) { t .lastErrorMessage = msg }
1934+ func (t * testICELogger ) Errorf (format string , args ... interface {}) {
1935+ t .lastErrorMessage = fmt .Sprintf (format , args ... )
1936+ }
1937+
1938+ type testICELoggerFactory struct {
1939+ logger * testICELogger
1940+ }
1941+
1942+ func (t * testICELoggerFactory ) NewLogger (string ) logging.LeveledLogger {
1943+ return t .logger
1944+ }
1945+
1946+ func TestAddICECandidate__DroppingOldGenerationCandidates (t * testing.T ) {
1947+ lim := test .TimeOut (time .Second * 30 )
1948+ defer lim .Stop ()
1949+
1950+ report := test .CheckRoutines (t )
1951+ defer report ()
1952+
1953+ testLogger := & testICELogger {}
1954+ loggerFactory := & testICELoggerFactory {logger : testLogger }
1955+
1956+ // Create a new API with the custom logger
1957+ api := NewAPI (WithSettingEngine (SettingEngine {
1958+ LoggerFactory : loggerFactory ,
1959+ }))
1960+
1961+ pc , err := api .NewPeerConnection (Configuration {})
1962+ assert .NoError (t , err )
1963+
1964+ _ , err = pc .CreateDataChannel ("test" , nil )
1965+ assert .NoError (t , err )
1966+
1967+ offer , err := pc .CreateOffer (nil )
1968+ assert .NoError (t , err )
1969+
1970+ offerGatheringComplete := GatheringCompletePromise (pc )
1971+ assert .NoError (t , pc .SetLocalDescription (offer ))
1972+ <- offerGatheringComplete
1973+
1974+ remotePC , err := api .NewPeerConnection (Configuration {})
1975+ assert .NoError (t , err )
1976+
1977+ assert .NoError (t , remotePC .SetRemoteDescription (offer ))
1978+
1979+ remoteDesc := remotePC .RemoteDescription ()
1980+ assert .NotNil (t , remoteDesc )
1981+
1982+ ufrag , hasUfrag := remoteDesc .parsed .MediaDescriptions [0 ].Attribute ("ice-ufrag" )
1983+ assert .True (t , hasUfrag )
1984+
1985+ emptyUfragCandidate := ICECandidateInit {
1986+ Candidate : "candidate:1 1 UDP 2122252543 192.168.1.1 12345 typ host" ,
1987+ }
1988+ err = remotePC .AddICECandidate (emptyUfragCandidate )
1989+ assert .NoError (t , err )
1990+ assert .Empty (t , testLogger .lastErrorMessage )
1991+
1992+ validCandidate := ICECandidateInit {
1993+ Candidate : fmt .Sprintf ("candidate:1 1 UDP 2122252543 192.168.1.1 12345 typ host ufrag %s" , ufrag ),
1994+ }
1995+ err = remotePC .AddICECandidate (validCandidate )
1996+ assert .NoError (t , err )
1997+ assert .Empty (t , testLogger .lastErrorMessage )
1998+
1999+ invalidCandidate := ICECandidateInit {
2000+ Candidate : "candidate:1 1 UDP 2122252543 192.168.1.1 12345 typ host ufrag invalid" ,
2001+ }
2002+ err = remotePC .AddICECandidate (invalidCandidate )
2003+ assert .NoError (t , err )
2004+ assert .Contains (t , testLogger .lastErrorMessage , "dropping candidate with ufrag" )
2005+
2006+ closePairNow (t , pc , remotePC )
2007+ }
0 commit comments