1 /*
   2  * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /*
  25  * @test
  26  * @bug 6239117 6445367
  27  * @summary test that CardTerminals.waitForCard() works
  28  * @author Andreas Sterbenz
  29  * @modules java.smartcardio/javax.smartcardio
  30  * @run main/manual TestMultiplePresent
  31  */
  32 
  33 // This test requires special hardware.
  34 
  35 import java.util.List;
  36 import javax.smartcardio.CardTerminal;
  37 import javax.smartcardio.CardTerminals;
  38 import javax.smartcardio.TerminalFactory;
  39 import static javax.smartcardio.CardTerminals.State.*;
  40 
  41 public class TestMultiplePresent {
  42 
  43     public static void main(String[] args) throws Exception {
  44         Utils.setLibrary(args);
  45         TerminalFactory factory = Utils.getTerminalFactory(null);
  46         if (factory == null) {
  47             System.out.println("Skipping the test: " +
  48                     "no card terminals available");
  49             return;
  50         }
  51         System.out.println(factory);
  52 
  53         CardTerminals terminals = factory.terminals();
  54         List<CardTerminal> list = terminals.list();
  55         System.out.println("Terminals: " + list);
  56         boolean multipleReaders = true;
  57         if (list.size() < 2) {
  58             if (list.isEmpty()) {
  59                 System.out.println("Skipping the test: " +
  60                         "no card terminals available");
  61                 return;
  62             }
  63             System.out.println("Only one reader present, using simplified test");
  64             multipleReaders = false;
  65         }
  66 
  67         while (true) {
  68             boolean present = false;
  69             for (CardTerminal terminal : list) {
  70                 present |= terminal.isCardPresent();
  71             }
  72             if (present == false) {
  73                 break;
  74             }
  75             System.out.println("*** Remove all cards!");
  76             Thread.sleep(1000);
  77         }
  78         System.out.println("OK");
  79 
  80         List<CardTerminal> result;
  81 
  82         result = terminals.list(CARD_PRESENT);
  83         if (result.size() != 0) {
  84             throw new Exception("List not empty: " + result);
  85         }
  86 
  87         if (terminals.waitForChange(1000)) {
  88             throw new Exception("no timeout");
  89         }
  90         if (terminals.waitForChange(1000)) {
  91             throw new Exception("no timeout");
  92         }
  93         result = terminals.list(CARD_PRESENT);
  94         if (result.size() != 0) {
  95             throw new Exception("List not empty: " + result);
  96         }
  97 
  98         System.out.println("*** Insert card!");
  99         terminals.waitForChange();
 100 
 101         result = terminals.list(CARD_INSERTION);
 102         System.out.println(result);
 103         if (result.size() != 1) {
 104             throw new Exception("no card present");
 105         }
 106         CardTerminal t1 = result.get(0);
 107 
 108         result = terminals.list(CARD_INSERTION);
 109         System.out.println(result);
 110         if ((result.size() != 1) || (result.get(0) != t1)) {
 111             throw new Exception("no card present");
 112         }
 113 
 114         if (terminals.list(CARD_REMOVAL).size() != 0) {
 115             throw new Exception("List not empty: " + result);
 116         }
 117         if (terminals.list(CARD_REMOVAL).size() != 0) {
 118             throw new Exception("List not empty: " + result);
 119         }
 120 
 121 
 122         if (terminals.waitForChange(1000)) {
 123             throw new Exception("no timeout");
 124         }
 125 
 126         if (terminals.list(CARD_REMOVAL).size() != 0) {
 127             throw new Exception("List not empty: " + result);
 128         }
 129 
 130         if (multipleReaders) {
 131             System.out.println("*** Insert card into other reader!");
 132             terminals.waitForChange();
 133 
 134             result = terminals.list(CARD_INSERTION);
 135             System.out.println(result);
 136             if (result.size() != 1) {
 137                 throw new Exception("no card present");
 138             }
 139             CardTerminal t2 = result.get(0);
 140             if (t1.getName().equals(t2.getName())) {
 141                 throw new Exception("same terminal");
 142             }
 143 
 144             System.out.println("*** Remove card from 2nd reader!");
 145             terminals.waitForChange();
 146 
 147             if (terminals.list(CARD_INSERTION).size() != 0) {
 148                 throw new Exception("List not empty: " + result);
 149             }
 150             result = terminals.list(CARD_REMOVAL);
 151             if ((result.size() != 1) || (result.get(0) != t2)) {
 152                 throw new Exception("no or wrong terminal");
 153             }
 154         }
 155 
 156         System.out.println("*** Remove card from 1st reader!");
 157         terminals.waitForChange();
 158 
 159         if (terminals.list(CARD_INSERTION).size() != 0) {
 160             throw new Exception("List not empty: " + result);
 161         }
 162         result = terminals.list(CARD_REMOVAL);
 163         if ((result.size() != 1) || (result.get(0) != t1)) {
 164             throw new Exception("no or wrong terminal");
 165         }
 166 
 167         System.out.println("OK.");
 168     }
 169 
 170 }