1 /*******************************************************************************
2  * Copyright (c) 2008, 2017 IBM Corporation and others.
3  *
4  * This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License 2.0
6  * which accompanies this distribution, and is available at
7  * https://www.eclipse.org/legal/epl-2.0/
8  *
9  * SPDX-License-Identifier: EPL-2.0
10  *
11  * Contributors:
12  *     IBM Corporation - initial API and implementation
13  *     martin.kirst@s1998.tu-chemnitz.de - fixed and improved sort algorithm tests
14  *******************************************************************************/
15 package org.eclipse.equinox.p2.tests.artifact.repository;
16 
17 import static org.junit.Assert.assertEquals;
18 
19 import java.util.ArrayList;
20 import java.util.Arrays;
21 import java.util.Collections;
22 import java.util.List;
23 import org.eclipse.equinox.internal.p2.artifact.repository.MirrorSelector;
24 import org.eclipse.equinox.internal.p2.artifact.repository.MirrorSelector.MirrorInfo;
25 import org.junit.Before;
26 import org.junit.Test;
27 
28 public class MirrorSelectorTest {
29 
30 	private List<MirrorInfo> originals;
31 
32 	@Before
setUp()33 	public void setUp() throws Exception {
34 		// examples taken from real live.
35 		// This is the expected order of mirrors,
36 		// doesn't matter how often you're resorting ;-)
37 
38 		originals = new ArrayList<>();
39 		MirrorInfo mi = null;
40 
41 		mi = new MirrorInfo("http://ftp.wh2.tu-dresden.de/pub/mirrors/eclipse/", 3);
42 		mi.setBytesPerSecond(224906);
43 		mi.incrementFailureCount();
44 		//mi.totalFailureCount = 1;
45 		originals.add(mi);
46 
47 		mi = new MirrorInfo("http://ftp-stud.fht-esslingen.de/pub/Mirrors/eclipse/", 1);
48 		mi.setBytesPerSecond(125868);
49 		mi.incrementFailureCount();
50 		//mi.totalFailureCount = 1;
51 		originals.add(mi);
52 
53 		mi = new MirrorInfo("http://mirror.netcologne.de/eclipse//", 0);
54 		mi.setBytesPerSecond(199719);
55 		mi.incrementFailureCount();
56 		mi.incrementFailureCount();
57 		//mi.totalFailureCount = 2;
58 		originals.add(mi);
59 
60 		mi = new MirrorInfo("http://mirror.selfnet.de/eclipse/", 5);
61 		mi.setBytesPerSecond(132379);
62 		mi.incrementFailureCount();
63 		//mi.totalFailureCount = 1;
64 		originals.add(mi);
65 
66 		mi = new MirrorInfo("http://mirror.switch.ch/eclipse/", 7);
67 		mi.setBytesPerSecond(137107);
68 		mi.incrementFailureCount();
69 		//mi.totalFailureCount = 1;
70 		originals.add(mi);
71 
72 		mi = new MirrorInfo("http://www.rcp-vision.com/eclipse/eclipseMirror/", 8);
73 		mi.setBytesPerSecond(128472);
74 		mi.incrementFailureCount();
75 		//mi.totalFailureCount = 1;
76 		originals.add(mi);
77 
78 		mi = new MirrorInfo("http://eclipse.mirror.garr.it/mirrors/eclipse//", 10);
79 		mi.setBytesPerSecond(129359);
80 		mi.incrementFailureCount();
81 		mi.incrementFailureCount();
82 		//mi.totalFailureCount = 2;
83 		originals.add(mi);
84 
85 		mi = new MirrorInfo("http://ftp.roedu.net/pub/mirrors/eclipse.org/", 6);
86 		mi.setBytesPerSecond(59587);
87 		mi.incrementFailureCount();
88 		//mi.totalFailureCount = 1;
89 		originals.add(mi);
90 
91 		mi = new MirrorInfo("http://giano.com.dist.unige.it/eclipse/", 9);
92 		mi.setBytesPerSecond(85624);
93 		mi.incrementFailureCount();
94 		//mi.totalFailureCount = 1;
95 		originals.add(mi);
96 
97 		mi = new MirrorInfo("http://ftp.roedu.net/mirrors/eclipse.org//", 19);
98 		mi.setBytesPerSecond(149572);
99 		mi.incrementFailureCount();
100 		mi.incrementFailureCount();
101 		//mi.totalFailureCount = 2;
102 		originals.add(mi);
103 
104 		mi = new MirrorInfo("http://ftp.ing.umu.se/mirror/eclipse/", 18);
105 		mi.setBytesPerSecond(105858);
106 		mi.incrementFailureCount();
107 		//mi.totalFailureCount = 1;
108 		originals.add(mi);
109 
110 		mi = new MirrorInfo("http://mirrors.fe.up.pt/pub/eclipse//", 15);
111 		mi.setBytesPerSecond(67202);
112 		mi.incrementFailureCount();
113 		//mi.totalFailureCount = 1;
114 		originals.add(mi);
115 
116 		mi = new MirrorInfo("http://ftp.heanet.ie/pub/eclipse//", 17);
117 		mi.setBytesPerSecond(68067);
118 		mi.incrementFailureCount();
119 		//mi.totalFailureCount = 1;
120 		originals.add(mi);
121 
122 		mi = new MirrorInfo("http://ftp.sh.cvut.cz/MIRRORS/eclipse/", 21);
123 		mi.setBytesPerSecond(73659);
124 		mi.incrementFailureCount();
125 		//mi.totalFailureCount = 1;
126 		originals.add(mi);
127 
128 		mi = new MirrorInfo("http://ftp.man.poznan.pl/eclipse/", 22);
129 		mi.setBytesPerSecond(73446);
130 		mi.incrementFailureCount();
131 		//mi.totalFailureCount = 1;
132 		originals.add(mi);
133 
134 		mi = new MirrorInfo("http://eclipse.dcc.fc.up.pt/", 16);
135 		mi.setBytesPerSecond(45175);
136 		mi.incrementFailureCount();
137 		//mi.totalFailureCount = 1;
138 		originals.add(mi);
139 
140 		mi = new MirrorInfo("http://eclipse.nordnet.fi/eclipse/", 23);
141 		mi.setBytesPerSecond(61443);
142 		mi.incrementFailureCount();
143 		//mi.totalFailureCount = 1;
144 		originals.add(mi);
145 
146 		mi = new MirrorInfo("http://www.gtlib.gatech.edu/pub/eclipse/", 26);
147 		mi.setBytesPerSecond(57637);
148 		mi.incrementFailureCount();
149 		//mi.totalFailureCount = 1;
150 		originals.add(mi);
151 
152 		mi = new MirrorInfo("http://ftp.osuosl.org/pub/eclipse//", 28);
153 		mi.setBytesPerSecond(35928);
154 		mi.incrementFailureCount();
155 		//mi.totalFailureCount = 1;
156 		originals.add(mi);
157 
158 		mi = new MirrorInfo("http://mirrors.med.harvard.edu/eclipse//", 32);
159 		mi.setBytesPerSecond(40683);
160 		//mi.totalFailureCount = 0;
161 		originals.add(mi);
162 
163 		mi = new MirrorInfo("http://mirrors.ibiblio.org/pub/mirrors/eclipse/", 31);
164 		mi.setBytesPerSecond(34207);
165 		mi.incrementFailureCount();
166 		mi.incrementFailureCount();
167 		//mi.totalFailureCount = 2;
168 		originals.add(mi);
169 
170 		mi = new MirrorInfo("http://ftp.ussg.iu.edu/eclipse/", 33);
171 		mi.setBytesPerSecond(31402);
172 		mi.incrementFailureCount();
173 		//mi.totalFailureCount = 1;
174 		originals.add(mi);
175 
176 		mi = new MirrorInfo("http://mirrors.xmission.com/eclipse/", 29);
177 		mi.setBytesPerSecond(24147);
178 		mi.incrementFailureCount();
179 		//mi.totalFailureCount = 1;
180 		originals.add(mi);
181 
182 		mi = new MirrorInfo("http://ftp.osuosl.org/pub/eclipse/", 34);
183 		mi.setBytesPerSecond(-1);
184 		//mi.totalFailureCount = 0;
185 		originals.add(mi);
186 
187 		mi = new MirrorInfo("http://www.ftp.saix.net/Eclipse//", 40);
188 		mi.setBytesPerSecond(-1);
189 		//mi.totalFailureCount = 0;
190 		originals.add(mi);
191 
192 		mi = new MirrorInfo("http://ftp.daum.net/eclipse/", 41);
193 		mi.setBytesPerSecond(-1);
194 		//mi.totalFailureCount = 0;
195 		originals.add(mi);
196 
197 		mi = new MirrorInfo("http://eclipse.stu.edu.tw/", 43);
198 		mi.setBytesPerSecond(-1);
199 		//mi.totalFailureCount = 0;
200 		originals.add(mi);
201 
202 		mi = new MirrorInfo("http://eclipse.stu.edu.tw/", 44);
203 		mi.setBytesPerSecond(-1);
204 		//mi.totalFailureCount = 0;
205 		originals.add(mi);
206 
207 		mi = new MirrorInfo("http://ftp.kaist.ac.kr/eclipse/", 45);
208 		mi.setBytesPerSecond(-1);
209 		//mi.totalFailureCount = 0;
210 		originals.add(mi);
211 
212 		mi = new MirrorInfo("http://eclipse.stu.edu.tw//", 46);
213 		mi.setBytesPerSecond(-1);
214 		//mi.totalFailureCount = 0;
215 		originals.add(mi);
216 
217 		mi = new MirrorInfo("http://ftp.tsukuba.wide.ad.jp/software/eclipse//", 47);
218 		mi.setBytesPerSecond(-1);
219 		//mi.totalFailureCount = 0;
220 		originals.add(mi);
221 
222 		mi = new MirrorInfo("http://mirror.neu.edu.cn/eclipse/", 50);
223 		mi.setBytesPerSecond(-1);
224 		//mi.totalFailureCount = 0;
225 		originals.add(mi);
226 
227 		mi = new MirrorInfo("http://mirror.bit.edu.cn/eclipse/", 51);
228 		mi.setBytesPerSecond(-1);
229 		//mi.totalFailureCount = 0;
230 		originals.add(mi);
231 
232 		mi = new MirrorInfo("http://ftp.cs.pu.edu.tw/pub/eclipse/", 52);
233 		mi.setBytesPerSecond(-1);
234 		//mi.totalFailureCount = 0;
235 		originals.add(mi);
236 
237 		mi = new MirrorInfo("http://ftp.neu.edu.cn/mirrors/eclipse/", 53);
238 		mi.setBytesPerSecond(-1);
239 		//mi.totalFailureCount = 0;
240 		originals.add(mi);
241 
242 		mi = new MirrorInfo("http://download.actuatechina.com/eclipse/", 54);
243 		mi.setBytesPerSecond(-1);
244 		//mi.totalFailureCount = 0;
245 		originals.add(mi);
246 
247 		mi = new MirrorInfo("http://linorg.usp.br/eclipse/", 57);
248 		mi.setBytesPerSecond(-1);
249 		//mi.totalFailureCount = 0;
250 		originals.add(mi);
251 
252 		mi = new MirrorInfo("http://eclipse.c3sl.ufpr.br/", 59);
253 		mi.setBytesPerSecond(-1);
254 		//mi.totalFailureCount = 0;
255 		originals.add(mi);
256 
257 		mi = new MirrorInfo("http://download.eclipse.org/", 61);
258 		mi.setBytesPerSecond(-1);
259 		//mi.totalFailureCount = 0;
260 		originals.add(mi);
261 
262 	}
263 
264 	@Test
testSorting()265 	public void testSorting() {
266 
267 		long maxBytesPerSecond = 0;
268 		for (MirrorInfo x : originals) {
269 			maxBytesPerSecond = Math.max(maxBytesPerSecond, x.getBytesPerSecond());
270 		}
271 
272 		MirrorSelector.MirrorInfoComparator comparator = new MirrorSelector.MirrorInfoComparator(maxBytesPerSecond, 0, 0);
273 
274 		// do 1000 tries of randomize and new sort
275 		// the result should always be the same
276 		// This way we hopefully get sure, that contract of Comparator#compareTo
277 		// is fulfilled.
278 		for (int x = 0; x < 1000; x++) {
279 			ArrayList<MirrorInfo> templist = new ArrayList<>(originals);
280 			Collections.shuffle(templist);
281 			MirrorInfo[] mirrors = templist.toArray(new MirrorInfo[originals.size()]);
282 			Arrays.sort(mirrors, comparator);
283 			assertList(originals, mirrors);
284 			/*
285 			 * ================================================================
286 			 *
287 			 * Because of
288 			 * Bug 317785 - Synchronization problem in mirror selection
289 			 *
290 			 * We need an implementation of TimSort for this test.
291 			 * But because of incompatibility of EPL and GPL, the TimSort
292 			 * algorithm was removed.
293 			 * Instead, this test relies on the fact, that a proper implementation
294 			 * of Comparator will always compute the same result.
295 			 * When this test case runs within a JVM7, it will automatically
296 			 * use the new TimSort algorithm.
297 			 * ================================================================
298 			 */
299 		}
300 
301 	}
302 
303 	@Test
testComparatorZeros()304 	public void testComparatorZeros() {
305 
306 		MirrorSelector.MirrorInfoComparator comparator = new MirrorSelector.MirrorInfoComparator(0, 0, 0);
307 
308 		assertEquals("equals", comparator.compare(originals.get(0), originals.get(0)), 0);
309 		assertEquals("equals", comparator.compare(originals.get(1), originals.get(1)), 0);
310 
311 	}
312 
313 	/**
314 	 * @param originallist
315 	 * @param mirrors
316 	 */
assertList(List<MirrorInfo> originallist, MirrorInfo[] mirrors)317 	private void assertList(List<MirrorInfo> originallist, MirrorInfo[] mirrors) {
318 		assertEquals("length", originallist.size(), mirrors.length);
319 		for (int i = 0; i < originallist.size(); i++) {
320 			assertEquals("equal mirror_" + i, originallist.get(i), mirrors[i]);
321 		}
322 	}
323 
324 }
325