Skip to content

Commit 5d8d3e4

Browse files
DSheirerDennis Sheirer
andauthored
#1966 P25 aliases not correctly matching when radio system is using fully qualified talkgroup/radio values. (#1967)
Co-authored-by: Dennis Sheirer <[email protected]>
1 parent 298d9d7 commit 5d8d3e4

File tree

4 files changed

+333
-48
lines changed

4 files changed

+333
-48
lines changed

build.gradle

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,11 @@ test {
7777
dependencies {
7878

7979
// JUnit Tests
80-
testImplementation 'junit:junit:4.13.2'
81-
testImplementation 'org.assertj:assertj-core:3.23.1'
82-
testImplementation('org.junit.jupiter:junit-jupiter-api:5.9.0')
83-
testImplementation 'org.mockito:mockito-core:4.8.0'
80+
testImplementation(platform("org.junit:junit-bom:5.11.0"))
81+
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.11.0'
8482

85-
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
83+
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine")
84+
testRuntimeOnly("org.junit.vintage:junit-vintage-engine")
8685

8786
//Jitpack imports
8887
implementation 'com.github.dnault:libresample4j:master'

src/main/java/io/github/dsheirer/alias/AliasList.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -666,10 +666,15 @@ public Alias getAlias(TalkgroupIdentifier identifier)
666666
//Attempt to do a fully qualified identifier match first.
667667
if(identifier instanceof FullyQualifiedTalkgroupIdentifier fqti)
668668
{
669-
return mFullyQualifiedTalkgroupAliasMap.get(fqti.getFullyQualifiedTalkgroupAddress());
669+
Alias fullyQualifiedAlias = mFullyQualifiedTalkgroupAliasMap.get(fqti.getFullyQualifiedTalkgroupAddress());
670+
671+
if(fullyQualifiedAlias != null)
672+
{
673+
return fullyQualifiedAlias;
674+
}
670675
}
671676

672-
//Then try to match it by it's locally assigned (temporary) address.
677+
//Next, attempt to match against the locally assigned (temporary) address
673678
int value = identifier.getValue();
674679

675680
Alias mapValue = mTalkgroupAliasMap.get(value);
@@ -786,10 +791,15 @@ public Alias getAlias(RadioIdentifier identifier)
786791
//Attempt to do a fully qualified identifier match first.
787792
if(identifier instanceof FullyQualifiedRadioIdentifier fqri)
788793
{
789-
return mFullyQualifiedRadioAliasMap.get(fqri.getFullyQualifiedRadioAddress());
794+
Alias fullyQualifiedRadioAlias = mFullyQualifiedRadioAliasMap.get(fqri.getFullyQualifiedRadioAddress());
795+
796+
if(fullyQualifiedRadioAlias != null)
797+
{
798+
return fullyQualifiedRadioAlias;
799+
}
790800
}
791801

792-
//Then match against the locally assigned (temporary) address
802+
//Next, attempt to match against the locally assigned (temporary) address
793803
int value = identifier.getValue();
794804

795805
Alias mapValue = mRadioAliasMap.get(value);
Lines changed: 267 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,267 @@
1+
/*
2+
* *****************************************************************************
3+
* Copyright (C) 2014-2024 Dennis Sheirer
4+
*
5+
* This program is free software: you can redistribute it and/or modify
6+
* it under the terms of the GNU General Public License as published by
7+
* the Free Software Foundation, either version 3 of the License, or
8+
* (at your option) any later version.
9+
*
10+
* This program is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
* GNU General Public License for more details.
14+
*
15+
* You should have received a copy of the GNU General Public License
16+
* along with this program. If not, see <http://www.gnu.org/licenses/>
17+
* ****************************************************************************
18+
*/
19+
20+
package io.github.dsheirer.alias;
21+
22+
import io.github.dsheirer.alias.id.radio.P25FullyQualifiedRadio;
23+
import io.github.dsheirer.alias.id.radio.Radio;
24+
import io.github.dsheirer.alias.id.radio.RadioRange;
25+
import io.github.dsheirer.alias.id.talkgroup.P25FullyQualifiedTalkgroup;
26+
import io.github.dsheirer.alias.id.talkgroup.Talkgroup;
27+
import io.github.dsheirer.alias.id.talkgroup.TalkgroupRange;
28+
import io.github.dsheirer.identifier.radio.RadioIdentifier;
29+
import io.github.dsheirer.identifier.talkgroup.TalkgroupIdentifier;
30+
import io.github.dsheirer.module.decode.p25.identifier.radio.APCO25FullyQualifiedRadioIdentifier;
31+
import io.github.dsheirer.module.decode.p25.identifier.radio.APCO25RadioIdentifier;
32+
import io.github.dsheirer.module.decode.p25.identifier.talkgroup.APCO25FullyQualifiedTalkgroupIdentifier;
33+
import io.github.dsheirer.module.decode.p25.identifier.talkgroup.APCO25Talkgroup;
34+
import io.github.dsheirer.protocol.Protocol;
35+
import java.util.List;
36+
import org.junit.jupiter.api.Test;
37+
38+
import static org.junit.jupiter.api.Assertions.assertEquals;
39+
40+
public class P25AliasTest
41+
{
42+
@Test
43+
void aliasP25Talkgroup()
44+
{
45+
String correctAliasName = "Alias Talkgroup 1";
46+
AliasList aliasList = new AliasList("Test Alias List");
47+
48+
Alias aliasTalkgroup1 = new Alias();
49+
aliasTalkgroup1.setName(correctAliasName);
50+
aliasTalkgroup1.addAliasID(new Talkgroup(Protocol.APCO25, 1));
51+
aliasList.addAlias(aliasTalkgroup1);
52+
53+
Alias aliasTalkgroupRange = new Alias();
54+
aliasTalkgroupRange.setName("Alias Talkgroup Range");
55+
aliasTalkgroupRange.addAliasID(new TalkgroupRange(Protocol.APCO25, 1, 65535));
56+
aliasList.addAlias(aliasTalkgroupRange);
57+
58+
TalkgroupIdentifier talkgroupIdentifier1 = APCO25Talkgroup.create(1);
59+
60+
List<Alias> aliases = aliasList.getAliases(talkgroupIdentifier1);
61+
assertEquals(1, aliases.size(), "Expected 1 matching alias");
62+
assertEquals(correctAliasName, aliases.getFirst().getName(), "Unexpected alias name");
63+
}
64+
65+
/**
66+
* Tests that a fully qualified P25 talkgroup aliases correctly when there is a matching fully qualified talkgroup
67+
* alias ID along with a simple talkgroup that has the same talkgroup value, that is shadowing the fully qualified
68+
* version.
69+
*/
70+
@Test
71+
void aliasP25FullyQualifiedTalkgroup()
72+
{
73+
int wacn = 100;
74+
int system = 200;
75+
int originalGroup = 300;
76+
int aliasGroup = 1;
77+
String correctAliasName = "Alias Fully Qualified Talkgroup 1";
78+
79+
AliasList aliasList = new AliasList("Test Alias List");
80+
81+
Alias aliasTalkgroup1 = new Alias();
82+
aliasTalkgroup1.setName("Alias Talkgroup 1");
83+
aliasTalkgroup1.addAliasID(new Talkgroup(Protocol.APCO25, aliasGroup)); //Shadows the fully qualified variant
84+
aliasList.addAlias(aliasTalkgroup1);
85+
86+
Alias aliasFullyQualifiedTalkgroup1 = new Alias();
87+
aliasFullyQualifiedTalkgroup1.setName(correctAliasName);
88+
aliasFullyQualifiedTalkgroup1.addAliasID(new P25FullyQualifiedTalkgroup(wacn, system, originalGroup));
89+
aliasList.addAlias(aliasFullyQualifiedTalkgroup1);
90+
91+
//Identifier transmitted over the air that we want to alias
92+
APCO25FullyQualifiedTalkgroupIdentifier p25FQTG1 = APCO25FullyQualifiedTalkgroupIdentifier.createTo(aliasGroup, wacn, system, originalGroup);
93+
94+
List<Alias> aliases = aliasList.getAliases(p25FQTG1);
95+
assertEquals(1, aliases.size(), "Expected 1 matching alias");
96+
assertEquals(correctAliasName, aliases.getFirst().getName(), "Unexpected alias name");
97+
}
98+
99+
/**
100+
* Tests that a fully qualified P25 talkgroup aliases correctly to a simple talkgroup alias for the local talkgroup
101+
* value, when the user has not explicitly added a fully qualified talkgroup alias ID..
102+
*/
103+
@Test
104+
void aliasP25FullyQualifiedTalkgroupToBasicTalkgroupAlias()
105+
{
106+
int wacn = 100;
107+
int system = 200;
108+
int originalGroup = 300;
109+
int aliasGroup = 1;
110+
String correctAliasName = "Alias Talkgroup 1";
111+
112+
AliasList aliasList = new AliasList("Test Alias List");
113+
114+
Alias aliasTalkgroup1 = new Alias();
115+
aliasTalkgroup1.setName("Alias Talkgroup 1");
116+
aliasTalkgroup1.addAliasID(new Talkgroup(Protocol.APCO25, aliasGroup));
117+
aliasList.addAlias(aliasTalkgroup1);
118+
119+
//Identifier transmitted over the air that we want to alias
120+
APCO25FullyQualifiedTalkgroupIdentifier p25FQTG1 = APCO25FullyQualifiedTalkgroupIdentifier.createTo(aliasGroup, wacn, system, originalGroup);
121+
122+
List<Alias> aliases = aliasList.getAliases(p25FQTG1);
123+
assertEquals(1, aliases.size(), "Expected 1 matching alias");
124+
assertEquals(correctAliasName, aliases.getFirst().getName(), "Unexpected alias name");
125+
}
126+
127+
/**
128+
* Tests that a fully qualified P25 talkgroup aliases correctly to a simple talkgroup alias for the local talkgroup
129+
* value, when the user has not explicitly added a fully qualified talkgroup alias ID..
130+
*/
131+
@Test
132+
void aliasP25FullyQualifiedTalkgroupToTalkgroupRangeAlias()
133+
{
134+
int wacn = 100;
135+
int system = 200;
136+
int originalGroup = 300;
137+
int aliasGroup = 1;
138+
String correctAliasName = "Alias Talkgroup 1";
139+
140+
AliasList aliasList = new AliasList("Test Alias List");
141+
142+
Alias aliasTalkgroupRange = new Alias();
143+
aliasTalkgroupRange.setName(correctAliasName);
144+
aliasTalkgroupRange.addAliasID(new TalkgroupRange(Protocol.APCO25, 1, 0xFFFF));
145+
aliasList.addAlias(aliasTalkgroupRange);
146+
147+
//Identifier transmitted over the air that we want to alias
148+
APCO25FullyQualifiedTalkgroupIdentifier p25FQTG1 = APCO25FullyQualifiedTalkgroupIdentifier.createTo(aliasGroup, wacn, system, originalGroup);
149+
150+
List<Alias> aliases = aliasList.getAliases(p25FQTG1);
151+
assertEquals(1, aliases.size(), "Expected 1 matching alias");
152+
assertEquals(correctAliasName, aliases.getFirst().getName(), "Unexpected alias name");
153+
}
154+
155+
@Test
156+
void aliasP25Radio()
157+
{
158+
String correctAliasName = "Alias Radio 1";
159+
AliasList aliasList = new AliasList("Test Alias List");
160+
161+
Alias correctAlias = new Alias();
162+
correctAlias.setName(correctAliasName);
163+
correctAlias.addAliasID(new Radio(Protocol.APCO25, 1));
164+
aliasList.addAlias(correctAlias);
165+
166+
Alias aliasRadioRange = new Alias();
167+
aliasRadioRange.setName("Alias Radio Range");
168+
aliasRadioRange.addAliasID(new RadioRange(Protocol.APCO25, 1, 0xFFFFFF));
169+
aliasList.addAlias(aliasRadioRange);
170+
171+
RadioIdentifier radioIdentifier1 = APCO25RadioIdentifier.createFrom(1);
172+
173+
List<Alias> aliases = aliasList.getAliases(radioIdentifier1);
174+
assertEquals(1, aliases.size(), "Expected 1 matching alias");
175+
assertEquals(correctAliasName, aliases.getFirst().getName(), "Unexpected alias name");
176+
}
177+
178+
/**
179+
* Tests that a fully qualified P25 radio aliases correctly when there is a matching fully qualified radio
180+
* alias ID along with a simple radio that has the same radio value, that is shadowing the fully qualified
181+
* version.
182+
*/
183+
@Test
184+
void aliasP25FullyQualifiedRadio()
185+
{
186+
int wacn = 100;
187+
int system = 200;
188+
int originalRadio = 300;
189+
int aliasRadio = 1;
190+
String correctAliasName = "Alias Fully Qualified Radio 1";
191+
192+
AliasList aliasList = new AliasList("Test Alias List");
193+
194+
Alias aliasRadio1 = new Alias();
195+
aliasRadio1.setName("Alias Radio 1");
196+
aliasRadio1.addAliasID(new Radio(Protocol.APCO25, aliasRadio)); //Shadows the fully qualified variant
197+
aliasList.addAlias(aliasRadio1);
198+
199+
Alias aliasFullyQualifiedRadio1 = new Alias();
200+
aliasFullyQualifiedRadio1.setName(correctAliasName);
201+
aliasFullyQualifiedRadio1.addAliasID(new P25FullyQualifiedRadio(wacn, system, originalRadio));
202+
aliasList.addAlias(aliasFullyQualifiedRadio1);
203+
204+
//Identifier transmitted over the air that we want to alias
205+
APCO25FullyQualifiedRadioIdentifier p25FQR1 = APCO25FullyQualifiedRadioIdentifier.createFrom(aliasRadio, wacn, system, originalRadio);
206+
207+
List<Alias> aliases = aliasList.getAliases(p25FQR1);
208+
assertEquals(1, aliases.size(), "Expected 1 matching alias");
209+
assertEquals(correctAliasName, aliases.getFirst().getName(), "Unexpected alias name");
210+
}
211+
212+
/**
213+
* Tests that a fully qualified P25 radio aliases correctly to a simple radio alias for the local radio
214+
* value, when the user has not explicitly added a fully qualified radio alias ID.
215+
*/
216+
@Test
217+
void aliasP25FullyQualifiedRadioToBasicRadioAlias()
218+
{
219+
int wacn = 100;
220+
int system = 200;
221+
int originalRadio = 300;
222+
int aliasRadio = 1;
223+
String correctAliasName = "Alias Radio 1";
224+
225+
AliasList aliasList = new AliasList("Test Alias List");
226+
227+
Alias aliasRadio1 = new Alias();
228+
aliasRadio1.setName(correctAliasName);
229+
aliasRadio1.addAliasID(new Radio(Protocol.APCO25, aliasRadio));
230+
aliasList.addAlias(aliasRadio1);
231+
232+
//Identifier transmitted over the air that we want to alias
233+
APCO25FullyQualifiedRadioIdentifier p25FQTG1 = APCO25FullyQualifiedRadioIdentifier.createFrom(aliasRadio, wacn, system, originalRadio);
234+
235+
List<Alias> aliases = aliasList.getAliases(p25FQTG1);
236+
assertEquals(1, aliases.size(), "Expected 1 matching alias");
237+
assertEquals(correctAliasName, aliases.getFirst().getName(), "Unexpected alias name");
238+
}
239+
240+
/**
241+
* Tests that a fully qualified P25 radio aliases correctly to a radio range alias for the local radio
242+
* value, when the user has not explicitly added a fully qualified radio alias ID.
243+
*/
244+
@Test
245+
void aliasP25FullyQualifiedRadioToRadioRangeAlias()
246+
{
247+
int wacn = 100;
248+
int system = 200;
249+
int originalRadio = 300;
250+
int aliasRadio = 1;
251+
String correctAliasName = "Alias Radio Range";
252+
253+
AliasList aliasList = new AliasList("Test Alias List");
254+
255+
Alias aliasTalkgroup1 = new Alias();
256+
aliasTalkgroup1.setName(correctAliasName);
257+
aliasTalkgroup1.addAliasID(new RadioRange(Protocol.APCO25, 1, 0xFFFFFF));
258+
aliasList.addAlias(aliasTalkgroup1);
259+
260+
//Identifier transmitted over the air that we want to alias
261+
APCO25FullyQualifiedRadioIdentifier p25FQTG1 = APCO25FullyQualifiedRadioIdentifier.createFrom(aliasRadio, wacn, system, originalRadio);
262+
263+
List<Alias> aliases = aliasList.getAliases(p25FQTG1);
264+
assertEquals(1, aliases.size(), "Expected 1 matching alias");
265+
assertEquals(correctAliasName, aliases.getFirst().getName(), "Unexpected alias name");
266+
}
267+
}

0 commit comments

Comments
 (0)