GlueGen v2.6.0-rc-20250712
GlueGen, Native Binding Generator for Java™ (public API).
SingletonJunitCase.java
Go to the documentation of this file.
1/**
2 * Copyright 2010 JogAmp Community. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without modification, are
5 * permitted provided that the following conditions are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright notice, this list of
8 * conditions and the following disclaimer.
9 *
10 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
11 * of conditions and the following disclaimer in the documentation and/or other materials
12 * provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
15 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
16 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
19 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
21 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
22 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23 *
24 * The views and conclusions contained in the software and documentation are those of the
25 * authors and should not be interpreted as representing official policies, either expressed
26 * or implied, of JogAmp Community.
27 */
28
29package com.jogamp.junit.util;
30
31import com.jogamp.common.util.locks.SingletonInstance;
32
33import org.junit.BeforeClass;
34import org.junit.AfterClass;
35import org.junit.FixMethodOrder;
36import org.junit.runners.MethodSorters;
37
38@FixMethodOrder(MethodSorters.NAME_ASCENDING)
39public abstract class SingletonJunitCase extends JunitTracer {
40 public static final String SINGLE_INSTANCE_LOCK_FILE = "SingletonTestCase.lock";
41 public static final int SINGLE_INSTANCE_LOCK_PORT = 59999;
42
43 public static final long SINGLE_INSTANCE_LOCK_TO = 15*60*1000; // wait up to 15 mins
44 public static final long SINGLE_INSTANCE_LOCK_POLL = 500; // poll every 500 ms
45
46 private static SingletonInstance singletonInstance = null; // system wide lock via port locking
47 private static final Object singletonSync = new Object(); // classloader wide lock
48 private static boolean enabled = true;
49
50 /**
51 * Default is {@code true}.
52 */
53 public static final void enableSingletonLock(final boolean v) {
54 enabled = v;
55 }
56
57 @BeforeClass
58 public static final void oneTimeSetUpSingleton() {
59 // one-time initialization code
60 synchronized( singletonSync ) {
61 if( enabled ) {
62 if( null == singletonInstance ) {
63 System.err.println("++++ Test Singleton.ctor()");
64 // singletonInstance = SingletonInstance.createFileLock(SINGLE_INSTANCE_LOCK_POLL, SINGLE_INSTANCE_LOCK_FILE);
65 singletonInstance = SingletonInstance.createServerSocket(SINGLE_INSTANCE_LOCK_POLL, SINGLE_INSTANCE_LOCK_PORT);
66 }
67 System.err.println("++++ Test Singleton.lock()");
68 if(!singletonInstance.tryLock(SINGLE_INSTANCE_LOCK_TO)) {
69 throw new RuntimeException("Fatal: Could not lock single instance: "+singletonInstance.getName());
70 }
71 }
72 }
73 }
74
75 @AfterClass
76 public static final void oneTimeTearDownSingleton() {
77 // one-time cleanup code
78 synchronized( singletonSync ) {
79 System.gc(); // force cleanup
80 if( enabled ) {
81 System.err.println("++++ Test Singleton.unlock()");
82 singletonInstance.unlock();
83 try {
84 // allowing other JVM instances to pick-up socket
85 Thread.sleep( SINGLE_INSTANCE_LOCK_POLL );
86 } catch (final InterruptedException e) { }
87 }
88 }
89 }
90}
91
synchronized boolean tryLock(long maxwait)
Blocking until the lock is acquired by this Thread or maxwait in ms is reached.
static SingletonInstance createServerSocket(final long poll_ms, final int portNumber)
A user shall use ephemeral ports:
static final void enableSingletonLock(final boolean v)
Default is true.