+ step release => sub {
+ my ($res) = @_;
+
+ $res->release(finished_cb => sub {
+ my ($err) = @_;
+ die $err if $err;
+
+ $finished_cb->();
+ });
+ };
+}
+test_relative_next(\&Amanda::MainLoop::quit);
+Amanda::MainLoop::run();
+
+# scan the changer using except_slots
+sub test_except_slots {
+ my ($finished_cb) = @_;
+ my $slot;
+ my %except_slots;
+
+ my $steps = define_steps
+ cb_ref => \$finished_cb;
+
+ step start => sub {
+ $chg->load(slot => "5", except_slots => { %except_slots },
+ res_cb => $steps->{'loaded'});
+ };
+
+ step loaded => sub {
+ my ($err, $res) = @_;
+ if ($err) {
+ if ($err->notfound) {
+ # this means the scan is done
+ return $steps->{'quit'}->();
+ } elsif ($err->volinuse and defined $err->{'slot'}) {
+ $slot = $err->{'slot'};
+ } else {
+ die $err;
+ }
+ } else {
+ $slot = $res->{'this_slot'};
+ }
+
+ $except_slots{$slot} = 1;
+
+ if ($res) {
+ $res->release(finished_cb => $steps->{'released'});
+ } else {
+ $steps->{'released'}->();
+ }
+ };
+
+ step released => sub {
+ my ($err) = @_;
+ die $err if $err;
+
+ $chg->load(relative_slot => 'next', slot => $slot,
+ except_slots => { %except_slots },
+ res_cb => $steps->{'loaded'});
+ };
+
+ step quit => sub {
+ is_deeply({ %except_slots }, { 5=>1, 1=>1, 2=>1, 3=>1, 4=>1 },
+ "scanning with except_slots works");
+ $finished_cb->();
+ };
+}
+test_except_slots(\&Amanda::MainLoop::quit);
+Amanda::MainLoop::run();
+
+# eject is not implemented
+{
+ my $try_eject = make_cb('try_eject' => sub {
+ $chg->eject(finished_cb => make_cb(sub {
+ my ($err, $res) = @_;
+ chg_err_like($err,
+ { type => 'failed', reason => 'notimpl' },
+ "eject returns a failed/notimpl error");
+
+ Amanda::MainLoop::quit();
+ }));
+ });
+
+ $try_eject->();