networkmanager-dbus 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. data/Guardfile +5 -1
  2. data/README.md +20 -2
  3. data/Rakefile +13 -1
  4. data/TODO.md +3 -3
  5. data/examples/change_ip.rb +17 -0
  6. data/examples/connectivity.rb +1 -1
  7. data/lib/dbus_interface.rb +14 -5
  8. data/lib/dbus_interface/class.rb +28 -4
  9. data/lib/dbus_interface/connection.rb +58 -0
  10. data/lib/dbus_interface/object.rb +15 -7
  11. data/lib/network_manager.rb +3 -2
  12. data/lib/network_manager/dbus.rb +2 -0
  13. data/lib/network_manager/dbus/device.rb +9 -7
  14. data/lib/network_manager/dbus/root.rb +8 -4
  15. data/lib/network_manager/dbus/settings.rb +18 -5
  16. data/lib/network_manager/dbus/settings_connection.rb +86 -0
  17. data/lib/network_manager/ip4_config.rb +33 -0
  18. data/lib/network_manager/version.rb +1 -1
  19. data/lib/networkmanager-dbus.rb +1 -1
  20. data/networkmanager-dbus.gemspec +4 -0
  21. data/script/console +7 -0
  22. data/script/spec_server +1 -0
  23. data/spec/fixtures/active_connections.yml +10 -0
  24. data/spec/fixtures/devices.yml +18 -37
  25. data/spec/fixtures/dhcp4_configs.yml +17 -0
  26. data/spec/fixtures/ip4_configs.yml +7 -0
  27. data/spec/fixtures/settings.yml +4 -14
  28. data/spec/fixtures/settings_connections.yml +10 -0
  29. data/spec/lib/dbus_interface/class_spec.rb +31 -0
  30. data/spec/lib/dbus_interface/object_spec.rb +32 -0
  31. data/spec/{network_manager → lib/network_manager}/dbus/active_connection_spec.rb +6 -6
  32. data/spec/lib/network_manager/dbus/device_spec.rb +58 -0
  33. data/spec/lib/network_manager/dbus/dhcp4_config_spec.rb +19 -0
  34. data/spec/lib/network_manager/dbus/ethernet_device_spec.rb +14 -0
  35. data/spec/lib/network_manager/dbus/ip4_config_spec.rb +19 -0
  36. data/spec/lib/network_manager/dbus/root_spec.rb +38 -0
  37. data/spec/lib/network_manager/dbus/settings_connection_spec.rb +69 -0
  38. data/spec/lib/network_manager/dbus/settings_spec.rb +53 -0
  39. data/spec/lib/network_manager/ip4_config_spec.rb +27 -0
  40. data/spec/{network_manager_spec.rb → lib/network_manager_spec.rb} +2 -0
  41. data/spec/mocks/dbus/ethernet_device_mock.rb +5 -0
  42. data/spec/mocks/dbus/root_mock.rb +14 -0
  43. data/spec/mocks/dbus/settings_connection_mock.rb +21 -0
  44. data/spec/mocks/dbus/settings_mock.rb +9 -0
  45. data/spec/mocks/dbus_mock.rb +33 -0
  46. data/spec/mocks/init.rb +18 -0
  47. data/spec/mocks/system_bus_mock.rb +5 -0
  48. data/spec/mocks/system_bus_service_mock.rb +9 -0
  49. data/spec/spec_helper.rb +22 -3
  50. data/spec/support/fixture_helper.rb +21 -4
  51. metadata +96 -28
  52. data/lib/network_manager/ip4_helper.rb +0 -14
  53. data/spec/network_manager/dbus/device_spec.rb +0 -36
  54. data/spec/network_manager/dbus/dhcp4_config_spec.rb +0 -14
  55. data/spec/network_manager/dbus/ethernet_device_spec.rb +0 -21
  56. data/spec/network_manager/dbus/ip4_config_spec.rb +0 -14
  57. data/spec/network_manager/dbus/root_spec.rb +0 -22
  58. data/spec/network_manager/dbus/settings_connection_spec.rb +0 -13
  59. data/spec/network_manager/dbus/settings_spec.rb +0 -30
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe "NetworkManager::DBus::Dhcp4Config" do
4
+ before :each do
5
+ @data = fixture('dhcp4_configs.yml')
6
+ @object_paths = object_paths_from_fixture('dhcp4_configs.yml')
7
+ end
8
+
9
+ it 'should map interface "org.freedesktop.NetworkManager.DHCP4Config"' do
10
+ NetworkManager::DBus::Dhcp4Config.default_iface.should ==
11
+ 'org.freedesktop.NetworkManager.DHCP4Config'
12
+ end
13
+
14
+ it 'shoud list properties' do
15
+ network_manager_dbus_mock
16
+ con = NetworkManager::DBus::Dhcp4Config.new @object_paths.first
17
+ con.properties.should == @data.first.last['properties']
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ describe "NetworkManager::DBus::EthernetDevice" do
4
+ before :each do
5
+ @data = fixture('devices.yml')
6
+ @object_paths = object_paths_from_fixture('devices.yml')
7
+ end
8
+
9
+ it "should list poperties" do
10
+ network_manager_dbus_mock
11
+ dev = NetworkManager::DBus::EthernetDevice.new @object_paths.first
12
+ dev.properties.should == @data.first.last['ethernet']['properties']
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe "NetworkManager::DBus::Ip4Config" do
4
+ before :each do
5
+ @data = fixture('ip4_configs.yml')
6
+ @object_paths = object_paths_from_fixture('ip4_configs.yml')
7
+ end
8
+
9
+ it 'should map interface "org.freedesktop.NetworkManager.IP4Config"' do
10
+ NetworkManager::DBus::Ip4Config.default_iface.should ==
11
+ 'org.freedesktop.NetworkManager.IP4Config'
12
+ end
13
+
14
+ it 'shoud list properties' do
15
+ network_manager_dbus_mock
16
+ con = NetworkManager::DBus::Ip4Config.new @object_paths.first
17
+ con.properties.should == @data.first.last['properties']
18
+ end
19
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe "NetworkManager::DBus::Root" do
4
+ before :each do
5
+ @devices = fixture('devices.yml')
6
+ end
7
+
8
+ it "should list devices" do
9
+ network_manager_dbus_mock
10
+ list = NetworkManager::DBus::Root.devices
11
+ list.size.should > 0
12
+ list.first.class.should == NetworkManager::DBus::Device
13
+ end
14
+
15
+ it "should return device_by_interface" do
16
+ network_manager_dbus_mock
17
+ dev = NetworkManager::DBus::Root.device_by_interface 'eth0'
18
+ dev.properties.should == @devices.first.last['properties']
19
+ end
20
+
21
+ describe "internet_connection?" do
22
+ it 'should recognize internet_connection? if NM_STATE_CONNECTED_GLOBAL' do
23
+ network_manager_dbus_mock
24
+ stub(NetworkManager::DBus::Root.instance).call('state') {
25
+ [NetworkManager::DBus::Root::NM_STATE_CONNECTED_GLOBAL]
26
+ }
27
+ NetworkManager::DBus::Root.internet_connection?.should be_true
28
+ end
29
+
30
+ it 'should not recognize internet_connection? if not NM_STATE_CONNECTED_GLOBAL' do
31
+ network_manager_dbus_mock
32
+ stub(NetworkManager::DBus::Root.instance).call('state') {
33
+ [Time.now.to_i]
34
+ }
35
+ NetworkManager::DBus::Root.internet_connection?.should be_false
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+
3
+ describe "NetworkManager::DBus::SettingsConnection" do
4
+ before :each do
5
+ @data = fixture('settings_connections.yml')
6
+ @object_paths = object_paths_from_fixture('settings_connections.yml')
7
+ end
8
+
9
+ it "should have no properties" do
10
+ network_manager_dbus_mock
11
+ con = NetworkManager::DBus::SettingsConnection.new @object_paths.first
12
+ con.properties.should == nil
13
+ end
14
+
15
+ it "should get settings" do
16
+ network_manager_dbus_mock
17
+ con = NetworkManager::DBus::SettingsConnection.new @object_paths.first
18
+ con.settings.should == @data.first.last['settings']
19
+ end
20
+
21
+ it 'should get secrets' do
22
+ network_manager_dbus_mock
23
+ con = NetworkManager::DBus::SettingsConnection.new @object_paths.first
24
+ lambda do
25
+ con.secrets
26
+ end.should raise_error(NetworkManager::DBus::SettingsConnection::SecretsCacheInvalidError)
27
+ end
28
+
29
+ describe 'update' do
30
+ it 'should do update' do
31
+ network_manager_dbus_mock
32
+ con = NetworkManager::DBus::SettingsConnection.new @object_paths.first
33
+ hash = con.settings.dup
34
+ hash['connection']['id'] = 'bar'
35
+ con.update hash
36
+ con.settings['connection']['id'].should == 'bar'
37
+ end
38
+
39
+ it 'should get #name' do
40
+ network_manager_dbus_mock
41
+ con = NetworkManager::DBus::SettingsConnection.new @object_paths.first
42
+ con.name.should == 'Wired connection 1'
43
+ end
44
+
45
+ it 'should set #name=' do
46
+ network_manager_dbus_mock
47
+ con = NetworkManager::DBus::SettingsConnection.new @object_paths.first
48
+ con.name = 'foo'
49
+ con.name.should == 'foo'
50
+ end
51
+
52
+ it 'should set ip4 auto' do
53
+ network_manager_dbus_mock
54
+ con = NetworkManager::DBus::SettingsConnection.new @object_paths.first
55
+ con.ip4_auto!
56
+ con.ip4.should == 'auto'
57
+ end
58
+
59
+ it 'should set ip4 manual' do
60
+ network_manager_dbus_mock
61
+ con = NetworkManager::DBus::SettingsConnection.new @object_paths.first
62
+ con.ip4_manual = NetworkManager::Ip4Config.from_dot_notation '192.168.10.66', '255.255.0.0', '192.168.10.1'
63
+ con.ip4.address.to_s.should == '192.168.10.66'
64
+ con.ip4.address.netmask.should == '255.255.0.0'
65
+ con.ip4.gateway.to_s.should == '192.168.10.1'
66
+ con.ip4.gateway.netmask.should == '255.255.0.0'
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe "NetworkManager::DBus::Settings" do
4
+ before :each do
5
+ @data = fixture('settings.yml')
6
+ @object_paths = object_paths_from_fixture('settings.yml')
7
+ end
8
+
9
+ it "should list properties" do
10
+ network_manager_dbus_mock
11
+ NetworkManager::DBus::Settings.instance.properties.should ==
12
+ @data.first.last['properties']
13
+ end
14
+
15
+ it "should list connections" do
16
+ network_manager_dbus_mock
17
+ NetworkManager::DBus::Settings.connections.size.should == 1
18
+ end
19
+
20
+ describe 'can_modify' do
21
+ it 'should provide can_modify?' do
22
+ network_manager_dbus_mock
23
+ NetworkManager::DBus::Settings.instance.can_modify?.should ==
24
+ @data.first.last['properties']['CanModify']
25
+ end
26
+ end
27
+
28
+ describe 'hostname' do
29
+ it 'should get hostname from properties' do
30
+ network_manager_dbus_mock
31
+ NetworkManager::DBus::Settings.instance.hostname.should ==
32
+ @data.first.last['properties']['Hostname']
33
+ end
34
+
35
+ it 'should set hostname via object.SaveHostname' do
36
+ network_manager_dbus_mock
37
+
38
+ # manual spy
39
+ new_hostname = nil
40
+ subject = NetworkManager::DBus::Settings.instance
41
+ stub(subject).call('SaveHostname', is_a(String)) do |method,hostn|
42
+ new_hostname = hostn
43
+ [ ]
44
+ end
45
+
46
+ # action
47
+ NetworkManager::DBus::Settings.instance.hostname = 'a-host-name'
48
+
49
+ # assert
50
+ new_hostname.should == 'a-host-name'
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe "NetworkManager::Ip4Config" do
4
+ it 'should #from_dot_notation' do
5
+ network_manager_dbus_mock
6
+ c = NetworkManager::Ip4Config.from_dot_notation '192.168.10.7', '255.255.255.0', '192.168.10.1'
7
+ c.address.to_s == '192.168.10.7'
8
+ c.address.netmask == '255.255.255.0'
9
+ c.gateway.to_s == '192.168.10.1'
10
+ c.gateway.netmask == '255.255.255.0'
11
+ end
12
+
13
+ it 'should #to_nm_au' do
14
+ network_manager_dbus_mock
15
+ c = NetworkManager::Ip4Config.from_dot_notation '192.168.10.7', '255.255.255.0', '192.168.10.1'
16
+ c.to_nm_au.should == [118139072, 24, 17475776]
17
+ end
18
+
19
+ it 'should #from_nm_au' do
20
+ network_manager_dbus_mock
21
+ c = NetworkManager::Ip4Config.from_nm_au *[118139072, 24, 17475776]
22
+ c.address.to_s == '192.168.10.7'
23
+ c.address.netmask == '255.255.255.0'
24
+ c.gateway.to_s == '192.168.10.1'
25
+ c.gateway.netmask == '255.255.255.0'
26
+ end
27
+ end
@@ -2,11 +2,13 @@ require 'spec_helper'
2
2
 
