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
35import java.util.List;
36import javax.smartcardio.CardTerminal;
37import javax.smartcardio.CardTerminals;
38import javax.smartcardio.TerminalFactory;
39import static javax.smartcardio.CardTerminals.State.*;
40
41public 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}
171