neptune 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,45 @@
1
+
2
+ class TestStorage < Test::Unit::TestCase
3
+ def test_in_out
4
+ STORAGE_TYPES.each { |storage|
5
+ run_in_out(storage)
6
+ }
7
+ end
8
+
9
+ def run_in_out(storage)
10
+ contents = TestHelper.get_random_alphanumeric(1024)
11
+ suffix = "neptune-testfile-#{TestHelper.get_random_alphanumeric}"
12
+ local = "/tmp/#{suffix}"
13
+ TestHelper.write_file(local, contents)
14
+
15
+ run_input(local, suffix, storage)
16
+ run_output(contents, suffix, storage)
17
+
18
+ FileUtils.rm_rf(local)
19
+ end
20
+
21
+ def run_input(local, suffix, storage)
22
+ params = {
23
+ :type => "input",
24
+ :local => local,
25
+ :remote => TestHelper.get_output_location(suffix, storage)
26
+ }.merge(TestHelper.get_storage_params(storage))
27
+
28
+ input_result = neptune(params)
29
+
30
+ msg = "We were unable to store a file in the database. We " +
31
+ " got back this: #{msg}"
32
+ assert(input_result, msg)
33
+ end
34
+
35
+ def run_output(local, suffix, storage)
36
+ output = TestHelper.get_output_location(suffix, storage)
37
+ remote = TestHelper.get_job_output(output, storage)
38
+
39
+ msg = "We were unable to verify that the remote file matches the " +
40
+ "local version. The local copy's contents are: " +
41
+ "[#{local}], while the remote copy's contents are [#{remote}]."
42
+ assert_equal(local, remote, msg)
43
+ end
44
+ end
45
+
data/test/tc_upc.rb ADDED
@@ -0,0 +1,75 @@
1
+
2
+ class TestUPC < Test::Unit::TestCase
3
+ def test_hello_world_code
4
+ STORAGE_TYPES.each { |storage|
5
+ run_hello_world_code(storage)
6
+ }
7
+ end
8
+
9
+ def run_hello_world_code(storage)
10
+ expected_output = "Hello from thread 0"
11
+ ring_code = <<BAZ
12
+ #include <upc_relaxed.h>
13
+ #include <stdio.h>
14
+
15
+ int main() {
16
+ printf("Hello from thread %i/%i", MYTHREAD, THREADS);
17
+ upc_barrier;
18
+ return 0;
19
+ }
20
+
21
+ BAZ
22
+
23
+ contents = TestHelper.get_random_alphanumeric(1024)
24
+ folder = "hello-world-#{TestHelper.get_random_alphanumeric}"
25
+ source = "HelloWorld.c"
26
+
27
+ tmp_folder = "/tmp/#{folder}"
28
+ FileUtils.mkdir_p(tmp_folder)
29
+ compiled = "#{tmp_folder}-compiled"
30
+ compiled_code = "#{compiled}/HelloWorld"
31
+
32
+ local = "#{tmp_folder}/#{source}"
33
+ TestHelper.write_file(local, ring_code)
34
+
35
+ output = TestHelper.get_output_location(folder, storage)
36
+
37
+ compile_upc_code(tmp_folder, source, compiled)
38
+ start_upc_code(compiled_code, output, storage)
39
+ get_upc_output(output, expected_output, storage)
40
+
41
+ FileUtils.rm_rf(tmp_folder)
42
+ FileUtils.rm_rf(compiled)
43
+ end
44
+
45
+ def compile_upc_code(location, main_file, compiled)
46
+ std_out, std_err = TestHelper.compile_code(location, main_file, compiled)
47
+
48
+ make = "/usr/local/berkeley_upc-2.12.1/upcc --network=mpi -o HelloWorld HelloWorld.c"
49
+ msg = "The UPC code did not compile as expected. It should have " +
50
+ "compiled with the command [#{make}] instead of [#{std_out}]."
51
+ assert_equal(std_out, make, msg)
52
+
53
+ msg = "The UPC code did not compile successfully. It reported " +
54
+ "the following error: #{std_err}"
55
+ assert_nil(std_err, msg)
56
+ end
57
+
58
+ def start_upc_code(code_location, output, storage)
59
+ status = TestHelper.start_job("upc", code_location, output, storage)
60
+
61
+ msg = "Your job was not started successfully. The failure message " +
62
+ "reported was #{status[:msg]}"
63
+ assert_equal(status[:result], :success, msg)
64
+ end
65
+
66
+ def get_upc_output(output, expected, storage)
67
+ result = TestHelper.get_job_output(output, storage)
68
+
69
+ msg = "The UPC job you ran did not return the expected result. " +
70
+ "We expected to see [#{expected}] but instead saw [#{result}]"
71
+ success = result.include?(expected)
72
+ assert(success, msg)
73
+ end
74
+ end
75
+
data/test/tc_x10.rb ADDED
@@ -0,0 +1,94 @@
1
+
2
+ class TestX10 < Test::Unit::TestCase
3
+ def test_ring_code
4
+ STORAGE_TYPES.each { |storage|
5
+ run_ring_code(storage)
6
+ }
7
+ end
8
+
9
+ def run_ring_code(storage)
10
+ expected_output = "All done!"
11
+ ring_code = <<BAZ
12
+ import x10.lang.Math;
13
+ import x10.util.Timer;
14
+
15
+ public class Ring {
16
+
17
+ static val NUM_MESSAGES = 1;
18
+
19
+ // A global datastructure with one integer cell per place
20
+ static A = PlaceLocalHandle.make[Cell[Long]](Dist.makeUnique(), ()=>new Cell[Long](-1));
21
+
22
+ public static def send (msg:Long, depth:Int) {
23
+ A()() = msg;
24
+ if (depth==0) return;
25
+ async at (here.next()) send(msg, depth-1);
26
+ }
27
+
28
+ public static def main(args:Array[String](1)) {
29
+
30
+ val startTime = Timer.milliTime();
31
+ finish send(42L, NUM_MESSAGES * Place.MAX_PLACES);
32
+ val endTime = Timer.milliTime();
33
+
34
+ val totalTime = (endTime - startTime) / 1000.0;
35
+
36
+ Console.OUT.printf("#{expected_output}");
37
+ }
38
+ }
39
+
40
+ BAZ
41
+
42
+ contents = TestHelper.get_random_alphanumeric(1024)
43
+ folder = "ring-#{TestHelper.get_random_alphanumeric}"
44
+ source = "Ring.x10"
45
+
46
+ tmp_folder = "/tmp/#{folder}"
47
+ FileUtils.mkdir_p(tmp_folder)
48
+ compiled = "#{tmp_folder}-compiled"
49
+ compiled_code = "#{compiled}/Ring"
50
+
51
+ local = "#{tmp_folder}/#{source}"
52
+ TestHelper.write_file(local, ring_code)
53
+
54
+ output = TestHelper.get_output_location(folder, storage)
55
+
56
+ compile_x10_code(tmp_folder, source, compiled)
57
+ start_x10_code(compiled_code, output, storage)
58
+ get_x10_output(output, expected_output, storage)
59
+
60
+ FileUtils.rm_rf(tmp_folder)
61
+ FileUtils.rm_rf(compiled)
62
+ end
63
+
64
+ def compile_x10_code(location, main_file, compiled)
65
+ std_out, std_err = TestHelper.compile_code(location, main_file, compiled)
66
+
67
+ make = "/usr/local/x10/x10.dist/bin/x10c++ -x10rt mpi -o Ring Ring.x10"
68
+ msg = "The X10 Ring code did not compile as expected. It should have " +
69
+ "compiled with the command [#{make}] instead of [#{std_out}]."
70
+ assert_equal(std_out, make, msg)
71
+
72
+ msg = "The X10 Ring code did not compile successfully. It reported " +
73
+ "the following error: #{std_err}"
74
+ compile_success = !std_err.include?("error")
75
+ assert(compile_success, msg)
76
+ end
77
+
78
+ def start_x10_code(code_location, output, storage)
79
+ status = TestHelper.start_job("x10", code_location, output, storage)
80
+
81
+ msg = "Your job was not started successfully. The failure message " +
82
+ "reported was #{status[:msg]}"
83
+ assert_equal(status[:result], :success, msg)
84
+ end
85
+
86
+ def get_x10_output(output, expected, storage)
87
+ result = TestHelper.get_job_output(output, storage)
88
+
89
+ msg = "The X10 job you ran did not return the expected result. " +
90
+ "We expected to see [#{expected}] but instead saw [#{result}]"
91
+ assert_equal(result, expected, msg)
92
+ end
93
+ end
94
+
@@ -0,0 +1,137 @@
1
+ #!/usr/bin/ruby -w
2
+ # Programmer: Chris Bunch
3
+
4
+ module TestHelper
5
+ def self.compile_code(location, main_file, compiled_location)
6
+ result = neptune(
7
+ :type => "compile",
8
+ :code => location,
9
+ :main => main_file,
10
+ :output => "/baz",
11
+ :copy_to => compiled_location
12
+ )
13
+
14
+ puts "standard out is #{result[:out]}"
15
+ puts "standard err is #{result[:err]}"
16
+
17
+ return result[:out], result[:err]
18
+ end
19
+
20
+ def self.start_job(type, code_location, output, storage, extras={})
21
+ params = {
22
+ :type => type,
23
+ :code => code_location,
24
+ :output => output,
25
+ :nodes_to_use => 1
26
+ }.merge(TestHelper.get_storage_params(storage)).merge(extras)
27
+
28
+ status = nil
29
+
30
+ loop {
31
+ status = neptune(params)
32
+ if status[:msg] =~ /not enough free nodes/
33
+ puts status[:msg]
34
+ else
35
+ break
36
+ end
37
+ sleep(5)
38
+ }
39
+
40
+ return status
41
+ end
42
+
43
+ def self.get_job_output(output, storage)
44
+ result = ""
45
+
46
+ params = {
47
+ :type => "output",
48
+ :output => output
49
+ }.merge(TestHelper.get_storage_params(storage))
50
+
51
+ loop {
52
+ result = neptune(params)
53
+
54
+ break if result != "error: output does not exist"
55
+ puts "Waiting for job to complete..."
56
+ sleep(30)
57
+ }
58
+
59
+ return result
60
+ end
61
+
62
+ def self.get_output_location(file, storage="appdb", notxt=false)
63
+ output = "/neptune"
64
+
65
+ if storage == "walrus"
66
+ output << "_"
67
+ else
68
+ output << "-"
69
+ end
70
+
71
+ output << "testbin/#{file}"
72
+ if !notxt
73
+ output << ".txt"
74
+ end
75
+
76
+ return output
77
+ end
78
+
79
+ def self.get_storage_params(storage)
80
+ if storage == "gstorage"
81
+ return {
82
+ :storage => "gstorage",
83
+ :EC2_ACCESS_KEY => ENV['GSTORAGE_ACCESS_KEY'],
84
+ :EC2_SECRET_KEY => ENV['GSTORAGE_SECRET_KEY'],
85
+ :S3_URL => ENV['GSTORAGE_URL']
86
+ }
87
+ elsif storage == "s3"
88
+ return {
89
+ :storage => "s3",
90
+ :EC2_ACCESS_KEY => ENV['S3_ACCESS_KEY'],
91
+ :EC2_SECRET_KEY => ENV['S3_SECRET_KEY'],
92
+ :S3_URL => ENV['S3_URL']
93
+ }
94
+ elsif storage == "walrus"
95
+ return {
96
+ :storage => "s3",
97
+ :EC2_ACCESS_KEY => ENV['WALRUS_ACCESS_KEY'],
98
+ :EC2_SECRET_KEY => ENV['WALRUS_SECRET_KEY'],
99
+ :S3_URL => ENV['WALRUS_URL']
100
+ }
101
+ elsif storage == "appdb"
102
+ return {}
103
+ # nothing special to do
104
+ else
105
+ abort "Storage specified was not an acceptable value: #{storage}"
106
+ end
107
+ end
108
+
109
+ def self.write_file(location, contents)
110
+ File.open(location, "w+") { |file| file.write(contents) }
111
+ end
112
+
113
+ def self.read_file(location)
114
+ File.open(location) { |f| f.read.chomp! }
115
+ end
116
+
117
+ def self.get_random_alphanumeric(length=10)
118
+ random = ""
119
+ possible = "0123456789abcdefghijklmnopqrstuvxwyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
120
+ possibleLength = possible.length
121
+
122
+ length.times { |index|
123
+ random << possible[rand(possibleLength)]
124
+ }
125
+
126
+ return random
127
+ end
128
+
129
+ def self.is_appscale_running?(ip)
130
+ begin
131
+ Net::HTTP.get_response(URI.parse("http://#{ip}"))
132
+ return true
133
+ rescue Exception
134
+ return false
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,41 @@
1
+ #STORAGE_TYPES = ["gstorage"]
2
+ STORAGE_TYPES = ["appdb", "gstorage", "s3", "walrus"]
3
+
4
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
5
+ require 'neptune'
6
+
7
+ $:.unshift File.join(File.dirname(__FILE__), "..", "test")
8
+ require 'test_helper'
9
+
10
+ REQUIRED_CREDS = %w{ APPSCALE_HEAD_NODE
11
+ GSTORAGE_ACCESS_KEY GSTORAGE_SECRET_KEY GSTORAGE_URL
12
+ S3_ACCESS_KEY S3_SECRET_KEY S3_URL
13
+ WALRUS_ACCESS_KEY WALRUS_SECRET_KEY WALRUS_URL }
14
+
15
+ require 'test/unit'
16
+
17
+ REQUIRED_CREDS.each { |cred|
18
+ msg = "The environment variable #{cred} was not set. Please " +
19
+ "set it and try again."
20
+ abort(msg) if ENV[cred].nil?
21
+ }
22
+
23
+ APPSCALE_HEAD_NODE_IP = ENV['APPSCALE_HEAD_NODE']
24
+ msg = "AppScale is not currently running at " +
25
+ "#{APPSCALE_HEAD_NODE_IP}. Please start AppScale and try again."
26
+ abort(msg) unless TestHelper.is_appscale_running?(APPSCALE_HEAD_NODE_IP)
27
+
28
+ TEST_ALL_WORKING = true
29
+
30
+ if TEST_ALL_WORKING
31
+ require 'tc_c'
32
+ require 'tc_dfsp'
33
+ require 'tc_dwssa'
34
+ require 'tc_erlang'
35
+ require 'tc_mpi'
36
+ require 'tc_storage'
37
+ require 'tc_upc'
38
+ require 'tc_x10'
39
+ else
40
+ require 'tc_mapreduce'
41
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: neptune
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 17
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 6
10
- version: 0.0.6
9
+ - 7
10
+ version: 0.0.7
11
11
  platform: ruby