3
3
  describe "NetworkManager" do
4
4
  it 'should expose all devices' do
5
+ network_manager_dbus_mock
5
6
  NetworkManager.devices.size.should == NetworkManager::DBus::Root.devices.size
6
7
  NetworkManager.devices.first.class.should == NetworkManager::DBus::Device
7
8
  end
8
9
 
9
10
  it 'should expose settings' do
11
+ network_manager_dbus_mock
10
12
  NetworkManager.settings.should == NetworkManager::DBus::Settings.instance
11
13
  end
12
14
  end
@@ -0,0 +1,5 @@
1
+ module EthernetDeviceMock
2
+ def all_properties
3
+ data['ethernet']['properties']
4
+ end
5
+ end
@@ -0,0 +1,14 @@
1
+ module RootMock
2
+ def GetDevices
3
+ object_paths = object_paths_from_fixture('devices.yml')
4
+ [ object_paths ]
5
+ end
6
+
7
+ def GetDeviceByIpIface(iface)
8
+ devices_data = fixture('devices.yml')
9
+ object_path, hash = devices_data.find do |object_path,hash|
10
+ hash['properties']['Interface'] == iface
11
+ end
12
+ [ object_path ]
13
+ end
14
+ end
@@ -0,0 +1,21 @@
1
+ module SettingsConnectionMock
2
+ def GetSettings
3
+ [ data['settings'] ]
4
+ end
5
+
6
+ def GetSecrets(name)
7
+ # until we know what it correctly can return, here return sth broken
8
+ raise DBus::Error.new 'm-settings-connection.c.830 - Internal error; secrets cache invalid.'
9
+ end
10
+
11
+ def Update(hash)
12
+ if ipv4 = hash['ipv4']
13
+ if addresses = ipv4['addresses']
14
+ if addresses.first == 'aau'
15
+ ipv4['addresses'] = addresses.last
16
+ end
17
+ end
18
+ end
19
+ data.merge(hash)
20
+ end
21
+ end
@@ -0,0 +1,9 @@
1
+ module SettingsMock
2
+ def ListConnections
3
+ object_paths = object_paths_from_fixture('settings_connections.yml')
4
+ [ object_paths ]
5
+ end
6
+ def SaveHostname(hostn)
7
+ []
8
+ end
9
+ end
@@ -0,0 +1,33 @@
1
+ class DBusMock
2
+ attr_reader :data
3
+ attr_accessor :default_iface, :introspect, :all_properties
4
+ def initialize(path)
5
+ @data = merged_dbus_fixtures[path]
6
+ end
7
+ def default_iface=(iface)
8
+ @default_iface = iface
9
+ case iface
10
+ when /NetworkManager$/
11
+ extend RootMock
12
+ when /NetworkManager.ActiveConnection$/
13
+ extend ActiveConnection
14
+ when /NetworkManager.Settings$/
15
+ extend SettingsMock
16
+ when /NetworkManager.Device.Wired$/
17
+ extend EthernetDeviceMock
18
+ when /NetworkManager.Settings.Connection$/
19
+ extend SettingsConnectionMock
20
+ end
21
+ iface
22
+ end
23
+ def call(method, *args)
24
+ if self.respond_to?(method)
25
+ self.send(method, *args)
26
+ else
27
+ [ ]
28
+ end
29
+ end
30
+ def all_properties
31
+ data['properties']
32
+ end
33
+ end
@@ -0,0 +1,18 @@
1
+ require File.join(File.dirname(__FILE__), 'dbus_mock')
2
+ require File.join(File.dirname(__FILE__), 'dbus/root_mock')
3
+ require File.join(File.dirname(__FILE__), 'dbus/settings_mock')
4
+ require File.join(File.dirname(__FILE__), 'dbus/settings_connection_mock')
5
+ require File.join(File.dirname(__FILE__), 'dbus/ethernet_device_mock')
6
+
7
+ require File.join(File.dirname(__FILE__), 'system_bus_mock')
8
+ require File.join(File.dirname(__FILE__), 'system_bus_service_mock')
9
+
10
+ def dbus_interface_mock
11
+ system_bus_mock = ::SystemBusMock.new
12
+ stub(DBusInterface).system_bus { system_bus_mock }
13
+ end
14
+
15
+ def network_manager_dbus_mock
16
+ DBusInterface::Connection.clear!
17
+ dbus_interface_mock
18
+ end
@@ -0,0 +1,5 @@
1
+ class SystemBusMock
2
+ def service(interface)
3
+ SystemBusServiceMock.new interface
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ class SystemBusServiceMock
2
+ attr_reader :interface
3
+ def initialize(interface)
4
+ @interface = interface
5
+ end
6
+ def object(path)
7
+ DBusMock.new path
8
+ end
9
+ end
@@ -1,10 +1,13 @@
1
1
  # load spec helper
