networkmanager-dbus 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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