12
12
  authors:
13
13
  - Chris Bunch
@@ -15,7 +15,7 @@ autorequire: neptune
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-03-28 00:00:00 -07:00
18
+ date: 2011-04-02 00:00:00 -07:00
19
19
  default_executable: neptune
20
20
  dependencies: []
21
21
 
@@ -40,6 +40,7 @@ files:
40
40
  - doc/AppControllerClient.html
41
41
  - doc/LICENSE.html
42
42
  - doc/lib/job_rb.html
43
+ - doc/lib/neptune_rb.html
43
44
  - doc/lib/app_controller_client_rb.html
44
45
  - doc/lib/common_functions_rb.html
45
46
  - doc/index.html
@@ -105,6 +106,17 @@ files:
105
106
  - lib/common_functions.rb
106
107
  - lib/app_controller_client.rb
107
108
  - lib/neptune.rb
109
+ - test/tc_c.rb
110
+ - test/tc_dfsp.rb
111
+ - test/test_helper.rb
112
+ - test/tc_mpi.rb
113
+ - test/tc_dwssa.rb
114
+ - test/tc_erlang.rb
115
+ - test/tc_storage.rb
116
+ - test/tc_x10.rb
117
+ - test/tc_upc.rb
118
+ - test/ts_neptune.rb
119
+ - test/tc_mapreduce.rb
108
120
  - README
109
121
  - LICENSE
110
122
  has_rdoc: true