2
- require File.join(File.dirname(__FILE__), 'support/fixture_helper.rb')
2
+ Dir.glob(File.join(File.dirname(__FILE__), 'support/**/*')).each do |path|
3
+ require path
4
+ end
3
5
 
4
6
  # load lib
5
7
  require File.join(File.dirname(__FILE__), '../lib/network_manager')
6
8
 
7
- require 'json'
9
+ require 'bundler'
10
+ Bundler.require :development
8
11
  require 'rspec/core/formatters/base_formatter'
9
12
  class JsonFormatter < RSpec::Core::Formatters::BaseFormatter
10
13
 
@@ -37,5 +40,21 @@ class JsonFormatter < RSpec::Core::Formatters::BaseFormatter
37
40
  end
38
41
 
39
42
  RSpec.configure do |config|
40
- config.formatter = 'JsonFormatter'
43
+ config.formatter = begin
44
+ case ENV['RSPEC_FORMAT']
45
+ when 'growl'
46
+ 'Growl::RSpec::Formatter'
47
+ when 'remote'
48
+ 'JsonFormatter'
49
+ else
50
+ 'progress'
51
+ end
52
+ end
53
+
54
+ config.mock_with :rr
55
+ # or if that doesn't work due to a version incompatibility
56
+ # config.mock_with RR::Adapters::Rspec
41
57
  end
58
+
59
+ # load mocks
60
+ require File.join(File.dirname(__FILE__), 'mocks/init')
@@ -1,11 +1,28 @@
1
1
  require 'yaml'
2
2
 
3
- def fixture(path)
4
- fixture_path = File.join(File.dirname(__FILE__), '../fixtures', path)
3
+ def fixture_path(subpath)
4
+ File.join(File.dirname(__FILE__), '../fixtures', subpath)
5
+ end
6
+
7
+ def fixture(subpath)
8
+ path = fixture_path(subpath)
5
9
  case File.extname(path)
6
10
  when '.yml'
7
- YAML.load_file(fixture_path)
11
+ YAML.load_file(path)
8
12
  else
9
- File.read(fixture_path)
13
+ File.read(path)
10
14
  end
11
15
  end
16
+
17
+ def merged_dbus_fixtures
18
+ data = {}
19
+ Dir.glob(fixture_path('*')).each do |path|
20
+ data.merge!(YAML.load_file(path))
21
+ end
22
+ data
23
+ end
24
+
25
+ def object_paths_from_fixture(subpath)
26
+ data = fixture(subpath)
27
+ data.map{|object_path, hash| object_path}
28
+ end