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