88import io .spiffe .exception .X509BundleException ;
99import io .spiffe .exception .X509ContextException ;
1010import io .spiffe .spiffeid .TrustDomain ;
11+ import io .spiffe .svid .x509svid .X509Svid ;
1112import io .spiffe .workloadapi .grpc .Workload ;
1213import org .junit .jupiter .api .Test ;
1314
15+ import java .io .FileNotFoundException ;
1416import java .io .IOException ;
17+ import java .io .InputStream ;
1518import java .net .URISyntaxException ;
1619import java .nio .file .Files ;
1720import java .nio .file .Path ;
1821import java .nio .file .Paths ;
1922import java .util .Collections ;
2023import java .util .Iterator ;
24+ import java .util .List ;
2125
2226import static io .spiffe .utils .TestUtils .toUri ;
2327import static org .junit .jupiter .api .Assertions .assertEquals ;
@@ -128,4 +132,86 @@ private Workload.X509BundlesResponse createX509BundlesResponse() throws URISynta
128132 .putBundles (TrustDomain .parse ("domain.test" ).getName (), federatedByteString )
129133 .build ();
130134 }
135+
136+ @ Test
137+ void getListOfX509Svid_dedupesOnlyNonEmptyHints () throws Exception {
138+
139+ ByteString certA = loadTestResource ("testdata/certs/leaf-a.crt.der" );
140+ ByteString keyA = loadTestResource ("testdata/certs/leaf-a.key.der" );
141+
142+ ByteString certB = loadTestResource ("testdata/certs/leaf-b.crt.der" );
143+ ByteString keyB = loadTestResource ("testdata/certs/leaf-b.key.der" );
144+
145+ ByteString certC = loadTestResource ("testdata/certs/leaf-c.crt.der" );
146+ ByteString keyC = loadTestResource ("testdata/certs/leaf-c.key.der" );
147+
148+ ByteString certD = loadTestResource ("testdata/certs/leaf-d.crt.der" );
149+ ByteString keyD = loadTestResource ("testdata/certs/leaf-d.key.der" );
150+
151+ ByteString certE = loadTestResource ("testdata/certs/leaf-e.crt.der" );
152+ ByteString keyE = loadTestResource ("testdata/certs/leaf-e.key.der" );
153+
154+ Workload .X509SVID svidA = Workload .X509SVID .newBuilder ()
155+ .setHint ("" )
156+ .setSpiffeId ("spiffe://test/a" )
157+ .setX509Svid (certA )
158+ .setX509SvidKey (keyA )
159+ .build ();
160+
161+ Workload .X509SVID svidB = Workload .X509SVID .newBuilder ()
162+ .setHint ("" )
163+ .setSpiffeId ("spiffe://test/b" )
164+ .setX509Svid (certB )
165+ .setX509SvidKey (keyB )
166+ .build ();
167+
168+ Workload .X509SVID svidC = Workload .X509SVID .newBuilder ()
169+ .setHint ("hintX" )
170+ .setSpiffeId ("spiffe://test/c" )
171+ .setX509Svid (certC )
172+ .setX509SvidKey (keyC )
173+ .build ();
174+
175+ Workload .X509SVID svidD = Workload .X509SVID .newBuilder ()
176+ .setHint ("hintX" )
177+ .setSpiffeId ("spiffe://test/d" )
178+ .setX509Svid (certD )
179+ .setX509SvidKey (keyD )
180+ .build ();
181+
182+ Workload .X509SVID svidE = Workload .X509SVID .newBuilder ()
183+ .setHint ("hintY" )
184+ .setSpiffeId ("spiffe://test/e" )
185+ .setX509Svid (certE )
186+ .setX509SvidKey (keyE )
187+ .build ();
188+
189+ Workload .X509SVIDResponse resp = Workload .X509SVIDResponse .newBuilder ()
190+ .addSvids (svidA )
191+ .addSvids (svidB )
192+ .addSvids (svidC )
193+ .addSvids (svidD )
194+ .addSvids (svidE )
195+ .build ();
196+
197+ // Act
198+ List <X509Svid > out = GrpcConversionUtils .getListOfX509Svid (resp );
199+
200+ // Assert: B must NOT be removed; D must be removed; order preserved
201+ assertEquals (4 , out .size ());
202+ assertEquals ("spiffe://test/a" , out .get (0 ).getSpiffeId ().toString ());
203+ assertEquals ("spiffe://test/b" , out .get (1 ).getSpiffeId ().toString ());
204+ assertEquals ("spiffe://test/c" , out .get (2 ).getSpiffeId ().toString ());
205+ assertEquals ("spiffe://test/e" , out .get (3 ).getSpiffeId ().toString ());
206+
207+ }
208+
209+ private static ByteString loadTestResource (String resourcePath ) throws IOException {
210+ try (InputStream in = GrpcConversionUtilsTest .class .getResourceAsStream ("/" + resourcePath )) {
211+ if (in == null ) {
212+ throw new FileNotFoundException ("Resource not found on classpath: " + resourcePath );
213+ }
214+ return ByteString .copyFrom (in .readAllBytes ());
215+ }
216+ }
131217}
0 commit comments