From 835c8486dc08f29ebbcae9e12b191654c2493ffc Mon Sep 17 00:00:00 2001
From: Darrell Hamilton <darrell.noice@gmail.com>
Date: Sat, 29 Nov 2014 22:09:37 -0700
Subject: [PATCH] Event and Timeout tests for select

---
 project.clj                              | 2 ++
 src/java/FILE.java                       | 5 +++++
 src/net/n01se/clojure_jna/libc_utils.clj | 7 ++++++-
 test/net/n01se/clojure_jna/test.clj      | 9 +++++++++
 4 files changed, 22 insertions(+), 1 deletion(-)
 create mode 100644 src/java/FILE.java

diff --git a/project.clj b/project.clj
index 42cae40..7e03a73 100644
--- a/project.clj
+++ b/project.clj
@@ -9,6 +9,8 @@
             :distribution :repo
             :comments "same as Clojure"}
   :min-lein-version "2.0.0"
+  :jvm-opts ["-Djna.nosys=true"]
+  :java-source-paths ["src/java"]
   :profiles {:1.2 {:dependencies [[org.clojure/clojure "1.2.0"]]}
              :1.3 {:dependencies [[org.clojure/clojure "1.3.0"]]}
              :1.4 {:dependencies [[org.clojure/clojure "1.4.0"]]}
diff --git a/src/java/FILE.java b/src/java/FILE.java
new file mode 100644
index 0000000..7b95739
--- /dev/null
+++ b/src/java/FILE.java
@@ -0,0 +1,5 @@
+package net.n01se.clojure_jna;
+
+import com.sun.jna.PointerType;
+
+public class FILE extends PointerType { }
diff --git a/src/net/n01se/clojure_jna/libc_utils.clj b/src/net/n01se/clojure_jna/libc_utils.clj
index ca02f48..a660912 100644
--- a/src/net/n01se/clojure_jna/libc_utils.clj
+++ b/src/net/n01se/clojure_jna/libc_utils.clj
@@ -9,10 +9,15 @@
 (ns net.n01se.clojure-jna.libc-utils
  "Convenience wrappers for libc functions. Currently just 'select'"
   {:author "Chris Houser"}
-  (:require [net.n01se.clojure-jna :as jna :refer [make-cbuf pointer when-err]]))
+  (:require [net.n01se.clojure-jna :as jna :refer [make-cbuf pointer when-err]])
+  (:import (net.n01se.clojure_jna FILE)))
 
 (jna/to-ns libc c [Integer select])
 
+(def fopen (jna/to-fn FILE c/fopen))
+(def fclose (jna/to-fn Integer c/fclose))
+(def fileno (jna/to-fn Integer c/fileno))
+
 (defn select
   "Block for timeout-secs waiting for events on the given file
    descriptors.  Each of readfds, writefds, and exceptfds must be
diff --git a/test/net/n01se/clojure_jna/test.clj b/test/net/n01se/clojure_jna/test.clj
index f5ce7aa..1c2a6a2 100644
--- a/test/net/n01se/clojure_jna/test.clj
+++ b/test/net/n01se/clojure_jna/test.clj
@@ -1,5 +1,6 @@
 (ns net.n01se.clojure-jna.test
   (:require [net.n01se.clojure-jna :as jna]
+            [net.n01se.clojure-jna.libc-utils :as libc-utils :refer [fopen fclose fileno]]
             [clojure.test :refer [deftest is]]))
 
 (deftest test-jna-invoke
@@ -13,3 +14,11 @@
   (jna/to-ns native-c c [Integer printf, Integer open, Integer close])
   (is (= 0 (eval '(native-c/close 0))))
   (is (= 14 (eval '(native-c/printf "one %s two\n" "hello")))))
+
+(deftest test-select
+  (let [fp (fopen "project.clj" "r")
+        fd (fileno (.getPointer fp))]
+    ; There should be no exceptional events on project.clj... I hope...
+    (is (= [#{} #{} #{}] (libc-utils/select nil nil [fd] 1)) "select timedout with no events")
+    (is (= [#{fd} #{} #{}] (libc-utils/select [fd] nil nil 1)) "select indicated that the fd can be read")    
+    (fclose fp)))